📄 m_boss32.inc
字号:
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 + -