diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index a50ce72609f18dfddfa5d3781b785dd0b16ad684..ad2a0f7e1fd54ead47a35dba8880325ffbe9d4d5 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
g_playermodel, g_gfx, g_options, g_weapons, Math,
g_triggers, MAPDEF, g_monsters, e_sound, CONFIG,
BinEditor, g_language, g_net, SDL,
- ENet, e_fixedbuffer, g_netmsg, g_netmaster, GL, GLExt,
+ ENet, e_msg, g_netmsg, g_netmaster, GL, GLExt,
utils, sfs;
a: Byte;
w: Word;
i, b: Integer;
+
+ function sendMonsPos (mon: TMonster): Boolean;
+ begin
+ result := false; // don't stop
+ if (mon.MonsterType = MONSTER_BARREL) then
+ begin
+ if (mon.GameVelX <> 0) or (mon.GameVelY <> 0) then MH_SEND_MonsterPos(mon.UID);
+ end
+ else
+ if (mon.MonsterState <> MONSTATE_SLEEP) then
+ begin
+ if (mon.MonsterState <> MONSTATE_DEAD) or (mon.GameVelX <> 0) or (mon.GameVelY <> 0) then
+ begin
+ MH_SEND_MonsterPos(mon.UID);
+ end;
+ end;
+ end;
+
begin
g_ResetDynlights();
// Ïîðà âûêëþ÷àòü èãðó:
if gPlayers[I] <> nil then
MH_SEND_PlayerPos(True, gPlayers[I].UID);
- if gMonsters <> nil then
- for I := 0 to High(gMonsters) do
- if gMonsters[I] <> nil then
- begin
- if (gMonsters[I].MonsterType = MONSTER_BARREL) then
- begin
- if (gMonsters[I].GameVelX <> 0) or (gMonsters[I].GameVelY <> 0) then
- MH_SEND_MonsterPos(gMonsters[I].UID);
- end
- else
- if (gMonsters[I].MonsterState <> MONSTATE_SLEEP) then
- if (gMonsters[I].MonsterState <> MONSTATE_DEAD) or
- (gMonsters[I].GameVelX <> 0) or
- (gMonsters[I].GameVelY <> 0) then
- MH_SEND_MonsterPos(gMonsters[I].UID);
- end;
+ g_Mons_ForEach(sendMonsPos);
NetTimeToReliable := 0;
NetTimeToUpdate := NetUpdateRate;
if gPlayers[I] <> nil then
MH_SEND_PlayerPos(False, gPlayers[I].UID);
- if gMonsters <> nil then
- for I := 0 to High(gMonsters) do
- if gMonsters[I] <> nil then
- begin
- if (gMonsters[I].MonsterType = MONSTER_BARREL) then
- begin
- if (gMonsters[I].GameVelX <> 0) or (gMonsters[I].GameVelY <> 0) then
- MH_SEND_MonsterPos(gMonsters[I].UID);
- end
- else
- if (gMonsters[I].MonsterState <> MONSTATE_SLEEP) then
- if (gMonsters[I].MonsterState <> MONSTATE_DEAD) or
- (gMonsters[I].GameVelX <> 0) or
- (gMonsters[I].GameVelY <> 0) then
- MH_SEND_MonsterPos(gMonsters[I].UID);
- end;
+ g_Mons_ForEach(sendMonsPos);
NetTimeToUpdate := 0;
end;
procedure DrawMinimap(p: TPlayer; RenderRect: e_graphics.TRect);
var
a, aX, aY, aX2, aY2, Scale, ScaleSz: Integer;
+
+ function monDraw (mon: TMonster): Boolean;
+ begin
+ result := false; // don't stop
+ with mon do
+ begin
+ if Live then
+ begin
+ // Ëåâûé âåðõíèé óãîë
+ aX := Obj.X div ScaleSz + 1;
+ aY := Obj.Y div ScaleSz + 1;
+ // Ðàçìåðû
+ aX2 := max(Obj.Rect.Width div ScaleSz, 1);
+ aY2 := max(Obj.Rect.Height div ScaleSz, 1);
+ // Ïðàâûé íèæíèé óãîë
+ aX2 := aX + aX2 - 1;
+ aY2 := aY + aY2 - 1;
+ e_DrawFillQuad(aX, aY, aX2, aY2, 255, 255, 0, 0);
+ end;
+ end;
+ end;
+
begin
if (gMapInfo.Width > RenderRect.Right - RenderRect.Left) or
(gMapInfo.Height > RenderRect.Bottom - RenderRect.Top) then
end;
end;
end;
- if gMonsters <> nil then
- begin
- // Ðèñóåì ìîíñòðîâ:
- for a := 0 to High(gMonsters) do
- if gMonsters[a] <> nil then with gMonsters[a] do
- if Live then begin
- // Ëåâûé âåðõíèé óãîë:
- aX := Obj.X div ScaleSz + 1;
- aY := Obj.Y div ScaleSz + 1;
- // Ðàçìåðû:
- aX2 := max(Obj.Rect.Width div ScaleSz, 1);
- aY2 := max(Obj.Rect.Height div ScaleSz, 1);
- // Ïðàâûé íèæíèé óãîë:
- aX2 := aX + aX2 - 1;
- aY2 := aY + aY2 - 1;
-
- e_DrawFillQuad(aX, aY, aX2, aY2, 255, 255, 0, 0);
- end;
- end;
+ // Ðèñóåì ìîíñòðîâ
+ g_Mons_ForEach(monDraw);
end;
end;
end;
begin
- profileFrameDraw.sectionBegin('map rendering');
+ profileFrameDraw.sectionBegin('total');
// our accelerated renderer will collect all panels to gDrawPanelList
// we can use panel tag to render level parts (see GridTagXXX in g_map.pas)
- profileFrameDraw.sectionBegin('pancollect');
+ profileFrameDraw.sectionBegin('collect');
if gdbg_map_use_accel_render then
begin
g_Map_CollectDrawPanels(sX, sY, sWidth, sHeight);
end;
profileFrameDraw.sectionEnd();
- profileFrameDraw.sectionBegin('map background');
+ profileFrameDraw.sectionBegin('skyback');
g_Map_DrawBack(backXOfs, backYOfs);
profileFrameDraw.sectionEnd();
if (setTransMatrix) then glTranslatef(transX, transY, 0);
- drawPanelType('panel_back', PANEL_BACK);
- drawPanelType('panel_step', PANEL_STEP);
+ drawPanelType('*back', PANEL_BACK);
+ drawPanelType('*step', PANEL_STEP);
drawOther('items', @g_Items_Draw);
drawOther('weapons', @g_Weapon_Draw);
drawOther('shells', @g_Player_DrawShells);
drawOther('drawall', @g_Player_DrawAll);
drawOther('corpses', @g_Player_DrawCorpses);
- drawPanelType('panel_wall', PANEL_WALL);
+ drawPanelType('*wall', PANEL_WALL);
drawOther('monsters', @g_Monsters_Draw);
- drawPanelType('panel_closedoor', PANEL_CLOSEDOOR);
+ drawPanelType('*door', PANEL_CLOSEDOOR);
drawOther('gfx', @g_GFX_Draw);
drawOther('flags', @g_Map_DrawFlags);
- drawPanelType('panel_acid1', PANEL_ACID1);
- drawPanelType('panel_acid2', PANEL_ACID2);
- drawPanelType('panel_water', PANEL_WATER);
+ drawPanelType('*acid1', PANEL_ACID1);
+ drawPanelType('*acid2', PANEL_ACID2);
+ drawPanelType('*water', PANEL_WATER);
drawOther('dynlights', @renderDynLightsInternal);
- drawPanelType('panel_fore', PANEL_FORE);
+ drawPanelType('*fore', PANEL_FORE);
if g_debug_HealthBar then
begin
Exit;
end;
- if (profileFrameDraw = nil) then profileFrameDraw := TProfiler.Create('MAP RENDER', g_profile_history_size);
+ if (profileFrameDraw = nil) then profileFrameDraw := TProfiler.Create('RENDER', g_profile_history_size);
profileFrameDraw.mainBegin(g_profile_frame_draw);
gPlayerDrawn := p;
Format('%d:%.2d:%.2d', [gTime div 1000 div 3600, (gTime div 1000 div 60) mod 60, gTime div 1000 mod 60]),
gStdFont);
- drawProfilers();
+ if gGameOn then drawProfilers();
end;
procedure g_Game_Quit();
State: Byte;
OuterLoop: Boolean;
newResPath: string;
+ InMsg: TMsg;
begin
g_Game_Free();
if (NetEvent.kind = ENET_EVENT_TYPE_RECEIVE) then
begin
Ptr := NetEvent.packet^.data;
- e_Raw_Seek(0);
+ if not InMsg.Init(Ptr, NetEvent.packet^.dataLength, True) then
+ continue;
- MID := e_Raw_Read_Byte(Ptr);
+ MID := InMsg.ReadByte();
if (MID = NET_MSG_INFO) and (State = 0) then
begin
- NetMyID := e_Raw_Read_Byte(Ptr);
- NetPlrUID1 := e_Raw_Read_Word(Ptr);
+ NetMyID := InMsg.ReadByte();
+ NetPlrUID1 := InMsg.ReadWord();
- WadName := e_Raw_Read_String(Ptr);
- Map := e_Raw_Read_String(Ptr);
+ WadName := InMsg.ReadString();
+ Map := InMsg.ReadString();
- gWADHash := e_Raw_Read_MD5(Ptr);
+ gWADHash := InMsg.ReadMD5();
- gGameSettings.GameMode := e_Raw_Read_Byte(Ptr);
+ gGameSettings.GameMode := InMsg.ReadByte();
gSwitchGameMode := gGameSettings.GameMode;
- gGameSettings.GoalLimit := e_Raw_Read_Word(Ptr);
- gGameSettings.TimeLimit := e_Raw_Read_Word(Ptr);
- gGameSettings.MaxLives := e_Raw_Read_Byte(Ptr);
- gGameSettings.Options := e_Raw_Read_LongWord(Ptr);
- T := e_Raw_Read_LongWord(Ptr);
+ gGameSettings.GoalLimit := InMsg.ReadWord();
+ gGameSettings.TimeLimit := InMsg.ReadWord();
+ gGameSettings.MaxLives := InMsg.ReadByte();
+ gGameSettings.Options := InMsg.ReadLongWord();
+ T := InMsg.ReadLongWord();
newResPath := g_Res_SearchSameWAD(MapsDir, WadName, gWADHash);
if newResPath = '' then
procedure g_Game_RestartRound(NoMapRestart: Boolean = False);
var
i, n, nb, nr: Integer;
+
+ function monRespawn (mon: TMonster): Boolean;
+ begin
+ result := false; // don't stop
+ if not mon.FNoRespawn then mon.Respawn();
+ end;
+
begin
if not g_Game_IsServer then Exit;
if gLMSRespawn = LMS_RESPAWN_NONE then Exit;
gPlayer2 := g_Player_Get(gLMSPID2);
end;
- for i := Low(gItems) to High(gItems) do
- begin
- if gItems[i].Respawnable then
- begin
- gItems[i].QuietRespawn := True;
- gItems[i].RespawnTime := 0;
- end
- else
- begin
- g_Items_Remove(i);
- if g_Game_IsNet then MH_SEND_ItemDestroy(True, i);
- end;
- end;
+ g_Items_RestartRound();
- for i := Low(gMonsters) to High(gMonsters) do
- begin
- if (gMonsters[i] <> nil) and not gMonsters[i].FNoRespawn then
- gMonsters[i].Respawn;
- end;
+
+ g_Mons_ForEach(monRespawn);
gLMSSoftSpawn := False;
end;
a, b: Integer;
cmd: string;
//pt: TPoint;
+ mon: TMonster;
begin
// Êîìàíäû îòëàäî÷íîãî ðåæèìà:
if gDebugMode then
else
begin
with gPlayer1.Obj do
- b := g_Monsters_Create(a,
+ begin
+ mon := g_Monsters_Create(a,
X + Rect.X + (Rect.Width div 2),
Y + Rect.Y + Rect.Height,
gPlayer1.Direction, True);
- if (Length(P) > 2) and (b >= 0) then
- gMonsters[b].MonsterBehaviour := Min(Max(StrToIntDef(P[2], BH_NORMAL), BH_NORMAL), BH_GOOD);
+ end;
+ if (Length(P) > 2) and (mon <> nil) then
+ mon.MonsterBehaviour := Min(Max(StrToIntDef(P[2], BH_NORMAL), BH_NORMAL), BH_GOOD);
end;
end;
end
gDefaultMegawadStart := s;
end;
- s := LowerCase(Find_Param_Value(pars, '-dbg-mainwad-restore'));
- if (s <> '') then
+ if (Find_Param_Value(pars, '--dbg-mainwad-restore') <> '') or
+ (Find_Param_Value(pars, '--dbg-mainwad-default') <> '') then
begin
gDefaultMegawadStart := DF_Default_Megawad_Start;
end;