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

📄 m_supertank.pas

📁 雷神之锤2(Quake2)Delphi源码
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  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 + -