diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index 4135b5af5794f8f3aeeaf8275e764f08a32f9dfa..8444232487b70404ff6b6575e96c4778e65fa51e 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
-(* Copyright (C) DooM 2D:Forever Developers
+(* Copyright (C) Doom 2D: Forever Developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
e_input, e_log, g_console, g_items, g_map, g_panel,
g_playermodel, g_gfx, g_options, g_weapons, Math,
g_triggers, g_monsters, e_sound, CONFIG,
- g_language, g_net, SDL,
+ g_language, g_net,
ENet, e_msg, g_netmsg, g_netmaster, GL, GLExt,
sfs, wadreader, g_holmes;
+var
+ hasPBarGfx: Boolean = false;
+
+
// ////////////////////////////////////////////////////////////////////////// //
function gPause (): Boolean; inline; begin result := gPauseMain or gPauseHolmes; end;
ShowCount: Integer;
Msgs: Array of String;
NextMsg: Word;
+ PBarWasHere: Boolean; // did we draw a progress bar for this message?
end;
TParamStrValue = record
end;
procedure g_Game_LoadData();
+var
+ wl, hl: Integer;
+ wr, hr: Integer;
+ wb, hb: Integer;
+ wm, hm: Integer;
begin
if DataLoaded then Exit;
g_Texture_CreateWADEx('TEXTURE_PLAYER_BLUEFLAG_D', GameWAD+':TEXTURES\FLAGHUD_B_DROP');
g_Texture_CreateWADEx('TEXTURE_PLAYER_TALKBUBBLE', GameWAD+':TEXTURES\TALKBUBBLE');
g_Texture_CreateWADEx('TEXTURE_PLAYER_INVULPENTA', GameWAD+':TEXTURES\PENTA');
+
+ hasPBarGfx := true;
+ if not g_Texture_CreateWADEx('UI_GFX_PBAR_LEFT', GameWAD+':TEXTURES\LLEFT') then hasPBarGfx := false;
+ if not g_Texture_CreateWADEx('UI_GFX_PBAR_MARKER', GameWAD+':TEXTURES\LMARKER') then hasPBarGfx := false;
+ if not g_Texture_CreateWADEx('UI_GFX_PBAR_MIDDLE', GameWAD+':TEXTURES\LMIDDLE') then hasPBarGfx := false;
+ if not g_Texture_CreateWADEx('UI_GFX_PBAR_RIGHT', GameWAD+':TEXTURES\LRIGHT') then hasPBarGfx := false;
+
+ if hasPBarGfx then
+ begin
+ g_Texture_GetSize('UI_GFX_PBAR_LEFT', wl, hl);
+ g_Texture_GetSize('UI_GFX_PBAR_RIGHT', wr, hr);
+ g_Texture_GetSize('UI_GFX_PBAR_MIDDLE', wb, hb);
+ g_Texture_GetSize('UI_GFX_PBAR_MARKER', wm, hm);
+ if (wl > 0) and (hl > 0) and (wr > 0) and (hr = hl) and (wb > 0) and (hb = hl) and (wm > 0) and (hm > 0) and (hm <= hl) then
+ begin
+ // yay!
+ end
+ else
+ begin
+ hasPBarGfx := false;
+ end;
+ end;
+
g_Frames_CreateWAD(nil, 'FRAMES_TELEPORT', GameWAD+':TEXTURES\TELEPORT', 64, 64, 10, False);
g_Sound_CreateWADEx('SOUND_GAME_TELEPORT', GameWAD+':SOUNDS\TELEPORT');
g_Sound_CreateWADEx('SOUND_GAME_NOTELEPORT', GameWAD+':SOUNDS\NOTELEPORT');
glEnd();
end;
- procedure drawPBar (cur, total: Integer);
+ function drawPBar (cur, total: Integer; washere: Boolean): Boolean;
var
rectW, rectH: Integer;
x0, y0: Integer;
wdt: Integer;
- begin
+ wl, hl: Integer;
+ wr, hr: Integer;
+ wb, hb: Integer;
+ wm, hm: Integer;
+ idl, idr, idb, idm: LongWord;
+ f, my: Integer;
+ begin
+ result := false;
if (total < 1) then exit;
if (cur < 1) then exit; // don't blink
- if (cur >= total) then exit; // don't blink
+ if (not washere) and (cur >= total) then exit; // don't blink
//if (cur < 0) then cur := 0;
//if (cur > total) then cur := total;
+ result := true;
- rectW := gScreenWidth-64;
- rectH := 16;
+ if (hasPBarGfx) then
+ begin
+ g_Texture_Get('UI_GFX_PBAR_LEFT', idl);
+ g_Texture_GetSize('UI_GFX_PBAR_LEFT', wl, hl);
+ g_Texture_Get('UI_GFX_PBAR_RIGHT', idr);
+ g_Texture_GetSize('UI_GFX_PBAR_RIGHT', wr, hr);
+ g_Texture_Get('UI_GFX_PBAR_MIDDLE', idb);
+ g_Texture_GetSize('UI_GFX_PBAR_MIDDLE', wb, hb);
+ g_Texture_Get('UI_GFX_PBAR_MARKER', idm);
+ g_Texture_GetSize('UI_GFX_PBAR_MARKER', wm, hm);
- x0 := (gScreenWidth-rectW) div 2;
- y0 := gScreenHeight-rectH-64;
- if (y0 < 2) then y0 := 2;
+ //rectW := gScreenWidth-360;
+ rectW := trunc(624.0*gScreenWidth/1024.0);
+ rectH := hl;
- glDisable(GL_BLEND);
- glDisable(GL_TEXTURE_2D);
+ x0 := (gScreenWidth-rectW) div 2;
+ y0 := gScreenHeight-rectH-64;
+ if (y0 < 2) then y0 := 2;
+
+ glEnable(GL_SCISSOR_TEST);
+
+ // left and right
+ glScissor(x0, gScreenHeight-y0-rectH, rectW, rectH);
+ e_DrawSize(idl, x0, y0, 0, true, false, wl, hl);
+ e_DrawSize(idr, x0+rectW-wr, y0, 0, true, false, wr, hr);
+
+ // body
+ glScissor(x0+wl, gScreenHeight-y0-rectH, rectW-wl-wr, rectH);
+ f := x0+wl;
+ while (f < x0+rectW) do
+ begin
+ e_DrawSize(idb, f, y0, 0, true, false, wb, hb);
+ f += wb;
+ end;
+
+ // filled part
+ wdt := (rectW-wl-wr)*cur div total;
+ if (wdt > rectW-wl-wr) then wdt := rectW-wr-wr;
+ if (wdt > 0) then
+ begin
+ my := y0; // don't be so smart, ketmar: +(rectH-wm) div 2;
+ glScissor(x0+wl, gScreenHeight-my-rectH, wdt, hm);
+ f := x0+wl;
+ while (wdt > 0) do
+ begin
+ e_DrawSize(idm, f, y0, 0, true, false, wm, hm);
+ f += wm;
+ wdt -= wm;
+ end;
+ end;
- //glClearColor(0, 0, 0, 0);
- //glClear(GL_COLOR_BUFFER_BIT);
+ glScissor(0, 0, gScreenWidth, gScreenHeight);
+ end
+ else
+ begin
+ rectW := gScreenWidth-64;
+ rectH := 16;
- glColor4ub(127, 127, 127, 255);
- drawRect(x0-2, y0-2, rectW+4, rectH+4);
+ x0 := (gScreenWidth-rectW) div 2;
+ y0 := gScreenHeight-rectH-64;
+ if (y0 < 2) then y0 := 2;
- glColor4ub(0, 0, 0, 255);
- drawRect(x0-1, y0-1, rectW+2, rectH+2);
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
- glColor4ub(127, 127, 127, 255);
- wdt := rectW*cur div total;
- if (wdt > rectW) then wdt := rectW;
- drawRect(x0, y0, wdt, rectH);
+ //glClearColor(0, 0, 0, 0);
+ //glClear(GL_COLOR_BUFFER_BIT);
+
+ glColor4ub(127, 127, 127, 255);
+ drawRect(x0-2, y0-2, rectW+4, rectH+4);
+
+ glColor4ub(0, 0, 0, 255);
+ drawRect(x0-1, y0-1, rectW+2, rectH+2);
+
+ glColor4ub(127, 127, 127, 255);
+ wdt := rectW*cur div total;
+ if (wdt > rectW) then wdt := rectW;
+ drawRect(x0, y0, wdt, rectH);
+ end;
end;
var
e_CharFont_PrintEx(gMenuSmallFont, xx, yy, s, _RGB(255, 0, 0));
yy := yy + LOADING_INTERLINE;
- drawPBar(CurValue, MaxValue);
+ PBarWasHere := drawPBar(CurValue, MaxValue, PBarWasHere);
end;
end;
end;
procedure g_Game_StartSingle(Map: String; TwoPlayers: Boolean; nPlayers: Byte);
var
i, nPl: Integer;
+ tmps: AnsiString;
begin
g_Game_Free();
// Çàãðóçêà è çàïóñê êàðòû:
if not g_Game_StartMap(MAP, True) then
begin
- g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [gGameSettings.WAD + ':\' + MAP]));
+ if (Pos(':\', Map) > 0) or (Pos(':/', Map) > 0) then tmps := Map else tmps := gGameSettings.WAD + ':\' + MAP;
+ g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [tmps]));
Exit;
end;
CurValue := 0;
MaxValue := Max;
ShowCount := 0;
+ PBarWasHere := false;
end;
g_ActiveWindow := nil;
for len := Low(Msgs) to High(Msgs) do
Msgs[len] := '';
NextMsg := 0;
+ PBarWasHere := false;
end;
end;