diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index b89b03736ce7c8d0f7b62425729ff69d3a3e856b..e371e0b3efe1bb221b8f7750ac35db1f637ca82d 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
procedure g_Game_Restart();
procedure g_Game_RestartLevel();
procedure g_Game_RestartRound(NoMapRestart: Boolean = False);
procedure g_Game_Restart();
procedure g_Game_RestartLevel();
procedure g_Game_RestartRound(NoMapRestart: Boolean = False);
-procedure g_Game_ClientWAD(NewWAD: String; WHash: TMD5Digest);
+function g_Game_ClientWAD (NewWAD: String; const WHash: TMD5Digest): AnsiString;
procedure g_Game_SaveOptions();
function g_Game_StartMap(Map: String; Force: Boolean = False; const oldMapPath: AnsiString=''): Boolean;
procedure g_Game_ChangeMap(const MapPath: String);
procedure g_Game_SaveOptions();
function g_Game_StartMap(Map: String; Force: Boolean = False; const oldMapPath: AnsiString=''): Boolean;
procedure g_Game_ChangeMap(const MapPath: String);
{$IFDEF ENABLE_HOLMES}
g_holmes,
{$ENDIF}
{$IFDEF ENABLE_HOLMES}
g_holmes,
{$ENDIF}
- e_texture, g_textures, g_main, g_window, g_menu,
+ e_texture, e_res, g_textures, g_main, g_window, g_menu,
e_input, e_log, g_console, g_items, g_map, g_panel,
g_playermodel, g_gfx, g_options, Math,
g_triggers, g_monsters, e_sound, CONFIG,
g_language, g_net,
ENet, e_msg, g_netmsg, g_netmaster,
e_input, e_log, g_console, g_items, g_map, g_panel,
g_playermodel, g_gfx, g_options, Math,
g_triggers, g_monsters, e_sound, CONFIG,
g_language, g_net,
ENet, e_msg, g_netmsg, g_netmaster,
- sfs, wadreader;
+ sfs, wadreader, g_system;
var
var
cfg: TConfig;
p: Pointer;
{b, }len: Integer;
cfg: TConfig;
p: Pointer;
{b, }len: Integer;
- s: string;
+ s: AnsiString;
begin
g_Game_FreeWAD();
gGameSettings.WAD := WAD;
if not (gGameSettings.GameMode in [GM_COOP, GM_SINGLE]) then
Exit;
begin
g_Game_FreeWAD();
gGameSettings.WAD := WAD;
if not (gGameSettings.GameMode in [GM_COOP, GM_SINGLE]) then
Exit;
- MegaWAD.info := g_Game_GetMegaWADInfo(MapsDir + WAD);
+ MegaWAD.info := g_Game_GetMegaWADInfo(WAD);
w := TWADFile.Create();
w := TWADFile.Create();
- w.ReadFile(MapsDir + WAD);
+ w.ReadFile(WAD);
if not w.GetResource('INTERSCRIPT', p, len) then
begin
if not w.GetResource('INTERSCRIPT', p, len) then
begin
MegaWAD.endpic := cfg.ReadStr('megawad', 'endpic', '');
if MegaWAD.endpic <> '' then
begin
MegaWAD.endpic := cfg.ReadStr('megawad', 'endpic', '');
if MegaWAD.endpic <> '' then
begin
- s := g_ExtractWadName(MegaWAD.endpic);
- if s = '' then s := MapsDir+WAD else s := GameDir+'/wads/';
TEXTUREFILTER := GL_LINEAR;
TEXTUREFILTER := GL_LINEAR;
- g_Texture_CreateWADEx('TEXTURE_endpic', s+MegaWAD.endpic);
+ s := e_GetResourcePath(WadDirs, MegaWAD.endpic, WAD);
+ g_Texture_CreateWADEx('TEXTURE_endpic', s);
TEXTUREFILTER := GL_NEAREST;
end;
MegaWAD.endmus := cfg.ReadStr('megawad', 'endmus', 'Standart.wad:D2DMUS\ÊÎÍÅÖ');
if MegaWAD.endmus <> '' then
begin
TEXTUREFILTER := GL_NEAREST;
end;
MegaWAD.endmus := cfg.ReadStr('megawad', 'endmus', 'Standart.wad:D2DMUS\ÊÎÍÅÖ');
if MegaWAD.endmus <> '' then
begin
- s := g_ExtractWadName(MegaWAD.endmus);
- if s = '' then s := MapsDir+WAD else s := GameDir+'/wads/';
- g_Sound_CreateWADEx('MUSIC_endmus', s+MegaWAD.endmus, True);
+ s := e_GetResourcePath(WadDirs, MegaWAD.endmus, WAD);
+ g_Sound_CreateWADEx('MUSIC_endmus', s, True);
end;
cfg.Free();
end;
cfg.Free();
gDelayedEvents[n].DENum := Num;
gDelayedEvents[n].DEStr := Str;
if DEType = DE_GLOBEVENT then
gDelayedEvents[n].DENum := Num;
gDelayedEvents[n].DEStr := Str;
if DEType = DE_GLOBEVENT then
- gDelayedEvents[n].Time := (GetTimer() {div 1000}) + Time
+ gDelayedEvents[n].Time := (sys_GetTicks() {div 1000}) + Time
else
gDelayedEvents[n].Time := gTime + Time;
Result := n;
else
gDelayedEvents[n].Time := gTime + Time;
Result := n;
procedure g_Game_Init();
var
SR: TSearchRec;
procedure g_Game_Init();
var
SR: TSearchRec;
+ knownFiles: array of AnsiString = nil;
+ found: Boolean;
+ wext, s: AnsiString;
+ f: Integer;
begin
gExit := 0;
gMapToDelete := '';
begin
gExit := 0;
gMapToDelete := '';
g_Game_SetLoadingText(_lc[I_LOAD_MODELS], 0, False);
g_PlayerModel_LoadData();
g_Game_SetLoadingText(_lc[I_LOAD_MODELS], 0, False);
g_PlayerModel_LoadData();
- 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]), 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]), 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]), TMsgType.Warning);
- until FindNext(SR) <> 0;
- FindClose(SR);
+ // load models from all possible wad types, in all known directories
+ // this does a loosy job (linear search, ooph!), but meh
+ for wext in wadExtensions do
+ begin
+ for f := High(ModelDirs) downto Low(ModelDirs) do
+ begin
+ if (FindFirst(ModelDirs[f]+DirectorySeparator+'*'+wext, faAnyFile, SR) = 0) then
+ begin
+ repeat
+ found := false;
+ for s in knownFiles do
+ begin
+ if (strEquCI1251(forceFilenameExt(SR.Name, ''), forceFilenameExt(ExtractFileName(s), ''))) then
+ begin
+ found := true;
+ break;
+ end;
+ end;
+ if not found then
+ begin
+ SetLength(knownFiles, length(knownFiles)+1);
+ knownFiles[High(knownFiles)] := ModelDirs[f]+DirectorySeparator+SR.Name;
+ end;
+ until (FindNext(SR) <> 0);
+ end;
+ FindClose(SR);
+ end;
+ end;
+
+ if (length(knownFiles) = 0) then raise Exception.Create('no player models found!');
+
+ if (length(knownFiles) = 1) then e_LogWriteln('1 player model found.', TMsgType.Notify) else e_LogWritefln('%d player models found.', [Integer(length(knownFiles))], TMsgType.Notify);
+ for s in knownFiles do
+ begin
+ if not g_PlayerModel_Load(s) then e_LogWritefln('Error loading model "%s"', [s], TMsgType.Warning);
+ end;
gGameOn := false;
gPauseMain := false;
gGameOn := false;
gPauseMain := false;
Exit;
end;
Exit;
end;
+ // process master server communications
+ g_Net_Slist_Pulse();
+
case gState of
STATE_INTERSINGLE, // Ñòàòèñòêà ïîñëå ïðîõîæäåíèÿ óðîâíÿ â Îäèíî÷íîé èãðå
STATE_INTERCUSTOM, // Ñòàòèñòêà ïîñëå ïðîõîæäåíèÿ óðîâíÿ â Ñâîåé èãðå
case gState of
STATE_INTERSINGLE, // Ñòàòèñòêà ïîñëå ïðîõîæäåíèÿ óðîâíÿ â Îäèíî÷íîé èãðå
STATE_INTERCUSTOM, // Ñòàòèñòêà ïîñëå ïðîõîæäåíèÿ óðîâíÿ â Ñâîåé èãðå
// send unexpected platform changes
g_Map_NetSendInterestingPanels();
// send unexpected platform changes
g_Map_NetSendInterestingPanels();
+ g_Net_Slist_ServerUpdate();
+ {
if NetUseMaster then
begin
if NetUseMaster then
begin
- if gTime >= NetTimeToMaster then
+ if (gTime >= NetTimeToMaster) or g_Net_Slist_IsConnectionInProgress then
begin
begin
- if (NetMHost = nil) or (NetMPeer = nil) then
- begin
- if not g_Net_Slist_Connect then g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_SLIST_ERROR]);
- end;
-
+ if (not g_Net_Slist_IsConnectionActive) then g_Net_Slist_Connect(false); // non-blocking connection to the master
g_Net_Slist_Update;
NetTimeToMaster := gTime + NetMasterRate;
end;
end;
g_Net_Slist_Update;
NetTimeToMaster := gTime + NetMasterRate;
end;
end;
+ }
end
else if (NetMode = NET_CLIENT) then
begin
end
else if (NetMode = NET_CLIENT) then
begin
KeyPress(IK_F10);
end;
KeyPress(IK_F10);
end;
- Time := GetTimer() {div 1000};
+ Time := sys_GetTicks() {div 1000};
// Îáðàáîòêà îòëîæåííûõ ñîáûòèé:
if gDelayedEvents <> nil then
// Îáðàáîòêà îòëîæåííûõ ñîáûòèé:
if gDelayedEvents <> nil then
begin
e_TextureFontGetSize(gStdFont, ww2, hh2);
begin
e_TextureFontGetSize(gStdFont, ww2, hh2);
- g_ProcessMessages();
+ sys_HandleInput;
if g_Console_Action(ACTION_SCORES) then
begin
if g_Console_Action(ACTION_SCORES) then
begin
renderMapInternal(-c, -d, true);
renderMapInternal(-c, -d, true);
- if (gGameSettings.GameMode <> GM_SINGLE) and gPlayerIndicator then
- if gPlayers[i] <> nil then
- for i := 0 to High(gPlayers) do
- if gPlayers[i] = p then gPlayers[i].DrawIndicator(_RGB(255, 255, 255))
- else if (gPlayers[i].Team = p.Team) and (gPlayers[i].Team <> TEAM_NONE)
- then
- gPlayers[i].DrawIndicator(gPlayers[i].GetColor);
+ if (gGameSettings.GameMode <> GM_SINGLE) and (gPlayerIndicator > 0) then
+ case gPlayerIndicator of
+ 1:
+ p.DrawIndicator(_RGB(255, 255, 255));
+
+ 2:
+ for i := 0 to High(gPlayers) do
+ if gPlayers[i] <> nil then
+ if gPlayers[i] = p then p.DrawIndicator(_RGB(255, 255, 255))
+ else if (gPlayers[i].Team = p.Team) and (gPlayers[i].Team <> TEAM_NONE) then
+ if gPlayerIndicatorStyle = 1 then
+ gPlayers[i].DrawIndicator(_RGB(192, 192, 192))
+ else gPlayers[i].DrawIndicator(gPlayers[i].GetColor);
+ end;
if p.FSpectator then
e_TextureFontPrintEx(p.GameX + PLAYER_RECT_CX - 4,
if p.FSpectator then
e_TextureFontPrintEx(p.GameX + PLAYER_RECT_CX - 4,
begin
if gExit = EXIT_QUIT then Exit;
begin
if gExit = EXIT_QUIT then Exit;
- Time := GetTimer() {div 1000};
+ Time := sys_GetTicks() {div 1000};
FPSCounter := FPSCounter+1;
if Time - FPSTime >= 1000 then
begin
FPSCounter := FPSCounter+1;
if Time - FPSTime >= 1000 then
begin
g_Game_DeleteTestMap();
gExit := EXIT_QUIT;
g_Game_DeleteTestMap();
gExit := EXIT_QUIT;
- PushExitEvent();
+ sys_RequestQuit;
end;
procedure g_FatalError(Text: String);
end;
procedure g_FatalError(Text: String);
procedure g_Game_ChangeResolution(newWidth, newHeight: Word; nowFull, nowMax: Boolean);
begin
procedure g_Game_ChangeResolution(newWidth, newHeight: Word; nowFull, nowMax: Boolean);
begin
- g_Window_SetSize(newWidth, newHeight, nowFull);
+ sys_SetDisplayMode(newWidth, newHeight, gBPP, nowFull);
end;
procedure g_Game_AddPlayer(Team: Byte = TEAM_NONE);
end;
procedure g_Game_AddPlayer(Team: Byte = TEAM_NONE);
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_PlayerCreate(gPlayer1.UID);
gPlayer1.Respawn(False, True);
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_PlayerCreate(gPlayer1.UID);
gPlayer1.Respawn(False, True);
-
- if g_Game_IsNet and NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerPlayerComes();
end;
Exit;
end;
Exit;
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_PlayerCreate(gPlayer2.UID);
gPlayer2.Respawn(False, True);
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_PlayerCreate(gPlayer2.UID);
gPlayer2.Respawn(False, True);
-
- if g_Game_IsNet and NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerPlayerComes();
end;
Exit;
end;
Exit;
Pl.Kill(K_SIMPLEKILL, 0, HIT_DISCON);
g_Console_Add(Format(_lc[I_PLAYER_LEAVE], [Pl.Name]), True);
g_Player_Remove(Pl.UID);
Pl.Kill(K_SIMPLEKILL, 0, HIT_DISCON);
g_Console_Add(Format(_lc[I_PLAYER_LEAVE], [Pl.Name]), True);
g_Player_Remove(Pl.UID);
-
- if g_Game_IsNet and NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerPlayerLeaves();
end else
gPlayer2 := nil;
Exit;
end else
gPlayer2 := nil;
Exit;
Pl.Kill(K_SIMPLEKILL, 0, HIT_DISCON);
g_Console_Add(Format(_lc[I_PLAYER_LEAVE], [Pl.Name]), True);
g_Player_Remove(Pl.UID);
Pl.Kill(K_SIMPLEKILL, 0, HIT_DISCON);
g_Console_Add(Format(_lc[I_PLAYER_LEAVE], [Pl.Name]), True);
g_Player_Remove(Pl.UID);
-
- if g_Game_IsNet and NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerPlayerLeaves();
end else
begin
gPlayer1 := nil;
end else
begin
gPlayer1 := nil;
end;
Exit;
end;
end;
Exit;
end;
+ g_Net_Slist_ServerPlayerLeaves();
end;
procedure g_Game_Spectate();
end;
procedure g_Game_Spectate();
IPAddr: LongWord; Port: Word);
begin
g_Game_Free();
IPAddr: LongWord; Port: Word);
begin
g_Game_Free();
+ g_Net_Slist_ServerClosed();
e_WriteLog('Starting net game (server)...', TMsgType.Notify);
e_WriteLog('Starting net game (server)...', TMsgType.Notify);
Exit;
end;
Exit;
end;
- g_Net_Slist_Set(NetSlistIP, NetSlistPort);
+ g_Net_Slist_Set(NetSlistIP, NetSlistPort, NetSlistList);
+
+ g_Net_Slist_ServerStarted();
// Çàãðóçêà è çàïóñê êàðòû:
if not g_Game_StartMap(Map, True) then
begin
// Çàãðóçêà è çàïóñê êàðòû:
if not g_Game_StartMap(Map, True) then
begin
+ g_Net_Slist_ServerClosed();
g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [Map]));
Exit;
end;
g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [Map]));
Exit;
end;
g_Map_GetPointCount(RESPAWNPOINT_RED)+
g_Map_GetPointCount(RESPAWNPOINT_BLUE)) < 1 then
begin
g_Map_GetPointCount(RESPAWNPOINT_RED)+
g_Map_GetPointCount(RESPAWNPOINT_BLUE)) < 1 then
begin
+ g_Net_Slist_ServerClosed();
g_FatalError(_lc[I_GAME_ERROR_GET_SPAWN]);
Exit;
end;
g_FatalError(_lc[I_GAME_ERROR_GET_SPAWN]);
Exit;
end;
// Íàñòðîéêè èãðîêîâ è áîòîâ:
g_Player_Init();
// Íàñòðîéêè èãðîêîâ è áîòîâ:
g_Player_Init();
+ g_Net_Slist_ServerMapStarted();
NetState := NET_STATE_GAME;
end;
NetState := NET_STATE_GAME;
end;
NetState := NET_STATE_AUTH;
g_Game_SetLoadingText(_lc[I_LOAD_CONNECT], 0, False);
NetState := NET_STATE_AUTH;
g_Game_SetLoadingText(_lc[I_LOAD_CONNECT], 0, False);
+
+ // create (or update) map/resource databases
+ g_Res_CreateDatabases(true);
+
// Ñòàðòóåì êëèåíò
if not g_Net_Connect(Addr, Port) then
begin
// Ñòàðòóåì êëèåíò
if not g_Net_Connect(Addr, Port) then
begin
OuterLoop := True;
while OuterLoop do
begin
OuterLoop := True;
while OuterLoop do
begin
- while (enet_host_service(NetHost, @NetEvent, 0) > 0) do
+ // fuck! https://www.mail-archive.com/enet-discuss@cubik.org/msg00852.html
+ // tl;dr: on shitdows, we can get -1 sometimes, and it is *NOT* a failure.
+ // thank you, enet. let's ignore failures altogether then.
+ while (enet_host_service(NetHost, @NetEvent, 50) > 0) do
begin
if (NetEvent.kind = ENET_EVENT_TYPE_RECEIVE) then
begin
begin
if (NetEvent.kind = ENET_EVENT_TYPE_RECEIVE) then
begin
+ if (NetEvent.channelID = NET_CHAN_DOWNLOAD_EX) then
+ begin
+ // ignore all download packets, they're processed by separate code
+ enet_packet_destroy(NetEvent.packet);
+ continue;
+ end;
Ptr := NetEvent.packet^.data;
if not InMsg.Init(Ptr, NetEvent.packet^.dataLength, True) then
Ptr := NetEvent.packet^.data;
if not InMsg.Init(Ptr, NetEvent.packet^.dataLength, True) then
+ begin
+ enet_packet_destroy(NetEvent.packet);
continue;
continue;
+ end;
InMsg.ReadLongWord(); // skip size
MID := InMsg.ReadByte();
InMsg.ReadLongWord(); // skip size
MID := InMsg.ReadByte();
gGameSettings.Options := InMsg.ReadLongWord();
T := InMsg.ReadLongWord();
gGameSettings.Options := InMsg.ReadLongWord();
T := InMsg.ReadLongWord();
- newResPath := g_Res_SearchSameWAD(MapsDir, WadName, gWADHash);
- if newResPath = '' then
+ //newResPath := g_Res_SearchSameWAD(MapsDir, WadName, gWADHash);
+ //if newResPath = '' then
begin
begin
- g_Game_SetLoadingText(_lc[I_LOAD_DL_RES], 0, False);
- newResPath := g_Res_DownloadWAD(WadName);
+ //g_Game_SetLoadingText(_lc[I_LOAD_DL_RES], 0, False);
+ newResPath := g_Res_DownloadMapWAD(WadName, gWADHash);
if newResPath = '' then
begin
g_FatalError(_lc[I_NET_ERR_HASH]);
if newResPath = '' then
begin
g_FatalError(_lc[I_NET_ERR_HASH]);
NetState := NET_STATE_NONE;
Exit;
end;
NetState := NET_STATE_NONE;
Exit;
end;
+ e_LogWritefln('using downloaded map wad [%s] for [%s]`', [newResPath, WadName], TMsgType.Notify);
end;
end;
- newResPath := ExtractRelativePath(MapsDir, newResPath);
+ //newResPath := ExtractRelativePath(MapsDir, newResPath);
+
gPlayer1 := g_Player_Get(g_Player_Create(gPlayer1Settings.Model,
gPlayer1Settings.Color,
gPlayer1 := g_Player_Get(g_Player_Create(gPlayer1Settings.Model,
gPlayer1Settings.Color,
ProcessLoading(true);
ProcessLoading(true);
- if e_KeyPressed(IK_SPACE) or e_KeyPressed(IK_ESCAPE) or e_KeyPressed(VK_ESCAPE) or
- e_KeyPressed(JOY0_JUMP) or e_KeyPressed(JOY1_JUMP) or e_KeyPressed(JOY2_JUMP) or e_KeyPressed(JOY3_JUMP) then
+ if g_Net_UserRequestExit() then
begin
State := 0;
break;
begin
State := 0;
break;
e_WriteLog('NET: Connection successful.', TMsgType.Notify);
end;
e_WriteLog('NET: Connection successful.', TMsgType.Notify);
end;
-procedure g_Game_SaveOptions();
+procedure g_Game_SaveOptions;
+ var s: AnsiString;
begin
begin
- g_Options_Write_Video(GameDir+'/'+CONFIG_FILENAME);
+ s := e_GetWriteableDir(ConfigDirs);
+ if s <> '' then
+ g_Options_Write_Video(s + '/' + CONFIG_FILENAME)
+ else
+ e_LogWritefln('unable to find or create directory for configs', []);
end;
procedure g_Game_ChangeMap(const MapPath: String);
end;
procedure g_Game_ChangeMap(const MapPath: String);
if g_Game_IsClient then
Exit;
map := g_ExtractFileName(gMapInfo.Map);
if g_Game_IsClient then
Exit;
map := g_ExtractFileName(gMapInfo.Map);
+ e_LogWritefln('g_Game_Restart: map = "%s" gCurrentMapFileName = "%s"', [map, gCurrentMapFileName]);
MessageTime := 0;
gGameOn := False;
MessageTime := 0;
gGameOn := False;
@@ -4778,6 +4827,7 @@ function g_Game_StartMap(Map: String; Force: Boolean = False; const oldMapPath:
var
NewWAD, ResName: String;
I: Integer;
var
NewWAD, ResName: String;
I: Integer;
+ nws: AnsiString;
begin
g_Map_Free((Map <> gCurrentMapFileName) and (oldMapPath <> gCurrentMapFileName));
g_Player_RemoveAllCorpses();
begin
g_Map_Free((Map <> gCurrentMapFileName) and (oldMapPath <> gCurrentMapFileName));
g_Player_RemoveAllCorpses();
ResName := g_ExtractFileName(Map);
if g_Game_IsServer then
begin
ResName := g_ExtractFileName(Map);
if g_Game_IsServer then
begin
- gWADHash := MD5File(MapsDir + NewWAD);
- g_Game_LoadWAD(NewWAD);
- end else
+ nws := findDiskWad(NewWAD);
+ //writeln('000: Map=[', Map, ']; nws=[', nws, ']; NewWAD=[', NewWAD, ']');
+ if (length(nws) = 0) then nws := e_FindWad(MapDirs, NewWAD);
+ //writeln('001: Map=[', Map, ']; nws=[', nws, ']; NewWAD=[', NewWAD, ']');
+ //nws := NewWAD;
+ if (length(nws) = 0) then
+ begin
+ ResName := ''; // failed
+ end
+ else
+ begin
+ NewWAD := nws;
+ if (g_Game_IsNet) then gWADHash := MD5File(nws);
+ //writeln('********: nws=', nws, ' : Map=', Map, ' : nw=', NewWAD, ' : resname=', ResName);
+ g_Game_LoadWAD(NewWAD);
+ end;
+ end
+ else
+ begin
// hash received in MC_RECV_GameEvent -> NET_EV_MAPSTART
// hash received in MC_RECV_GameEvent -> NET_EV_MAPSTART
- g_Game_ClientWAD(NewWAD, gWADHash);
- end else
+ NewWAD := g_Game_ClientWAD(NewWAD, gWADHash);
+ end;
+ end
+ else
+ begin
+ NewWAD := gGameSettings.WAD;
ResName := Map;
ResName := Map;
+ end;
- Result := g_Map_Load(MapsDir + gGameSettings.WAD + ':\' + ResName);
+ //writeln('********: gsw=', gGameSettings.WAD, '; rn=', ResName);
+ result := false;
+ if (ResName <> '') and (NewWAD <> '') then
+ begin
+ //result := g_Map_Load(gGameSettings.WAD + ':\' + ResName);
+ result := g_Map_Load(NewWAD+':\'+ResName);
+ end;
if Result then
begin
g_Player_ResetAll(Force or gLastMap, gGameSettings.GameType = GT_SINGLE);
if Result then
begin
g_Player_ResetAll(Force or gLastMap, gGameSettings.GameType = GT_SINGLE);
MH_SEND_GameEvent(NET_EV_MAPSTART, gGameSettings.GameMode, Map);
// Ìàñòåðñåðâåð
MH_SEND_GameEvent(NET_EV_MAPSTART, gGameSettings.GameMode, Map);
// Ìàñòåðñåðâåð
- if NetUseMaster then
- begin
- if (NetMHost = nil) or (NetMPeer = nil) then
- if not g_Net_Slist_Connect then
- g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_SLIST_ERROR]);
-
- g_Net_Slist_Update;
- end;
+ g_Net_Slist_ServerMapStarted();
if NetClients <> nil then
for I := 0 to High(NetClients) do
if NetClients <> nil then
for I := 0 to High(NetClients) do
g_Game_ExecuteEvent('onmapstart');
end;
g_Game_ExecuteEvent('onmapstart');
end;
-procedure SetFirstLevel();
+procedure SetFirstLevel;
begin
gNextMap := '';
begin
gNextMap := '';
- MapList := g_Map_GetMapsList(MapsDir + gGameSettings.WAD);
+ MapList := g_Map_GetMapsList(gGameSettings.WAD);
if MapList = nil then
Exit;
if MapList = nil then
Exit;
if gGameSettings.GameMode = GM_COOP then
g_Player_RememberAll;
if gGameSettings.GameMode = GM_COOP then
g_Player_RememberAll;
- if not g_Map_Exist(MapsDir + gGameSettings.WAD + ':\' + gNextMap) then
+ if not g_Map_Exist(gGameSettings.WAD + ':\' + gNextMap) then
begin
gLastMap := True;
if gGameSettings.GameMode = GM_COOP then
begin
gLastMap := True;
if gGameSettings.GameMode = GM_COOP then
gStatsPressed := True;
gNextMap := 'MAP01';
gStatsPressed := True;
gNextMap := 'MAP01';
- if not g_Map_Exist(MapsDir + gGameSettings.WAD + ':\' + gNextMap) then
+ if not g_Map_Exist(gGameSettings.WAD + ':\' + gNextMap) then
g_Game_NextLevel;
if g_Game_IsNet then
g_Game_NextLevel;
if g_Game_IsNet then
gNextMap := Map;
end;
gNextMap := Map;
end;
-procedure g_Game_ClientWAD(NewWAD: String; WHash: TMD5Digest);
+function g_Game_ClientWAD (NewWAD: String; const WHash: TMD5Digest): AnsiString;
var
var
- gWAD: String;
+ gWAD{, xwad}: String;
begin
begin
- if LowerCase(NewWAD) = LowerCase(gGameSettings.WAD) then
- Exit;
- if not g_Game_IsClient then
+ result := NewWAD;
+ if not g_Game_IsClient then Exit;
+ //e_LogWritefln('*** g_Game_ClientWAD: `%s`', [NewWAD]);
+
+ gWAD := g_Res_DownloadMapWAD(ExtractFileName(NewWAD), WHash);
+ if gWAD = '' then
+ begin
+ result := '';
+ g_Game_Free();
+ g_FatalError(Format(_lc[I_GAME_ERROR_MAP_WAD], [ExtractFileName(NewWAD)]));
Exit;
Exit;
+ end;
+
+(*
+ xwad := ExtractRelativePath(MapsDir, gWAD);
+ e_LogWritefln('using downloaded client map wad [%s] for [%s]`', [xwad, NewWAD], TMsgType.Notify);
+ NewWAD := xwad;
+ g_Game_LoadWAD(NewWAD);
+*)
+
+ e_LogWritefln('using downloaded client map wad [%s]`', [NewWAD], TMsgType.Notify);
+ g_Game_LoadWAD(NewWAD);
+ result := NewWAD;
+
+ {
+ if LowerCase(NewWAD) = LowerCase(gGameSettings.WAD) then Exit;
gWAD := g_Res_SearchSameWAD(MapsDir, ExtractFileName(NewWAD), WHash);
if gWAD = '' then
begin
g_Game_SetLoadingText(_lc[I_LOAD_DL_RES], 0, False);
gWAD := g_Res_SearchSameWAD(MapsDir, ExtractFileName(NewWAD), WHash);
if gWAD = '' then
begin
g_Game_SetLoadingText(_lc[I_LOAD_DL_RES], 0, False);
- gWAD := g_Res_DownloadWAD(ExtractFileName(NewWAD));
+ gWAD := g_Res_DownloadMapWAD(ExtractFileName(NewWAD), WHash);
if gWAD = '' then
begin
g_Game_Free();
if gWAD = '' then
begin
g_Game_Free();
end;
NewWAD := ExtractRelativePath(MapsDir, gWAD);
g_Game_LoadWAD(NewWAD);
end;
NewWAD := ExtractRelativePath(MapsDir, gWAD);
g_Game_LoadWAD(NewWAD);
+ }
end;
procedure g_Game_RestartRound(NoMapRestart: Boolean = False);
end;
procedure g_Game_RestartRound(NoMapRestart: Boolean = False);
begin
Result := '';
begin
Result := '';
- MapList := g_Map_GetMapsList(MapsDir + gGameSettings.WAD);
+ MapList := g_Map_GetMapsList(gGameSettings.WAD);
if MapList = nil then
Exit;
if MapList = nil then
Exit;
else
Result := MapList[MapIndex + 1];
else
Result := MapList[MapIndex + 1];
- if not g_Map_Exist(MapsDir + gGameSettings.WAD + ':\' + Result) then Result := Map;
+ if not g_Map_Exist(gGameSettings.WAD + ':\' + Result) then Result := Map;
end;
MapList := nil;
end;
MapList := nil;
begin
if (Length(P) > 1) then
NetInterpLevel := StrToIntDef(P[1], NetInterpLevel);
begin
if (Length(P) > 1) then
NetInterpLevel := StrToIntDef(P[1], NetInterpLevel);
-
g_Console_Add('net_interp = ' + IntToStr(NetInterpLevel));
g_Console_Add('net_interp = ' + IntToStr(NetInterpLevel));
- config := TConfig.CreateFile(GameDir+'/'+CONFIG_FILENAME);
- config.WriteInt('Client', 'InterpolationSteps', NetInterpLevel);
- config.SaveFile(GameDir+'/'+CONFIG_FILENAME);
- config.Free();
+ s := e_GetWriteableDir(ConfigDirs);
+ if s <> '' then
+ begin
+ config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME);
+ config.WriteInt('Client', 'InterpolationSteps', NetInterpLevel);
+ config.SaveFile(s + '/' + CONFIG_FILENAME);
+ config.Free
+ end
end
else if cmd = 'net_forceplayerupdate' then
begin
end
else if cmd = 'net_forceplayerupdate' then
begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
+ if (Length(P) > 1) and ((P[1] = '1') or (P[1] = '0')) then
NetForcePlayerUpdate := (P[1][1] = '1');
if NetForcePlayerUpdate then
g_Console_Add('net_forceplayerupdate = 1')
else
g_Console_Add('net_forceplayerupdate = 0');
NetForcePlayerUpdate := (P[1][1] = '1');
if NetForcePlayerUpdate then
g_Console_Add('net_forceplayerupdate = 1')
else
g_Console_Add('net_forceplayerupdate = 0');
- config := TConfig.CreateFile(GameDir+'/'+CONFIG_FILENAME);
- config.WriteBool('Client', 'ForcePlayerUpdate', NetForcePlayerUpdate);
- config.SaveFile(GameDir+'/'+CONFIG_FILENAME);
- config.Free();
+
+ s := e_GetWriteableDir(ConfigDirs);
+ if s <> '' then
+ begin
+ config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME);
+ config.WriteBool('Client', 'ForcePlayerUpdate', NetForcePlayerUpdate);
+ config.SaveFile(s + '/' + CONFIG_FILENAME);
+ config.Free
+ end
end
else if cmd = 'net_predictself' then
begin
end
else if cmd = 'net_predictself' then
begin
g_Console_Add('net_predictself = 1')
else
g_Console_Add('net_predictself = 0');
g_Console_Add('net_predictself = 1')
else
g_Console_Add('net_predictself = 0');
- config := TConfig.CreateFile(GameDir+'/'+CONFIG_FILENAME);
- config.WriteBool('Client', 'PredictSelf', NetPredictSelf);
- config.SaveFile(GameDir+'/'+CONFIG_FILENAME);
- config.Free();
+
+ s := e_GetWriteableDir(ConfigDirs);
+ if s <> '' then
+ begin
+ config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME);
+ config.WriteBool('Client', 'PredictSelf', NetPredictSelf);
+ config.SaveFile(s + '/' + CONFIG_FILENAME);
+ config.Free
+ end
end
else if cmd = 'sv_name' then
begin
end
else if cmd = 'sv_name' then
begin
NetServerName := P[1];
if Length(NetServerName) > 64 then
SetLength(NetServerName, 64);
NetServerName := P[1];
if Length(NetServerName) > 64 then
SetLength(NetServerName, 64);
- if g_Game_IsServer and g_Game_IsNet and NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerRenamed();
end;
g_Console_Add(cmd + ' = "' + NetServerName + '"');
end;
g_Console_Add(cmd + ' = "' + NetServerName + '"');
NetPassword := P[1];
if Length(NetPassword) > 24 then
SetLength(NetPassword, 24);
NetPassword := P[1];
if Length(NetPassword) > 24 then
SetLength(NetPassword, 24);
- if g_Game_IsServer and g_Game_IsNet and NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerRenamed();
end;
g_Console_Add(cmd + ' = "' + AnsiLowerCase(NetPassword) + '"');
end;
g_Console_Add(cmd + ' = "' + AnsiLowerCase(NetPassword) + '"');
begin
b := 0;
for a := 0 to High(NetClients) do
begin
b := 0;
for a := 0 to High(NetClients) do
+ begin
if NetClients[a].Used then
begin
Inc(b);
if NetClients[a].Used then
begin
Inc(b);
MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s);
end;
end;
MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s);
end;
end;
- if NetUseMaster then
- g_Net_Slist_Update;
+ end;
+ g_Net_Slist_ServerRenamed();
end;
end;
end;
end;
if (Length(P) > 1) then
begin
NetUseMaster := StrToIntDef(P[1], Byte(NetUseMaster)) > 0;
if (Length(P) > 1) then
begin
NetUseMaster := StrToIntDef(P[1], Byte(NetUseMaster)) > 0;
- if g_Game_IsServer and g_Game_IsNet then
- if NetUseMaster then
- begin
- if NetMPeer = nil then
- if not g_Net_Slist_Connect() then
- g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_SLIST_ERROR]);
- g_Net_Slist_Update();
- end
- else
- if NetMPeer <> nil then
- g_Net_Slist_Disconnect();
+ if NetUseMaster then g_Net_Slist_Public() else g_Net_Slist_Private();
end;
g_Console_Add(cmd + ' = ' + IntToStr(Byte(NetUseMaster)));
end;
g_Console_Add(cmd + ' = ' + IntToStr(Byte(NetUseMaster)));
prt: Word;
nm: Boolean;
listen: LongWord;
prt: Word;
nm: Boolean;
listen: LongWord;
+ found: Boolean;
begin
// Îáùèå êîìàíäû:
cmd := LowerCase(P[0]);
begin
// Îáùèå êîìàíäû:
cmd := LowerCase(P[0]);
enet_peer_disconnect(pl^.Peer, NET_DISC_KICK);
g_Console_Add(Format(_lc[I_PLAYER_KICK], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s);
enet_peer_disconnect(pl^.Peer, NET_DISC_KICK);
g_Console_Add(Format(_lc[I_PLAYER_KICK], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s);
- if NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerPlayerLeaves();
end else if gPlayers <> nil then
for a := Low(gPlayers) to High(gPlayers) do
if gPlayers[a] <> nil then
end else if gPlayers <> nil then
for a := Low(gPlayers) to High(gPlayers) do
if gPlayers[a] <> nil then
gPlayers[a].Kill(K_SIMPLEKILL, 0, HIT_DISCON);
g_Console_Add(Format(_lc[I_PLAYER_LEAVE], [gPlayers[a].Name]), True);
g_Player_Remove(gPlayers[a].UID);
gPlayers[a].Kill(K_SIMPLEKILL, 0, HIT_DISCON);
g_Console_Add(Format(_lc[I_PLAYER_LEAVE], [gPlayers[a].Name]), True);
g_Player_Remove(gPlayers[a].UID);
- if NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerPlayerLeaves();
// Åñëè íå ïåðåìåøàòü, ïðè äîáàâëåíèè íîâûõ áîòîâ ïîÿâÿòñÿ ñòàðûå
g_Bot_MixNames();
end;
// Åñëè íå ïåðåìåøàòü, ïðè äîáàâëåíèè íîâûõ áîòîâ ïîÿâÿòñÿ ñòàðûå
g_Bot_MixNames();
end;
enet_peer_disconnect(NetClients[a].Peer, NET_DISC_KICK);
g_Console_Add(Format(_lc[I_PLAYER_KICK], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s);
enet_peer_disconnect(NetClients[a].Peer, NET_DISC_KICK);
g_Console_Add(Format(_lc[I_PLAYER_KICK], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s);
- if NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerPlayerLeaves();
end;
end;
end else
end;
end;
end else
enet_peer_disconnect(pl^.Peer, NET_DISC_TEMPBAN);
g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
enet_peer_disconnect(pl^.Peer, NET_DISC_TEMPBAN);
g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
- if NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerPlayerLeaves();
end else
g_Console_Add(Format(_lc[I_NET_ERR_NAME404], [P[1]]));
end else
end else
g_Console_Add(Format(_lc[I_NET_ERR_NAME404], [P[1]]));
end else
enet_peer_disconnect(NetClients[a].Peer, NET_DISC_TEMPBAN);
g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
enet_peer_disconnect(NetClients[a].Peer, NET_DISC_TEMPBAN);
g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
- if NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerPlayerLeaves();
end;
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
end;
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
g_Net_SaveBanList();
g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
g_Net_SaveBanList();
g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
- if NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerPlayerLeaves();
end else
g_Console_Add(Format(_lc[I_NET_ERR_NAME404], [P[1]]));
end else
end else
g_Console_Add(Format(_lc[I_NET_ERR_NAME404], [P[1]]));
end else
g_Net_SaveBanList();
g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
g_Net_SaveBanList();
g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
- if NetUseMaster then
- g_Net_Slist_Update;
+ g_Net_Slist_ServerPlayerLeaves();
end;
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
end;
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
g_Console_Add(cmd + ' <WAD> [MAP] [# players]');
Exit;
end;
g_Console_Add(cmd + ' <WAD> [MAP] [# players]');
Exit;
end;
- // Èãðà åù¸ íå çàïóùåíà, ñíà÷àëà íàì íàäî çàãðóçèòü êàêîé-òî WAD
- P[1] := addWadExtension(P[1]);
- if FileExists(MapsDir + P[1]) then
+ // game not started yet, load fist map from some wad
+ found := false;
+ s := addWadExtension(P[1]);
+ found := e_FindResource(AllMapDirs, s);
+ P[1] := s;
+ if found then
begin
begin
- // Åñëè êàðòà íå óêàçàíà, áåð¸ì ïåðâóþ êàðòó â ôàéëå
+ P[1] := ExpandFileName(P[1]);
+ // if map not choosed then set first map
if Length(P) < 3 then
begin
SetLength(P, 3);
if Length(P) < 3 then
begin
SetLength(P, 3);
- P[2] := g_Game_GetFirstMap(MapsDir + P[1]);
+ P[2] := g_Game_GetFirstMap(P[1]);
end;
s := P[1] + ':\' + UpperCase(P[2]);
end;
s := P[1] + ':\' + UpperCase(P[2]);
- if g_Map_Exist(MapsDir + s) then
+ if g_Map_Exist(s) then
begin
begin
- // Çàïóñêàåì ñâîþ èãðó
+ // start game
g_Game_Free();
with gGameSettings do
begin
g_Game_Free();
with gGameSettings do
begin
Exit;
prt := StrToIntDef(P[2], 25666);
Exit;
prt := StrToIntDef(P[2], 25666);
- P[3] := addWadExtension(P[3]);
- if FileExists(MapsDir + P[3]) then
+ s := addWadExtension(P[3]);
+ found := e_FindResource(AllMapDirs, s);
+ P[3] := s;
+ if found then
begin
begin
- // Åñëè êàðòà íå óêàçàíà, áåð¸ì ïåðâóþ êàðòó â ôàéëå
+ // get first map in wad, if not specified
if Length(P) < 5 then
begin
SetLength(P, 5);
if Length(P) < 5 then
begin
SetLength(P, 5);
- P[4] := g_Game_GetFirstMap(MapsDir + P[1]);
+ P[4] := g_Game_GetFirstMap(P[1]);
end;
end;
-
s := P[3] + ':\' + UpperCase(P[4]);
s := P[3] + ':\' + UpperCase(P[4]);
-
- if g_Map_Exist(MapsDir + s) then
+ if g_Map_Exist(s) then
begin
begin
- // Çàïóñêàåì ñâîþ èãðó
+ // start game
g_Game_Free();
with gGameSettings do
begin
GameMode := g_Game_TextToMode(gcGameMode);
g_Game_Free();
with gGameSettings do
begin
GameMode := g_Game_TextToMode(gcGameMode);
- if gSwitchGameMode <> GM_NONE then
- GameMode := gSwitchGameMode;
+ if gSwitchGameMode <> GM_NONE then GameMode := gSwitchGameMode;
if GameMode = GM_NONE then GameMode := GM_DM;
if GameMode = GM_SINGLE then GameMode := GM_COOP;
b := 0;
if Length(P) >= 6 then
b := StrToIntDef(P[5], 0);
if GameMode = GM_NONE then GameMode := GM_DM;
if GameMode = GM_SINGLE then GameMode := GM_COOP;
b := 0;
if Length(P) >= 6 then
b := StrToIntDef(P[5], 0);
- g_Game_StartServer(s, GameMode, TimeLimit,
- GoalLimit, MaxLives, Options, b, listen, prt);
- end;
+ g_Game_StartServer(s, GameMode, TimeLimit, GoalLimit, MaxLives, Options, b, listen, prt)
+ end
end
else
end
else
+ begin
if P[4] = '' then
g_Console_Add(Format(_lc[I_MSG_NO_MAPS], [P[3]]))
else
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_FALLBACK], [UpperCase(P[4]), P[3]]));
- end else
- g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[3]]));
+ g_Console_Add(Format(_lc[I_MSG_NO_MAP_FALLBACK], [UpperCase(P[4]), P[3]]))
+ end
+ end
+ else
+ begin
+ g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[3]]))
+ end
end
else if cmd = 'map' then
begin
end
else if cmd = 'map' then
begin
if g_Game_IsServer and (gGameSettings.GameType <> GT_SINGLE) then
begin
g_Console_Add(cmd + ' <MAP>');
if g_Game_IsServer and (gGameSettings.GameType <> GT_SINGLE) then
begin
g_Console_Add(cmd + ' <MAP>');
- g_Console_Add(cmd + ' <WAD> [MAP]');
- end else
- g_Console_Add(_lc[I_MSG_GM_UNAVAIL]);
- end else
+ g_Console_Add(cmd + ' <WAD> [MAP]')
+ end
+ else
+ begin
+ g_Console_Add(_lc[I_MSG_GM_UNAVAIL])
+ end
+ end
+ else
+ begin
if g_Game_IsServer and (gGameSettings.GameType <> GT_SINGLE) then
begin
if g_Game_IsServer and (gGameSettings.GameType <> GT_SINGLE) then
begin
- // Èä¸ò ñâîÿ èãðà èëè ñåðâåð
if Length(P) < 3 then
begin
if Length(P) < 3 then
begin
- // Ïåðâûé ïàðàìåòð - ëèáî êàðòà, ëèáî èìÿ WAD ôàéëà
+ // first param is map or wad
s := UpperCase(P[1]);
s := UpperCase(P[1]);
- if g_Map_Exist(MapsDir + gGameSettings.WAD + ':\' + s) then
- begin // Êàðòà íàøëàñü
+ if g_Map_Exist(gGameSettings.WAD + ':\' + s) then
+ begin
gExitByTrigger := False;
if gGameOn then
gExitByTrigger := False;
if gGameOn then
- begin // Èä¸ò èãðà - çàâåðøàåì óðîâåíü
+ begin
+ // already in game, finish current map
gNextMap := s;
gExit := EXIT_ENDLEVELCUSTOM;
end
gNextMap := s;
gExit := EXIT_ENDLEVELCUSTOM;
end
- else // Èíòåðìèññèÿ - ñðàçó çàãðóæàåì êàðòó
- g_Game_ChangeMap(s);
- end else
+ else
+ begin
+ // intermission, so change map immediately
+ g_Game_ChangeMap(s)
+ end
+ end
+ else
begin
begin
- // Òàêîé êàðòû íåò, èùåì WAD ôàéë
- pw := findDiskWad(MapsDir + P[1]);
+ s := P[1];
+ found := e_FindResource(AllMapDirs, s);
+ P[1] := s;
g_Console_Add(Format(_lc[I_MSG_NO_MAP_FALLBACK], [s, 'WAD ' + P[1]]));
g_Console_Add(Format(_lc[I_MSG_NO_MAP_FALLBACK], [s, 'WAD ' + P[1]]));
- if FileExists(pw) then
+ if found then
begin
begin
- // Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà
+ // no such map, found wad
SetLength(P, 3);
SetLength(P, 3);
- P[1] := ExtractRelativePath(MapsDir, pw);
- P[2] := g_Game_GetFirstMap(MapsDir + P[1]);
-
+ P[1] := ExpandFileName(pw);
+ P[2] := g_Game_GetFirstMap(P[1]);
s := P[1] + ':\' + P[2];
s := P[1] + ':\' + P[2];
-
- if g_Map_Exist(MapsDir + s) then
+ if g_Map_Exist(s) then
begin
gExitByTrigger := False;
if gGameOn then
begin
gExitByTrigger := False;
if gGameOn then
- begin // Èä¸ò èãðà - çàâåðøàåì óðîâåíü
+ begin
+ // already in game, finish current map
gNextMap := s;
gNextMap := s;
- gExit := EXIT_ENDLEVELCUSTOM;
+ gExit := EXIT_ENDLEVELCUSTOM
end
end
- else // Èíòåðìèññèÿ - ñðàçó çàãðóæàåì êàðòó
- g_Game_ChangeMap(s);
- end else
+ else
+ begin
+ // intermission, so change map immediately
+ g_Game_ChangeMap(s)
+ end
+ end
+ else
+ begin
if P[2] = '' then
g_Console_Add(Format(_lc[I_MSG_NO_MAPS], [P[1]]))
else
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], [P[2]]));
- end else
- g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[1]]));
+ g_Console_Add(Format(_lc[I_MSG_NO_MAP], [P[2]]))
+ end
+ end
+ else
+ begin
+ g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[1]]))
+ end
end;
end;
- end else
+ end
+ else
begin
begin
- // Óêàçàíî äâà ïàðàìåòðà, çíà÷èò ïåðâûé - WAD ôàéë, à âòîðîé - êàðòà
- P[1] := addWadExtension(P[1]);
- if FileExists(MapsDir + P[1]) then
+ s := addWadExtension(P[1]);
+ found := e_FindResource(AllMapDirs, s);
+ P[1] := s;
+ if found then
begin
begin
- // Íàøëè WAD ôàéë
P[2] := UpperCase(P[2]);
s := P[1] + ':\' + P[2];
P[2] := UpperCase(P[2]);
s := P[1] + ':\' + P[2];
-
- if g_Map_Exist(MapsDir + s) then
- begin // Íàøëè êàðòó
+ if g_Map_Exist(s) then
+ begin
gExitByTrigger := False;
if gGameOn then
gExitByTrigger := False;
if gGameOn then
- begin // Èä¸ò èãðà - çàâåðøàåì óðîâåíü
+ begin
gNextMap := s;
gNextMap := s;
- gExit := EXIT_ENDLEVELCUSTOM;
+ gExit := EXIT_ENDLEVELCUSTOM
end
end
- else // Èíòåðìèññèÿ - ñðàçó çàãðóæàåì êàðòó
- g_Game_ChangeMap(s);
- end else
- g_Console_Add(Format(_lc[I_MSG_NO_MAP], [P[2]]));
- end else
- g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[1]]));
- end;
- end else
- g_Console_Add(_lc[I_MSG_GM_UNAVAIL]);
+ else
+ begin
+ g_Game_ChangeMap(s)
+ end
+ end
+ else
+ begin
+ g_Console_Add(Format(_lc[I_MSG_NO_MAP], [P[2]]))
+ end
+ end
+ else
+ begin
+ g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[1]]))
+ end
+ end
+ end
+ else
+ begin
+ g_Console_Add(_lc[I_MSG_GM_UNAVAIL])
+ end
+ end
end
else if cmd = 'nextmap' then
begin
if not(gGameOn or (gState = STATE_INTERCUSTOM)) then
end
else if cmd = 'nextmap' then
begin
if not(gGameOn or (gState = STATE_INTERCUSTOM)) then
+ begin
g_Console_Add(_lc[I_MSG_NOT_GAME])
g_Console_Add(_lc[I_MSG_NOT_GAME])
- else begin
+ end
+ else
+ begin
nm := True;
if Length(P) = 1 then
begin
nm := True;
if Length(P) = 1 then
begin
begin
g_Console_Add(cmd + ' <MAP>');
g_Console_Add(cmd + ' <WAD> [MAP]');
begin
g_Console_Add(cmd + ' <MAP>');
g_Console_Add(cmd + ' <WAD> [MAP]');
- end else begin
+ end
+ else
+ begin
nm := False;
g_Console_Add(_lc[I_MSG_GM_UNAVAIL]);
end;
nm := False;
g_Console_Add(_lc[I_MSG_GM_UNAVAIL]);
end;
- end else
+ end
+ else
begin
nm := False;
if g_Game_IsServer and (gGameSettings.GameType <> GT_SINGLE) then
begin
if Length(P) < 3 then
begin
begin
nm := False;
if g_Game_IsServer and (gGameSettings.GameType <> GT_SINGLE) then
begin
if Length(P) < 3 then
begin
- // Ïåðâûé ïàðàìåòð - ëèáî êàðòà, ëèáî èìÿ WAD ôàéëà
+ // first param is map or wad
s := UpperCase(P[1]);
s := UpperCase(P[1]);
- if g_Map_Exist(MapsDir + gGameSettings.WAD + ':\' + s) then
- begin // Êàðòà íàøëàñü
+ if g_Map_Exist(gGameSettings.WAD + ':\' + s) then
+ begin
+ // map founded
gExitByTrigger := False;
gNextMap := s;
nm := True;
gExitByTrigger := False;
gNextMap := s;
nm := True;
- end else
+ end
+ else
begin
begin
- // Òàêîé êàðòû íåò, èùåì WAD ôàéë
- P[1] := addWadExtension(P[1]);
+ // no such map, found wad
+ pw := addWadExtension(P[1]);
+ found := e_FindResource(MapDirs, pw);
+ if not found then
+ found := e_FindResource(WadDirs, pw);
+ P[1] := pw;
g_Console_Add(Format(_lc[I_MSG_NO_MAP_FALLBACK], [s, P[1]]));
g_Console_Add(Format(_lc[I_MSG_NO_MAP_FALLBACK], [s, P[1]]));
- if FileExists(MapsDir + P[1]) then
+ if found then
begin
begin
- // Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà
+ // map not specified, select first map
SetLength(P, 3);
SetLength(P, 3);
- P[2] := g_Game_GetFirstMap(MapsDir + P[1]);
-
+ P[2] := g_Game_GetFirstMap(P[1]);
s := P[1] + ':\' + P[2];
s := P[1] + ':\' + P[2];
-
- if g_Map_Exist(MapsDir + s) then
- begin // Óñòàíàâëèâàåì êàðòó
+ if g_Map_Exist(s) then
+ begin
gExitByTrigger := False;
gNextMap := s;
gExitByTrigger := False;
gNextMap := s;
- nm := True;
- end else
+ nm := True
+ end
+ else
+ begin
if P[2] = '' then
g_Console_Add(Format(_lc[I_MSG_NO_MAPS], [P[1]]))
else
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], [P[2]]));
- end else
- g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[1]]));
- end;
- end else
+ g_Console_Add(Format(_lc[I_MSG_NO_MAP], [P[2]]))
+ end
+ end
+ else
+ begin
+ g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[1]]))
+ end
+ end
+ end
+ else
begin
begin
- // Óêàçàíî äâà ïàðàìåòðà, çíà÷èò ïåðâûé - WAD ôàéë, à âòîðîé - êàðòà
- P[1] := addWadExtension(P[1]);
- if FileExists(MapsDir + P[1]) then
+ // specified two params wad + map
+ pw := addWadExtension(P[1]);
+ found := e_FindResource(MapDirs, pw);
+ if not found then
+ found := e_FindResource(MapDirs, pw);
+ P[1] := pw;
+ if found then
begin
begin
- // Íàøëè WAD ôàéë
P[2] := UpperCase(P[2]);
s := P[1] + ':\' + P[2];
P[2] := UpperCase(P[2]);
s := P[1] + ':\' + P[2];
-
- if g_Map_Exist(MapsDir + s) then
- begin // Íàøëè êàðòó
+ if g_Map_Exist(s) then
+ begin
gExitByTrigger := False;
gNextMap := s;
gExitByTrigger := False;
gNextMap := s;
- nm := True;
- end else
- g_Console_Add(Format(_lc[I_MSG_NO_MAP], [P[2]]));
- end else
- g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[1]]));
- end;
- end else
- g_Console_Add(_lc[I_MSG_GM_UNAVAIL]);
+ nm := True
+ end
+ else
+ begin
+ g_Console_Add(Format(_lc[I_MSG_NO_MAP], [P[2]]))
+ end
+ end
+ else
+ begin
+ g_Console_Add(Format(_lc[I_MSG_NO_WAD], [P[1]]))
+ end
+ end
+ end
+ else
+ begin
+ g_Console_Add(_lc[I_MSG_GM_UNAVAIL])
+ end
end;
if nm then
end;
if nm then
+ begin
if gNextMap = '' then
g_Console_Add(_lc[I_MSG_NEXTMAP_UNSET])
else
if gNextMap = '' then
g_Console_Add(_lc[I_MSG_NEXTMAP_UNSET])
else
- g_Console_Add(Format(_lc[I_MSG_NEXTMAP_SET], [gNextMap]));
- end;
+ g_Console_Add(Format(_lc[I_MSG_NEXTMAP_SET], [gNextMap]))
+ end
+ end
end
else if (cmd = 'endmap') or (cmd = 'goodbye') then
begin
if not gGameOn then
end
else if (cmd = 'endmap') or (cmd = 'goodbye') then
begin
if not gGameOn then
+ begin
g_Console_Add(_lc[I_MSG_NOT_GAME])
g_Console_Add(_lc[I_MSG_NOT_GAME])
+ end
else
else
+ begin
if g_Game_IsServer and (gGameSettings.GameType <> GT_SINGLE) then
begin
gExitByTrigger := False;
if g_Game_IsServer and (gGameSettings.GameType <> GT_SINGLE) then
begin
gExitByTrigger := False;
- // Ñëåäóþùàÿ êàðòà íå çàäàíà, ïðîáóåì íàéòè òðèããåð Âûõîä
+ // next map not specified, try to find trigger EXIT
if (gNextMap = '') and (gTriggers <> nil) then
if (gNextMap = '') and (gTriggers <> nil) then
+ begin
for a := 0 to High(gTriggers) do
for a := 0 to High(gTriggers) do
+ begin
if gTriggers[a].TriggerType = TRIGGER_EXIT then
begin
gExitByTrigger := True;
//gNextMap := gTriggers[a].Data.MapName;
gNextMap := gTriggers[a].tgcMap;
if gTriggers[a].TriggerType = TRIGGER_EXIT then
begin
gExitByTrigger := True;
//gNextMap := gTriggers[a].Data.MapName;
gNextMap := gTriggers[a].tgcMap;
- Break;
- end;
- // Èùåì ñëåäóþùóþ êàðòó â WAD ôàéëå
+ Break
+ end
+ end
+ end;
if gNextMap = '' then
gNextMap := g_Game_GetNextMap();
if gNextMap = '' then
gNextMap := g_Game_GetNextMap();
- // Ïðîâåðÿåì, íå çàäàí ëè WAD ôàéë ðåñóðñíîé ñòðîêîé
if not isWadPath(gNextMap) then
s := gGameSettings.WAD + ':\' + gNextMap
else
s := gNextMap;
if not isWadPath(gNextMap) then
s := gGameSettings.WAD + ':\' + gNextMap
else
s := gNextMap;
- // Åñëè êàðòà íàéäåíà, âûõîäèì ñ óðîâíÿ
- if g_Map_Exist(MapsDir + s) then
+ if g_Map_Exist(s) then
gExit := EXIT_ENDLEVELCUSTOM
else
gExit := EXIT_ENDLEVELCUSTOM
else
- g_Console_Add(Format(_lc[I_MSG_NO_MAP], [gNextMap]));
- end else
- g_Console_Add(_lc[I_MSG_GM_UNAVAIL]);
+ g_Console_Add(Format(_lc[I_MSG_NO_MAP], [gNextMap]))
+ end
+ else
+ begin
+ g_Console_Add(_lc[I_MSG_GM_UNAVAIL])
+ end
+ end
end
else if (cmd = 'event') then
begin
end
else if (cmd = 'event') then
begin
end;
end;
end;
end;
-procedure g_TakeScreenShot();
-var
- a: Word;
- FileName: string;
- ssdir, t: string;
- st: TStream;
- ok: Boolean;
+procedure g_TakeScreenShot;
+ var s: TStream; t: TDateTime; date, name: String;
begin
if e_NoGraphics then Exit;
begin
if e_NoGraphics then Exit;
- ssdir := GameDir+'/screenshots';
- if not findFileCI(ssdir, true) then
- begin
- // try to create dir
- try
- CreateDir(ssdir);
- except
- end;
- if not findFileCI(ssdir, true) then exit; // alas
- end;
+ t := Now;
+ DateTimeToString(date, 'yyyy-mm-dd-hh-nn-ss', t);
+ name := 'screenshot-' + date + '.png';
try
try
- for a := 1 to High(Word) do
- begin
- FileName := Format(ssdir+'screenshot%.3d.png', [a]);
- t := FileName;
- if findFileCI(t, true) then continue;
- if not findFileCI(FileName) then
- begin
- ok := false;
- st := createDiskFile(FileName);
- try
- e_MakeScreenshot(st, gScreenWidth, gScreenHeight);
- ok := true;
- finally
- st.Free();
- end;
- if not ok then try DeleteFile(FileName); except end else g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [ExtractFileName(FileName)]));
- break;
- end;
- end;
+ s := e_CreateResource(ScreenshotDirs, name);
+ e_MakeScreenshot(s, gScreenWidth, gScreenHeight);
+ g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [name]))
except
except
- end;
+ g_Console_Add('oh shit, i can''t create screenshot!')
+ end
end;
procedure g_Game_InGameMenu(Show: Boolean);
end;
procedure g_Game_InGameMenu(Show: Boolean);
// Override map to test:
s := LowerCase(Find_Param_Value(pars, '-testmap'));
if s <> '' then
// Override map to test:
s := LowerCase(Find_Param_Value(pars, '-testmap'));
if s <> '' then
- gTestMap := MapsDir + s;
+ begin
+ if e_IsValidResourceName(s) then
+ e_FindResource(AllMapDirs, s);
+ gTestMap := ExpandFileName(s);
+ end;
// Delete test map after play:
s := Find_Param_Value(pars, '--testdelete');
if (s <> '') then
begin
// Delete test map after play:
s := Find_Param_Value(pars, '--testdelete');
if (s <> '') then
begin
- gMapToDelete := MapsDir + map;
+ //gMapToDelete := MapsDir + map;
e_WriteLog('"--testdelete" is deprecated, use --tempdelete.', TMsgType.Fatal);
Halt(1);
end;
e_WriteLog('"--testdelete" is deprecated, use --tempdelete.', TMsgType.Fatal);
Halt(1);
end;
s := Find_Param_Value(pars, '-exec');
if s <> '' then
begin
s := Find_Param_Value(pars, '-exec');
if s <> '' then
begin
- if not isWadPath(s) then
- s := GameDir + '/' + s;
+// if not isWadPath(s) then
+// s := GameDir + '/' + s;
{$I-}
AssignFile(F, s);
{$I-}
AssignFile(F, s);