X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=53280381f8b390f9e16819f49786a3fd90e0cfc0;hb=ceef3cf5ed716aab604357b2805a978cb9c6bab6;hp=d98227aa36faed7685df9c144c9848c0ebd783bb;hpb=db50943803691219f9199de6e299dc59283c31c5;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index d98227a..5328038 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -22,7 +22,7 @@ uses 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 @@ -123,10 +123,10 @@ procedure g_FatalError(Text: String); 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(); @@ -346,7 +346,7 @@ uses 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; // ////////////////////////////////////////////////////////////////////////// // @@ -360,9 +360,9 @@ begin if g_Game_IsNet then exit; if not gDebugMode then begin - if not gCheats then exit; + //if not gCheats then exit; if not (gGameSettings.GameType in [GT_SINGLE, GT_CUSTOM]) then exit; - if (gGameSettings.GameMode <> GM_COOP) then exit; + if not (gGameSettings.GameMode in [GM_COOP, GM_SINGLE]) then exit; end; result := true; end; @@ -540,7 +540,7 @@ var EndingGameCounter: Byte = 0; MessageText: String; MessageTime: Word; - MapList: SArray = nil; + MapList: SSArray = nil; MapIndex: Integer = -1; MegaWAD: record info: TMegaWADInfo; @@ -563,7 +563,7 @@ var end; //InterPic: String; InterText: record - lines: SArray; + lines: SSArray; img: String; cur_line: Integer; cur_char: Integer; @@ -1255,21 +1255,21 @@ begin 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); @@ -1443,16 +1443,16 @@ begin // 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; @@ -1965,7 +1965,7 @@ begin // Íóæíî ñìåíèòü ðàçðåøåíèå: 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; @@ -2046,7 +2046,7 @@ procedure g_Game_LoadData(); 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'); @@ -2122,7 +2122,7 @@ begin 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'); @@ -2503,13 +2503,60 @@ begin 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); @@ -2517,16 +2564,19 @@ begin 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); @@ -3101,15 +3151,21 @@ begin //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); @@ -3299,6 +3355,9 @@ begin 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; @@ -3489,9 +3548,6 @@ begin g_ActiveWindow.Draw(); end; - // draw inspector - if (g_holmes_enabled) then g_Holmes_Draw(); - g_Console_Draw(); if g_debug_Sounds and gGameOn then @@ -3539,7 +3595,7 @@ end; 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; @@ -3547,7 +3603,7 @@ 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(); @@ -3731,7 +3787,7 @@ var begin g_Game_Free(); - e_WriteLog('Starting singleplayer game...', MSG_NOTIFY); + e_WriteLog('Starting singleplayer game...', TMsgType.Notify); g_Game_ClearLoading(); @@ -3804,7 +3860,7 @@ var begin g_Game_Free(); - e_WriteLog('Starting custom game...', MSG_NOTIFY); + e_WriteLog('Starting custom game...', TMsgType.Notify); g_Game_ClearLoading(); @@ -3902,7 +3958,7 @@ procedure g_Game_StartServer(Map: String; GameMode: Byte; begin g_Game_Free(); - e_WriteLog('Starting net game (server)...', MSG_NOTIFY); + e_WriteLog('Starting net game (server)...', TMsgType.Notify); g_Game_ClearLoading(); @@ -4012,8 +4068,8 @@ begin 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(); @@ -4165,7 +4221,7 @@ begin 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(); @@ -4597,7 +4653,7 @@ var WadName: string; { WAD: TWADFile; - MapList: SArray; + MapList: SSArray; time: Integer; } begin @@ -4650,7 +4706,7 @@ begin if gTempDelete then DeleteFile(WadName); end; -procedure GameCVars(P: SArray); +procedure GameCVars(P: SSArray); var a, b: Integer; stat: TPlayerStatArray; @@ -5197,7 +5253,7 @@ begin e_LogWriteLn ('^=======================^'); end; -procedure DebugCommands(P: SArray); +procedure DebugCommands(P: SSArray); var a, b: Integer; cmd: string; @@ -5205,7 +5261,7 @@ var mon: TMonster; begin // Êîìàíäû îòëàäî÷íîãî ðåæèìà: - if gDebugMode then + if {gDebugMode}conIsCheatsEnabled then begin cmd := LowerCase(P[0]); if cmd = 'd_window' then @@ -5333,14 +5389,13 @@ begin end; -procedure GameCheats(P: SArray); +procedure GameCheats(P: SSArray); var cmd: string; f, a: Integer; plr: TPlayer; begin - if (not gGameOn) or (not gCheats) or ((gGameSettings.GameType <> GT_SINGLE) and - (gGameSettings.GameMode <> GM_COOP) and (not gDebugMode)) or g_Game_IsNet then + if (not gGameOn) or (not conIsCheatsEnabled) then begin g_Console_Add('not available'); exit; @@ -5549,7 +5604,7 @@ begin end; end; -procedure GameCommands(P: SArray); +procedure GameCommands(P: SSArray); var a, b: Integer; s, pw: String; @@ -6003,7 +6058,7 @@ begin 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 @@ -6057,7 +6112,7 @@ begin 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 @@ -6091,9 +6146,9 @@ begin 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 // Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà @@ -6180,9 +6235,9 @@ 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 // Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà @@ -7133,20 +7188,25 @@ 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; @@ -7177,12 +7237,12 @@ begin 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 @@ -7190,7 +7250,7 @@ begin 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;