📄 m_supertank.pas
字号:
self.pain_debounce_time := level.time + 3;
if (skill.value = 3) then
Exit; // no pain anims in nightmare
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
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
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) 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
procedure supertank_attack (self : edict_p);
var
vec : vec3_t;
range : float;
//float 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;//procedure
//
// 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
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()&15);
org[2] := org[2] +24 + random(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 (TE_EXPLOSION1);
gi.WritePosition (org);
gi.multicast (self.s.origin, MULTICAST_PVS);
self.nextthink := level.time + 0.1;
end;//procedure
procedure supertank_die (self, inflictor, attacker : edict_p; damage : integer; point : vec3_t);
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;//procedure
//
// 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) 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 := NULL;
self.monsterinfo.attack := @supertank_attack;
self.monsterinfo.search := @supertank_search;
self.monsterinfo.melee := NULL;
self.monsterinfo.sight := NULL;
gi.linkentity (self);
self.monsterinfo.currentmove := @supertank_move_stand;
self.monsterinfo.scale := MODEL_SCALE;
walkmonster_start(self);
end;//procedure
// End of file
end.
{This is COMMON problem
C-code
procedure AAA (edict_t *self, edict_t *other);
PAS1:
procedure AAA (self, other : edict_p);
PAS2:
procedure AAA (const self, other : edict_t);
PAS3:
procedure AAA (self, other : edict_t);
}
2) NULL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -