⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m_boss32.inc

📁 雷神之锤2(Quake2)Delphi源码
💻 INC
📖 第 1 页 / 共 3 页
字号:
      else
      if (random() <= 0.35) then
      begin
        gi.sound(self, CHAN_VOICE, sound_pain6, 1, ATTN_NONE,0);
        self.monsterinfo.currentmove := makron_move_pain6;
      end;
    end;
  end;
end;

procedure makron_sight(self, other : edict_t);
begin
  self.monsterinfo.currentmove := makron_move_sight;
end;

procedure makron_attack(self : edict_t);
var
  vec   : vec3_t;
  range : single;
  r     : single;
begin
  r := random();

  VectorSubtract(self.enemy.s.origin, self.s.origin, vec);
  range := VectorLength(vec);

  if (r <= 0.3) then
    self.monsterinfo.currentmove := makron_move_attack3
  else
  if (r <= 0.6) then
    self.monsterinfo.currentmove := makron_move_attack4;
  else
    self.monsterinfo.currentmove := makron_move_attack5;
end;

{
---
Makron Torso. This needs to be spawned in
---
}

procedure makron_torso_think(self : edict_t);
begin
  self.s.frame := self.s.frame + 1;
  if (self.s.frame < 365) then
    self.nextthink := level.time + FRAMETIME;
  else
  begin
    self.s.frame := 346;
    self.nextthink := level.time + FRAMETIME;
  end;
end;

procedure makron_torso(ent : edict_t);
begin
  ent.movetype := MOVETYPE_NONE;
  ent.solid := SOLID_NOT;
  VectorSet(ent.mins, -8, -8, 0);
  VectorSet(ent.maxs, 8, 8, 8);
  ent.s.frame := 346;
  ent.s.modelindex := gi.modelindex('models/monsters/boss3/rider/tris.md2');
  ent.think := makron_torso_think;
  ent.nextthink := level.time + 2 * FRAMETIME;
  ent.s.sound := gi.soundindex ('makron/spine.wav');
  gi.linkentity(ent);
end;

//
// death
//

procedure makron_dead(self : edict_t);
begin
  VectorSet(self.mins, -60, -60, 0);
  VectorSet(self.maxs, 60, 60, 72);
  self.movetype := MOVETYPE_TOSS;
  self.svflags := self.svflags or SVF_DEADMONSTER;
  self.nextthink := 0;
  gi.linkentity(self);
end;

procedure makron_die(self, inflictor, attacker : edict_t; damage : integer; point : vec3_t);
var
  tempent : edict_t;
  n : integer;
begin
  self.s.sound := 0;
  // check for gib
  if (self.health <= self.gib_health) then
  begin
    gi.sound(self, CHAN_VOICE, gi.soundindex('misc/udeath.wav'), 1, ATTN_NORM, 0);
    for n := 0 to 0 {3} do
      ThrowGib(self, 'models/objects/gibs/sm_meat/tris.md2', damage, GIB_ORGANIC);
    for n := 0 to 3 do
      ThrowGib(self, 'models/objects/gibs/sm_metal/tris.md2', damage, GIB_METALLIC);
    ThrowHead(self, 'models/objects/gibs/gear/tris.md2', damage, GIB_METALLIC);
    self.deadflag := DEAD_DEAD;
    exit;
  end;

  if (self.deadflag = DEAD_DEAD) then
    exit;

  // regular death
  gi.sound(self, CHAN_VOICE, sound_death, 1, ATTN_NONE, 0);
  self.deadflag := DEAD_DEAD;
  self.takedamage := DAMAGE_YES;

  tempent := G_Spawn();
  VectorCopy(self.s.origin, tempent.s.origin);
  VectorCopy(self.s.angles, tempent.s.angles);
  tempent.s.origin[1] := tempent.s.origin[1] - 84;
  makron_torso(tempent);

  self.monsterinfo.currentmove := makron_move_death2;
	
end;

function Makron_CheckAttack(self : edict_t): qboolean;
var
  spot1, spot2  : edict_t;
  temp          : edict_t;
  chance        : single;
  trace_t       : tr;
  enemy_infront : qboolean;
  enemy_range   : integer;
  enemy_yaw     : single;
