- g_Items_FreeData();
- g_Weapon_FreeData();
- g_Monsters_FreeData();
-
- e_WriteLog('Releasing game data...', MSG_NOTIFY);
-
- g_Texture_Delete('NOTEXTURE');
- g_Texture_Delete('TEXTURE_PLAYER_HUD');
- g_Texture_Delete('TEXTURE_PLAYER_HUDBG');
- g_Texture_Delete('TEXTURE_PLAYER_ARMORHUD');
- g_Texture_Delete('TEXTURE_PLAYER_REDFLAG');
- g_Texture_Delete('TEXTURE_PLAYER_REDFLAG_S');
- g_Texture_Delete('TEXTURE_PLAYER_REDFLAG_D');
- g_Texture_Delete('TEXTURE_PLAYER_BLUEFLAG');
- g_Texture_Delete('TEXTURE_PLAYER_BLUEFLAG_S');
- g_Texture_Delete('TEXTURE_PLAYER_BLUEFLAG_D');
- g_Texture_Delete('TEXTURE_PLAYER_TALKBUBBLE');
- g_Texture_Delete('TEXTURE_PLAYER_INVULPENTA');
- g_Frames_DeleteByName('FRAMES_TELEPORT');
- g_Sound_Delete('SOUND_GAME_TELEPORT');
- g_Sound_Delete('SOUND_GAME_NOTELEPORT');
- g_Sound_Delete('SOUND_GAME_DOOROPEN');
- g_Sound_Delete('SOUND_GAME_DOORCLOSE');
- g_Sound_Delete('SOUND_GAME_BULK1');
- g_Sound_Delete('SOUND_GAME_BULK2');
- g_Sound_Delete('SOUND_GAME_BUBBLE1');
- g_Sound_Delete('SOUND_GAME_BUBBLE2');
- g_Sound_Delete('SOUND_GAME_SWITCH1');
- g_Sound_Delete('SOUND_GAME_SWITCH0');
-
- goodsnd[0].Free();
- goodsnd[1].Free();
- goodsnd[2].Free();
- goodsnd[3].Free();
-
- g_Sound_Delete('SOUND_ANNOUNCER_GOOD1');
- g_Sound_Delete('SOUND_ANNOUNCER_GOOD2');
- g_Sound_Delete('SOUND_ANNOUNCER_GOOD3');
- g_Sound_Delete('SOUND_ANNOUNCER_GOOD4');
-
- killsnd[0].Free();
- killsnd[1].Free();
- killsnd[2].Free();
- killsnd[3].Free();
-
- g_Sound_Delete('SOUND_ANNOUNCER_KILL2X');
- g_Sound_Delete('SOUND_ANNOUNCER_KILL3X');
- g_Sound_Delete('SOUND_ANNOUNCER_KILL4X');
- g_Sound_Delete('SOUND_ANNOUNCER_KILLMX');
-
- DataLoaded := False;
-end;
-
-procedure DrawCustomStat();
-var
- pc, x, y, w, _y,
- w1, w2, w3,
- t, p, m: Integer;
- ww1, hh1: Word;
- ww2, hh2, r, g, b, rr, gg, bb: Byte;
- s1, s2, topstr: String;
-begin
- e_TextureFontGetSize(gStdFont, ww2, hh2);
-
- e_PollInput();
- if e_KeyPressed(IK_TAB) then
- begin
- if not gStatsPressed then
- begin
- gStatsOff := not gStatsOff;
- gStatsPressed := True;
- end;
- end
- else
- gStatsPressed := False;
-
- if gStatsOff then
- begin
- s1 := _lc[I_MENU_INTER_NOTICE_TAB];
- w := (Length(s1) * ww2) div 2;
- x := gScreenWidth div 2 - w;
- y := 8;
- e_TextureFontPrint(x, y, s1, gStdFont);
- Exit;
- end;
-
- if (gGameSettings.GameMode = GM_COOP) then
- begin
- if gMissionFailed then
- topstr := _lc[I_MENU_INTER_MISSION_FAIL]
- else
- topstr := _lc[I_MENU_INTER_LEVEL_COMPLETE];
- end
- else
- topstr := _lc[I_MENU_INTER_ROUND_OVER];
-
- e_CharFont_GetSize(gMenuFont, topstr, ww1, hh1);
- e_CharFont_Print(gMenuFont, (gScreenWidth div 2)-(ww1 div 2), 16, topstr);
-
- if g_Game_IsNet then
- begin
- topstr := Format(_lc[I_MENU_INTER_NOTICE_TIME], [gServInterTime]);
- if not gChatShow then
- e_TextureFontPrintEx((gScreenWidth div 2)-(Length(topstr)*ww2 div 2),
- gScreenHeight-(hh2+4)*2, topstr, gStdFont, 255, 255, 255, 1);
- end;
-
- if g_Game_IsClient then
- topstr := _lc[I_MENU_INTER_NOTICE_MAP]
- else
- topstr := _lc[I_MENU_INTER_NOTICE_SPACE];
- if not gChatShow then
- e_TextureFontPrintEx((gScreenWidth div 2)-(Length(topstr)*ww2 div 2),
- gScreenHeight-(hh2+4), topstr, gStdFont, 255, 255, 255, 1);
-
- x := 32;
- y := 16+hh1+16;
-
- w := gScreenWidth-x*2;
-
- w2 := (w-16) div 6;
- w3 := w2;
- w1 := w-16-w2-w3;
-
- e_DrawFillQuad(x, y, gScreenWidth-x-1, gScreenHeight-y-1, 64, 64, 64, 32);
- e_DrawQuad(x, y, gScreenWidth-x-1, gScreenHeight-y-1, 255, 127, 0);
-
- m := Max(Length(_lc[I_MENU_MAP])+1, Length(_lc[I_GAME_GAME_TIME])+1)*ww2;
-
- case CustomStat.GameMode of
- GM_DM:
- begin
- if gGameSettings.MaxLives = 0 then
- s1 := _lc[I_GAME_DM]
- else
- s1 := _lc[I_GAME_LMS];
- end;
- GM_TDM:
- begin
- if gGameSettings.MaxLives = 0 then
- s1 := _lc[I_GAME_TDM]
- else
- s1 := _lc[I_GAME_TLMS];
- end;
- GM_CTF: s1 := _lc[I_GAME_CTF];
- GM_COOP:
- begin
- if gGameSettings.MaxLives = 0 then
- s1 := _lc[I_GAME_COOP]
- else
- s1 := _lc[I_GAME_SURV];
- end;
- else s1 := '';
- end;
-
- _y := y+16;
- e_TextureFontPrintEx(x+(w div 2)-(Length(s1)*ww2 div 2), _y, s1, gStdFont, 255, 255, 255, 1);
- _y := _y+8;
-
- _y := _y+16;
- e_TextureFontPrintEx(x+8, _y, _lc[I_MENU_MAP], gStdFont, 255, 127, 0, 1);
- e_TextureFontPrint(x+8+m, _y, Format('%s - %s', [CustomStat.Map, CustomStat.MapName]), gStdFont);
-
- _y := _y+16;
- e_TextureFontPrintEx(x+8, _y, _lc[I_GAME_GAME_TIME], gStdFont, 255, 127, 0, 1);
- e_TextureFontPrint(x+8+m, _y, Format('%d:%.2d:%.2d', [CustomStat.GameTime div 1000 div 3600,
- (CustomStat.GameTime div 1000 div 60) mod 60,
- CustomStat.GameTime div 1000 mod 60]), gStdFont);
-
- pc := Length(CustomStat.PlayerStat);
- if pc = 0 then Exit;
-
- if CustomStat.GameMode = GM_COOP then
- begin
- m := Max(Length(_lc[I_GAME_MONSTERS])+1, Length(_lc[I_GAME_SECRETS])+1)*ww2;
- _y := _y+32;
- s2 := _lc[I_GAME_MONSTERS];
- e_TextureFontPrintEx(x+8, _y, s2, gStdFont, 255, 127, 0, 1);
- e_TextureFontPrintEx(x+8+m, _y, IntToStr(gCoopMonstersKilled) + '/' + IntToStr(gTotalMonsters), gStdFont, 255, 255, 255, 1);
- _y := _y+16;
- s2 := _lc[I_GAME_SECRETS];
- e_TextureFontPrintEx(x+8, _y, s2, gStdFont, 255, 127, 0, 1);
- e_TextureFontPrintEx(x+8+m, _y, IntToStr(gCoopSecretsFound) + '/' + IntToStr(gSecretsCount), gStdFont, 255, 255, 255, 1);
- if gLastMap then
- begin
- m := Max(Length(_lc[I_GAME_MONSTERS_TOTAL])+1, Length(_lc[I_GAME_SECRETS_TOTAL])+1)*ww2;
- _y := _y-16;
- s2 := _lc[I_GAME_MONSTERS_TOTAL];
- e_TextureFontPrintEx(x+250, _y, s2, gStdFont, 255, 127, 0, 1);
- e_TextureFontPrintEx(x+250+m, _y, IntToStr(gCoopTotalMonstersKilled) + '/' + IntToStr(gCoopTotalMonsters), gStdFont, 255, 255, 255, 1);
- _y := _y+16;
- s2 := _lc[I_GAME_SECRETS_TOTAL];
- e_TextureFontPrintEx(x+250, _y, s2, gStdFont, 255, 127, 0, 1);
- e_TextureFontPrintEx(x+250+m, _y, IntToStr(gCoopTotalSecretsFound) + '/' + IntToStr(gCoopTotalSecrets), gStdFont, 255, 255, 255, 1);
- end;
- end;
-
- if CustomStat.GameMode in [GM_TDM, GM_CTF] then
- begin
- _y := _y+16+16;
-
- with CustomStat do
- if TeamStat[TEAM_RED].Goals > TeamStat[TEAM_BLUE].Goals then s1 := _lc[I_GAME_WIN_RED]
- else if TeamStat[TEAM_BLUE].Goals > TeamStat[TEAM_RED].Goals then s1 := _lc[I_GAME_WIN_BLUE]
- else s1 := _lc[I_GAME_WIN_DRAW];
-
- e_TextureFontPrintEx(x+8+(w div 2)-(Length(s1)*ww2 div 2), _y, s1, gStdFont, 255, 255, 255, 1);
- _y := _y+40;
-
- for t := TEAM_RED to TEAM_BLUE do
- begin
- if t = TEAM_RED then
- begin
- e_TextureFontPrintEx(x+8, _y, _lc[I_GAME_TEAM_RED],
- gStdFont, 255, 0, 0, 1);
- e_TextureFontPrintEx(x+w1+8, _y, IntToStr(CustomStat.TeamStat[TEAM_RED].Goals),
- gStdFont, 255, 0, 0, 1);
- r := 255;
- g := 0;
- b := 0;
- end
- else
- begin
- e_TextureFontPrintEx(x+8, _y, _lc[I_GAME_TEAM_BLUE],
- gStdFont, 0, 0, 255, 1);
- e_TextureFontPrintEx(x+w1+8, _y, IntToStr(CustomStat.TeamStat[TEAM_BLUE].Goals),
- gStdFont, 0, 0, 255, 1);
- r := 0;
- g := 0;
- b := 255;
- end;
-
- e_DrawLine(1, x+8, _y+20, x-8+w, _y+20, r, g, b);
- _y := _y+24;
-
- for p := 0 to High(CustomStat.PlayerStat) do
- if CustomStat.PlayerStat[p].Team = t then
- with CustomStat.PlayerStat[p] do
- begin
- if Spectator then
- begin
- rr := r div 2;
- gg := g div 2;
- bb := b div 2;
- end
- else
- begin
- rr := r;
- gg := g;
- bb := b;
- end;
- e_TextureFontPrintEx(x+8, _y, Name, gStdFont, rr, gg, bb, 1);
- e_TextureFontPrintEx(x+w1+8, _y, IntToStr(Frags), gStdFont, rr, gg, bb, 1);
- e_TextureFontPrintEx(x+w1+w2+8, _y, IntToStr(Deaths), gStdFont, rr, gg, bb, 1);
- _y := _y+24;
- end;
-
- _y := _y+16+16;
- end;
- end
- else if CustomStat.GameMode in [GM_DM, GM_COOP] then
- begin
- _y := _y+40;
- e_TextureFontPrintEx(x+8, _y, _lc[I_GAME_PLAYER_NAME], gStdFont, 255, 127, 0, 1);
- e_TextureFontPrintEx(x+8+w1, _y, _lc[I_GAME_FRAGS], gStdFont, 255, 127, 0, 1);
- e_TextureFontPrintEx(x+8+w1+w2, _y, _lc[I_GAME_DEATHS], gStdFont, 255, 127, 0, 1);
-
- _y := _y+24;
- for p := 0 to High(CustomStat.PlayerStat) do
- with CustomStat.PlayerStat[p] do
- begin
- e_DrawFillQuad(x+8, _y+4, x+24-1, _y+16+4-1, Color.R, Color.G, Color.B, 0);
-
- if Spectator then
- r := 127
- else
- r := 255;
-
- e_TextureFontPrintEx(x+8+16+8, _y+4, Name, gStdFont, r, r, r, 1, True);
- e_TextureFontPrintEx(x+w1+8+16+8, _y+4, IntToStr(Frags), gStdFont, r, r, r, 1, True);
- e_TextureFontPrintEx(x+w1+w2+8+16+8, _y+4, IntToStr(Deaths), gStdFont, r, r, r, 1, True);
- _y := _y+24;
- end;
- end;
-end;
-
-procedure DrawSingleStat();
-var
- tm, key_x, val_x, y: Integer;
- w1, w2, h: Word;
- s1, s2: String;
-
- procedure player_stat(n: Integer);
- var
- kpm: Real;
-
- begin
- // "Kills: # / #":
- s1 := Format(' %d ', [SingleStat.PlayerStat[n].Kills]);
- s2 := Format(' %d', [gTotalMonsters]);
-
- e_CharFont_Print(gMenuFont, key_x, y, _lc[I_MENU_INTER_KILLS]);
- e_CharFont_PrintEx(gMenuFont, val_x, y, s1, _RGB(255, 0, 0));
- e_CharFont_GetSize(gMenuFont, s1, w1, h);
- e_CharFont_Print(gMenuFont, val_x+w1, y, '/');
- s1 := s1 + '/';
- e_CharFont_GetSize(gMenuFont, s1, w1, h);
- e_CharFont_PrintEx(gMenuFont, val_x+w1, y, s2, _RGB(255, 0, 0));
-
- // "Kills-per-minute: ##.#":
- s1 := _lc[I_MENU_INTER_KPM];
- if tm > 0 then
- kpm := (SingleStat.PlayerStat[n].Kills / tm) * 60
- else
- kpm := SingleStat.PlayerStat[n].Kills;
- s2 := Format(' %.1f', [kpm]);
-
- e_CharFont_Print(gMenuFont, key_x, y+32, s1);
- e_CharFont_PrintEx(gMenuFont, val_x, y+32, s2, _RGB(255, 0, 0));
-
- // "Secrets found: # / #":
- s1 := Format(' %d ', [SingleStat.PlayerStat[n].Secrets]);
- s2 := Format(' %d', [SingleStat.TotalSecrets]);
-
- e_CharFont_Print(gMenuFont, key_x, y+64, _lc[I_MENU_INTER_SECRETS]);
- e_CharFont_PrintEx(gMenuFont, val_x, y+64, s1, _RGB(255, 0, 0));
- e_CharFont_GetSize(gMenuFont, s1, w1, h);
- e_CharFont_Print(gMenuFont, val_x+w1, y+64, '/');
- s1 := s1 + '/';
- e_CharFont_GetSize(gMenuFont, s1, w1, h);
- e_CharFont_PrintEx(gMenuFont, val_x+w1, y+64, s2, _RGB(255, 0, 0));
- end;
-
-begin
-// "Level Complete":
- e_CharFont_GetSize(gMenuFont, _lc[I_MENU_INTER_LEVEL_COMPLETE], w1, h);
- e_CharFont_Print(gMenuFont, (gScreenWidth-w1) div 2, 32, _lc[I_MENU_INTER_LEVEL_COMPLETE]);
-
-// Îïðåäåëÿåì êîîðäèíàòû âûðàâíèâàíèÿ ïî ñàìîé äëèííîé ñòðîêå:
- s1 := _lc[I_MENU_INTER_KPM];
- e_CharFont_GetSize(gMenuFont, s1, w1, h);
- Inc(w1, 16);
- s1 := ' 9999.9';
- e_CharFont_GetSize(gMenuFont, s1, w2, h);
-
- key_x := (gScreenWidth-w1-w2) div 2;
- val_x := key_x + w1;
-
-// "Time: #:##:##":
- tm := SingleStat.GameTime div 1000;
- s1 := _lc[I_MENU_INTER_TIME];
- s2 := Format(' %d:%.2d:%.2d', [tm div (60*60), (tm mod (60*60)) div 60, tm mod 60]);
-
- e_CharFont_Print(gMenuFont, key_x, 80, s1);
- e_CharFont_PrintEx(gMenuFont, val_x, 80, s2, _RGB(255, 0, 0));
-
- if SingleStat.TwoPlayers then
- begin
- // "Player 1":
- s1 := _lc[I_MENU_PLAYER_1];
- e_CharFont_GetSize(gMenuFont, s1, w1, h);
- e_CharFont_Print(gMenuFont, (gScreenWidth-w1) div 2, 128, s1);
-
- // Ñòàòèñòèêà ïåðâîãî èãðîêà:
- y := 176;
- player_stat(0);
-
- // "Player 2":
- s1 := _lc[I_MENU_PLAYER_2];
- e_CharFont_GetSize(gMenuFont, s1, w1, h);
- e_CharFont_Print(gMenuFont, (gScreenWidth-w1) div 2, 288, s1);
-
- // Ñòàòèñòèêà âòîðîãî èãðîêà:
- y := 336;
- player_stat(1);
- end
- else
- begin
- // Ñòàòèñòèêà ïåðâîãî èãðîêà:
- y := 128;
- player_stat(0);
- end;
-end;
-
-procedure DrawLoadingStat();
-var
- ww, hh: Word;
- xx, yy, i: Integer;
- s: String;
-begin
- if Length(LoadingStat.Msgs) = 0 then
- Exit;
-
- e_CharFont_GetSize(gMenuFont, _lc[I_MENU_LOADING], ww, hh);
- yy := (gScreenHeight div 3);
- e_CharFont_Print(gMenuFont, (gScreenWidth div 2)-(ww div 2), yy-2*hh, _lc[I_MENU_LOADING]);
- xx := (gScreenWidth div 3);
-
- with LoadingStat do
- for i := 0 to NextMsg-1 do
- begin
- if (i = (NextMsg-1)) and (MaxValue > 0) then
- s := Format('%s: %d/%d', [Msgs[i], CurValue, MaxValue])
- else
- s := Msgs[i];
-
- e_CharFont_PrintEx(gMenuSmallFont, xx, yy, s, _RGB(255, 0, 0));
- yy := yy + LOADING_INTERLINE;
- end;
-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
- begin
- Scale := 1;
- // Ñêîëüêî ïèêñåëîâ êàðòû â 1 ïèêñåëå ìèíè-êàðòû:
- ScaleSz := 16 div Scale;
- // Ðàçìåðû ìèíè-êàðòû:
- aX := max(gMapInfo.Width div ScaleSz, 1);
- aY := max(gMapInfo.Height div ScaleSz, 1);
- // Ðàìêà êàðòû:
- e_DrawFillQuad(0, 0, aX-1, aY-1, 0, 0, 0, 0);
-
- if gWalls <> nil then
- begin
- // Ðèñóåì ñòåíû:
- for a := 0 to High(gWalls) do
- with gWalls[a] do
- if PanelType <> 0 then
- begin
- // Ëåâûé âåðõíèé óãîë:
- aX := X div ScaleSz;
- aY := Y div ScaleSz;
- // Ðàçìåðû:
- aX2 := max(Width div ScaleSz, 1);
- aY2 := max(Height div ScaleSz, 1);
- // Ïðàâûé íèæíèé óãîë:
- aX2 := aX + aX2 - 1;
- aY2 := aY + aY2 - 1;
-
- case PanelType of
- PANEL_WALL: e_DrawFillQuad(aX, aY, aX2, aY2, 208, 208, 208, 0);
- PANEL_OPENDOOR, PANEL_CLOSEDOOR:
- if Enabled then e_DrawFillQuad(aX, aY, aX2, aY2, 160, 160, 160, 0);
- end;
- end;
- end;
- if gSteps <> nil then
- begin
- // Ðèñóåì ñòóïåíè:
- for a := 0 to High(gSteps) do
- with gSteps[a] do
- if PanelType <> 0 then
- begin
- // Ëåâûé âåðõíèé óãîë:
- aX := X div ScaleSz;
- aY := Y div ScaleSz;
- // Ðàçìåðû:
- aX2 := max(Width div ScaleSz, 1);
- aY2 := max(Height div ScaleSz, 1);
- // Ïðàâûé íèæíèé óãîë:
- aX2 := aX + aX2 - 1;
- aY2 := aY + aY2 - 1;
-
- e_DrawFillQuad(aX, aY, aX2, aY2, 128, 128, 128, 0);
- end;
- end;
- if gLifts <> nil then
- begin
- // Ðèñóåì ëèôòû:
- for a := 0 to High(gLifts) do
- with gLifts[a] do
- if PanelType <> 0 then
- begin
- // Ëåâûé âåðõíèé óãîë:
- aX := X div ScaleSz;
- aY := Y div ScaleSz;
- // Ðàçìåðû:
- aX2 := max(Width div ScaleSz, 1);
- aY2 := max(Height div ScaleSz, 1);
- // Ïðàâûé íèæíèé óãîë:
- aX2 := aX + aX2 - 1;
- aY2 := aY + aY2 - 1;
-
- case LiftType of
- 0: e_DrawFillQuad(aX, aY, aX2, aY2, 116, 72, 36, 0);
- 1: e_DrawFillQuad(aX, aY, aX2, aY2, 116, 124, 96, 0);
- 2: e_DrawFillQuad(aX, aY, aX2, aY2, 200, 80, 4, 0);
- 3: e_DrawFillQuad(aX, aY, aX2, aY2, 252, 140, 56, 0);
- end;
- end;
- end;
- if gWater <> nil then
- begin
- // Ðèñóåì âîäó:
- for a := 0 to High(gWater) do
- with gWater[a] do
- if PanelType <> 0 then
- begin
- // Ëåâûé âåðõíèé óãîë:
- aX := X div ScaleSz;
- aY := Y div ScaleSz;
- // Ðàçìåðû:
- aX2 := max(Width div ScaleSz, 1);
- aY2 := max(Height div ScaleSz, 1);
- // Ïðàâûé íèæíèé óãîë:
- aX2 := aX + aX2 - 1;
- aY2 := aY + aY2 - 1;
-
- e_DrawFillQuad(aX, aY, aX2, aY2, 0, 0, 192, 0);
- end;
- end;
- if gAcid1 <> nil then
- begin
- // Ðèñóåì êèñëîòó 1:
- for a := 0 to High(gAcid1) do
- with gAcid1[a] do
- if PanelType <> 0 then
- begin
- // Ëåâûé âåðõíèé óãîë:
- aX := X div ScaleSz;
- aY := Y div ScaleSz;
- // Ðàçìåðû:
- aX2 := max(Width div ScaleSz, 1);
- aY2 := max(Height div ScaleSz, 1);
- // Ïðàâûé íèæíèé óãîë:
- aX2 := aX + aX2 - 1;
- aY2 := aY + aY2 - 1;
-
- e_DrawFillQuad(aX, aY, aX2, aY2, 0, 176, 0, 0);
- end;
- end;
- if gAcid2 <> nil then
- begin
- // Ðèñóåì êèñëîòó 2:
- for a := 0 to High(gAcid2) do
- with gAcid2[a] do
- if PanelType <> 0 then
- begin
- // Ëåâûé âåðõíèé óãîë:
- aX := X div ScaleSz;
- aY := Y div ScaleSz;
- // Ðàçìåðû:
- aX2 := max(Width div ScaleSz, 1);
- aY2 := max(Height div ScaleSz, 1);
- // Ïðàâûé íèæíèé óãîë:
- aX2 := aX + aX2 - 1;
- aY2 := aY + aY2 - 1;
-
- e_DrawFillQuad(aX, aY, aX2, aY2, 176, 0, 0, 0);
- end;
- end;
- if gPlayers <> nil then
- begin
- // Ðèñóåì èãðîêîâ:
- for a := 0 to High(gPlayers) do
- if gPlayers[a] <> nil then with gPlayers[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;
-
- if gPlayers[a] = p then
- e_DrawFillQuad(aX, aY, aX2, aY2, 0, 255, 0, 0)
- else
- case Team of
- TEAM_RED: e_DrawFillQuad(aX, aY, aX2, aY2, 255, 0, 0, 0);
- TEAM_BLUE: e_DrawFillQuad(aX, aY, aX2, aY2, 0, 0, 255, 0);
- else e_DrawFillQuad(aX, aY, aX2, aY2, 255, 128, 0, 0);
- end;
- end;
- end;
- // Ðèñóåì ìîíñòðîâ
- g_Mons_ForEach(monDraw);
- end;
-end;
-
-
-// setup sX, sY, sWidth, sHeight, and transformation matrix before calling this!
-procedure renderDynLightsInternal ();
-var
- lln: Integer;
- lx, ly, lrad: Integer;
-begin
- //TODO: lights should be in separate grid, i think
- // but on the other side: grid may be slower for dynlights, as their lifetime is short
- if not gwin_has_stencil or (g_dynLightCount < 1) then exit;
-
- // setup OpenGL parameters
- glStencilMask($FFFFFFFF);
- glStencilFunc(GL_ALWAYS, 0, $FFFFFFFF);
- glEnable(GL_STENCIL_TEST);
- glEnable(GL_SCISSOR_TEST);
- glClear(GL_STENCIL_BUFFER_BIT);
- glStencilFunc(GL_EQUAL, 0, $ff);
-
- for lln := 0 to g_dynLightCount-1 do
- begin
- lx := g_dynLights[lln].x;
- ly := g_dynLights[lln].y;
- lrad := g_dynLights[lln].radius;
- if lrad < 3 then continue;
-
- if lx-sX+lrad < 0 then continue;
- if ly-sY+lrad < 0 then continue;
- if lx-sX-lrad >= gPlayerScreenSize.X then continue;
- if ly-sY-lrad >= gPlayerScreenSize.Y then continue;
-
- // set scissor to optimize drawing
- //FIXME: broken for splitscreen mode
- glScissor((lx-sX)-lrad+2, gPlayerScreenSize.Y-(ly-sY)-lrad-1+2, lrad*2-4, lrad*2-4);
- // no need to clear stencil buffer, light blitting will do it for us
- glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
- // draw extruded panels
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
- glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // no need to modify color buffer
- if (lrad > 4) then g_Map_DrawPanelShadowVolumes(lx, ly, lrad);
- // render light texture
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); // modify color buffer
- glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO); // draw light, and clear stencil buffer
- // blend it
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_TEXTURE_2D);
- // color and opacity
- glColor4f(g_dynLights[lln].r, g_dynLights[lln].g, g_dynLights[lln].b, g_dynLights[lln].a);
- glBindTexture(GL_TEXTURE_2D, g_Texture_Light());
- glBegin(GL_QUADS);
- glTexCoord2f(0.0, 0.0); glVertex2i(lx-lrad, ly-lrad); // top-left
- glTexCoord2f(1.0, 0.0); glVertex2i(lx+lrad, ly-lrad); // top-right
- glTexCoord2f(1.0, 1.0); glVertex2i(lx+lrad, ly+lrad); // bottom-right
- glTexCoord2f(0.0, 1.0); glVertex2i(lx-lrad, ly+lrad); // bottom-left
- glEnd();
- end;
-
- // done
- glDisable(GL_STENCIL_TEST);
- glDisable(GL_BLEND);
- glDisable(GL_SCISSOR_TEST);
- glScissor(0, 0, sWidth, sHeight);
-end;
-
-
-// setup sX, sY, sWidth, sHeight, and transformation matrix before calling this!
-// WARNING! this WILL CALL `glTranslatef()`, but won't restore matrices!
-procedure renderMapInternal (backXOfs, backYOfs: Integer; transX, transY: Integer; setTransMatrix: Boolean);
-type
- TDrawCB = procedure ();
-
- procedure drawPanelType (profname: AnsiString; panType: DWord; doDraw: Boolean);
- var
- tagmask: Integer;
- pan: TPanel;
- begin
- profileFrameDraw.sectionBegin(profname);
- if gdbg_map_use_accel_render then
- begin
- tagmask := panelTypeToTag(panType);
- while (gDrawPanelList.count > 0) do
- begin
- pan := TPanel(gDrawPanelList.front());
- if ((pan.tag and tagmask) = 0) then break;
- if doDraw then pan.Draw();
- gDrawPanelList.popFront();
- end;
- end
- else
- begin
- if doDraw then g_Map_DrawPanels(panType);
- end;
- profileFrameDraw.sectionEnd();
- end;
-
- procedure drawOther (profname: AnsiString; cb: TDrawCB);
- begin
- profileFrameDraw.sectionBegin(profname);
- if assigned(cb) then cb();
- profileFrameDraw.sectionEnd();
- end;
-
-begin
- 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('collect');
- if gdbg_map_use_accel_render then
- begin
- g_Map_CollectDrawPanels(sX, sY, sWidth, sHeight);
- end;
- profileFrameDraw.sectionEnd();
-
- profileFrameDraw.sectionBegin('skyback');
- g_Map_DrawBack(backXOfs, backYOfs);
- profileFrameDraw.sectionEnd();
-
- if (setTransMatrix) then glTranslatef(transX, transY, 0);
-
- drawPanelType('*back', PANEL_BACK, g_rlayer_back);
- drawPanelType('*step', PANEL_STEP, g_rlayer_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('*wall', PANEL_WALL, g_rlayer_wall);
- drawOther('monsters', @g_Monsters_Draw);
- drawPanelType('*door', PANEL_CLOSEDOOR, g_rlayer_door);
- drawOther('gfx', @g_GFX_Draw);
- drawOther('flags', @g_Map_DrawFlags);
- drawPanelType('*acid1', PANEL_ACID1, g_rlayer_acid1);
- drawPanelType('*acid2', PANEL_ACID2, g_rlayer_acid2);
- drawPanelType('*water', PANEL_WATER, g_rlayer_water);
- drawOther('dynlights', @renderDynLightsInternal);
- drawPanelType('*fore', PANEL_FORE, g_rlayer_fore);
-
- if g_debug_HealthBar then
- begin
- g_Monsters_DrawHealth();
- g_Player_DrawHealth();
- end;
-
- profileFrameDraw.mainEnd(); // map rendering
-end;
-
-
-procedure DrawMapView(x, y, w, h: Integer);
-
-var
- bx, by: Integer;
-begin
- glPushMatrix();
-
- bx := Round(x/(gMapInfo.Width - w)*(gBackSize.X - w));
- by := Round(y/(gMapInfo.Height - h)*(gBackSize.Y - h));
-
- sX := x;
- sY := y;
- sWidth := w;
- sHeight := h;
-
- renderMapInternal(-bx, -by, -x, -y, true);
-
- glPopMatrix();
-end;
-
-
-procedure DrawPlayer(p: TPlayer);
-var
- px, py, a, b, c, d: Integer;
- //R: TRect;
-
-begin
- if (p = nil) or (p.FDummy) then
- begin
- glPushMatrix();
- g_Map_DrawBack(0, 0);
- glPopMatrix();
- Exit;
- end;
-
- if (profileFrameDraw = nil) then profileFrameDraw := TProfiler.Create('RENDER', g_profile_history_size);
- profileFrameDraw.mainBegin(g_profile_frame_draw);
-
- gPlayerDrawn := p;
-
- glPushMatrix();
-
- px := p.GameX + PLAYER_RECT_CX;
- py := p.GameY + PLAYER_RECT_CY;
-
- if px > (gPlayerScreenSize.X div 2) then a := -px+(gPlayerScreenSize.X div 2) else a := 0;
- if py > (gPlayerScreenSize.Y div 2) then b := -py+(gPlayerScreenSize.Y div 2) else b := 0;
-
- if px > gMapInfo.Width-(gPlayerScreenSize.X div 2) then a := -gMapInfo.Width+gPlayerScreenSize.X;
- if py > gMapInfo.Height-(gPlayerScreenSize.Y div 2) then b := -gMapInfo.Height+gPlayerScreenSize.Y;
-
- if (gMapInfo.Width = gPlayerScreenSize.X) then a := 0
- else if (gMapInfo.Width < gPlayerScreenSize.X) then
- begin
- // hcenter
- a := (gPlayerScreenSize.X-gMapInfo.Width) div 2;
- end;
-
- if (gMapInfo.Height = gPlayerScreenSize.Y) then b := 0
- else if (gMapInfo.Height < gPlayerScreenSize.Y) then
- begin
- // vcenter
- b := (gPlayerScreenSize.Y-gMapInfo.Height) div 2;
- end;
-
- if p.IncCam <> 0 then
- begin
- if py > gMapInfo.Height-(gPlayerScreenSize.Y div 2) then
- begin
- if p.IncCam > 120-(py-(gMapInfo.Height-(gPlayerScreenSize.Y div 2))) then
- begin
- p.IncCam := 120-(py-(gMapInfo.Height-(gPlayerScreenSize.Y div 2)));
- end;
- end;
-
- if py < gPlayerScreenSize.Y div 2 then
- begin
- if p.IncCam < -120+((gPlayerScreenSize.Y div 2)-py) then
- begin
- p.IncCam := -120+((gPlayerScreenSize.Y div 2)-py);
- end;
- end;
-
- if p.IncCam < 0 then
- begin
- while (py+(gPlayerScreenSize.Y div 2)-p.IncCam > gMapInfo.Height) and (p.IncCam < 0) do p.IncCam := p.IncCam+1; //Inc(p.IncCam);
- end;
-
- if p.IncCam > 0 then
- begin
- while (py-(gPlayerScreenSize.Y div 2)-p.IncCam < 0) and (p.IncCam > 0) do p.IncCam := p.IncCam-1; //Dec(p.IncCam);
- end;
- end;
-
- if (px < gPlayerScreenSize.X div 2) or (gMapInfo.Width-gPlayerScreenSize.X <= 256) then c := 0
- else if (px > gMapInfo.Width-(gPlayerScreenSize.X div 2)) then c := gBackSize.X-gPlayerScreenSize.X
- else c := round((px-(gPlayerScreenSize.X div 2))/(gMapInfo.Width-gPlayerScreenSize.X)*(gBackSize.X-gPlayerScreenSize.X));
-
- if (py-p.IncCam <= gPlayerScreenSize.Y div 2) or (gMapInfo.Height-gPlayerScreenSize.Y <= 256) then d := 0
- else if (py-p.IncCam >= gMapInfo.Height-(gPlayerScreenSize.Y div 2)) then d := gBackSize.Y-gPlayerScreenSize.Y
- else d := round((py-p.IncCam-(gPlayerScreenSize.Y div 2))/(gMapInfo.Height-gPlayerScreenSize.Y)*(gBackSize.Y-gPlayerScreenSize.Y));
-
- sX := -a;
- sY := -(b+p.IncCam);
- sWidth := gPlayerScreenSize.X;
- sHeight := gPlayerScreenSize.Y;
-
- //glTranslatef(a, b+p.IncCam, 0);
-
- p.viewPortX := sX;
- p.viewPortY := sY;
- p.viewPortW := sWidth;
- p.viewPortH := sHeight;
-
- if (p = gPlayer1) then
- begin
- g_Holmes_plrView(p.viewPortX, p.viewPortY, p.viewPortW, p.viewPortH);
- end;
-
- renderMapInternal(-c, -d, a, b+p.IncCam, true);
-
- if p.FSpectator then
- e_TextureFontPrintEx(p.GameX + PLAYER_RECT_CX - 4,
- p.GameY + PLAYER_RECT_CY - 4,
- 'X', gStdFont, 255, 255, 255, 1, True);
- {
- for a := 0 to High(gCollideMap) do
- for b := 0 to High(gCollideMap[a]) do
- begin
- d := 0;
- if ByteBool(gCollideMap[a, b] and MARK_WALL) then
- d := d + 1;
- if ByteBool(gCollideMap[a, b] and MARK_DOOR) then
- d := d + 2;
-
- case d of
- 1: e_DrawPoint(1, b, a, 200, 200, 200);
- 2: e_DrawPoint(1, b, a, 64, 64, 255);
- 3: e_DrawPoint(1, b, a, 255, 0, 255);
- end;
- end;
- }
-
- glPopMatrix();
-
- p.DrawPain();
- p.DrawPickup();
- p.DrawRulez();
- if gShowMap then DrawMinimap(p, _TRect(0, 0, 128, 128));
- if g_Debug_Player then
- g_Player_DrawDebug(p);
- p.DrawGUI();
-end;
-
-procedure drawProfilers ();
-var
- px: Integer = -1;
- py: Integer = -1;
-begin
- if g_profile_frame_draw then px := px-drawProfiles(px, py, profileFrameDraw);
- if g_profile_collision then begin px := px-drawProfiles(px, py, profMapCollision); py -= calcProfilesHeight(profMonsLOS); end;
- if g_profile_los then begin px := px-drawProfiles(px, py, profMonsLOS); py -= calcProfilesHeight(profMonsLOS); end;
-end;
-
-procedure g_Game_Draw();
-var
- ID: DWORD;
- w, h: Word;
- ww, hh: Byte;
- Time: Int64;
- back: string;
- plView1, plView2: TPlayer;
- Split: Boolean;
-begin
- if gExit = EXIT_QUIT then Exit;
-
- Time := GetTimer() {div 1000};
- FPSCounter := FPSCounter+1;
- if Time - FPSTime >= 1000 then
- begin
- FPS := FPSCounter;
- FPSCounter := 0;
- FPSTime := Time;
- end;
-
- if gGameOn or (gState = STATE_FOLD) then
- begin
- if (gPlayer1 <> nil) and (gPlayer2 <> nil) then
- begin
- gSpectMode := SPECT_NONE;
- if not gRevertPlayers then
- begin
- plView1 := gPlayer1;
- plView2 := gPlayer2;
- end
- else
- begin
- plView1 := gPlayer2;
- plView2 := gPlayer1;
- end;
- end
- else
- if (gPlayer1 <> nil) or (gPlayer2 <> nil) then
- begin
- gSpectMode := SPECT_NONE;
- if gPlayer2 = nil then
- plView1 := gPlayer1
- else
- plView1 := gPlayer2;
- plView2 := nil;
- end
- else
- begin
- plView1 := nil;
- plView2 := nil;
- end;
-
- if (plView1 = nil) and (plView2 = nil) and (gSpectMode = SPECT_NONE) then
- gSpectMode := SPECT_STATS;
-
- if gSpectMode = SPECT_PLAYERS then
- if gPlayers <> nil then
- begin
- plView1 := GetActivePlayer_ByID(gSpectPID1);
- if plView1 = nil then
- begin
- gSpectPID1 := GetActivePlayerID_Next();
- plView1 := GetActivePlayer_ByID(gSpectPID1);
- end;
- if gSpectViewTwo then
- begin
- plView2 := GetActivePlayer_ByID(gSpectPID2);
- if plView2 = nil then
- begin
- gSpectPID2 := GetActivePlayerID_Next();
- plView2 := GetActivePlayer_ByID(gSpectPID2);
- end;
- end;
- end;
-
- if gSpectMode = SPECT_MAPVIEW then
- begin
- // Ðåæèì ïðîñìîòðà êàðòû
- Split := False;
- e_SetViewPort(0, 0, gScreenWidth, gScreenHeight);
- DrawMapView(gSpectX, gSpectY, gScreenWidth, gScreenHeight);
- gHearPoint1.Active := True;
- gHearPoint1.Coords.X := gScreenWidth div 2 + gSpectX;
- gHearPoint1.Coords.Y := gScreenHeight div 2 + gSpectY;
- gHearPoint2.Active := False;
- end
- else
- begin
- Split := (plView1 <> nil) and (plView2 <> nil);
-
- // Òî÷êè ñëóõà èãðîêîâ
- if plView1 <> nil then
- begin
- gHearPoint1.Active := True;
- gHearPoint1.Coords.X := plView1.GameX;
- gHearPoint1.Coords.Y := plView1.GameY;
- end else
- gHearPoint1.Active := False;
- if plView2 <> nil then
- begin
- gHearPoint2.Active := True;
- gHearPoint2.Coords.X := plView2.GameX;
- gHearPoint2.Coords.Y := plView2.GameY;
- end else
- gHearPoint2.Active := False;
-
- // Ðàçìåð ýêðàíîâ èãðîêîâ:
- gPlayerScreenSize.X := gScreenWidth-196;
- if Split then
- begin
- gPlayerScreenSize.Y := gScreenHeight div 2;
- if gScreenHeight mod 2 = 0 then
- Dec(gPlayerScreenSize.Y);
- end
- else
- gPlayerScreenSize.Y := gScreenHeight;
-
- if Split then
- if gScreenHeight mod 2 = 0 then
- e_SetViewPort(0, gPlayerScreenSize.Y+2, gPlayerScreenSize.X+196, gPlayerScreenSize.Y)
- else
- e_SetViewPort(0, gPlayerScreenSize.Y+1, gPlayerScreenSize.X+196, gPlayerScreenSize.Y);
-
- DrawPlayer(plView1);
- gPlayer1ScreenCoord.X := sX;
- gPlayer1ScreenCoord.Y := sY;
-
- if Split then
- begin
- e_SetViewPort(0, 0, gPlayerScreenSize.X+196, gPlayerScreenSize.Y);
-
- DrawPlayer(plView2);
- gPlayer2ScreenCoord.X := sX;
- gPlayer2ScreenCoord.Y := sY;
- end;
-
- e_SetViewPort(0, 0, gScreenWidth, gScreenHeight);
-
- if Split then
- e_DrawLine(2, 0, gScreenHeight div 2, gScreenWidth, gScreenHeight div 2, 0, 0, 0);
- end;
-
- if MessageText <> '' then
- begin
- w := 0;
- h := 0;
- e_CharFont_GetSizeFmt(gMenuFont, MessageText, w, h);
- if Split then
- e_CharFont_PrintFmt(gMenuFont, (gScreenWidth div 2)-(w div 2),
- (gScreenHeight div 2)-(h div 2), MessageText)
- else
- e_CharFont_PrintFmt(gMenuFont, (gScreenWidth div 2)-(w div 2),
- Round(gScreenHeight / 2.75)-(h div 2), MessageText);
- end;
-
- if IsDrawStat or (gSpectMode = 1) then DrawStat();
-
- if gSpectHUD and (not gChatShow) and (gSpectMode <> SPECT_NONE) then
- begin
- // Draw spectator GUI
- ww := 0;
- hh := 0;
- e_TextureFontGetSize(gStdFont, ww, hh);
- case gSpectMode of
- SPECT_STATS:
- e_TextureFontPrintEx(0, gScreenHeight - (hh+2)*2, 'MODE: Stats', gStdFont, 255, 255, 255, 1);
- SPECT_MAPVIEW:
- e_TextureFontPrintEx(0, gScreenHeight - (hh+2)*2, 'MODE: Observe Map', gStdFont, 255, 255, 255, 1);
- SPECT_PLAYERS:
- e_TextureFontPrintEx(0, gScreenHeight - (hh+2)*2, 'MODE: Watch Players', gStdFont, 255, 255, 255, 1);
- end;
- e_TextureFontPrintEx(2*ww, gScreenHeight - (hh+2), '< jump >', gStdFont, 255, 255, 255, 1);
- if gSpectMode = SPECT_MAPVIEW then
- begin
- e_TextureFontPrintEx(22*ww, gScreenHeight - (hh+2)*2, '[-]', gStdFont, 255, 255, 255, 1);
- e_TextureFontPrintEx(26*ww, gScreenHeight - (hh+2)*2, 'Step ' + IntToStr(gSpectStep), gStdFont, 255, 255, 255, 1);
- e_TextureFontPrintEx(34*ww, gScreenHeight - (hh+2)*2, '[+]', gStdFont, 255, 255, 255, 1);
- e_TextureFontPrintEx(18*ww, gScreenHeight - (hh+2), '<prev weap>', gStdFont, 255, 255, 255, 1);
- e_TextureFontPrintEx(30*ww, gScreenHeight - (hh+2), '<next weap>', gStdFont, 255, 255, 255, 1);
- end;
- if gSpectMode = SPECT_PLAYERS then
- begin
- e_TextureFontPrintEx(22*ww, gScreenHeight - (hh+2)*2, 'Player 1', gStdFont, 255, 255, 255, 1);
- e_TextureFontPrintEx(20*ww, gScreenHeight - (hh+2), '<left/right>', gStdFont, 255, 255, 255, 1);
- if gSpectViewTwo then
- begin
- e_TextureFontPrintEx(37*ww, gScreenHeight - (hh+2)*2, 'Player 2', gStdFont, 255, 255, 255, 1);
- e_TextureFontPrintEx(34*ww, gScreenHeight - (hh+2), '<prev w/next w>', gStdFont, 255, 255, 255, 1);
- e_TextureFontPrintEx(52*ww, gScreenHeight - (hh+2)*2, '2x View', gStdFont, 255, 255, 255, 1);
- e_TextureFontPrintEx(51*ww, gScreenHeight - (hh+2), '<up/down>', gStdFont, 255, 255, 255, 1);
- end
- else
- begin
- e_TextureFontPrintEx(35*ww, gScreenHeight - (hh+2)*2, '2x View', gStdFont, 255, 255, 255, 1);
- e_TextureFontPrintEx(34*ww, gScreenHeight - (hh+2), '<up/down>', gStdFont, 255, 255, 255, 1);
- end;
- end;
- end;
- end;
-
- if gPause and gGameOn and (g_ActiveWindow = nil) then
- begin
- //e_DrawFillQuad(0, 0, gScreenWidth-1, gScreenHeight-1, 48, 48, 48, 180);
- e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
-
- e_CharFont_GetSize(gMenuFont, _lc[I_MENU_PAUSE], w, h);
- e_CharFont_Print(gMenuFont, (gScreenWidth div 2)-(w div 2),
- (gScreenHeight div 2)-(h div 2), _lc[I_MENU_PAUSE]);
- end;
-
- if not gGameOn then
- begin
- if (gState = STATE_MENU) then
- begin
- if ((g_ActiveWindow = nil) or (g_ActiveWindow.BackTexture = '')) then
- begin
- if g_Texture_Get('MENU_BACKGROUND', ID) then
- e_DrawSize(ID, 0, 0, 0, False, False, gScreenWidth, gScreenHeight)
- else e_Clear(GL_COLOR_BUFFER_BIT, 0, 0, 0);
- end;
- if g_ActiveWindow <> nil then
- begin
- //e_DrawFillQuad(0, 0, gScreenWidth-1, gScreenHeight-1, 48, 48, 48, 180);
- e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
- end;
- end;
-
- if gState = STATE_FOLD then
- begin
- e_DrawFillQuad(0, 0, gScreenWidth-1, gScreenHeight-1, 0, 0, 0, EndingGameCounter);
- end;
-
- if gState = STATE_INTERCUSTOM then
- begin
- if gLastMap and (gGameSettings.GameMode = GM_COOP) then
- begin
- back := 'TEXTURE_endpic';
- if not g_Texture_Get(back, ID) then
- back := _lc[I_TEXTURE_ENDPIC];
- end
- else
- back := 'INTER';
-
- if g_Texture_Get(back, ID) then
- e_DrawSize(ID, 0, 0, 0, False, False, gScreenWidth, gScreenHeight)
- else
- e_Clear(GL_COLOR_BUFFER_BIT, 0, 0, 0);
-
- DrawCustomStat();
-
- if g_ActiveWindow <> nil then
- begin
- //e_DrawFillQuad(0, 0, gScreenWidth-1, gScreenHeight-1, 48, 48, 48, 180);
- e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
- end;
- end;
-
- if gState = STATE_INTERSINGLE then
- begin
- if EndingGameCounter > 0 then
- begin
- e_DrawFillQuad(0, 0, gScreenWidth-1, gScreenHeight-1, 0, 0, 0, EndingGameCounter);
- end
- else
- begin
- back := 'INTER';
-
- if g_Texture_Get(back, ID) then
- e_DrawSize(ID, 0, 0, 0, False, False, gScreenWidth, gScreenHeight)
- else
- e_Clear(GL_COLOR_BUFFER_BIT, 0, 0, 0);
-
- DrawSingleStat();
-
- if g_ActiveWindow <> nil then
- begin
- //e_DrawFillQuad(0, 0, gScreenWidth-1, gScreenHeight-1, 48, 48, 48, 180);
- e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
- end;
- end;
- end;
-
- if gState = STATE_ENDPIC then
- begin
- ID := DWORD(-1);
- if not g_Texture_Get('TEXTURE_endpic', ID) then
- g_Texture_Get(_lc[I_TEXTURE_ENDPIC], ID);
-
- if ID <> DWORD(-1) then
- e_DrawSize(ID, 0, 0, 0, False, False, gScreenWidth, gScreenHeight)
- else
- e_Clear(GL_COLOR_BUFFER_BIT, 0, 0, 0);
-
- if g_ActiveWindow <> nil then
- begin
- //e_DrawFillQuad(0, 0, gScreenWidth-1, gScreenHeight-1, 48, 48, 48, 180);
- e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
- end;
- end;
-
- if gState = STATE_SLIST then
- begin
- if g_Texture_Get('MENU_BACKGROUND', ID) then
- begin
- e_DrawSize(ID, 0, 0, 0, False, False, gScreenWidth, gScreenHeight);
- //e_DrawFillQuad(0, 0, gScreenWidth-1, gScreenHeight-1, 48, 48, 48, 180);
- e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
- end;
- g_Serverlist_Draw(slCurrent);
- end;
- end;