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

📄 cl_tent.pas

📁 delphi编的不错的贪吃蛇
💻 PAS
📖 第 1 页 / 共 4 页
字号:
    end;
    Inc(b);
  end;
  Com_Printf('beam list overflow!'#10);
  Result := ent;
end;

// ROGUE
{
=========
CL_ParsePlayerBeam
  - adds to the cl_playerbeam array instead of the cl_beams array
=========
}

function CL_ParsePlayerBeam(Model: Model_p): Integer;
var
  Ent: Integer;
  Start, End_, Offset: Vec3_t;
  b: Beam_p;
  I: Integer;
begin
  ent := MSG_ReadShort(net_message);

  MSG_ReadPos(net_message, start);
  MSG_ReadPos(net_message, end_);
  // PMM - network optimization
  if (model = cl_mod_heatbeam) then
    VectorSet(offset, 2, 7, -3)
  else if (model = cl_mod_monster_heatbeam) then
  begin
    model := cl_mod_heatbeam;
    VectorSet(offset, 0, 0, 0);
  end
  else
    MSG_ReadPos(net_message, offset);

  // Com_Printf ('end- %f %f %f'#10, end[0], end[1], end[2]);

  // override any beam with the same entity
  // PMM - For player beams, we only want one per player (entity) so..
  b := @cl_playerbeams;
  for i := 0 to MAX_BEAMS - 1 do
  begin
    if (b^.entity = ent) then
    begin
      b^.entity := ent;
      b^.model := model;
      b^.endtime := cl.time + 200;
      VectorCopy(start, b^.start);
      VectorCopy(end_, b^.end_);
      VectorCopy(offset, b^.offset);
      Result := ent;
      exit;
    end;
    Inc(b);
  end;

  // find a free beam
  b := @cl_playerbeams;
  for i := 0 to MAX_BEAMS - 1 do
  begin
    if (b^.model = nil) or (b^.endtime < cl.time) then
    begin
      b^.entity := ent;
      b^.model := model;
      b^.endtime := cl.time + 100;      // PMM - this needs to be 100 to prevent multiple heatbeams
      VectorCopy(start, b^.start);
      VectorCopy(end_, b^.end_);
      VectorCopy(offset, b^.offset);
      Result := ent;
      exit;
    end;
    Inc(b);
  end;
  Com_Printf('beam list overflow!'#10);
  result := ent;
end;
//rogue

{
=========
CL_ParseLightning
=========
}

function CL_ParseLightning(Model: Model_p): Integer;
var
  srcEnt, destEnt, i: Integer;
  Start, End_: vec3_t;
  b: Beam_p;
begin
  srcEnt := MSG_ReadShort(net_message);
  destEnt := MSG_ReadShort(net_message);

  MSG_ReadPos(net_message, start);
  MSG_ReadPos(net_message, end_);

  // override any beam with the same source AND destination entities
  b := @cl_beams;
  for i := 0 to MAX_BEAMS - 1 do
  begin
    if (b^.entity = srcEnt) and (b^.dest_entity = destEnt) then
    begin
      //  Com_Printf('%d: OVERRIDE  %d ^. %d'#10, cl.time, srcEnt, destEnt);
      b^.entity := srcEnt;
      b^.dest_entity := destEnt;
      b^.model := model;
      b^.endtime := cl.time + 200;
      VectorCopy(start, b^.start);
      VectorCopy(end_, b^.end_);
      VectorClear(b^.offset);
      result := srcEnt;
      exit;
    end;
    Inc(b);
  end;

  // find a free beam
  b := @cl_beams;
  for i := 0 to MAX_BEAMS - 1 do
  begin
    if (b^.model = nil) or (b^.endtime < cl.time) then
    begin
      // Com_Printf('%d: NORMAL  %d ^. %d'#10, cl.time, srcEnt, destEnt);
      b^.entity := srcEnt;
      b^.dest_entity := destEnt;
      b^.model := model;
      b^.endtime := cl.time + 200;
      VectorCopy(start, b^.start);
      VectorCopy(end_, b^.end_);
      VectorClear(b^.offset);
      result := srcEnt;
      exit;
    end;
    Inc(b);
  end;
  Com_Printf('beam list overflow!'#10);
  result := srcEnt;
end;

{
=========
CL_ParseLaser
=========
}

procedure CL_ParseLaser(Colors: Integer);
var
  Start, End_: vec3_t;
  l: laser_p;
  i: Integer;
begin
  MSG_ReadPos(net_message, start);
  MSG_ReadPos(net_message, end_);

  l := @cl_lasers;
  for i := 0 to MAX_LASERS - 1 do
  begin
    if (l.endtime < cl.time) then
    begin
      l.ent.flags := RF_TRANSLUCENT or RF_BEAM;
      VectorCopy(start, vec3_t(l.ent.origin));
      VectorCopy(end_, vec3_t(l.ent.oldorigin));
      l.ent.alpha := 0.30;
      l.ent.skinnum := (colors shr ((rand() mod 4) * 8)) and $FF; // was (rand() % 4)
      l.ent.model := nil;
      l.ent.frame := 4;
      l.endtime := cl.time + 100;
      exit;
    end;
    Inc(l);
  end;
end;

//=======
//ROGUE

procedure CL_ParseSteam;
var
  pos, dir: vec3_t;
  id, i, r, cnt, color, magnitude: Integer;
  s, free_sustain: cl_sustain_p;
begin
  id := MSG_ReadShort(net_message);     // an id of -1 is an instant effect
  if (id <> -1) then
  begin                                 // sustains
    // Com_Printf ('Sustain effect id %d\n', id);
    free_sustain := nil;
    for i := 0 to MAX_SUSTAINS - 1 do
    begin
      s := @cl_sustains[i];
      if (s.id = 0) then
      begin
        free_sustain := s;
        break;
      end;
    end;
    if (free_sustain <> nil) then
    begin
      s.id := id;
      s.count := MSG_ReadByte(net_message);
      MSG_ReadPos(net_message, s.org);
      MSG_ReadDir(net_message, s.dir);
      r := MSG_ReadByte(net_message);
      s.color := r and $FF;
      s.magnitude := MSG_ReadShort(net_message);
      s.endtime := cl.time + MSG_ReadLong(net_message);
      s.think := CL_ParticleSteamEffect2;
      s.thinkinterval := 100;
      s.nextthink := cl.time;
    end
    else
    begin
      // Com_Printf ('No free sustains!\n');
      // FIXME - read the stuff anyway
      cnt := MSG_ReadByte(net_message);
      MSG_ReadPos(net_message, pos);
      MSG_ReadDir(net_message, dir);
      r := MSG_ReadByte(net_message);
      magnitude := MSG_ReadShort(net_message);
      magnitude := MSG_ReadLong(net_message); // really interval
    end;
  end
  else
  begin                                 // instant
    cnt := MSG_ReadByte(net_message);
    MSG_ReadPos(net_message, pos);
    MSG_ReadDir(net_message, dir);
    r := MSG_ReadByte(net_message);
    magnitude := MSG_ReadShort(net_message);
    color := r and $FF;
    CL_ParticleSteamEffect(pos, dir, color, cnt, magnitude);
    // S_StartSound (pos,  0, 0, cl_sfx_lashit, 1, ATTN_NORM, 0);
  end;
end;

procedure CL_ParseWidow;
var
  Pos: vec3_t;
  id, i: Integer;
  s, free_sustain: cl_sustain_p;
begin
  id := MSG_ReadShort(net_message);

  free_sustain := nil;
  for i := 0 to MAX_SUSTAINS - 1 do
  begin
    s := @cl_sustains[i];
    if (s.id = 0) then
    begin
      free_sustain := s;
      break;
    end;
  end;
  if (free_sustain <> nil) then
  begin
    s.id := id;
    MSG_ReadPos(net_message, s.org);
    s.endtime := cl.time + 2100;
    s.think := CL_Widowbeamout;
    s.thinkinterval := 1;
    s.nextthink := cl.time;
  end
  else
  begin                                 // no free sustains
    // FIXME - read the stuff anyway
    MSG_ReadPos(net_message, pos);
  end;
end;

procedure CL_ParseNuke;
var
  Pos: Vec3_t;
  id, i: Integer;
  s, free_sustain: cl_sustain_p;
begin
  free_sustain := nil;
  for i := 0 to MAX_SUSTAINS - 1 do
  begin
    s := @cl_sustains[i];
    if (s.id = 0) then
    begin
      free_sustain := s;
      break;
    end;
  end;
  if (free_sustain <> nil) then
  begin
    s.id := 21000;
    MSG_ReadPos(net_message, s.org);
    s.endtime := cl.time + 1000;
    s.think := CL_Nukeblast;
    s.thinkinterval := 1;
    s.nextthink := cl.time;
  end
  else
  begin                                 // no free sustains
    // FIXME - read the stuff anyway
    MSG_ReadPos(net_message, pos);
  end;
end;

//ROGUE
//=======

{
=========
CL_ParseTEnt
=========
}
const
  splash_color: array[0..6] of byte =
  ($00, $E0, $B0, $50, $D0, $E0, $E8);

procedure CL_ParseTEnt;
var
  type_: Integer;
  Pos, Pos2, Dir: vec3_t;
  Ex: Explosion_p;
  Cnt, Color, r, Ent, Magnitude: Integer;
begin
  type_ := MSG_ReadByte(net_message);

  case temp_event_t(type_) of
    TE_BLOOD:
      begin                             // bullet hitting flesh
        MSG_ReadPos(net_message, pos);
        MSG_ReadDir(net_message, dir);
        CL_ParticleEffect(pos, dir, $E8, 60);
      end;

    TE_GUNSHOT,                         // bullet hitting wall
    TE_SPARKS,
      TE_BULLET_SPARKS:
      begin
        MSG_ReadPos(net_message, pos);
        MSG_ReadDir(net_message, dir);
        if temp_event_t(type_) = TE_GUNSHOT then
          CL_ParticleEffect(pos, dir, 0, 40)
        else
          CL_ParticleEffect(pos, dir, $E0, 6);

        if (temp_event_t(type_) <> TE_SPARKS) then
        begin
          CL_SmokeAndFlash(pos);

          // impact sound
          cnt := rand() and 15;
          case cnt of
            1: S_StartSound(@pos, 0, 0, cl_sfx_ric1, 1, ATTN_NORM, 0);
            2: S_StartSound(@pos, 0, 0, cl_sfx_ric2, 1, ATTN_NORM, 0);
            3: S_StartSound(@pos, 0, 0, cl_sfx_ric3, 1, ATTN_NORM, 0);
          end;
        end;
      end;

    TE_SCREEN_SPARKS,
      TE_SHIELD_SPARKS:
      begin
        MSG_ReadPos(net_message, pos);
        MSG_ReadDir(net_message, dir);
        if temp_event_t(type_) = TE_SCREEN_SPARKS then
          CL_ParticleEffect(pos, dir, $D0, 40)
        else
          CL_ParticleEffect(pos, dir, $B0, 40);
        //FIXME : replace or remove this sound
        S_StartSound(@pos, 0, 0, cl_sfx_lashit, 1, ATTN_NORM, 0);
      end;

    TE_SHOTGUN:
      begin                             // bullet hitting wall
        MSG_ReadPos(net_message, pos);
        MSG_ReadDir(net_message, dir);
        CL_ParticleEffect(pos, dir, 0, 20);
        CL_SmokeAndFlash(pos);
      end;

    TE_SPLASH:
      begin                             // bullet hitting water
        cnt := MSG_ReadByte(net_message);
        MSG_ReadPos(net_message, pos);
        MSG_ReadDir(net_message, dir);
        r := MSG_ReadByte(net_message);
        if (r > 6) then
          color := $00
        else
          color := splash_color[r];
        CL_ParticleEffect(pos, dir, color, cnt);

        if (r = SPLASH_SPARKS) then
        begin
          r := rand() and 3;
          case r of
            0: S_StartSound(@pos, 0, 0, cl_sfx_spark5, 1, ATTN_STATIC, 0);
            1: S_StartSound(@pos, 0, 0, cl_sfx_spark6, 1, ATTN_STATIC, 0);
          else
            S_StartSound(@pos, 0, 0, cl_sfx_spark7, 1, ATTN_STATIC, 0);
          end;
        end;
      end;

    TE_LASER_SPARKS:
      begin
        cnt := MSG_ReadByte(net_message);
        MSG_ReadPos(net_message, pos);
        MSG_ReadDir(net_message, dir);
        color := MSG_ReadByte(net_message);
        CL_ParticleEffect2(pos, dir, color, cnt);
      end;

    // RAFAEL
    TE_BLUEHYPERBLASTER:
      begin
        MSG_ReadPos(net_message, pos);
        MSG_ReadPos(net_message, dir);
        CL_BlasterParticles(pos, dir);
      end;

    TE_BLASTER:
      begin                             // blaster hitting wall
        MSG_ReadPos(net_message, pos);
        MSG_ReadDir(net_message, dir);
        CL_BlasterParticles(pos, dir);

        ex := CL_AllocExplosion();
        VectorCopy(pos, vec3_t(ex^.ent.origin));
        ex^.ent.angles[0] := arccos(dir[2]) / M_PI * 180;
        // PMM - fixed to correct for pitch of 0
        if (dir[0] <> 0) then
          // was ex^.ent.angles[1] := atan2(dir[1], dir[0])/M_PI*180
          ex^.ent.angles[1] := ArcTan2(dir[1], dir[0]) / M_PI * 180 // ???
        else if (dir[1] > 0) then
          ex^.ent.angles[1] := 90
        else if (dir[1] < 0) then
          ex^.ent.angles[1] := 270
        else
          ex^.ent.angles[1] := 0;

        ex^.type_ := ex_misc;
        ex^.ent.flags := RF_FULLBRIGHT or RF_TRANSLUCENT;
        ex^.start := cl.frame.servertime - 100;
        ex^.light := 150;
        ex^.lightcolor[0] := 1;
        ex^.lightcolor[1] := 1;
        ex^.ent.model := cl_mod_explode;
        ex^.frames := 4;

⌨️ 快捷键说明

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