diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index f4882b6bdbc95b4069ef439cf192f1da7cb0a4a9..a505edc1cb44adbedd6af288142b102a4acd815f 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
SysUtils, Classes,
MAPDEF,
g_basic, g_player, e_graphics, g_res_downloader,
- g_sound, g_gui, wadreader, md5, xprofiler;
+ g_sound, g_gui, utils, md5, xprofiler;
type
TGameSettings = record
procedure g_SimpleError(Text: String);
function g_Game_IsTestMap(): Boolean;
procedure g_Game_DeleteTestMap();
-procedure GameCVars(P: SArray);
-procedure GameCommands(P: SArray);
-procedure GameCheats(P: SArray);
-procedure DebugCommands(P: SArray);
+procedure GameCVars(P: SSArray);
+procedure GameCommands(P: SSArray);
+procedure GameCheats(P: SSArray);
+procedure DebugCommands(P: SSArray);
procedure g_Game_Process_Params;
procedure g_Game_SetLoadingText(Text: String; Max: Integer; reWrite: Boolean);
procedure g_Game_StepLoading();
g_triggers, g_monsters, e_sound, CONFIG,
g_language, g_net, SDL,
ENet, e_msg, g_netmsg, g_netmaster, GL, GLExt,
- utils, sfs, g_holmes;
+ sfs, wadreader, g_holmes;
// ////////////////////////////////////////////////////////////////////////// //
EndingGameCounter: Byte = 0;
MessageText: String;
MessageTime: Word;
- MapList: SArray = nil;
+ MapList: SSArray = nil;
MapIndex: Integer = -1;
MegaWAD: record
info: TMegaWADInfo;
end;
//InterPic: String;
InterText: record
- lines: SArray;
+ lines: SSArray;
img: String;
cur_line: Integer;
cur_char: Integer;
if FindFirst(ModelsDir+'*.wad', faAnyFile, SR) = 0 then
repeat
if not g_PlayerModel_Load(ModelsDir+SR.Name) then
- e_WriteLog(Format('Error loading model %s', [SR.Name]), MSG_WARNING);
+ e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning);
until FindNext(SR) <> 0;
FindClose(SR);
if FindFirst(ModelsDir+'*.pk3', faAnyFile, SR) = 0 then
repeat
if not g_PlayerModel_Load(ModelsDir+SR.Name) then
- e_WriteLog(Format('Error loading model %s', [SR.Name]), MSG_WARNING);
+ e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning);
until FindNext(SR) <> 0;
FindClose(SR);
if FindFirst(ModelsDir+'*.zip', faAnyFile, SR) = 0 then
repeat
if not g_PlayerModel_Load(ModelsDir+SR.Name) then
- e_WriteLog(Format('Error loading model %s', [SR.Name]), MSG_WARNING);
+ e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning);
until FindNext(SR) <> 0;
FindClose(SR);
// new strafe mechanics
if (strafeDir = 0) then strafeDir := MoveButton; // start strafing
// now set direction according to strafe (reversed)
- if (strafeDir = 2) then plr.SetDirection(D_LEFT)
- else if (strafeDir = 1) then plr.SetDirection(D_RIGHT);
+ if (strafeDir = 2) then plr.SetDirection(TDirection.D_LEFT)
+ else if (strafeDir = 1) then plr.SetDirection(TDirection.D_RIGHT);
end
else
begin
strafeDir := 0; // not strafing anymore
// Ðàíüøå áûëà íàæàòà "Âïðàâî", à ñåé÷àñ "Âëåâî" => áåæèì âïðàâî, ñìîòðèì âëåâî:
- if (MoveButton = 2) and isKeyPressed(KeyLeft, KeyLeft2) then plr.SetDirection(D_LEFT)
+ if (MoveButton = 2) and isKeyPressed(KeyLeft, KeyLeft2) then plr.SetDirection(TDirection.D_LEFT)
// Ðàíüøå áûëà íàæàòà "Âëåâî", à ñåé÷àñ "Âïðàâî" => áåæèì âëåâî, ñìîòðèì âïðàâî:
- else if (MoveButton = 1) and isKeyPressed(KeyRight, KeyRight2) then plr.SetDirection(D_RIGHT)
+ else if (MoveButton = 1) and isKeyPressed(KeyRight, KeyRight2) then plr.SetDirection(TDirection.D_RIGHT)
// ×òî-òî áûëî íàæàòî è íå èçìåíèëîñü => êóäà áåæèì, òóäà è ñìîòðèì:
else if MoveButton <> 0 then plr.SetDirection(TDirection(MoveButton-1));
end;
Exit;
end;
-// ×èòàåì êëàâèàòóðó è äæîéñòèê, åñëè îêíî àêòèâíî:
- e_PollInput();
+ // ×èòàåì êëàâèàòóðó è äæîéñòèê, åñëè îêíî àêòèâíî
+ // no need to, as we'll do it in event handler
// Îáíîâëÿåì êîíñîëü (äâèæåíèå è ñîîáùåíèÿ):
g_Console_Update();
// Íóæíî ñìåíèòü ðàçðåøåíèå:
if gResolutionChange then
begin
- e_WriteLog('Changing resolution', MSG_NOTIFY);
+ e_WriteLog('Changing resolution', TMsgType.Notify);
g_Game_ChangeResolution(gRC_Width, gRC_Height, gRC_FullScreen, gRC_Maximized);
gResolutionChange := False;
end;
begin
if DataLoaded then Exit;
- e_WriteLog('Loading game data...', MSG_NOTIFY);
+ e_WriteLog('Loading game data...', TMsgType.Notify);
g_Texture_CreateWADEx('NOTEXTURE', GameWAD+':TEXTURES\NOTEXTURE');
g_Texture_CreateWADEx('TEXTURE_PLAYER_HUD', GameWAD+':TEXTURES\HUD');
g_Weapon_FreeData();
g_Monsters_FreeData();
- e_WriteLog('Releasing game data...', MSG_NOTIFY);
+ e_WriteLog('Releasing game data...', TMsgType.Notify);
g_Texture_Delete('NOTEXTURE');
g_Texture_Delete('TEXTURE_PLAYER_HUD');
begin
e_TextureFontGetSize(gStdFont, ww2, hh2);
- e_PollInput();
+ g_ProcessMessages();
+
if e_KeyPressed(IK_TAB) then
begin
if not gStatsPressed then
end;
procedure DrawLoadingStat();
+ procedure drawRect (x, y, w, h: Integer);
+ begin
+ if (w < 1) or (h < 1) then exit;
+ glBegin(GL_QUADS);
+ glVertex2f(x+0.375, y+0.375);
+ glVertex2f(x+w+0.375, y+0.375);
+ glVertex2f(x+w+0.375, y+h+0.375);
+ glVertex2f(x+0.375, y+h+0.375);
+ glEnd();
+ end;
+
+ procedure drawPBar (cur, total: Integer);
+ var
+ rectW, rectH: Integer;
+ x0, y0: Integer;
+ wdt: Integer;
+ begin
+ if (total < 1) then exit;
+ if (cur < 1) then exit; // don't blink
+ if (cur >= total) then exit; // don't blink
+ //if (cur < 0) then cur := 0;
+ //if (cur > total) then cur := total;
+
+ rectW := gScreenWidth-64;
+ rectH := 16;
+
+ x0 := (gScreenWidth-rectW) div 2;
+ y0 := gScreenHeight-rectH-64;
+ if (y0 < 2) then y0 := 2;
+
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+
+ //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;
+
var
ww, hh: Word;
xx, yy, i: Integer;
s: String;
begin
- if Length(LoadingStat.Msgs) = 0 then
- Exit;
+ if (Length(LoadingStat.Msgs) = 0) then exit;
e_CharFont_GetSize(gMenuFont, _lc[I_MENU_LOADING], ww, hh);
yy := (gScreenHeight div 3);
xx := (gScreenWidth div 3);
with LoadingStat do
+ begin
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];
+ 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;
+ e_CharFont_PrintEx(gMenuSmallFont, xx, yy, s, _RGB(255, 0, 0));
+ yy := yy + LOADING_INTERLINE;
+ drawPBar(CurValue, MaxValue);
+ end;
+ end;
end;
procedure DrawMinimap(p: TPlayer; RenderRect: e_graphics.TRect);
//glTranslatef(a, b+p.IncCam, 0);
- if (p = gPlayer1) then g_Holmes_plrViewSize(sWidth, sHeight);
+ //if (p = gPlayer1) and (g_dbg_scale >= 1.0) then g_Holmes_plrViewSize(sWidth, sHeight);
+ //conwritefln('OLD: (%s,%s)-(%s,%s)', [sX, sY, sWidth, sHeight]);
fixViewportForScale();
+ //conwritefln(' (%s,%s)-(%s,%s)', [sX, sY, sWidth, sHeight]);
p.viewPortX := sX;
p.viewPortY := sY;
p.viewPortW := sWidth;
p.viewPortH := sHeight;
- if (p = gPlayer1) then g_Holmes_plrViewPos(sX, sY);
+ if (p = gPlayer1) then
+ begin
+ g_Holmes_plrViewPos(sX, sY);
+ g_Holmes_plrViewSize(sWidth, sHeight);
+ end;
renderMapInternal(-c, -d, true);
e_DrawLine(2, 0, gScreenHeight div 2, gScreenWidth, gScreenHeight div 2, 0, 0, 0);
end;
+ // draw inspector
+ if (g_holmes_enabled) then g_Holmes_Draw();
+
if MessageText <> '' then
begin
w := 0;
g_ActiveWindow.Draw();
end;
- // draw inspector
- if (g_holmes_enabled) then g_Holmes_Draw();
-
g_Console_Draw();
if g_debug_Sounds and gGameOn then
procedure g_FatalError(Text: String);
begin
g_Console_Add(Format(_lc[I_FATAL_ERROR], [Text]), True);
- e_WriteLog(Format(_lc[I_FATAL_ERROR], [Text]), MSG_WARNING);
+ e_WriteLog(Format(_lc[I_FATAL_ERROR], [Text]), TMsgType.Warning);
gExit := EXIT_SIMPLE;
end;
procedure g_SimpleError(Text: String);
begin
g_Console_Add(Format(_lc[I_SIMPLE_ERROR], [Text]), True);
- e_WriteLog(Format(_lc[I_SIMPLE_ERROR], [Text]), MSG_WARNING);
+ e_WriteLog(Format(_lc[I_SIMPLE_ERROR], [Text]), TMsgType.Warning);
end;
procedure g_Game_SetupScreenSize();
begin
g_Game_Free();
- e_WriteLog('Starting singleplayer game...', MSG_NOTIFY);
+ e_WriteLog('Starting singleplayer game...', TMsgType.Notify);
g_Game_ClearLoading();
begin
g_Game_Free();
- e_WriteLog('Starting custom game...', MSG_NOTIFY);
+ e_WriteLog('Starting custom game...', TMsgType.Notify);
g_Game_ClearLoading();
begin
g_Game_Free();
- e_WriteLog('Starting net game (server)...', MSG_NOTIFY);
+ e_WriteLog('Starting net game (server)...', TMsgType.Notify);
g_Game_ClearLoading();
g_Game_Free();
State := 0;
- e_WriteLog('Starting net game (client)...', MSG_NOTIFY);
- e_WriteLog('NET: Trying to connect to ' + Addr + ':' + IntToStr(Port) + '...', MSG_NOTIFY);
+ e_WriteLog('Starting net game (client)...', TMsgType.Notify);
+ e_WriteLog('NET: Trying to connect to ' + Addr + ':' + IntToStr(Port) + '...', TMsgType.Notify);
g_Game_ClearLoading();
enet_packet_destroy(NetEvent.packet);
end
else
+ begin
if (NetEvent.kind = ENET_EVENT_TYPE_DISCONNECT) then
begin
State := 0;
OuterLoop := False;
Break;
end;
+ end;
end;
ProcessLoading(true);
- e_PollInput();
-
if e_KeyPressed(IK_ESCAPE) or e_KeyPressed(IK_SPACE) then
begin
State := 0;
g_Player_Init();
NetState := NET_STATE_GAME;
MC_SEND_FullStateRequest;
- e_WriteLog('NET: Connection successful.', MSG_NOTIFY);
+ e_WriteLog('NET: Connection successful.', TMsgType.Notify);
end;
procedure g_Game_SaveOptions();
WadName: string;
{
WAD: TWADFile;
- MapList: SArray;
+ MapList: SSArray;
time: Integer;
}
begin
if gTempDelete then DeleteFile(WadName);
end;
-procedure GameCVars(P: SArray);
+procedure GameCVars(P: SSArray);
var
a, b: Integer;
stat: TPlayerStatArray;
e_LogWriteLn ('^=======================^');
end;
-procedure DebugCommands(P: SArray);
+procedure DebugCommands(P: SSArray);
var
a, b: Integer;
cmd: string;
end;
-procedure GameCheats(P: SArray);
+procedure GameCheats(P: SSArray);
var
cmd: string;
f, a: Integer;
end;
end;
-procedure GameCommands(P: SArray);
+procedure GameCommands(P: SSArray);
var
a, b: Integer;
s, pw: String;
if P[2] = '' then
g_Console_Add(Format(_lc[I_MSG_NO_MAPS], [P[1]]))
else
- g_Console_Add(Format(_lc[I_MSG_NO_MAP], [UpperCase(P[2])]));
+ g_Console_Add(Format(_lc[I_MSG_NO_MAP_FALLBACK], [UpperCase(P[2]), P[1]]));
end else
g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[1]]));
end
if P[4] = '' then
g_Console_Add(Format(_lc[I_MSG_NO_MAPS], [P[3]]))
else
- g_Console_Add(Format(_lc[I_MSG_NO_MAP], [UpperCase(P[4])]));
+ g_Console_Add(Format(_lc[I_MSG_NO_MAP_FALLBACK], [UpperCase(P[4]), P[3]]));
end else
g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[3]]));
end
g_Game_ChangeMap(s);
end else
begin
- g_Console_Add(Format(_lc[I_MSG_NO_MAP], [s]));
// Òàêîé êàðòû íåò, èùåì WAD ôàéë
P[1] := addWadExtension(P[1]);
+ g_Console_Add(Format(_lc[I_MSG_NO_MAP_FALLBACK], [s, P[1]]));
if FileExists(MapsDir + P[1]) then
begin
// Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà
nm := True;
end else
begin
- g_Console_Add(Format(_lc[I_MSG_NO_MAP], [s]));
// Òàêîé êàðòû íåò, èùåì WAD ôàéë
P[1] := addWadExtension(P[1]);
+ g_Console_Add(Format(_lc[I_MSG_NO_MAP_FALLBACK], [s, P[1]]));
if FileExists(MapsDir + P[1]) then
begin
// Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà
if (s <> '') then
gMapOnce := True;
+ // Override map to test:
+ s := LowerCase(Find_Param_Value(pars, '-testmap'));
+ if s <> '' then
+ gTestMap := MapsDir + s;
+
// Delete test map after play:
s := Find_Param_Value(pars, '--testdelete');
if (s <> '') then
begin
gMapToDelete := MapsDir + map;
- e_WriteLog('"--testdelete" is deprecated, use --tempdelete.', MSG_FATALERROR);
+ e_WriteLog('"--testdelete" is deprecated, use --tempdelete.', TMsgType.Fatal);
Halt(1);
end;
// Delete temporary WAD after play:
s := Find_Param_Value(pars, '--tempdelete');
- if (s <> '') then
+ if (s <> '') and (gTestMap <> '') then
begin
- gMapToDelete := MapsDir + map;
+ gMapToDelete := gTestMap;
gTempDelete := True;
end;
Reset(F);
if IOResult <> 0 then
begin
- e_WriteLog(Format(_lc[I_SIMPLE_ERROR], ['Failed to read file: ' + s]), MSG_WARNING);
+ e_WriteLog(Format(_lc[I_SIMPLE_ERROR], ['Failed to read file: ' + s]), TMsgType.Warning);
g_Console_Add(Format(_lc[I_CONSOLE_ERROR_READ], [s]));
CloseFile(F);
Exit;
end;
- e_WriteLog('Executing script: ' + s, MSG_NOTIFY);
+ e_WriteLog('Executing script: ' + s, TMsgType.Notify);
g_Console_Add(Format(_lc[I_CONSOLE_EXEC], [s]));
while not EOF(F) do
ReadLn(F, s);
if IOResult <> 0 then
begin
- e_WriteLog(Format(_lc[I_SIMPLE_ERROR], ['Failed to read file: ' + s]), MSG_WARNING);
+ e_WriteLog(Format(_lc[I_SIMPLE_ERROR], ['Failed to read file: ' + s]), TMsgType.Warning);
g_Console_Add(Format(_lc[I_CONSOLE_ERROR_READ], [s]));
CloseFile(F);
Exit;