/*========================================================================= npc.h Author: CRB Created: Project: Spongebob Purpose: Copyright (c) 2000 Climax Development Ltd ===========================================================================*/ #ifndef __ENEMY_NPC_H__ #define __ENEMY_NPC_H__ //#include #include "Game/Thing.h" #include "Gfx/Skel.h" #ifndef __ENEMY_NPCPATH_H__ #include "enemy\npcpath.h" #endif /*****************************************************************************/ class CNpc : public CThing { public: enum NPC_UNIT_TYPE { NPC_SANDY_CHEEKS = 0, NPC_FALLING_ITEM = 1, NPC_FISH_HOOK, NPC_DUST_DEVIL, NPC_PENDULUM, NPC_FIREBALL, NPC_SAW_BLADE, NPC_SMALL_JELLYFISH_1, NPC_SMALL_JELLYFISH_2, NPC_LARGE_JELLYFISH, NPC_ANEMONE_1, NPC_ANEMONE_2, NPC_CLAM, NPC_SQUID_DART, NPC_FISH_FOLK, NPC_PRICKLY_BUG, NPC_SEA_SNAKE_1, NPC_SEA_SNAKE_2, NPC_PUFFA_FISH, NPC_ANGLER_FISH, NPC_HERMIT_CRAB, NPC_MINE, NPC_BOOGER_MONSTER, NPC_SPIDER_CRAB, NPC_EYEBALL, NPC_BABY_OCTOPUS, NPC_ZOMBIE_FISH_FOLK, NPC_NINJA_STARFISH, NPC_GHOST, NPC_GHOST_PIRATE, NPC_FLAMING_SKULL, NPC_SHARK_MAN, NPC_OIL_BLOB, NPC_SKULL_STOMPER, NPC_MOTHER_JELLYFISH, NPC_SUB_SHARK, NPC_FLYING_DUTCHMAN, NPC_IRON_DOGFISH, NPC_UNIT_TYPE_MAX, }; void init(); void shutdown(); void think(int _frames); virtual void render(); void processEvent( GAME_EVENT evt, CThing *sourceThing ); protected: // NPC data structure definitions // enum NPC_INIT_FUNC { NPC_INIT_DEFAULT = 0, NPC_INIT_SNAKE = 1, NPC_INIT_ACID, NPC_INIT_GHOST_PIRATE, NPC_INIT_SKULL_STOMPER, NPC_INIT_MOTHER_JELLYFISH, NPC_INIT_SUB_SHARK, NPC_INIT_FLYING_DUTCHMAN, NPC_INIT_IRON_DOGFISH, NPC_INIT_FALLING_ITEM, NPC_INIT_FISH_HOOK, NPC_INIT_PENDULUM, NPC_INIT_FIREBALL, NPC_INIT_RETURNING_HAZARD, }; enum NPC_CONTROL_FUNC { NPC_CONTROL_NONE, NPC_CONTROL_MOVEMENT, NPC_CONTROL_SHOT, NPC_CONTROL_CLOSE, NPC_CONTROL_COLLISION, }; enum NPC_SENSOR_FUNC { NPC_SENSOR_NONE = 0, NPC_SENSOR_JELLYFISH_USER_CLOSE = 1, NPC_SENSOR_CLAM_USER_CLOSE, NPC_SENSOR_SPIDER_CRAB_USER_CLOSE, NPC_SENSOR_NINJA_STARFISH_USER_CLOSE, NPC_SENSOR_GHOST_PIRATE_USER_CLOSE, NPC_SENSOR_SHARK_MAN_USER_VISIBLE, NPC_SENSOR_OIL_BLOB_USER_CLOSE, NPC_SENSOR_ANEMONE_USER_CLOSE, NPC_SENSOR_EYEBALL_USER_CLOSE, NPC_SENSOR_SKULL_STOMPER_USER_CLOSE, NPC_SENSOR_BOOGER_MONSTER_USER_CLOSE, NPC_SENSOR_IRON_DOGFISH_USER_CLOSE, NPC_SENSOR_FALLING_ITEM_USER_CLOSE, NPC_SENSOR_FISH_HOOK_USER_CLOSE, }; enum NPC_CLOSE_FUNC { NPC_CLOSE_NONE = 0, NPC_CLOSE_JELLYFISH_EVADE = 1, NPC_CLOSE_CLAM_ATTACK, NPC_CLOSE_SPIDER_CRAB_ATTACK, NPC_CLOSE_GHOST_PIRATE_ATTACK, NPC_CLOSE_SHARK_MAN_ATTACK, NPC_CLOSE_GENERIC_USER_SEEK, NPC_CLOSE_ANEMONE_1_ATTACK, NPC_CLOSE_ANEMONE_2_ATTACK, NPC_CLOSE_EYEBALL_ATTACK, NPC_CLOSE_SKULL_STOMPER_ATTACK, NPC_CLOSE_BOOGER_MONSTER_ATTACK, NPC_CLOSE_MOTHER_JELLYFISH_ATTACK, NPC_CLOSE_SUB_SHARK_ATTACK, NPC_CLOSE_FLYING_DUTCHMAN_ATTACK, NPC_CLOSE_IRON_DOGFISH_ATTACK, NPC_CLOSE_FALLING_ITEM_FALL, NPC_CLOSE_FISH_HOOK_RISE, }; enum NPC_MOVEMENT_FUNC { NPC_MOVEMENT_STATIC = 0, NPC_MOVEMENT_FIXED_PATH = 1, NPC_MOVEMENT_MOTHER_JELLYFISH, NPC_MOVEMENT_SUB_SHARK, NPC_MOVEMENT_FLYING_DUTCHMAN, NPC_MOVEMENT_IRON_DOGFISH, NPC_MOVEMENT_PENDULUM, NPC_MOVEMENT_FIREBALL, NPC_MOVEMENT_RETURNING_HAZARD, }; enum NPC_MOVEMENT_MODIFIER_FUNC { NPC_MOVEMENT_MODIFIER_NONE = 0, NPC_MOVEMENT_MODIFIER_BOB = 1, NPC_MOVEMENT_MODIFIER_JELLYFISH, }; enum NPC_TIMER_FUNC { NPC_TIMER_NONE = 0, NPC_TIMER_EVADE_DONE = 1, NPC_TIMER_ATTACK_DONE, }; enum NPC_MOTHER_JELLYFISH_STATE { MOTHER_JELLYFISH_RETURN_TO_START = 0, MOTHER_JELLYFISH_CYCLE = 1, MOTHER_JELLYFISH_ATTACK_PLAYER, }; enum NPC_SUB_SHARK_STATE { SUB_SHARK_CYCLE = 0, SUB_SHARK_MINE_1 = 1, SUB_SHARK_MINE_2, }; enum NPC_FLYING_DUTCHMAN_STATE { FLYING_DUTCHMAN_ATTACK_PLAYER_1 = 0, FLYING_DUTCHMAN_ATTACK_PLAYER_2 = 1, FLYING_DUTCHMAN_ATTACK_PLAYER_3, }; enum NPC_IRON_DOGFISH_STATE { IRON_DOGFISH_THUMP_1 = 0, IRON_DOGFISH_LASER_EYE_1 = 1, IRON_DOGFISH_THUMP_2, IRON_DOGFISH_ROLL, IRON_DOGFISH_LASER_EYE_2, }; enum { NPC_JELLYFISH_RESISTANCE = 64, NPC_BOOGER_MONSTER_MAX_EXTENSION = 20, EXTEND_UP = true, EXTEND_DOWN = false, EXTEND_RIGHT = true, EXTEND_LEFT = false, }; typedef struct NPC_DATA_TYPE { NPC_INIT_FUNC initFunc; NPC_SENSOR_FUNC sensorFunc; NPC_MOVEMENT_FUNC movementFunc; NPC_MOVEMENT_MODIFIER_FUNC movementModifierFunc; NPC_CLOSE_FUNC closeFunc; NPC_TIMER_FUNC timerFunc; bool canTalk; u8 speed; u16 turnSpeed; } NPC_DATA; // functions bool processSensor(); void processMovement( int _frames ); void processMovementModifier( int _frames, s32 distX, s32 distY, s32 dist, s16 headingChange ); void processShot(); void processClose( int _frames ); void processCollision(); void processTimer( int _frames ); void processGenericGotoTarget( int _frames, s32 xDist, s32 yDist, s32 speed ); void processCloseGenericUserSeek( int _frames ); // small jellyfish functions void processSmallJellyfishSensor(); void processSmallJellyfishMovementModifier( int _frames, s32 distX, s32 distY, s32 dist, s16 headingChange ); void processCloseSmallJellyfishEvade( int _frames ); // clam functions void processCloseClamAttack( int _frames ); // spider crab functions void processCloseSpiderCrabAttack( int _frames ); // ghost pirate functions void processCloseGhostPirateAttack( int _frames ); // shark man functions void processCloseSharkManAttack( int _frames ); // anemone functions void processCloseAnemone1Attack( int _frames ); void processCloseAnemone2Attack( int _frames ); // eyeball functions void processCloseEyeballAttack( int _frames ); // skull stomper functions void processCloseSkullStomperAttack( int _frames ); // booger monster functions void processCloseBoogerMonsterAttack( int _frames ); // mother jellyfish functions void processMotherJellyfishMovement( int _frames ); void processCloseMotherJellyfishAttack( int _frames ); // sub shark functions void processSubSharkMovement( int _frames ); void processCloseSubSharkAttack( int _frames ); // flying dutchman functions void processFlyingDutchmanMovement( int _frames ); void processCloseFlyingDutchmanAttack( int _frames ); // iron dogfish functions void processIronDogfishMovement( int _frames ); void processStandardIronDogfishAttack( int _frames ); void processCloseIronDogfishAttack( int _frames ); // hazard functions void processCloseFallingItemFall( int _frames ); void processCloseFishHookRise( int _frames ); void processPendulumMovement( int _frames ); void processFireballMovement( int _frames ); void processReturningHazardMovement( int _frames ); // data static NPC_DATA m_data[NPC_UNIT_TYPE_MAX]; // internal variables NPC_UNIT_TYPE m_type; NPC_CONTROL_FUNC m_controlFunc; NPC_TIMER_FUNC m_timerFunc; NPC_SENSOR_FUNC m_sensorFunc; CNpcPath m_npcPath; s32 m_heading; s32 m_fireHeading; s32 m_velocity; bool m_evadeClockwise; s32 m_movementTimer; s32 m_timerTimer; s32 m_extension; bool m_extendDir; DVECTOR m_base; u8 m_state; u8 m_salvoCount; }; /*****************************************************************************/ #endif