Eweapon functions

eweapon FireEWeapon(int weaponID, int x, int y, float angle, int step, int damage, int sprite, int sound, int flags)
eweapon FireAimedEWeapon(int weaponID, int x, int y, float angle, int step, int damage, int sprite, int sound, int flags)
eweapon FireNonAngularEWeapon(int weaponID, int x, int y, int direction, int step, int damage, int sprite, int sound, int flags)
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 FireBigAimedEWeapon(int weaponID, int x, int y, float angle, int step, int damage, int sprite, int sound, int flags, int width, int height)
eweapon FireBigNonAngularEWeapon(int weaponID, int x, int y, int direction, int step, int damage, int sprite, int sound, int flags, int width, int height)

Create an eweapon with the given properties.

angle is given in radians. If the weapon is aimed, this is an offset from the base angle. So, for instance, an angle of 0.2 will always aim slightly away from Link.

sprite should be the ID of a sprite from Quest > Graphics > Sprites > Weapons/Misc. If this is -1, the standard sprite for the weapon type will be used.

sound specifies a sound to play. If this is 0, no sound will be played. If it's -1, a sound will be chosen automatically based on the type of weapon.

flags argument should be one or more EWF_ constants ORed together, or 0 for none.

EWF_UNBLOCKABLE
The weapon is unblockable.
EWF_ROTATE
The weapon's sprite will be rotated and flipped according to the weapon's direction.
EWF_ROTATE_360

The weapon will be drawn using Screen->DrawTile(), allowing the sprite to rotate in whichever direction the weapon is moving.

Tip

The base sprite set in Quest > Graphics > Sprites > Weapons/Misc. should be pointing to the right.

EWF_SHADOW
The weapon will cast a shadow if its Z position is greater than 0.
EWF_FLICKER
The weapon will be invisible every other frame.
EWF_NO_COLLISION
The weapon's collision detection will be disabled.
EWF_FAKE_Z

The weapon's hitbox will always be on the ground.

Note

This does not actually keep the weapon on the ground; it only simulates this by setting the weapon's hit and draw offsets.

eweapon CreateDummyEWeapon(int weaponID, int step, int damage, int sprite, int sound, int flags)
eweapon CreateBigDummyEWeapon(int weaponID, int step, int damage, int sprite, int sound, int flags, int width, int height)

These will create a dummy eweapon to be used as a prototype for SetEWeaponDeathEffect(). The dummy weapon will be invisible and will have collision detection disabled. It can have a movement, lifespan, and death effect set, but the dummy weapon itself will not make use of them - only its copies will.

A dummy weapon will never be removed automatically. If reaching the weapon limit is a concern, you should destroy the weapon yourself when it's no longer needed.

void SetEWeaponMovement(eweapon wpn, int type, float arg, float arg2)

This sets an eweapon's movement pattern. The type argument should be one of the EWM_ constants below. The effect of arg and arg2 vary depending on the type of movement.

EWM_SINE_WAVE

Move in a sine wave.

arg: Amplitude

arg2: Angular frequency in degrees per frame

EWM_HOMING

Turn toward Link each frame.

arg: Maximum rotation per frame in radians

arg2: Homing time in frames - after this many frames, the weapon will die. Use -1 to home indefinitely.

EWM_HOMING_REAIM

Move in straight lines, stopping and re-aiming at Link.

arg: Number of re-aims

arg2: Time between re-aims

EWM_RANDOM

Turn randomly each frame.

arg: Maximum rotation per frame in radians

arg2: Rotation time in frames - after this many frames, the weapon will die. Use -1 to keep moving indefinitely.

EWM_RANDOM_REAIM

Stop frequently and aim in a random direction

arg: Number of re-aims

arg2: Time between re-aims

EWM_VEER

Accelerate in a given direction.

arg: Direction of acceleration

arg2: Rate of acceleration

EWM_DRIFT

Drift in the given direction at a constant speed.

arg: Drift direction

arg2: Drift speed

EWM_DRIFT_WAIT

Drift in the given direction at a constant speed and wait 16 frames before beginning normal movement. This mimics the behavior of boss fireballs.

arg: Drift direction

arg2: Drift speed

EWM_THROW

Arc through the air as if thrown. The weapon stops moving when it hits the ground.

arg: Initial upward velocity; use -1 to make the weapon travel the distance to Link

arg2: OR together these flags, or use 0 for none:

EWMF_BOUNCE
The weapon will bounce on impact.
EWMF_DIE
The weapon will die on impact rather than simply stopping.
EWM_FALL

Fall straight down. The weapon stops moving when it hits the ground.

arg: Initial height

arg2: OR together these flags, or use 0 for none:

EWMF_BOUNCE
The weapon will bounce on impact.
EWMF_DIE
The weapon will die on impact rather than simply stopping.
void SetEWeaponLifespan(eweapon wpn, int type, int arg)

This controls the conditions under which a weapon dies. "Dying" does not mean the weapon is removed, but that its scripted movement is no longer handled, and, optionally, a death effect is activated. Use one of the EWL_ constants for the type argument. The effect of arg depends on the type.

EWL_TIMER

Die after a certain amount of time.

arg: Time in frames

EWL_NEAR_LINK

Die when within a certain distance of Link.

arg: Distance in pixels

EWL_SLOW_TO_HALT

Slow down until stopped, then die. This can behave oddly if movement is set.

arg: Step per frame

void SetEWeaponDeathEffect(eweapon wpn, int type, int arg)

This determines what happens when the weapon dies. The type argument should be one of the EWD_ constants below. The effect of arg depends on the type.

EWD_VANISH

The weapon is removed.

arg: No effect

EWD_AIM_AT_LINK

The weapon pauses for a moment, then aims at Link.

arg: Delay

EWD_EXPLODE

The weapon explodes.

arg: Explosion damage

EWD_SBOMB_EXPLODE

The weapon explodes like a super bomb.

arg: Explosion damage

EWD_4_FIREBALLS_HV

Shoots fireballs horizontally and vertically.

arg: Fireball sprite

EWD_4_FIREBALLS_DIAG

Shoots fireballs at 45-degree angles.

arg: Fireball sprite

EWD_4_FIREBALLS_RANDOM

Randomly shoots fireballs either vertically and horizontally or at 45-degree angles.

arg: Fireball sprite

EWD_8_FIREBALLS

Shoots fireballs horizontally, vertically, and at 45-degree angles

arg: Fireball sprite

EWD_FIRE

Leaves a single, immobile fire

arg: Fire sprite

EWD_4_FIRES_HV

Shoots fires horizontally and vertically.

arg: Fire sprite

EWD_4_FIRES_DIAG

Shoots fires at 45-degree angles.

arg: Fire sprite

EWD_4_FIRES_RANDOM

Randomly shoots fires either vertically and horizontally or at 45-degree angles.

arg: Fire sprite

EWD_8_FIRES

Shoots fires horizontally, vertically, and at 45-degree angles

arg: Fire sprite

EWD_SPAWN_NPC

Creates an npc at the weapon's location. This is done without regard for the suitability of the location.

arg: npc to spawn

EWD_RUN_SCRIPT

Loads an unused FFC, positions it at the weapons position, and runs a script. The weapon will not be removed; it should be loaded by the script with GetAssociatedEWeapon(). The number to pass into it will be given to the script as argument D0. If no FFC is free, the weapon will simply be removed.

arg: Script to run. If this is not a valid script, EWD_VANISH will be set instead

void SetEWeaponDeathEffect(eweapon wpn, eweapon prototype, int numShots, int spreadType, float angle)

This will make a weapon spawn copies of a prototype weapon when it dies. The prototype must be a dummy eweapon.

spreadType is one of the following:

EWD_EVEN

Weapons are evenly spaced

angle: First weapon's offset from 0 in radians

EWD_AIMED

Weapons are aimed at Link

angle: Angle range of spawned weapons in radians

EWD_RANDOM

Weapons are fired at random angles

angle: No effect

void SetEWeaponDir(eweapon wpn)
Set the direction of an angled eweapon so that it interacts correctly with shields. This is normally handled automatically, but you may need to use it if you script a weapon's movement yourself.
void SetEWeaponRotation(eweapon wpn)
void SetEWeaponRotation(eweapon wpn, int direction)
Rotate the weapon's sprite. If direction is not given, this is done according to the weapon's direction.
void KillEWeapon(eweapon wpn)
Kill the eweapon, stopping scripted movement and activating any death effects.
void DrawEWeaponShadow(eweapon wpn)
Draws a shadow under the eweapon according to the GH_SHADOW_ constants. This is used internally when EWF_SHADOW is set.
int GetDefaultEWeaponSprite(int weaponID)
Returns the sprite normally used by the given weapon type.
int GetDefaultEWeaponSound(int weaponID)
Returns the sound normally used by the given weapon type.
eweapon GetAssociatedEWeapon(int weaponID)
Finds an eweapon using an internal ID number. This should be used by scripts launched by EWD_RUN_SCRIPT, and the weaponID argument should be the number passed to the script as D0. If the requested weapon is not found, an uninitialized pointer will be returned.
bool IsGhostZHEWeapon(eweapon wpn)
Returns true if the weapon is one created or handled by ghost.zh.
bool IsDummyEWeapon(eweapon wpn)
Returns true if the eweapon is a dummy.