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

📄 m_berserk.pas

📁 delphi编的不错的贪吃蛇
💻 PAS
📖 第 1 页 / 共 2 页
字号:
     (aifunc:ai_stand; dist:0; thinkfunc:nil),
     (aifunc:ai_stand; dist:0; thinkfunc:nil),
     (aifunc:ai_stand; dist:0; thinkfunc:nil),
     (aifunc:ai_stand; dist:0; thinkfunc:nil),
     (aifunc:ai_stand; dist:0; thinkfunc:nil),
     (aifunc:ai_stand; dist:0; thinkfunc:nil));

  berserk_move_stand_fidget : mmove_t =
    (firstframe:FRAME_standb1; lastframe:FRAME_standb20; frame:@berserk_frames_stand_fidget; endfunc:berserk_stand);

procedure berserk_fidget(self : edict_p);
begin
  if (self.monsterinfo.aiflags and AI_STAND_GROUND) <> 0 then
    exit;
  if (_random() > 0.15) then
    exit;

  self.monsterinfo.currentmove := @berserk_move_stand_fidget;
  gi.sound(self, CHAN_WEAPON, sound_idle, 1, ATTN_IDLE, 0);
end;

const
  berserk_frames_walk : Array[0..11] of mframe_t =
    ((aifunc:ai_walk; dist:9.1; thinkfunc:nil),
     (aifunc:ai_walk; dist:6.3; thinkfunc:nil),
     (aifunc:ai_walk; dist:4.9; thinkfunc:nil),
     (aifunc:ai_walk; dist:6.7; thinkfunc:nil),
     (aifunc:ai_walk; dist:6.0; thinkfunc:nil),
     (aifunc:ai_walk; dist:8.2; thinkfunc:nil),
     (aifunc:ai_walk; dist:7.2; thinkfunc:nil),
     (aifunc:ai_walk; dist:6.1; thinkfunc:nil),
     (aifunc:ai_walk; dist:4.9; thinkfunc:nil),
     (aifunc:ai_walk; dist:4.7; thinkfunc:nil),
     (aifunc:ai_walk; dist:4.7; thinkfunc:nil),
     (aifunc:ai_walk; dist:4.8; thinkfunc:nil));

  berserk_move_walk : mmove_t =
    (firstframe:FRAME_walkc1; lastframe:FRAME_walkc11; frame:@berserk_frames_walk; endfunc:nil);

procedure berserk_walk(self : edict_p); cdecl;
begin
  self.monsterinfo.currentmove := @berserk_move_walk;
end;

{

  *****************************
  SKIPPED THIS FOR NOW!
  *****************************

   Running -> Arm raised in air    }

//void()	berserk_runb1	=[	$r_att1 ,	berserk_runb2	] {ai_run(21);};
//void()	berserk_runb2	=[	$r_att2 ,	berserk_runb3	] {ai_run(11);};
//void()	berserk_runb3	=[	$r_att3 ,	berserk_runb4	] {ai_run(21);};
//void()	berserk_runb4	=[	$r_att4 ,	berserk_runb5	] {ai_run(25);};
//void()	berserk_runb5	=[	$r_att5 ,	berserk_runb6	] {ai_run(18);};
//void()	berserk_runb6	=[	$r_att6 ,	berserk_runb7	] {ai_run(19);};
// running with arm in air : start loop
//void()	berserk_runb7	=[	$r_att7 ,	berserk_runb8	] {ai_run(21);};
//void()	berserk_runb8	=[	$r_att8 ,	berserk_runb9	] {ai_run(11);};
//void()	berserk_runb9	=[	$r_att9 ,	berserk_runb10	] {ai_run(21);};
//void()	berserk_runb10	=[	$r_att10 ,	berserk_runb11	] {ai_run(25);};
//void()	berserk_runb11	=[	$r_att11 ,	berserk_runb12	] {ai_run(18);};
//void()	berserk_runb12	=[	$r_att12 ,	berserk_runb7	] {ai_run(19);};
// running with arm in air : end loop

const
  berserk_frames_run1 : Array[0..5] of mframe_t =
    ((aifunc:ai_run; dist:21; thinkfunc:nil),
     (aifunc:ai_run; dist:11; thinkfunc:nil),
     (aifunc:ai_run; dist:21; thinkfunc:nil),
     (aifunc:ai_run; dist:25; thinkfunc:nil),
     (aifunc:ai_run; dist:18; thinkfunc:nil),
     (aifunc:ai_run; dist:19; thinkfunc:nil));

  berserk_move_run1 : mmove_t =
    (firstframe:FRAME_run1; lastframe:FRAME_run6; frame:@berserk_frames_run1; endfunc:nil);

procedure berserk_run(self : edict_p); cdecl;
begin
  if (self.monsterinfo.aiflags and AI_STAND_GROUND) <> 0 then
    self.monsterinfo.currentmove := @berserk_move_stand
  else
    self.monsterinfo.currentmove := @berserk_move_run1;
end;

procedure berserk_attack_spike(self : edict_p); cdecl;
var
  aim : vec3_t;