begin
  if (self.enemy.health > 0) then
  begin
    // see if any entities are in the way of the shot
    VectorCopy(self.s.origin, spot1);
    spot1[2] := spot1[2] + self.viewheight;
    VectorCopy(self.enemy.s.origin, spot2);
    spot2[2] := spot2[2] + self.enemy.viewheight;

    tr := gi.trace(spot1, nil, nil, spot2, self, (CONTENTS_SOLID or CONTENTS_MONSTER or CONTENTS_SLIME or CONTENTS_LAVA));

    // do we have a clear shot?
    if (tr.ent <> self.enemy)  then
      Result := false;
  end;

  enemy_infront := infront(self, self.enemy);
  enemy_range := range(self, self.enemy);
  VectorSubtract(self.enemy.s.origin, self.s.origin, temp);
  enemy_yaw := vectoyaw(temp);

  self.ideal_yaw := enemy_yaw;

  // melee attack
  if (enemy_range = RANGE_MELEE) then
  begin
    if (self.monsterinfo.melee) then
      self.monsterinfo.attack_state := AS_MELEE
    else
      self.monsterinfo.attack_state := AS_MISSILE;
    Result := true;
  end;

  // missile attack
  if not(self.monsterinfo.attack) then
    Result := false;

  if (level.time < self.monsterinfo.attack_finished) then
    Result := false;

  if (enemy_range = RANGE_FAR) then
    Result := false;

  if (self.monsterinfo.aiflags and AI_STAND_GROUND) then
    chance := 0.4;
  else
  if (enemy_range = RANGE_MELEE) then
    chance := 0.8;
  else
  if (enemy_range = RANGE_NEAR) then
    chance := 0.4;
  else
  if (enemy_range = RANGE_MID) then
    chance := 0.2;
  else
    Result := false;

  if (random () < chance) then
  begin
    self.monsterinfo.attack_state := AS_MISSILE;
    self.monsterinfo.attack_finished := level.time + 2*random();
    Result := true;
  end;

  if (self.flags and FL_FLY) then
  begin
    if (random() < 0.3) then
      self.monsterinfo.attack_state := AS_SLIDING;
    else
      self.monsterinfo.attack_state := AS_STRAIGHT;
  end;

  return false;
end;

//
// monster_makron
//

procedure MakronPrecache;
begin
  sound_pain4        := gi.soundindex('makron/pain3.wav');
  sound_pain5        := gi.soundindex('makron/pain2.wav');
  sound_pain6        := gi.soundindex('makron/pain1.wav');
  sound_death        := gi.soundindex('makron/death.wav');
  sound_step_left    := gi.soundindex('makron/step1.wav');
  sound_step_right   := gi.soundindex('makron/step2.wav');
  sound_attack_bfg   := gi.soundindex('makron/bfg_fire.wav');
  sound_brainsplorch := gi.soundindex('makron/brain1.wav');
  sound_prerailgun   := gi.soundindex('makron/rail_up.wav');
  sound_popup        := gi.soundindex('makron/popup.wav');
  sound_taunt1       := gi.soundindex('makron/voice4.wav');
  sound_taunt2       := gi.soundindex('makron/voice3.wav');
  sound_taunt3       := gi.soundindex('makron/voice.wav');
  sound_hit          := gi.soundindex('makron/bhit.wav');

  gi.modelindex('models/monsters/boss3/rider/tris.md2');
end;

{QUAKED monster_makron (1 .5 0) (-30 -30 0) (30 30 90) Ambush Trigger_Spawn Sight
}
procedure SP_monster_makron(self : edict_t);
begin
  if (deathmatch.value) then
  begin
    G_FreeEdict(self);
    exit;
  end;

  MakronPrecache;

  self.movetype := MOVETYPE_STEP;
  self.solid := SOLID_BBOX;
  self.s.modelindex := gi.modelindex('models/monsters/boss3/rider/tris.md2');
  VectorSet(self.mins, -30, -30, 0);
  VectorSet(self.maxs, 30, 30, 90);

  self.health := 3000;
  self.gib_health := -2000;
  self.mass := 500;

  self.pain := makron_pain;
  self.die := makron_die;
  self.monsterinfo.stand := makron_stand;
  self.monsterinfo.walk := makron_walk;
  self.monsterinfo.run := makron_run;
  self.monsterinfo.dodge := nil;
  self.monsterinfo.attack := makron_attack;
  self.monsterinfo.melee := nil;
  self.monsterinfo.sight := makron_sight;
  self.monsterinfo.checkattack := Makron_CheckAttack;

  gi.linkentity(self);

//self.monsterinfo.currentmove := makron_move_stand;
  self.monsterinfo.currentmove := makron_move_sight;
  self.monsterinfo.scale := MODEL_SCALE;

  walkmonster_start(self);
end;


{
=================
MakronSpawn

=================
}
procedure MakronSpawn(self : edict_t);
var
  vec    : vec3_t;
  player : edict_t;
begin
  SP_monster_makron(self);

  // jump at player
  player := level.sight_client;
  if not(player) then
    exit;

  VectorSubtract(player.s.origin, self.s.origin, vec);
  self.s.angles[YAW] := vectoyaw(vec);
  VectorNormalize(vec);
  VectorMA(vec3_origin, 400, vec, self.velocity);
  self.velocity[2] := 200;
  self.groundentity := nil;
end;

{
=================
MakronToss

Jorg is just about dead, so set up to launch Makron out
=================
}
procedure MakronToss(self : edict_t);
var
  ent : edict_t;
begin
  ent := G_Spawn();
  ent.nextthink := level.time + 0.8;
  ent.think := MakronSpawn;
  ent.target := selftarget;
  VectorCopy(self.s.origin, ent.s.origin);
end;


end.
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -