📄 m_supertank.pas
字号:
if (damage <= 10) then
begin
gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM,0);
self^.monsterinfo.currentmove := @supertank_move_pain1;
end
else if (damage <= 25) then
begin
gi.sound (self, CHAN_VOICE, sound_pain3, 1, ATTN_NORM,0);
self^.monsterinfo.currentmove := @supertank_move_pain2;
end
else
begin
gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM,0);
self^.monsterinfo.currentmove := @supertank_move_pain3;
end;
end;
procedure supertankRocket (self : edict_p); cdecl;
var
forward_, right,
start,
dir,
vec : vec3_t;
flash_number : integer;
begin
if (self^.s.frame = FRAME_attak2_8) then
flash_number := MZ2_SUPERTANK_ROCKET_1
else if (self^.s.frame = FRAME_attak2_11) then
flash_number := MZ2_SUPERTANK_ROCKET_2
else //idsoft (self->s.frame == FRAME_attak2_14)
flash_number := MZ2_SUPERTANK_ROCKET_3;
AngleVectors (self^.s.angles, @forward_, @right, Nil);
G_ProjectSource (self^.s.origin, monster_flash_offset[flash_number], forward_, right, start);
VectorCopy (self^.enemy^.s.origin, vec);
vec[2] := vec[2] + self^.enemy^.viewheight;
VectorSubtract (vec, start, dir);
VectorNormalize (dir);
monster_fire_rocket (self, start, dir, 50, 500, flash_number);
end;
procedure supertankMachineGun (self : edict_p); cdecl;
var
dir,
vec,
start,
forward_, right : vec3_t;
flash_number : integer;
begin
flash_number := MZ2_SUPERTANK_MACHINEGUN_1 + (self^.s.frame - FRAME_attak1_1);
//FIXME!!!
dir[0] := 0;
dir[1] := self^.s.angles[1];
dir[2] := 0;
AngleVectors (dir, @forward_, @right, Nil);
G_ProjectSource (self^.s.origin, monster_flash_offset[flash_number], forward_, right, start);
if (self^.enemy <> nil) then
begin
VectorCopy (self^.enemy^.s.origin, vec);
VectorMA (vec, 0, self^.enemy^.velocity, vec);
vec[2] := vec[2] + self^.enemy^.viewheight;
VectorSubtract (vec, start, forward_);
VectorNormalize (forward_);
end;
monster_fire_bullet (self, start, forward_, 6, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, flash_number);
end;
procedure supertank_attack (self : edict_p); cdecl;
var
vec : vec3_t;
range : single;
//single r;
begin
VectorSubtract (self^.enemy^.s.origin, self^.s.origin, vec);
range := VectorLength (vec);
//r = _random();
// Attack 1 == Chaingun
// Attack 2 == Rocket Launcher
if (range <= 160) then
self^.monsterinfo.currentmove := @supertank_move_attack1
else begin
// fire rockets more often at distance
if (_random() < 0.3) then
self^.monsterinfo.currentmove := @supertank_move_attack1
else
self^.monsterinfo.currentmove := @supertank_move_attack2;
end;
end;
//
// death
//
procedure supertank_dead (self : edict_p); cdecl;
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 BossExplode (self : edict_p); cdecl;
var
org : vec3_t;
n : integer;
begin
self^.think := BossExplode;
VectorCopy (self^.s.origin, org);
org[2] := org[2] + 24 + (rand() AND 15);
// switch (self->count++)
Case self^.count of
0: begin
org[0] := org[0] -24;
org[1] := org[1] -24;
end;
1: begin
org[0] := org[0] +24;
org[1] := org[1] +24;
end;
2: begin
org[0] := org[0] +24;
org[1] := org[1] -24;
end;
3: begin
org[0] := org[0] -24;
org[1] := org[1] +24;
end;
4: begin
org[0] := org[0] -48;
org[1] := org[1] -48;
end;
5: begin
org[0] := org[0] +48;
org[1] := org[1] +48;
end;
6: begin
org[0] := org[0] -48;
org[1] := org[1] +48;
end;
7: begin
org[0] := org[0] +48;
org[1] := org[1] -48;
end;
8: begin
self^.s.sound := 0;
for n:= 0 to 3 do
ThrowGib (self, 'models/objects/gibs/sm_meat/tris.md2', 500, GIB_ORGANIC);
for n:= 0 to 7 do
ThrowGib (self, 'models/objects/gibs/sm_metal/tris.md2', 500, GIB_METALLIC);
ThrowGib (self, 'models/objects/gibs/chest/tris.md2', 500, GIB_ORGANIC);
ThrowHead (self, 'models/objects/gibs/gear/tris.md2', 500, GIB_METALLIC);
self^.deadflag := DEAD_DEAD;
Exit;
end;
end; //case
Inc (self.count); //case
gi.WriteByte (svc_temp_entity);
gi.WriteByte (Ord(TE_EXPLOSION1));
gi.WritePosition (org);
gi.multicast (@self^.s.origin, MULTICAST_PVS);
self^.nextthink := level.time + 0.1;
end;
procedure supertank_die (self, inflictor, attacker : edict_p; damage : integer; const point : vec3_t); cdecl;
begin
gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
self^.deadflag := DEAD_DEAD;
self^.takedamage := DAMAGE_NO;
self^.count := 0;
self^.monsterinfo.currentmove := @supertank_move_death;
end;
//
// monster_supertank
//
{*QUAKED monster_supertank (1 .5 0) (-64 -64 0) (64 64 72) Ambush Trigger_Spawn Sight
*}
procedure SP_monster_supertank (self : edict_p);
begin
if (deathmatch^.Value <> 0) then
begin
G_FreeEdict (self);
Exit;
end;
sound_pain1 := gi.soundindex ('bosstank/btkpain1.wav');
sound_pain2 := gi.soundindex ('bosstank/btkpain2.wav');
sound_pain3 := gi.soundindex ('bosstank/btkpain3.wav');
sound_death := gi.soundindex ('bosstank/btkdeth1.wav');
sound_search1 := gi.soundindex ('bosstank/btkunqv1.wav');
sound_search2 := gi.soundindex ('bosstank/btkunqv2.wav');
//idsoft self->s.sound = gi.soundindex ("bosstank/btkengn1.wav");
tread_sound := gi.soundindex ('bosstank/btkengn1.wav');
self^.movetype := MOVETYPE_STEP;
self^.solid := SOLID_BBOX;
self^.s.modelindex := gi.modelindex ('models/monsters/boss1/tris.md2');
VectorSet (self^.mins, -64, -64, 0);
VectorSet (self^.maxs, 64, 64, 112);
self^.health := 1500;
self^.gib_health := -500;
self^.mass := 800;
self^.pain := supertank_pain;
self^.die := supertank_die;
self^.monsterinfo.stand := supertank_stand;
self^.monsterinfo.walk := supertank_walk;
self^.monsterinfo.run := supertank_run;
self^.monsterinfo.dodge := nil;
self^.monsterinfo.attack := supertank_attack;
self^.monsterinfo.search := supertank_search;
self^.monsterinfo.melee := nil;
self^.monsterinfo.sight := nil;
gi.linkentity (self);
self^.monsterinfo.currentmove := @supertank_move_stand;
self^.monsterinfo.scale := MODEL_SCALE;
walkmonster_start(self);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -