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

📄 g_misc.pas

📁 delphi编的不错的贪吃蛇
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  ratio := other.mass / self.mass;
  VectorSubtract(self.s.origin, other.s.origin, v);
  M_walkmove(self, vectoyaw(v), 20 * ratio * FRAMETIME);
end;

procedure barrel_explode(self: edict_p); cdecl;
Var org: vec3_t; spd: Single; save: vec3_t;
begin
  T_RadiusDamage (self, self.activator, self.dmg, Nil, self.dmg+40, MOD_BARREL);

  VectorCopy(self.s.origin, save);
  VectorMA(self.absmin, 0.5, self.size, self.s.origin);

  // a few big chunks
  spd := 1.5 * self.dmg / 200;
  org[0] := self.s.origin[0] + crandom() * self.size[0];
  org[1] := self.s.origin[1] + crandom() * self.size[1];
  org[2] := self.s.origin[2] + crandom() * self.size[2];
  ThrowDebris(self, 'models/objects/debris1/tris.md2', spd, org);
  org[0] := self.s.origin[0] + crandom() * self.size[0];
  org[1] := self.s.origin[1] + crandom() * self.size[1];
  org[2] := self.s.origin[2] + crandom() * self.size[2];
  ThrowDebris(self, 'models/objects/debris1/tris.md2', spd, org);

  // bottom corners
  spd := 1.75 * self.dmg / 200;
  VectorCopy(self.absmin, org);
  ThrowDebris(self, 'models/objects/debris3/tris.md2', spd, org);
  VectorCopy(self.absmin, org);
  org[0] := org[0] + self.size[0];
  ThrowDebris(self, 'models/objects/debris3/tris.md2', spd, org);
  VectorCopy(self.absmin, org);
  org[1] := org[1] + self.size[1];
  ThrowDebris(self, 'models/objects/debris3/tris.md2', spd, org);
  VectorCopy(self.absmin, org);
  org[0] := org[0] + self.size[0];
  org[1] := org[1] + self.size[1];
  ThrowDebris(self, 'models/objects/debris3/tris.md2', spd, org);

  // a bunch of little chunks
  spd := 2 * self.dmg / 200;
  org[0] := self.s.origin[0] + crandom() * self.size[0];
  org[1] := self.s.origin[1] + crandom() * self.size[1];
  org[2] := self.s.origin[2] + crandom() * self.size[2];
  ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
  org[0] := self.s.origin[0] + crandom() * self.size[0];
  org[1] := self.s.origin[1] + crandom() * self.size[1];
  org[2] := self.s.origin[2] + crandom() * self.size[2];
  ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
  org[0] := self.s.origin[0] + crandom() * self.size[0];
  org[1] := self.s.origin[1] + crandom() * self.size[1];
  org[2] := self.s.origin[2] + crandom() * self.size[2];
  ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
  org[0] := self.s.origin[0] + crandom() * self.size[0];
  org[1] := self.s.origin[1] + crandom() * self.size[1];
  org[2] := self.s.origin[2] + crandom() * self.size[2];
  ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
  org[0] := self.s.origin[0] + crandom() * self.size[0];
  org[1] := self.s.origin[1] + crandom() * self.size[1];
  org[2] := self.s.origin[2] + crandom() * self.size[2];
  ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
  org[0] := self.s.origin[0] + crandom() * self.size[0];
  org[1] := self.s.origin[1] + crandom() * self.size[1];
  org[2] := self.s.origin[2] + crandom() * self.size[2];
  ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
  org[0] := self.s.origin[0] + crandom() * self.size[0];
  org[1] := self.s.origin[1] + crandom() * self.size[1];
  org[2] := self.s.origin[2] + crandom() * self.size[2];
  ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
  org[0] := self.s.origin[0] + crandom() * self.size[0];
  org[1] := self.s.origin[1] + crandom() * self.size[1];
  org[2] := self.s.origin[2] + crandom() * self.size[2];
  ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);

  VectorCopy(save, self.s.origin);
  if self.groundentity<>Nil then
    BecomeExplosion2(self)
  else
    BecomeExplosion1(self);
end;

procedure barrel_delay(self, inflictor, attacker: edict_p; damage: Integer; point: vec3_t); cdecl;
begin
  self.takedamage := DAMAGE_NO;
  self.nextthink := level.time + 2 * FRAMETIME;
  self.think := barrel_explode;
  self.activator := attacker;
end;

procedure SP_misc_explobox(self: edict_p); cdecl;
begin
  if deathmatch.value<>0 then begin  // auto-remove for deathmatch
    G_FreeEdict(self);
    exit;
  end;

  gi.modelindex('models/objects/debris1/tris.md2');
  gi.modelindex('models/objects/debris2/tris.md2');
  gi.modelindex('models/objects/debris3/tris.md2');

  self.solid := SOLID_BBOX;
  self.movetype := MOVETYPE_STEP;

  self.model := 'models/objects/barrels/tris.md2';
  self.s.modelindex := gi.modelindex(self.model);
  VectorSet(self.mins, -16, -16, 0);
  VectorSet(self.maxs, 16, 16, 40);

  if self.mass = 0 then
    self.mass := 400;
  if self.health = 0 then
    self.health := 10;
  if self.dmg = 0 then
    self.dmg := 150;

  self.die := barrel_delay;
  self.takedamage := DAMAGE_YES;
  self.monsterinfo.aiflags := AI_NOSTEP;

  self.touch := barrel_touch;

  self.think := M_droptofloor;
  self.nextthink := level.time + 2 * FRAMETIME;

  gi.linkentity(self);
end;


//
// miscellaneous specialty items
//

(*QUAKED misc_blackhole (1 .5 0) (-8 -8 -8) (8 8 8)
*)

procedure misc_blackhole_use(ent, other, activator: edict_p); cdecl;
begin
  (*
  gi.WriteByte(svc_temp_entity);
  gi.WriteByte(TE_BOSSTPORT);
  gi.WritePosition(ent.s.origin);
  gi.multicast(ent.s.origin, MULTICAST_PVS);
  *)
  G_FreeEdict(ent);
end;

procedure misc_blackhole_think(self: edict_p); cdecl;
begin
  Inc(self.s.frame);
  if self.s.frame < 19 then
    self.nextthink := level.time + FRAMETIME
  else begin
    self.s.frame := 0;
    self.nextthink := level.time + FRAMETIME;
  end;
end;

procedure SP_misc_blackhole(ent: edict_p); cdecl;
begin
  ent.movetype := MOVETYPE_NONE;
  ent.solid := SOLID_NOT;
  VectorSet (ent.mins, -64, -64, 0);
  VectorSet (ent.maxs, 64, 64, 8);
  ent.s.modelindex := gi.modelindex('models/objects/black/tris.md2');
  ent.s.renderfx := RF_TRANSLUCENT;
  ent.use := misc_blackhole_use;
  ent.think := misc_blackhole_think;
  ent.nextthink := level.time + 2 * FRAMETIME;
  gi.linkentity(ent);
end;

(*QUAKED misc_eastertank (1 .5 0) (-32 -32 -16) (32 32 32)
*)

procedure misc_eastertank_think(self: edict_p); cdecl;
begin
  Inc (self.s.frame);
  if self.s.frame < 293 then
    self.nextthink := level.time + FRAMETIME
  else begin
    self.s.frame := 254;
    self.nextthink := level.time + FRAMETIME;
  end;
end;

procedure SP_misc_eastertank(ent: edict_p); cdecl;
begin
  ent.movetype := MOVETYPE_NONE;
  ent.solid := SOLID_BBOX;
  VectorSet (ent.mins, -32, -32, -16);
  VectorSet (ent.maxs, 32, 32, 32);
  ent.s.modelindex := gi.modelindex ('models/monsters/tank/tris.md2');
  ent.s.frame := 254;
  ent.think := misc_eastertank_think;
  ent.nextthink := level.time + 2 * FRAMETIME;
  gi.linkentity (ent);
end;

(*QUAKED misc_easterchick (1 .5 0) (-32 -32 0) (32 32 32)
*)


procedure misc_easterchick_think(self: edict_p); cdecl;
begin
  Inc(self.s.frame);
  if self.s.frame < 247 then
    self.nextthink := level.time + FRAMETIME
  else begin
    self.s.frame := 208;
    self.nextthink := level.time + FRAMETIME;
  end;
end;

procedure SP_misc_easterchick(ent: edict_p); cdecl;
begin
  ent.movetype := MOVETYPE_NONE;
  ent.solid := SOLID_BBOX;
  VectorSet (ent.mins, -32, -32, 0);
  VectorSet (ent.maxs, 32, 32, 32);
  ent.s.modelindex := gi.modelindex ('models/monsters/bitch/tris.md2');
  ent.s.frame := 208;
  ent.think := misc_easterchick_think;
  ent.nextthink := level.time + 2 * FRAMETIME;
  gi.linkentity(ent);
end;

(*QUAKED misc_easterchick2 (1 .5 0) (-32 -32 0) (32 32 32)
*)


procedure misc_easterchick2_think (self: edict_p); cdecl;
begin
  Inc(self.s.frame);
  if self.s.frame < 287 then
    self.nextthink := level.time + FRAMETIME
  else begin
    self.s.frame := 248;
    self.nextthink := level.time + FRAMETIME;
  end;
end;

