/* ============================================================================== GENERIC ============================================================================== */ #include "quagent.h" #include "m_generic.h" // STAND void generic_stand (edict_t *self); //each frame is {ai_routine to call for bot movement etc., // distance to move along the ground for the frame, // function to call when frame is finished} mframe_t generic_frames_stand [] = { ai_stand, 0, NULL }; //contents: {first frame, last frame, function called when beginning, // function called when ending} mmove_t generic_move_stand = {FRAME_all,FRAME_all,generic_frames_stand, NULL}; void generic_stand (edict_t *self) { self->monsterinfo.currentmove = &generic_move_stand; } // // WALK // void generic_walk(edict_t *self); mframe_t generic_frames_walk [] = { ai_walk, 5, NULL, }; mmove_t generic_move_walk = {FRAME_all,FRAME_all,generic_frames_walk, NULL}; void generic_walk (edict_t *self) { self->monsterinfo.currentmove = &generic_move_walk; } // // RUN // void generic_run (edict_t *self); mframe_t generic_frames_run [] = { ai_run, 10, NULL }; mmove_t generic_move_run = {FRAME_all,FRAME_all,generic_frames_run, NULL}; void generic_run (edict_t *self) { self->monsterinfo.currentmove = &generic_move_run; } // // PAIN // void generic_pain(edict_t *self, edict_t *other, float kick, int damage){ return; } // // DEAD // void generic_dead (edict_t *self) { VectorSet (self->mins, -16, -16, -24); VectorSet (self->maxs, 16, 16, -8); self->movetype = MOVETYPE_TOSS; self->svflags |= SVF_DEADMONSTER; self->nextthink = 0; gi.linkentity (self); } //can either explode if mechanical, or throw gibs if organic void generic_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) { int n; self->quagentinfo.die(self); BecomeExplosion1(self); //for (n= 0; n < 50; n++) // ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); //ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC); self->deadflag == DEAD_DEAD; } int quagent_generic_walk_by(edict_t *self, float distance) { int result = quagent_walk_by(self, distance); if(result <= 0) return result; self->monsterinfo.currentmove = &generic_move_walk; return 1; } int quagent_generic_run_by(edict_t *self, float distance) { int result = quagent_walk_by(self, distance); if(result <= 0) return result; self->monsterinfo.currentmove = &generic_move_run; return 1; } edict_t* SP_quagent_generic (edict_t *client) { edict_t *self; vec3_t spawn_origin, spawn_angles; //begin the spawning process self = G_Spawn(); self->client = client->client; SelectSpawnPoint (self, spawn_origin, spawn_angles); VectorCopy (client->s.origin, self->s.origin); self->classname = "bot_generic"; self->s.modelindex = gi.modelindex ("models/monsters/generic/tris.md2"); self->s.skinnum = 0; //MODEL_SCALE defined in m_generic.h self->monsterinfo.scale = MODEL_SCALE; //bounding box VectorSet (self->mins, -16, -16, -24); VectorSet (self->maxs, 16, 16, 32); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->health = 100; self->gib_health = -30; self->mass = 100; //set functions to call for specific actions self->pain = generic_pain; self->die = generic_die; self->monsterinfo.stand = generic_stand; self->monsterinfo.walk = generic_walk; self->monsterinfo.run = generic_run; self->monsterinfo.dodge = NULL; self->monsterinfo.attack = NULL; self->monsterinfo.melee = NULL; self->monsterinfo.sight = NULL; self->monsterinfo.search = NULL; self->monsterinfo.currentmove = &generic_move_stand; //set up quagent transfigure_quagent(self); self->quagentinfo.walk_by = quagent_generic_walk_by; self->quagentinfo.run_by = quagent_generic_run_by; //complete the spawning process gi.linkentity (self); walkmonster_start (self); return self; }