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

📄 m_boss32.pas

📁 delphi编的不错的贪吃蛇
💻 PAS
📖 第 1 页 / 共 3 页
字号:
procedure makron_sight(self, other : edict_p);
begin
  self.monsterinfo.currentmove := @makron_move_sight;
end;

procedure makron_attack(self : edict_p);
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_p);
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_p);
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_p);
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_p;  damage : integer; const point : vec3_t);
var
  tempent : edict_p;
  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; n < 1 /*4*/; n++)
    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_p): qboolean;
var
  spot1, spot2  : vec3_t;
  temp          : vec3_t;
  chance        : single;
  tr            : trace_t;
  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
    begin
      Result := false;
      Exit;
    end;
  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 <> nil) then
      self.monsterinfo.attack_state := AS_MELEE
    else
      self.monsterinfo.attack_state := AS_MISSILE;
    Result := true;
    Exit;
  end;

  // missile attack
  if (@self.monsterinfo.attack = nil) then
  begin
    Result := false;
    Exit;
  end;

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

  if (enemy_range = RANGE_FAR) then
  begin
    Result := false;
    Exit;
  end;

  if (self.monsterinfo.aiflags and AI_STAND_GROUND) <> 0 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
  begin
    Result := False;
    Exit;
  end;

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

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

  Result := 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_p);
begin
  if (deathmatch.Value <> 0) 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_p);
var
  vec    : vec3_t;
  player : edict_p;
begin
  SP_monster_makron(self);

  // jump at player
  player := level.sight_client;
  if (player = nil) 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_p);
var
  ent : edict_p;
begin
  ent := G_Spawn();
  ent.nextthink := level.time + 0.8;
  ent.think := MakronSpawn;
  ent.target := Self.target;
  VectorCopy(self.s.origin, ent.s.origin);
end;


end.
 

⌨️ 快捷键说明

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