X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fgame%2Fg_game.pas;h=7e20f0962af8e18c463e556ec3a9443ba9d9a668;hb=972b9c8afd00ac4117edd481183e0f39af6d272b;hp=b0f64563e8cfd2ecb1a3ad1ef39aaebde48a7469;hpb=48a0fec9c3b27ded8cfd9e669257329a475189b0;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index b0f6456..7e20f09 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -1,4 +1,4 @@ -(* 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 @@ -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,11 @@ 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; + + +var + hasPBarGfx: Boolean = false; // ////////////////////////////////////////////////////////////////////////// // @@ -360,9 +364,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; @@ -513,6 +517,7 @@ type ShowCount: Integer; Msgs: Array of String; NextMsg: Word; + PBarWasHere: Boolean; // did we draw a progress bar for this message? end; TParamStrValue = record @@ -540,7 +545,7 @@ var EndingGameCounter: Byte = 0; MessageText: String; MessageTime: Word; - MapList: SArray = nil; + MapList: SSArray = nil; MapIndex: Integer = -1; MegaWAD: record info: TMegaWADInfo; @@ -563,7 +568,7 @@ var end; //InterPic: String; InterText: record - lines: SArray; + lines: SSArray; img: String; cur_line: Integer; cur_char: Integer; @@ -1255,21 +1260,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 +1448,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; @@ -1538,8 +1543,8 @@ begin Exit; end; -// ×èòàåì êëàâèàòóðó è äæîéñòèê, åñëè îêíî àêòèâíî: - e_PollInput(); + // ×èòàåì êëàâèàòóðó è äæîéñòèê, åñëè îêíî àêòèâíî + // no need to, as we'll do it in event handler // Îáíîâëÿåì êîíñîëü (äâèæåíèå è ñîîáùåíèÿ): g_Console_Update(); @@ -1965,7 +1970,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; @@ -2043,10 +2048,15 @@ begin end; procedure g_Game_LoadData(); +var + wl, hl: Integer; + wr, hr: Integer; + wb, hb: Integer; + wm, hm: Integer; 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'); @@ -2054,14 +2064,37 @@ begin g_Texture_CreateWADEx('TEXTURE_PLAYER_HUDJET', GameWAD+':TEXTURES\JETBAR'); g_Texture_CreateWADEx('TEXTURE_PLAYER_HUDBG', GameWAD+':TEXTURES\HUDBG'); g_Texture_CreateWADEx('TEXTURE_PLAYER_ARMORHUD', GameWAD+':TEXTURES\ARMORHUD'); - g_Texture_CreateWADEx('TEXTURE_PLAYER_REDFLAG', GameWAD+':TEXTURES\FLAGHUD_RB', GameWAD+':TEXTURES\FLAGHUD_R_BASE'); - g_Texture_CreateWADEx('TEXTURE_PLAYER_REDFLAG_S', GameWAD+':TEXTURES\FLAGHUD_RS', GameWAD+':TEXTURES\FLAGHUD_R_STOLEN'); - g_Texture_CreateWADEx('TEXTURE_PLAYER_REDFLAG_D', GameWAD+':TEXTURES\FLAGHUD_RD', GameWAD+':TEXTURES\FLAGHUD_R_DROP'); - g_Texture_CreateWADEx('TEXTURE_PLAYER_BLUEFLAG', GameWAD+':TEXTURES\FLAGHUD_BB', GameWAD+':TEXTURES\FLAGHUD_B_BASE'); - g_Texture_CreateWADEx('TEXTURE_PLAYER_BLUEFLAG_S', GameWAD+':TEXTURES\FLAGHUD_BS', GameWAD+':TEXTURES\FLAGHUD_B_STOLEN'); - g_Texture_CreateWADEx('TEXTURE_PLAYER_BLUEFLAG_D', GameWAD+':TEXTURES\FLAGHUD_BD', GameWAD+':TEXTURES\FLAGHUD_B_DROP'); + g_Texture_CreateWADEx('TEXTURE_PLAYER_REDFLAG', GameWAD+':TEXTURES\FLAGHUD_R_BASE'); + g_Texture_CreateWADEx('TEXTURE_PLAYER_REDFLAG_S', GameWAD+':TEXTURES\FLAGHUD_R_STOLEN'); + g_Texture_CreateWADEx('TEXTURE_PLAYER_REDFLAG_D', GameWAD+':TEXTURES\FLAGHUD_R_DROP'); + g_Texture_CreateWADEx('TEXTURE_PLAYER_BLUEFLAG', GameWAD+':TEXTURES\FLAGHUD_B_BASE'); + g_Texture_CreateWADEx('TEXTURE_PLAYER_BLUEFLAG_S', GameWAD+':TEXTURES\FLAGHUD_B_STOLEN'); + 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'); @@ -2122,7 +2155,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'); @@ -2182,7 +2215,8 @@ var begin e_TextureFontGetSize(gStdFont, ww2, hh2); - e_PollInput(); + g_ProcessMessages(); + if e_KeyPressed(IK_TAB) then begin if not gStatsPressed then @@ -2503,13 +2537,130 @@ 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; + + function drawPBar (cur, total: Integer; washere: Boolean): Boolean; + var + rectW, rectH: Integer; + x0, y0: Integer; + wdt: Integer; + 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 (not washere) and (cur >= total) then exit; // don't blink + //if (cur < 0) then cur := 0; + //if (cur > total) then cur := total; + result := true; + + 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); + + rectW := gScreenWidth-64; + rectH := hl; + + 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+(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; + + glScissor(0, 0, gScreenWidth, gScreenHeight); + +{ +procedure e_DrawSize(ID: DWORD; X, Y: Integer; Alpha: Byte; AlphaChannel: Boolean; + Blending: Boolean; Width, Height: Word; Mirror: TMirrorType = TMirrorType.None); + 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 + else + begin + 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; + 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 +2668,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; + PBarWasHere := drawPBar(CurValue, MaxValue, PBarWasHere); + end; + end; end; procedure DrawMinimap(p: TPlayer; RenderRect: e_graphics.TRect); @@ -2750,7 +2904,7 @@ 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 g_playerLight) or (not gwin_has_stencil) or (g_dynLightCount < 1) then exit; + if (not gwin_k8_enable_light_experiments) or (not gwin_has_stencil) or (g_dynLightCount < 1) then exit; // rendering mode //ambColor := gCurrentMap['light_ambient'].rgba; @@ -3101,15 +3255,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 +3459,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 +3652,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 +3699,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 +3707,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(); @@ -3728,10 +3888,11 @@ end; procedure g_Game_StartSingle(Map: String; TwoPlayers: Boolean; nPlayers: Byte); var i, nPl: Integer; + tmps: AnsiString; begin g_Game_Free(); - e_WriteLog('Starting singleplayer game...', MSG_NOTIFY); + e_WriteLog('Starting singleplayer game...', TMsgType.Notify); g_Game_ClearLoading(); @@ -3783,7 +3944,8 @@ begin // Çàãðóçêà è çàïóñê êàðòû: 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; @@ -3804,7 +3966,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 +4064,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 +4174,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(); @@ -4130,6 +4292,7 @@ begin enet_packet_destroy(NetEvent.packet); end else + begin if (NetEvent.kind = ENET_EVENT_TYPE_DISCONNECT) then begin State := 0; @@ -4139,12 +4302,11 @@ begin OuterLoop := False; Break; end; + end; end; ProcessLoading(true); - e_PollInput(); - if e_KeyPressed(IK_ESCAPE) or e_KeyPressed(IK_SPACE) then begin State := 0; @@ -4165,7 +4327,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 +4759,7 @@ var WadName: string; { WAD: TWADFile; - MapList: SArray; + MapList: SSArray; time: Integer; } begin @@ -4650,7 +4812,7 @@ begin if gTempDelete then DeleteFile(WadName); end; -procedure GameCVars(P: SArray); +procedure GameCVars(P: SSArray); var a, b: Integer; stat: TPlayerStatArray; @@ -5197,7 +5359,7 @@ begin e_LogWriteLn ('^=======================^'); end; -procedure DebugCommands(P: SArray); +procedure DebugCommands(P: SSArray); var a, b: Integer; cmd: string; @@ -5205,7 +5367,7 @@ var mon: TMonster; begin // Êîìàíäû îòëàäî÷íîãî ðåæèìà: - if gDebugMode then + if {gDebugMode}conIsCheatsEnabled then begin cmd := LowerCase(P[0]); if cmd = 'd_window' then @@ -5333,14 +5495,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 +5710,7 @@ begin end; end; -procedure GameCommands(P: SArray); +procedure GameCommands(P: SSArray); var a, b: Integer; s, pw: String; @@ -6003,7 +6164,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 +6218,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 +6252,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 +6341,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 // Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà @@ -6946,6 +7107,7 @@ begin CurValue := 0; MaxValue := Max; ShowCount := 0; + PBarWasHere := false; end; g_ActiveWindow := nil; @@ -6982,6 +7144,7 @@ begin for len := Low(Msgs) to High(Msgs) do Msgs[len] := ''; NextMsg := 0; + PBarWasHere := false; end; end; @@ -7133,20 +7296,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 +7345,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 +7358,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; @@ -7226,4 +7394,7 @@ begin conRegVar('dbg_holmes', @g_holmes_enabled, 'enable/disable Holmes', 'Holmes', true); conRegVar('dbg_scale', @g_dbg_scale, 0.01, 100.0, 'experimental deBUG scale mode', '', false); + + conRegVar('light_enabled', @gwin_k8_enable_light_experiments, 'enable/disable dynamic lighting', 'lighting'); + conRegVar('light_player_halo', @g_playerLight, 'enable/disable player halo', 'player light halo'); end.