void gunner_attack(edict_t *self) { float chance, r; monster_done_dodge(self); // PMM if (self->monsterinfo.attack_state == AS_BLIND) { // setup shot probabilities if (self->monsterinfo.blind_fire_delay < 1.0) chance = 1.0; else if (self->monsterinfo.blind_fire_delay < 7.5) chance = 0.4; else chance = 0.1; r = random(); // minimum of 2 seconds, plus 0-3, after the shots are done self->monsterinfo.blind_fire_delay += 2.1 + 2.0 + random()*3.0; // don't shoot at the origin if (VectorCompare (self->monsterinfo.blind_fire_target, vec3_origin)) return; // don't shoot if the dice say not to if (r > chance) { return; } // turn on manual steering to signal both manual steering and blindfire self->monsterinfo.aiflags |= AI_MANUAL_STEERING; if (gunner_grenade_check(self)) { // if the check passes, go for the attack self->monsterinfo.currentmove = &gunner_move_attack_grenade; self->monsterinfo.attack_finished = level.time + 2*random(); } // turn off blindfire flag self->monsterinfo.aiflags &= ~AI_MANUAL_STEERING; return; } // pmm // PGM - gunner needs to use his chaingun if he's being attacked by a tesla. if ((range (self, self->enemy) == RANGE_MELEE) || self->bad_area) { self->monsterinfo.currentmove = &gunner_move_attack_chain; } else { if (random() <= 0.5 && gunner_grenade_check(self)) self->monsterinfo.currentmove = &gunner_move_attack_grenade; else self->monsterinfo.currentmove = &gunner_move_attack_chain; } }
void medic_run (edict_t *self) { monster_done_dodge (self); if (!(self->monsterinfo.aiflags & AI_MEDIC)) { edict_t *ent; ent = medic_FindDeadMonster(self); if (ent) { self->oldenemy = self->enemy; self->enemy = ent; self->enemy->monsterinfo.healer = self; self->monsterinfo.aiflags |= AI_MEDIC; FoundTarget (self); return; } } // else if (!canReach(self, self->enemy)) // { // abortHeal (self, 0); // } if (self->monsterinfo.aiflags & AI_STAND_GROUND) self->monsterinfo.currentmove = &medic_move_stand; else self->monsterinfo.currentmove = &medic_move_run; }
void berserk_run (edict_t *self) { monster_done_dodge (self); if (self->monsterinfo.aiflags & AI_STAND_GROUND) self->monsterinfo.currentmove = &berserk_move_stand; else self->monsterinfo.currentmove = &berserk_move_run1; }
void gunner_run (edict_t *self) { monster_done_dodge(self); if (self->monsterinfo.aiflags & AI_STAND_GROUND) self->monsterinfo.currentmove = &gunner_move_stand; else self->monsterinfo.currentmove = &gunner_move_run; }
void infantry_attack(edict_t *self) { monster_done_dodge (self); if (range (self, self->enemy) == RANGE_MELEE) self->monsterinfo.currentmove = &infantry_move_attack2; else self->monsterinfo.currentmove = &infantry_move_attack1; }
void berserk_melee (edict_t *self) { monster_done_dodge (self); if ((rand() % 2) == 0) self->monsterinfo.currentmove = &berserk_move_attack_spike; else self->monsterinfo.currentmove = &berserk_move_attack_club; }
void medic_pain (edict_t *self, edict_t *other, float kick, int damage) { monster_done_dodge (self); if ((self->health < (self->max_health / 2))) if (self->mass > 400) self->s.skinnum = 3; else self->s.skinnum = 1; if (level.time < self->pain_debounce_time) return; self->pain_debounce_time = level.time + 3; if (skill->value == 3) return; // no pain anims in nightmare // if we're healing someone, we ignore pain if (self->monsterinfo.aiflags & AI_MEDIC) return; if (self->mass > 400) { if (damage < 35) { gi.sound (self, CHAN_VOICE, commander_sound_pain1, 1, ATTN_NORM, 0); return; } self->monsterinfo.aiflags &= ~AI_MANUAL_STEERING; self->monsterinfo.aiflags &= ~AI_HOLD_FRAME; gi.sound (self, CHAN_VOICE, commander_sound_pain2, 1, ATTN_NORM, 0); if (random() < (min(((float)damage * 0.005), 0.5))) // no more than 50% chance of big pain self->monsterinfo.currentmove = &medic_move_pain2; else self->monsterinfo.currentmove = &medic_move_pain1; } else if (random() < 0.5) { self->monsterinfo.currentmove = &medic_move_pain1; gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); } else { self->monsterinfo.currentmove = &medic_move_pain2; gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); } // PMM - clear duck flag if (self->monsterinfo.aiflags & AI_DUCKED) monster_duck_up(self); }
void berserk_jump (edict_t *self) { if(!self->enemy) return; monster_done_dodge (self); if(self->enemy->s.origin[2] > self->s.origin[2]) self->monsterinfo.currentmove = &berserk_move_jump2; else self->monsterinfo.currentmove = &berserk_move_jump; }
void gunner_run(edict_t *self) { if (!self) { return; } monster_done_dodge(self); if (self->monsterinfo.aiflags & AI_STAND_GROUND) { self->monsterinfo.currentmove = &gunner_move_stand; } else { self->monsterinfo.currentmove = &gunner_move_run; } }
void soldier_attack6_refire (edict_t *self) { // PMM - make sure dodge & charge bits are cleared monster_done_dodge (self); soldier_stop_charge (self); if (!self->enemy) return; if (self->enemy->health <= 0) return; // if (range(self, self->enemy) < RANGE_MID) if (range(self, self->enemy) < RANGE_NEAR) return; if ((skill->value == 3) || ((random() < (0.25*((float)skill->value))))) self->monsterinfo.nextframe = FRAME_runs03; }
void berserk_pain (edict_t *self, edict_t *other, float kick, int damage) { if (self->health < (self->max_health / 2)) self->s.skinnum = 1; if (level.time < self->pain_debounce_time) return; self->pain_debounce_time = level.time + 3; gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0); if (skill->value == 3) return; // no pain anims in nightmare monster_done_dodge (self); if ((damage < 20) || (random() < 0.5)) self->monsterinfo.currentmove = &berserk_move_pain1; else self->monsterinfo.currentmove = &berserk_move_pain2; }
void soldier_run (edict_t *self) { monster_done_dodge (self); if (self->monsterinfo.aiflags & AI_STAND_GROUND) { self->monsterinfo.currentmove = &soldier_move_stand1; return; } if (self->monsterinfo.currentmove == &soldier_move_walk1 || self->monsterinfo.currentmove == &soldier_move_walk2 || self->monsterinfo.currentmove == &soldier_move_start_run) { self->monsterinfo.currentmove = &soldier_move_run; } else { self->monsterinfo.currentmove = &soldier_move_start_run; } }
void infantry_pain (edict_t *self, edict_t *other, float kick, int damage) { int n; if (self->health < (self->max_health / 2)) self->s.skinnum |= 1; if (!self->groundentity) { // if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("infantry: pain avoided due to no ground\n"); return; } monster_done_dodge (self); if (level.time < self->pain_debounce_time) return; self->pain_debounce_time = level.time + 3; if (skill->value == 3) return; // no pain anims in nightmare n = rand() % 2; if (n == 0) { self->monsterinfo.currentmove = &infantry_move_pain1; gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); } else { self->monsterinfo.currentmove = &infantry_move_pain2; gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); } // PMM - clear duck flag if (self->monsterinfo.aiflags & AI_DUCKED) monster_duck_up(self); }
void gunner_pain (edict_t *self, edict_t *other, float kick, int damage) { if (self->health < (self->max_health / 2)) self->s.skinnum = 1; monster_done_dodge (self); if (!self->groundentity) { return; } if (level.time < self->pain_debounce_time) return; self->pain_debounce_time = level.time + 3; if (rand()&1) gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0); else gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); if (skill->value == 3) return; // no pain anims in nightmare if (damage <= 10) self->monsterinfo.currentmove = &gunner_move_pain3; else if (damage <= 25) self->monsterinfo.currentmove = &gunner_move_pain2; else self->monsterinfo.currentmove = &gunner_move_pain1; self->monsterinfo.aiflags &= ~AI_MANUAL_STEERING; // PMM - clear duck flag if (self->monsterinfo.aiflags & AI_DUCKED) monster_duck_up(self); }
void medic_attack(edict_t *self) { int enemy_range; float r; monster_done_dodge (self); enemy_range = range(self, self->enemy); // signal from checkattack to spawn if (self->monsterinfo.aiflags & AI_BLOCKED) { self->monsterinfo.currentmove = &medic_move_callReinforcements; self->monsterinfo.aiflags &= ~AI_BLOCKED; } r = random(); if (self->monsterinfo.aiflags & AI_MEDIC) { if ((self->mass > 400) && (r > 0.8) && (self->monsterinfo.monster_slots > 2)) self->monsterinfo.currentmove = &medic_move_callReinforcements; else self->monsterinfo.currentmove = &medic_move_attackCable; } else { if (self->monsterinfo.attack_state == AS_BLIND) { self->monsterinfo.currentmove = &medic_move_callReinforcements; return; } if ((self->mass > 400) && (r > 0.2) && (enemy_range != RANGE_MELEE) && (self->monsterinfo.monster_slots > 2)) self->monsterinfo.currentmove = &medic_move_callReinforcements; else self->monsterinfo.currentmove = &medic_move_attackBlaster; } }
void gunner_jump(edict_t *self) { if (!self) { return; } if (!self->enemy) { return; } monster_done_dodge(self); if (self->enemy->s.origin[2] > self->s.origin[2]) { self->monsterinfo.currentmove = &gunner_move_jump2; } else { self->monsterinfo.currentmove = &gunner_move_jump; } }
void soldier_pain (edict_t *self, edict_t *other, float kick, int damage) { float r; int n; if (self->health < (self->max_health / 2)) self->s.skinnum |= 1; monster_done_dodge (self); soldier_stop_charge(self); // if we're blind firing, this needs to be turned off here self->monsterinfo.aiflags &= ~AI_MANUAL_STEERING; if (level.time < self->pain_debounce_time) { if ((self->velocity[2] > 100) && ( (self->monsterinfo.currentmove == &soldier_move_pain1) || (self->monsterinfo.currentmove == &soldier_move_pain2) || (self->monsterinfo.currentmove == &soldier_move_pain3))) { // PMM - clear duck flag if (self->monsterinfo.aiflags & AI_DUCKED) monster_duck_up(self); self->monsterinfo.currentmove = &soldier_move_pain4; } return; } self->pain_debounce_time = level.time + 3; n = self->s.skinnum | 1; if (n == 1) gi.sound (self, CHAN_VOICE, sound_pain_light, 1, ATTN_NORM, 0); else if (n == 3) gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0); else gi.sound (self, CHAN_VOICE, sound_pain_ss, 1, ATTN_NORM, 0); if (self->velocity[2] > 100) { // PMM - clear duck flag if (self->monsterinfo.aiflags & AI_DUCKED) monster_duck_up(self); self->monsterinfo.currentmove = &soldier_move_pain4; // self->monsterinfo.pausetime = 0; return; } if (skill->value == 3) return; // no pain anims in nightmare r = random(); if (r < 0.33) self->monsterinfo.currentmove = &soldier_move_pain1; else if (r < 0.66) self->monsterinfo.currentmove = &soldier_move_pain2; else self->monsterinfo.currentmove = &soldier_move_pain3; // PMM - clear duck flag if (self->monsterinfo.aiflags & AI_DUCKED) monster_duck_up(self); // self->monsterinfo.pausetime = 0; }
void gunner_pain(edict_t *self, edict_t *other /* unused */, float kick, int damage) { if (!self) { return; } if (self->health < (self->max_health / 2)) { self->s.skinnum = 1; } monster_done_dodge(self); if (!self->groundentity) { return; } if (level.time < self->pain_debounce_time) { return; } self->pain_debounce_time = level.time + 3; if (rand() & 1) { gi.sound(self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0); } else { gi.sound(self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); } if (skill->value == 3) { return; /* no pain anims in nightmare */ } if (damage <= 10) { self->monsterinfo.currentmove = &gunner_move_pain3; } else if (damage <= 25) { self->monsterinfo.currentmove = &gunner_move_pain2; } else { self->monsterinfo.currentmove = &gunner_move_pain1; } self->monsterinfo.aiflags &= ~AI_MANUAL_STEERING; if (self->monsterinfo.aiflags & AI_DUCKED) { monster_duck_up(self); } }
void soldier_attack(edict_t *self) { float r, chance; monster_done_dodge (self); // PMM - blindfire! if (self->monsterinfo.attack_state == AS_BLIND) { // setup shot probabilities if (self->monsterinfo.blind_fire_delay < 1.0) chance = 1.0; else if (self->monsterinfo.blind_fire_delay < 7.5) chance = 0.4; else chance = 0.1; r = random(); // minimum of 2 seconds, plus 0-3, after the shots are done self->monsterinfo.blind_fire_delay += 2.1 + 2.0 + random()*3.0; // don't shoot at the origin if (VectorCompare (self->monsterinfo.blind_fire_target, vec3_origin)) return; // don't shoot if the dice say not to if (r > chance) { // if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("blindfire - NO SHOT\n"); return; } // turn on manual steering to signal both manual steering and blindfire self->monsterinfo.aiflags |= AI_MANUAL_STEERING; self->monsterinfo.currentmove = &soldier_move_attack1; self->monsterinfo.attack_finished = level.time + 1.5 + random(); return; } // pmm // PMM - added this so the soldiers now run toward you and shoot instead of just stopping and shooting // if ((range(self, self->enemy) >= RANGE_MID) && (r < (skill->value*0.25) && (self->s.skinnum <= 3))) r = random(); if ((!(self->monsterinfo.aiflags & (AI_BLOCKED|AI_STAND_GROUND))) && (range(self, self->enemy) >= RANGE_NEAR) && (r < (skill->value*0.25) && (self->s.skinnum <= 3))) { self->monsterinfo.currentmove = &soldier_move_attack6; } else { if (self->s.skinnum < 4) { if (random() < 0.5) self->monsterinfo.currentmove = &soldier_move_attack1; else self->monsterinfo.currentmove = &soldier_move_attack2; } else { self->monsterinfo.currentmove = &soldier_move_attack4; } } }