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

📄 m_supertank.pas

📁 delphi编的不错的贪吃蛇
💻 PAS
📖 第 1 页 / 共 3 页
字号:

  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 + -