1) Yes. It's actually fairly simple. Directions 8-15 correspond to directions 1-7 but can't be blocked. Here's a simple internal function from ghost to convert a weapon's direction (weapon->Dir) to an unblockable one.
// Get the unblockable version (8-15) of a direction
int __UnblockableDir(int dir)
{
if(dir==DIR_UP)
return 8;
if(dir==DIR_DOWN)
return 12;
if(dir==DIR_LEFT)
return 14;
if(dir==DIR_RIGHT)
return 10;
if(dir==DIR_LEFTUP)
return 15;
if(dir==DIR_RIGHTUP)
return 9;
if(dir==DIR_LEFTDOWN)
return 13;
if(dir==DIR_RIGHTDOWN)
return 11;
// Should never get here
return dir;
}
2) You could script the behaviour easily enough with a weapon script.
3) Literally just who they affect. Internally, they're the same thing. The lweapon/eweapon divide is entirely arbitrary and a bit annoying. Having them be the same type with just a flag for hitting Link, enemies, or both would be much easier.
4) You're basically gonna need to rescript hookshots to do that, because of the pulling Link to them bit. Boomerangs are a bit easier.
5) Like, with engine picking up and throwing? Or just firing a weapon. The latter is trivial by setting a few flags. Here's a ghost function that does it to demonstrate. The former... I honestly couldn't tell you, not having messed much with liftable objects.
// Fire an eweapon larger than 1x1
eweapon FireBigEWeapon(int weaponID, int x, int y, float angle, int step, int damage, int sprite, int sound, int flags, int width, int height)
{
eweapon wpn=FireEWeapon(weaponID, x, y, angle, step, damage, sprite, sound, flags);
wpn->Extend=3;
wpn->TileWidth=width;
wpn->TileHeight=height;
wpn->HitWidth=16*width;
wpn->HitHeight=16*height;
return wpn;
}