procedure SP_misc_easterchick2(ent: edict_p); cdecl;
begin
  ent.movetype := MOVETYPE_NONE;
  ent.solid := SOLID_BBOX;
  VectorSet (ent.mins, -32, -32, 0);
  VectorSet (ent.maxs, 32, 32, 32);
  ent.s.modelindex := gi.modelindex ('models/monsters/bitch/tris.md2');
  ent.s.frame := 248;
  ent.think := misc_easterchick2_think;
  ent.nextthink := level.time + 2 * FRAMETIME;
  gi.linkentity(ent);
end;


(*QUAKED monster_commander_body (1 .5 0) (-32 -32 0) (32 32 48)
Not really a monster, this is the Tank Commander's decapitated body.
There should be a item_commander_head that has this as it's target.
*)

procedure commander_body_think(self: edict_p); cdecl;
begin
  Inc (self.s.frame);
  if self.s.frame < 24 then
    self.nextthink := level.time + FRAMETIME
  else
    self.nextthink := 0;

  if self.s.frame = 22 then
    gi.sound(self, CHAN_BODY, gi.soundindex('tank/thud.wav'), 1, ATTN_NORM, 0);
end;

procedure commander_body_use(self, other, activator: edict_p); cdecl;
begin
  self.think := commander_body_think;
  self.nextthink := level.time + FRAMETIME;
  gi.sound (self, CHAN_BODY, gi.soundindex ('tank/pain.wav'), 1, ATTN_NORM, 0);
end;

procedure commander_body_drop(self: edict_p); cdecl;
begin
  self.movetype := MOVETYPE_TOSS;
  self.s.origin[2] := self.s.origin[2] + 2;
end;

procedure SP_monster_commander_body(self: edict_p); cdecl;
begin
  self.movetype := MOVETYPE_NONE;
  self.solid := SOLID_BBOX;
  self.model := 'models/monsters/commandr/tris.md2';
  self.s.modelindex := gi.modelindex (self.model);
  VectorSet (self.mins, -32, -32, 0);
  VectorSet (self.maxs, 32, 32, 48);
  self.use := commander_body_use;
  self.takedamage := DAMAGE_YES;
  self.flags := FL_GODMODE;
  self.s.renderfx := self.s.renderfx OR RF_FRAMELERP;
  gi.linkentity (self);

  gi.soundindex ('tank/thud.wav');
  gi.soundindex ('tank/pain.wav');

  self.think := commander_body_drop;
  self.nextthink := level.time + 5 * FRAMETIME;
end;


(*QUAKED misc_banner (1 .5 0) (-4 -4 -4) (4 4 4)
The origin is the bottom of the banner.
The banner is 128 tall.
*)
procedure misc_banner_think(ent: edict_p); cdecl;
begin
  ent.s.frame := (ent.s.frame + 1) mod 16;
  ent.nextthink := level.time + FRAMETIME;
end;

procedure SP_misc_banner(ent: edict_p); cdecl;
begin
  ent.movetype := MOVETYPE_NONE;
  ent.solid := SOLID_NOT;
  ent.s.modelindex := gi.modelindex ('models/objects/banner/tris.md2');
  ent.s.frame := System.Random(16);
  gi.linkentity (ent);

  ent.think := misc_banner_think;
  ent.nextthink := level.time + FRAMETIME;
end;

(*QUAKED misc_deadsoldier (1 .5 0) (-16 -16 0) (16 16 16) ON_BACK ON_STOMACH BACK_DECAP FETAL_POS SIT_DECAP IMPALED
This is the dead player model. Comes in 6 exciting different poses!
*)
procedure misc_deadsoldier_die(self, inflictor, attacker: edict_p; damage: Integer; point: vec3_t); cdecl;
Var n: Integer;
begin
  if self.health > -80 then
    exit;

  gi.sound (self, CHAN_BODY, gi.soundindex ('misc/udeath.wav'), 1, ATTN_NORM, 0);
  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);
end;

procedure SP_misc_deadsoldier(ent: edict_p); cdecl;
begin
  if deathmatch.value <> 0 then begin  // auto-remove for deathmatch
    G_FreeEdict (ent);
    exit;
  end;

  ent.movetype := MOVETYPE_NONE;
  ent.solid := SOLID_BBOX;
  ent.s.modelindex:=gi.modelindex('models/deadbods/dude/tris.md2');

  // Defaults to frame 0
  if (ent.spawnflags AND 2)>0 then
    ent.s.frame := 1
  else if (ent.spawnflags AND 4)>0 then
    ent.s.frame := 2
  else if (ent.spawnflags AND 8)>0 then
    ent.s.frame := 3
  else if (ent.spawnflags AND 16)>0 then
    ent.s.frame := 4
  else if (ent.spawnflags AND 32)>0 then
    ent.s.frame := 5
  else
    ent.s.frame := 0;

  VectorSet(ent.mins, -16, -16, 0);
  VectorSet(ent.maxs, 16, 16, 16);
  ent.deadflag := DEAD_DEAD;
  ent.takedamage := DAMAGE_YES;
  ent.svflags := ent.svflags OR SVF_MONSTER OR SVF_DEADMONSTER;
  ent.die := misc_deadsoldier_die;
  ent.monsterinfo.aiflags := ent.monsterinfo.aiflags OR AI_GOOD_GUY;

  gi.linkentity (ent);
end;

(*QUAKED misc_viper (1 .5 0) (-16 -16 0) (16 16 32)
This is the Viper for the flyby bombing.
It is trigger_spawned, so you must have something use it for it to show up.
There must be a path for it to follow once it is activated.

'speed'    How fast the Viper should fly
*)

procedure misc_viper_use(self, other, activator: edict_p); cdecl;
begin
  self.svflags := self.svflags AND NOT SVF_NOCLIENT;
  self.use := train_use;
  train_use (self, other, activator);
end;

procedure SP_misc_viper (ent: edict_p); cdecl;
begin
  if ent.target=Nil then begin
    gi_dprintf('misc_viper without a target at %s'#10, [vtos(ent.absmin)]);
    G_FreeEdict(ent);
    exit;
  end;

  if ent.speed = 0 then
    ent.speed := 300;

  ent.movetype := MOVETYPE_PUSH;
  ent.solid := SOLID_NOT;
  ent.s.modelindex := gi.modelindex('models/ships/viper/tris.md2');
  VectorSet(ent.mins, -16, -16, 0);
  VectorSet(ent.maxs, 16, 16, 32);

  ent.think := func_train_find;
  ent.nextthink := level.time + FRAMETIME;
  ent.use := misc_viper_use;
  ent.svflags := ent.svflags OR SVF_NOCLIENT;
  ent.moveinfo.accel := ent.speed;
  ent.moveinfo.decel := ent.speed;
  ent.moveinfo.speed := ent.speed;

  gi.linkentity(ent);
end;


(*QUAKED misc_bigviper (1 .5 0) (-176 -120 -24) (176 120 72) 
This is a large stationary viper as seen in Paul's intro
*)
procedure SP_misc_bigviper(ent: edict_p); cdecl;
begin
  ent.movetype := MOVETYPE_NONE;
  ent.solid := SOLID_BBOX;
  VectorSet(ent.mins, -176, -120, -24);
  VectorSet(ent.maxs, 176, 120, 72);
  ent.s.modelindex := gi.modelindex('models/ships/bigviper/tris.md2');
  gi.linkentity(ent);
end;


(*QUAKED misc_viper_bomb (1 0 0) (-8 -8 -8) (8 8 8)
'dmg'  how much boom should the bomb make?
*)
procedure misc_viper_bomb_touch(self, other: edict_p; plane: cplane_p; surf: csurface_p); cdecl;
begin
  G_UseTargets (self, self.activator);

  self.s.origin[2] := self.absmin[2] + 1;
  T_RadiusDamage(self, self, self.dmg, Nil, self.dmg+40, MOD_BOMB);
  BecomeExplosion2(self);
end;

procedure misc_viper_bomb_prethink(self: edict_p); cdecl;
Var v: vec3_t; diff: Single;
begin
  self.groundentity := Nil;

  diff := self.timestamp - level.time;
  if diff < -1.0 then
    diff := -1.0;

  VectorScale(self.moveinfo.dir, 1.0 + diff, v);
  v[2] := diff;

  diff := self.s.angles[2];
  vectoangles(v, self.s.angles);
  self.s.angles[2] := diff + 10;
end;

procedure misc_viper_bomb_use(self, other, activator: edict_p); cdecl;
Var viper: edict_p;
begin
  self.solid := SOLID_BBOX;
  self.svflags := self.svflags AND NOT SVF_NOCLIENT;
  self.s.effects := self.s.effects OR EF_ROCKET;
  self.use := Nil;
  self.movetype := MOVETYPE_TOSS;
  self.prethink := misc_viper_bomb_prethink;
  self.touch := misc_viper_bomb_touch;
  self.activator := activator;

  viper := G_Find(Nil, FOFS_classname, 'misc_viper');
  VectorScale (viper.moveinfo.dir, viper.moveinfo.speed, self.velocity);

  self.timestamp := level.time;
  VectorCopy (viper.moveinfo.dir, self.moveinfo.dir);
end;

procedure SP_misc_viper_bomb(self: edict_p); cdecl;

⌨️ 快捷键说明

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