begin
  aim[0] := MELEE_DISTANCE;
  aim[1] := 0;
  aim[2] :=  -24;
  fire_hit(Self, aim, (15 + (rand() mod 6)), 400); // Faster attack -- upwards and backwards
end;

procedure berserk_swing(self : edict_p); cdecl;
begin
  gi.sound(self, CHAN_WEAPON, sound_punch, 1, ATTN_NORM, 0);
end;

const
  berserk_frames_attack_spike : Array[0..7] of mframe_t =
    ((aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:berserk_swing),
     (aifunc:ai_charge; dist:0; thinkfunc:berserk_attack_spike),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:nil));

  berserk_move_attack_spike : mmove_t =
    (firstframe:FRAME_att_c1; lastframe:FRAME_att_c8; frame:@berserk_frames_attack_spike; endfunc:berserk_run);

procedure berserk_attack_club(self : edict_p); cdecl;
var
  aim : vec3_t;
begin
  VectorSet(aim, MELEE_DISTANCE, self.mins[0], -4);
  fire_hit(Self, aim, (5 + (rand() mod 6)), 400);		// Slower attack
end;

const
  berserk_frames_attack_club : Array[0..11] of mframe_t =
    ((aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:berserk_swing),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:berserk_attack_club),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:nil),
     (aifunc:ai_charge; dist:0; thinkfunc:nil));

  berserk_move_attack_club : mmove_t =
    (firstframe:FRAME_att_c9; lastframe:FRAME_att_c20; frame:@berserk_frames_attack_club; endfunc:berserk_run);

procedure berserk_strike(self : edict_p); cdecl;
begin
  //FIXME play impact sound
end;

const
  berserk_frames_attack_strike : Array[0..13] of mframe_t =
    ((aifunc:ai_move; dist:0;    thinkfunc:nil),
     (aifunc:ai_move; dist:0;    thinkfunc:nil),
     (aifunc:ai_move; dist:0;    thinkfunc:nil),
     (aifunc:ai_move; dist:0;    thinkfunc:berserk_swing),
     (aifunc:ai_move; dist:0;    thinkfunc:nil),
     (aifunc:ai_move; dist:0;    thinkfunc:nil),
     (aifunc:ai_move; dist:0;    thinkfunc:nil),
     (aifunc:ai_move; dist:0;    thinkfunc:berserk_strike),
     (aifunc:ai_move; dist:0;    thinkfunc:nil),
     (aifunc:ai_move; dist:0;    thinkfunc:nil),
     (aifunc:ai_move; dist:0;    thinkfunc:nil),
     (aifunc:ai_move; dist:0;    thinkfunc:nil),
     (aifunc:ai_move; dist:9.7;  thinkfunc:nil),
     (aifunc:ai_move; dist:13.6; thinkfunc:nil));

  berserk_move_attack_strike : mmove_t =
    (firstframe:FRAME_att_c21; lastframe:FRAME_att_c34; frame:@berserk_frames_attack_strike; endfunc:berserk_run);

procedure berserk_melee(self : edict_p); cdecl;
begin
  if (rand() mod 2) = 0 then
    self.monsterinfo.currentmove := @berserk_move_attack_spike
  else
    self.monsterinfo.currentmove := @berserk_move_attack_club;
end;


