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

📄 g_spawn.pas

📁 delphi编的不错的贪吃蛇
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      begin
        inc(c2);
        chain^.teamchain := e2;
        e2^.teammaster := e;
        chain := e2;
        e2^.flags := e2^.flags or FL_TEAMSLAVE;
      end;
    Continue_J:
      inc(e2);
    end;
  Continue_:
    inc(e);
  end;

  gi.dprintf('%i teams with %i entities'#10, c, c2);
end;

(*
==============
SpawnEntities

Creates a server's entity / program execution context by
parsing textual entity definitions out of an ent file.
==============
*)   
procedure SpawnEntities(mapname: pchar;  entities: pchar;  spawnpoint: pchar);
var
  ent: edict_p;
  inhibit: integer;
  com_token: pchar;
  i: integer;
  skill_level: single;
begin
  skill_level := floor(skill^.value);
  if skill_level < 0 then
    skill_level := 0;
  if skill_level > 3 then
    skill_level := 3;
  if skill^.value <> skill_level then
    gi.cvar_forceset('skill', va('%f', [skill_level]));

  SaveClientData();

  gi.FreeTags(TAG_LEVEL);

  FillChar(level, SizeOf(level), 0);
  FillChar(g_edicts^, game.maxentities * SizeOf(g_edicts^[0]), 0);

  strncpy(level.mapname, mapname, SizeOf(level.mapname)-1);
  strncpy(game.spawnpoint, spawnpoint, SizeOf(game.spawnpoint)-1);

  (* set client fields on player ents*)
  for i := 0 to (game.maxclients - 1) do
    g_edicts^[i + 1].client := @gclient_a(game.clients)^[i];

  ent := Nil;
  inhibit := 0;

  (* parse ents*)
  while True do
  begin
    (* parse the opening brace *)
    com_token := COM_Parse(entities);
    if entities = nil then
      Break;  //if (!entities)

    if com_token[0] <> '{' then
      gi.error('ED_LoadFromFile: found %s when expecting {', com_token);

    if ent = nil then
      ent := @g_edicts^[0] //if (!ent)
    else
      ent := g_utils.G_Spawn();
    entities := ED_ParseEdict(entities, ent);

    (* yet another map hack*)
    if (Q_stricmp(level.mapname, 'command') = 0) and (Q_stricmp(ent^.classname, 'trigger_once') = 0) and (Q_stricmp(ent^.model, '*27') = 0) then
      ent^.spawnflags := ent^.spawnflags and (not SPAWNFLAG_NOT_HARD);

    (* remove things (except the world) from different skill levels or deathmatch*)
    if ent <> @g_edicts^[0] then
    begin
      if deathmatch^.value <> 0 then
      begin
        if (ent^.spawnflags and SPAWNFLAG_NOT_DEATHMATCH) <> 0 then
        begin
          G_FreeEdict(ent);
          inc(inhibit);
          Continue;
        end;
      end
      else
      begin
        if ((skill^.value = 0) and ((ent^.spawnflags and SPAWNFLAG_NOT_EASY) <> 0)) or
           ((skill^.value = 1) and ((ent^.spawnflags and SPAWNFLAG_NOT_MEDIUM) <> 0)) or
           (((skill^.value = 2) or  (skill^.value = 3)) and ((ent^.spawnflags and SPAWNFLAG_NOT_HARD) <> 0)) then
        begin
          G_FreeEdict(ent);
          inc(inhibit);
          Continue;
        end;
      end;
      ent^.spawnflags := ent^.spawnflags and (not (SPAWNFLAG_NOT_EASY or SPAWNFLAG_NOT_MEDIUM or SPAWNFLAG_NOT_HARD or SPAWNFLAG_NOT_COOP or SPAWNFLAG_NOT_DEATHMATCH));
    end;

    ED_CallSpawn(ent);
  end;

  gi.dprintf('%i entities inhibited'#10,inhibit);

{$ifdef DEBUG}
  i := 1;
  ent := EDICT_NUM(i);
  while i < globals.num_edicts do
  begin
    if (ent^.inuse <> 0) or (ent^.inuse <> 1) then
      Com_DPrintf('Invalid entity %d'#10, i);
    inc(i);
    inc(ent);
  end;
{$endif}

  G_FindTeams();

  PlayerTrail_Init();
end;

{  |  |                           |  |   }
{  V  V   ToDo:  Scott from Here  V  V   }

(*===================================================================*)
{$ifdef 0}
{   (* cursor positioning*)
   xl <value>
   xr <value>
   yb <value>
   yt <value>
   xv <value>
   yv<value>

   (* drawing*)
   statpic <name>
   pic <stat>
   num< fieldwidth> <stat>
   string_ <stat>

   (* control*)
   if <stat>
     ifeq <stat> <value>
     ifbit <stat> <value>
   endif;}
{$endif}

var
  single_statusbar: PChar = 'yb -24 '+
(* health*)
 'xv 0 '+
 'hnum '+
 'xv 50 '+
 'pic 0 '+

(* ammo*)
 'if 2 '+
   ' xv 100 '+
   ' anum '+
   ' xv 150 '+
   ' pic 2 '+
 'endif '+

 (* armor*)
 'if 4 '+
   ' xv 200 '+
   ' rnum '+
   ' xv 250 '+
   ' pic 4 '+
 'endif '+

 (* selected item*)
 'if 6 '+
   ' xv 296 '+
   ' pic 6 '+
 'endif '+

 'yb -50 '+

 (* picked up item*)
 'if 7 '+
   ' xv 0 '+
   ' pic 7 '+
   ' xv 26 '+
   ' yb -42 '+
   ' stat_string 8 '+
   ' yb -50 '+
 'endif '+

 (* timer*)
 'if 9 '+
   ' xv 262 '+
   ' num 2 10 '+
   ' xv 296 '+
   ' pic 9 '+
 'endif '+

 (*  help / weapon icon *)
 'if 11 '+
   ' xv 148 '+
   ' pic 11 '+
 'endif ';

 dm_statusbar: pchar =
 'yb -24 '+

 (* health*)
 'xv 0 '+
 'hnum '+
 'xv 50 '+
 'pic 0 '+

 (* ammo*)
 'if 2 '+
   ' xv 100 '+
   ' anum '+
   ' xv 150 '+
   ' pic 2 '+
 'endif '+

 (* armor*)
 'if 4 '+
   ' xv 200 '+
   ' rnum '+
   ' xv 250 '+
   ' pic 4 '+
 'endif '+

  (* selected item*)
 'if 6 '+
   ' xv 296 '+
   ' pic 6 '+
 'endif '+

 'yb -50 '+

 (* picked up item*)
 'if 7 '+
   ' xv 0 '+
   ' pic 7 '+
   ' xv 26 '+
   ' yb -42 '+
   ' stat_string 8 '+
   ' yb -50 '+
 'endif '+

 (* timer*)
 'if 9 '+
   ' xv 246 '+
   ' num 2 10 '+
   ' xv 296 '+
   ' pic 9 '+
 'endif '+

 (*  help / weapon icon *)
 'if 11 '+
   ' xv 148 '+
   ' pic 11 '+
 'endif '+

 (*  frags*)
 'xr -50 '+
 'yt 2 '+
 'num 3 14 '+

 (* spectator*)
 'if 17 '+
   'xv 0 '+
   'yb -58 '+
   'string2 "SPECTATOR MODE" '+
 'endif '+

 (* chase camera*)
 'if 16 '+
   'xv 0 '+
   'yb -68 '+
   'string "Chasing" '+
   'xv 64 '+
   'stat_string 16 '+
 'endif ';


(*QUAKED worldspawn (0 0 0) ?

Only used for the world.
"sky" environment map name
"skyaxis" vector axis for rotating sky
"skyrotate" speed of rotation in degrees/second
"sounds" music cd track number
"gravity" 800 is default gravity
"message" text to print at user logon
*)


procedure SP_worldspawn(ent: edict_p);
begin
  ent^.movetype := MOVETYPE_PUSH;
  ent^.solid := SOLID_BSP;
  ent^.inuse := true;
  ent^.s.modelindex := 1;
  (* since the world doesn't use G_Spawn()*)
  (* world model is always index 1*)
  (*---------------*)
  (* reserve some spots for dead player bodies for coop / deathmatch*)
  InitBodyQue();

  (* set configstrings for items*)
  SetItemNames;

  if st.nextmap <> nil then
    strcpy(level.nextmap, st.nextmap); // if (st.nextmap)

  (* make some data visible to the server*)
  if (ent^._message <> nil) and (ent^._message[0] <> #0)then
  begin
    gi.configstring(CS_NAME, ent^._message);
    strncpy(level.level_name, ent^._message, SizeOf(level.level_name));
  end
  else
    strncpy(level.level_name, level.mapname, SizeOf(level.level_name));

  if (st.sky <> nil) and (st.sky[0] <> #0) then
    gi.configstring(CS_SKY, st.sky)
  else
    gi.configstring(CS_SKY, 'unit1_');

  gi.configstring(CS_SKYROTATE, va('%f', [st.skyrotate]));

  gi.configstring(CS_SKYAXIS, va('%f %f %f', [st.skyaxis[0], st.skyaxis[1], st.skyaxis[2]]));

  gi.configstring(CS_CDTRACK, va('%i', [ent^.sounds]));

  gi.configstring(CS_MAXCLIENTS, va('%i', [trunc(maxclients^.Value)]));


  (* status bar program*)
  if deathmatch^.value <> 0 then
    gi.configstring(CS_STATUSBAR, dm_statusbar)
  else
    gi.configstring(CS_STATUSBAR, single_statusbar);
  (*---------------*)

  (* help icon for statusbar*)
  gi.imageindex('i_help');
  level.pic_health := gi.imageindex('i_health');
  gi.imageindex('help');
  gi.imageindex('field_3');

  if st.gravity = nil then
    gi.cvar_set('sv_gravity', '800')
  else
    gi.cvar_set('sv_gravity', st.gravity);

  snd_fry := gi.soundindex('player/fry.wav'); (* standing in lava / slime*)

  PrecacheItem(FindItem('Blaster'));

  gi.soundindex('player/lava1.wav');
  gi.soundindex('player/lava2.wav');

  gi.soundindex('misc/pc_up.wav');
  gi.soundindex('misc/talk1.wav');

  gi.soundindex('misc/udeath.wav');

  (* gibs*)
  gi.soundindex('items/respawn1.wav');

  (* sexed sounds*)
  gi.soundindex('*death1.wav');
  gi.soundindex('*death2.wav');
  gi.soundindex('*death3.wav');
  gi.soundindex('*death4.wav');
  gi.soundindex('*fall1.wav');
  gi.soundindex('*fall2.wav');
  (* drowning damage*)
  gi.soundindex('*gurp1.wav');
  gi.soundindex('*gurp2.wav');
  (* player jump*)
  gi.soundindex('*jump1.wav');
  gi.soundindex('*pain25_1.wav');
  gi.soundindex('*pain25_2.wav');
  gi.soundindex('*pain50_1.wav');
  gi.soundindex('*pain50_2.wav');
  gi.soundindex('*pain75_1.wav');
  gi.soundindex('*pain75_2.wav');
  gi.soundindex('*pain100_1.wav');
  gi.soundindex('*pain100_2.wav');

  (* sexed models*)
  (* THIS ORDER MUST MATCH THE DEFINES IN g_local.h*)
  (* you can add more, max 15*)
  gi.modelindex('#w_blaster.md2');
  gi.modelindex('#w_shotgun.md2');
  gi.modelindex('#w_sshotgun.md2');
  gi.modelindex('#w_machinegun.md2');
  gi.modelindex('#w_chaingun.md2');
  gi.modelindex('#a_grenades.md2');
  gi.modelindex('#w_glauncher.md2');
  gi.modelindex('#w_rlauncher.md2');
  gi.modelindex('#w_hyperblaster.md2');
  gi.modelindex('#w_railgun.md2');
  gi.modelindex('#w_bfg.md2');

  (*-------------------*)
  gi.soundindex('player/gasp1.wav');    (* gasping for air*)
  gi.soundindex('player/gasp2.wav');    (* head breaking surface, not gasping*)

  gi.soundindex('player/watr_in.wav');  (* feet hitting water*)
  gi.soundindex('player/watr_out.wav');  (* feet leaving water*)

  gi.soundindex('player/watr_un.wav');  (* head going underwater*)

  gi.soundindex('player/u_breath1.wav');
  gi.soundindex('player/u_breath2.wav');

  gi.soundindex('items/pkup.wav');  (* bonus item pickup*)
  gi.soundindex('world/land.wav');  (* landing thud*)
  gi.soundindex('misc/h2ohit1.wav');  (* landing splash*)

  gi.soundindex('items/damage.wav');
  gi.soundindex('items/protect.wav');
  gi.soundindex('items/protect4.wav');
  gi.soundindex('weapons/noammo.wav');

  gi.soundindex('infantry/inflies1.wav');

  sm_meat_index := gi.modelindex('models/objects/gibs/sm_meat/tris.md2');
  gi.modelindex('models/objects/gibs/arm/tris.md2');
  gi.modelindex('models/objects/gibs/bone/tris.md2');
  gi.modelindex('models/objects/gibs/bone2/tris.md2');
  gi.modelindex('models/objects/gibs/chest/tris.md2');
  gi.modelindex('models/objects/gibs/skull/tris.md2');
  gi.modelindex('models/objects/gibs/head2/tris.md2');

  (**)
  (* Setup light animation tables. 'a' is total darkness, 'z' is doublebright.*)
  (**)
  (* 0 normal*)
  gi.configstring(CS_LIGHTS + 0, 'm');
  (* 1 FLICKER (first variety)*)
  gi.configstring(CS_LIGHTS + 1, 'mmnmmommommnonmmonqnmmo');
  (* 2 SLOW STRONG PULSE*)
  gi.configstring(CS_LIGHTS + 2, 'abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba');
  (* 3 CANDLE (first variety)*)
  gi.configstring(CS_LIGHTS + 3, 'mmmmmaaaaammmmmaaaaaabcdefgabcdefg');
  (* 4 FAST STROBE*)
  gi.configstring(CS_LIGHTS + 4, 'mamamamamama');
  (* 5 GENTLE PULSE 1*)
  gi.configstring(CS_LIGHTS + 5, 'jklmnopqrstuvwxyzyxwvutsrqponmlkj');
  (* 6 FLICKER (second variety)*)
  gi.configstring(CS_LIGHTS + 6, 'nmonqnmomnmomomno');
  (* 7 CANDLE (second variety)*)
  gi.configstring(CS_LIGHTS + 7, 'mmmaaaabcdefgmmmmaaaammmaamm');
  (* 8 CANDLE (third variety)*)
  gi.configstring(CS_LIGHTS + 8, 'mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa');
  (* 9 SLOW STROBE (fourth variety)*)
  gi.configstring(CS_LIGHTS + 9, 'aaaaaaaazzzzzzzz');
  (* 10 FLUORESCENT FLICKER*)
  gi.configstring(CS_LIGHTS + 10, 'mmamammmmammamamaaamammma');
  (* 11 SLOW PULSE NOT FADE TO BLACK*)
  gi.configstring(CS_LIGHTS + 11, 'abcdefghijklmnopqrrqponmlkjihgfedcba');

  (* styles 32-62 are assigned by the light program for switchable lights*)
  (* 63 testing*)
  gi.configstring(CS_LIGHTS + 63, 'a');
end;


end.

⌨️ 快捷键说明

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