{
//void() 	berserk_atke1	=[	$r_attb1,	berserk_atke2	] {ai_run(9);;}
//void() 	berserk_atke2	=[	$r_attb2,	berserk_atke3	] {ai_run(6);};
//void() 	berserk_atke3	=[	$r_attb3,	berserk_atke4	] {ai_run(18.4);};
//void() 	berserk_atke4	=[	$r_attb4,	berserk_atke5	] {ai_run(25);};
//void() 	berserk_atke5	=[	$r_attb5,	berserk_atke6	] {ai_run(14);};
//void() 	berserk_atke6	=[	$r_attb6,	berserk_atke7	] {ai_run(20);};
//void() 	berserk_atke7	=[	$r_attb7,	berserk_atke8	] {ai_run(8.5);};
//void() 	berserk_atke8	=[	$r_attb8,	berserk_atke9	] {ai_run(3);};
//void() 	berserk_atke9	=[	$r_attb9,	berserk_atke10	] {ai_run(17.5);};
//void() 	berserk_atke10	=[	$r_attb10,	berserk_atke11	] {ai_run(17);};
//void() 	berserk_atke11	=[	$r_attb11,	berserk_atke12	] {ai_run(9);};
//void() 	berserk_atke12	=[	$r_attb12,	berserk_atke13	] {ai_run(25);};
//void() 	berserk_atke13	=[	$r_attb13,	berserk_atke14	] {ai_run(3.7);};
//void() 	berserk_atke14	=[	$r_attb14,	berserk_atke15	] {ai_run(2.6);};
//void() 	berserk_atke15	=[	$r_attb15,	berserk_atke16	] {ai_run(19);};
//void() 	berserk_atke16	=[	$r_attb16,	berserk_atke17	] {ai_run(25);};
//void() 	berserk_atke17	=[	$r_attb17,	berserk_atke18	] {ai_run(19.6);};
//void() 	berserk_atke18	=[	$r_attb18,	berserk_run1	] {ai_run(7.8);};


const
  berserk_frames_pain1 : Array[0..3] of mframe_t =
    ((aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil));

  berserk_move_pain1 : mmove_t =
    (firstframe:FRAME_painc1; lastframe:FRAME_painc4; frame:@berserk_frames_pain1; endfunc:berserk_run);

  berserk_frames_pain2 : Array[0..19] of mframe_t =
    ((aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil));

  berserk_move_pain2 : mmove_t =
    (firstframe:FRAME_painb1; lastframe:FRAME_painb20; frame:@berserk_frames_pain2; endfunc:berserk_run);

procedure berserk_pain(self, other : edict_p; kick : single; damage : integer); cdecl;
begin
  if (self.health < (self.max_health / 2)) then
    self.s.skinnum := 1;

  if (level.time < self.pain_debounce_time) then
    exit;

  self.pain_debounce_time := level.time + 3;
  gi.sound(self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0);

  if skill.value = 3 then
    exit;		// no pain anims in nightmare

  if ((damage < 20) or (_random() < 0.5)) then
    self.monsterinfo.currentmove := @berserk_move_pain1
	else
    self.monsterinfo.currentmove := @berserk_move_pain2;
end;

procedure berserk_dead(self : edict_p); cdecl;
begin
  VectorSet(self.mins, -16, -16, -24);
  VectorSet(self.maxs,  16,  16,  -8);
  self.movetype := MOVETYPE_TOSS;
  self.svflags := self.svflags or SVF_DEADMONSTER;
  self.nextthink := 0;
  gi.linkentity(self);
end;

const
  berserk_frames_death1 : Array[0..12] of mframe_t =
    ((aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil));

  berserk_move_death1 : mmove_t =
    (firstframe:FRAME_death1; lastframe:FRAME_death13; frame:@berserk_frames_death1; endfunc:berserk_dead);

  berserk_frames_death2 : Array[0..7] of mframe_t =
    ((aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil),
     (aifunc:ai_move; dist:0; thinkfunc:nil));

  berserk_move_death2 : mmove_t =
    (firstframe:FRAME_deathc1; lastframe:FRAME_deathc8; frame:@berserk_frames_death2; endfunc:berserk_dead);

procedure berserk_die(self, inflictor, attacker : edict_p; damage : integer; const point : vec3_t); cdecl;
var
  n : integer;
begin
  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 1 do
      ThrowGib(self, 'models/objects/gibs/bone/tris.md2', damage, GIB_ORGANIC);
    for n := 0 to 3 do
      ThrowGib(self, 'models/objects/gibs/sm_meat/tris.md2', damage, GIB_ORGANIC);
    ThrowHead(self, 'models/objects/gibs/head2/tris.md2', damage, GIB_ORGANIC);
    self.deadflag := DEAD_DEAD;
    exit;
  end;

  if (self.deadflag = DEAD_DEAD) then
    exit;

  gi.sound(self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0);
  self.deadflag := DEAD_DEAD;
  self.takedamage := DAMAGE_YES;

  if damage >= 50 then
    self.monsterinfo.currentmove := @berserk_move_death1
  else
    self.monsterinfo.currentmove := @berserk_move_death2;
end;


{QUAKED monster_berserk (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
}
procedure SP_monster_berserk(self : edict_p);
begin
  if (deathmatch.Value <> 0) then
  begin
    G_FreeEdict(self);
    exit;
  end;

  // pre-caches
  sound_pain   := gi.soundindex('berserk/berpain2.wav');
  sound_die    := gi.soundindex('berserk/berdeth2.wav');
  sound_idle   := gi.soundindex('berserk/beridle1.wav');
  sound_punch  := gi.soundindex('berserk/attack.wav');
  sound_search := gi.soundindex('berserk/bersrch1.wav');
  sound_sight  := gi.soundindex('berserk/sight.wav');

  self.s.modelindex := gi.modelindex('models/monsters/berserk/tris.md2');
  VectorSet(self.mins, -16, -16, -24);
  VectorSet(self.maxs,  16,  16,  32);
  self.movetype := MOVETYPE_STEP;
  self.solid    := SOLID_BBOX;

  self.health     := 240;
  self.gib_health := -60;
  self.mass       := 250;

  self.pain := berserk_pain;
  self.die  := berserk_die;

  self.monsterinfo.stand  := berserk_stand;
  self.monsterinfo.walk   := berserk_walk;
  self.monsterinfo.run    := berserk_run;
  self.monsterinfo.dodge  := nil;
  self.monsterinfo.attack := nil;
  self.monsterinfo.melee  := berserk_melee;
  self.monsterinfo.sight  := berserk_sight;
  self.monsterinfo.search := berserk_search;

  self.monsterinfo.currentmove := @berserk_move_stand;
  self.monsterinfo.scale       := MODEL_SCALE;

  gi.linkentity(self);

  walkmonster_start(self);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -