X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=c5e144c7c0dfaad252644494be24bf65de0e092e;hb=cc934f758d8d3036fa3bca8a3cca949814e04d89;hp=13ffb1064132327dbe8d6cff0d81522af9f9fb96;hpb=dfd3e97bffa213f5b21206b8a292b80180bab948;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 13ffb10..c5e144c 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -294,7 +294,8 @@ uses g_playermodel, g_gfx, g_options, g_weapons, Math, g_triggers, MAPDEF, g_monsters, e_sound, CONFIG, BinEditor, g_language, g_net, SDL, - ENet, e_fixedbuffer, g_netmsg, g_netmaster, GL, GLExt; + ENet, e_fixedbuffer, g_netmsg, g_netmaster, GL, GLExt, + utils, sfs; type TEndCustomGameStat = record @@ -1019,66 +1020,86 @@ begin gMapToDelete := ''; gTempDelete := False; - g_Texture_CreateWADEx('MENU_BACKGROUND', GameWAD+':TEXTURES\TITLE'); - g_Texture_CreateWADEx('INTER', GameWAD+':TEXTURES\INTER'); - g_Texture_CreateWADEx('ENDGAME_EN', GameWAD+':TEXTURES\ENDGAME_EN'); - g_Texture_CreateWADEx('ENDGAME_RU', GameWAD+':TEXTURES\ENDGAME_RU'); - - LoadStdFont('STDTXT', 'STDFONT', gStdFont); - LoadFont('MENUTXT', 'MENUFONT', gMenuFont); - LoadFont('SMALLTXT', 'SMALLFONT', gMenuSmallFont); - - g_Game_ClearLoading(); - g_Game_SetLoadingText(Format('Doom 2D: Forever %s', [GAME_VERSION]), 0, False); - g_Game_SetLoadingText('', 0, False); - - g_Game_SetLoadingText(_lc[I_LOAD_CONSOLE], 0, False); - g_Console_Init(); - - 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]), MSG_WARNING); - until FindNext(SR) <> 0; - FindClose(SR); - - gGameOn := False; - gPause := False; - gTime := 0; - LastScreenShot := 0; - - {e_MouseInfo.Accel := 1.0;} - - g_Game_SetLoadingText(_lc[I_LOAD_GAME_DATA], 0, False); - g_Game_LoadData(); - - g_Game_SetLoadingText(_lc[I_LOAD_MUSIC], 0, False); - g_Sound_CreateWADEx('MUSIC_INTERMUS', GameWAD+':MUSIC\INTERMUS', True); - g_Sound_CreateWADEx('MUSIC_MENU', GameWAD+':MUSIC\MENU', True); - g_Sound_CreateWADEx('MUSIC_ROUNDMUS', GameWAD+':MUSIC\ROUNDMUS'); - g_Sound_CreateWADEx('MUSIC_STDENDMUS', GameWAD+':MUSIC\ENDMUS', True); - - g_Game_SetLoadingText(_lc[I_LOAD_MENUS], 0, False); - g_Menu_Init(); - - gMusic := TMusic.Create(); - gMusic.SetByName('MUSIC_MENU'); - gMusic.Play(); - - gGameSettings.WarmupTime := 30; - - gState := STATE_MENU; - - SetLength(gEvents, 6); - gEvents[0].Name := 'ongamestart'; - gEvents[1].Name := 'ongameend'; - gEvents[2].Name := 'onmapstart'; - gEvents[3].Name := 'onmapend'; - gEvents[4].Name := 'oninter'; - gEvents[5].Name := 'onwadend'; + sfsGCDisable(); // temporary disable removing of temporary volumes + + try + g_Texture_CreateWADEx('MENU_BACKGROUND', GameWAD+':TEXTURES\TITLE'); + g_Texture_CreateWADEx('INTER', GameWAD+':TEXTURES\INTER'); + g_Texture_CreateWADEx('ENDGAME_EN', GameWAD+':TEXTURES\ENDGAME_EN'); + g_Texture_CreateWADEx('ENDGAME_RU', GameWAD+':TEXTURES\ENDGAME_RU'); + + LoadStdFont('STDTXT', 'STDFONT', gStdFont); + LoadFont('MENUTXT', 'MENUFONT', gMenuFont); + LoadFont('SMALLTXT', 'SMALLFONT', gMenuSmallFont); + + g_Game_ClearLoading(); + g_Game_SetLoadingText(Format('Doom 2D: Forever %s', [GAME_VERSION]), 0, False); + g_Game_SetLoadingText('', 0, False); + + g_Game_SetLoadingText(_lc[I_LOAD_CONSOLE], 0, False); + g_Console_Init(); + + 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]), MSG_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); + 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); + until FindNext(SR) <> 0; + FindClose(SR); + + gGameOn := False; + gPause := False; + gTime := 0; + LastScreenShot := 0; + + {e_MouseInfo.Accel := 1.0;} + + g_Game_SetLoadingText(_lc[I_LOAD_GAME_DATA], 0, False); + g_Game_LoadData(); + + g_Game_SetLoadingText(_lc[I_LOAD_MUSIC], 0, False); + g_Sound_CreateWADEx('MUSIC_INTERMUS', GameWAD+':MUSIC\INTERMUS', True); + g_Sound_CreateWADEx('MUSIC_MENU', GameWAD+':MUSIC\MENU', True); + g_Sound_CreateWADEx('MUSIC_ROUNDMUS', GameWAD+':MUSIC\ROUNDMUS', True); + g_Sound_CreateWADEx('MUSIC_STDENDMUS', GameWAD+':MUSIC\ENDMUS', True); + + g_Game_SetLoadingText(_lc[I_LOAD_MENUS], 0, False); + g_Menu_Init(); + + gMusic := TMusic.Create(); + gMusic.SetByName('MUSIC_MENU'); + gMusic.Play(); + + gGameSettings.WarmupTime := 30; + + gState := STATE_MENU; + + SetLength(gEvents, 6); + gEvents[0].Name := 'ongamestart'; + gEvents[1].Name := 'ongameend'; + gEvents[2].Name := 'onmapstart'; + gEvents[3].Name := 'onmapend'; + gEvents[4].Name := 'oninter'; + gEvents[5].Name := 'onwadend'; + finally + sfsGCEnable(); // enable releasing unused volumes + end; end; procedure g_Game_Free(); @@ -1230,7 +1251,7 @@ begin if (not g_Game_IsClient) and ( ( - (e_KeyPressed(IK_RETURN) or e_KeyPressed(IK_SPACE)) + (e_KeyPressed(IK_RETURN) or e_KeyPressed(IK_KPRETURN) or e_KeyPressed(IK_SPACE)) and (not gJustChatted) and (not gConsoleShow) and (not gChatShow) and (g_ActiveWindow = nil) ) @@ -2985,7 +3006,7 @@ begin g_Texture_DeleteAll(); g_Frames_DeleteAll(); g_Menu_Free(); - + if NetInitDone then g_Net_Free; // Íàäî óäàëèòü êàðòó ïîñëå òåñòà: @@ -3588,7 +3609,7 @@ begin ProcessLoading(); e_PollInput(); - + if e_KeyPressed(IK_ESCAPE) or e_KeyPressed(IK_SPACE) then begin State := 0; @@ -3677,7 +3698,7 @@ begin gWADHash := MD5File(MapsDir + NewWAD); g_Game_LoadWAD(NewWAD); end else - // hash recieved in MC_RECV_GameEvent -> NET_EV_MAPSTART + // hash recieved in MC_RECV_GameEvent -> NET_EV_MAPSTART g_Game_ClientWAD(NewWAD, gWADHash); end else ResName := Map; @@ -3782,7 +3803,7 @@ begin gCoopTotalSecrets := 0; gLastMap := False; end; - + g_Game_ExecuteEvent('onmapstart'); end; @@ -4045,11 +4066,14 @@ end; procedure g_Game_DeleteTestMap(); var - WAD: TWADEditor_1; + a: Integer; MapName: Char16; - MapList: SArray; - a, time: Integer; WadName: string; +{ + WAD: TWADEditor_1; + MapList: SArray; + time: Integer; +} begin a := Pos('.wad:\', gMapToDelete); if a = 0 then @@ -4062,6 +4086,7 @@ begin MapName := ''; CopyMemory(@MapName[0], @gMapToDelete[1], Min(16, Length(gMapToDelete))); +{ // Èìÿ êàðòû íå ñòàíäàðòíîå òåñòîâîå: if MapName <> TEST_MAP_NAME then Exit; @@ -4095,7 +4120,8 @@ begin WAD.Free(); g_SetFileTime(WadName, time); end else - DeleteFile(WadName); +} + if gTempDelete then DeleteFile(WadName); end; procedure GameCVars(P: SArray); @@ -4193,7 +4219,7 @@ begin else Options := Options and (not GAME_OPTION_ALLOWEXIT); end; - + if (LongBool(Options and GAME_OPTION_ALLOWEXIT)) then g_Console_Add(_lc[I_MSG_ALLOWEXIT_ON]) else @@ -4237,7 +4263,7 @@ begin else Options := Options and (not GAME_OPTION_BOTVSPLAYER); end; - + if (LongBool(Options and GAME_OPTION_BOTVSPLAYER)) then g_Console_Add(_lc[I_MSG_BOTSVSPLAYERS_ON]) else @@ -5168,9 +5194,7 @@ begin Exit; end; // Èãðà åù¸ íå çàïóùåíà, ñíà÷àëà íàì íàäî çàãðóçèòü êàêîé-òî WAD - if Pos('.wad', LowerCase(P[1])) = 0 then - P[1] := P[1] + '.wad'; - + P[1] := addWadExtension(P[1]); if FileExists(MapsDir + P[1]) then begin // Åñëè êàðòà íå óêàçàíà, áåð¸ì ïåðâóþ êàðòó â ôàéëå @@ -5224,9 +5248,7 @@ begin Exit; prt := StrToIntDef(P[2], 25666); - if Pos('.wad', LowerCase(P[3])) = 0 then - P[3] := P[3] + '.wad'; - + P[3] := addWadExtension(P[3]); if FileExists(MapsDir + P[3]) then begin // Åñëè êàðòà íå óêàçàíà, áåð¸ì ïåðâóþ êàðòó â ôàéëå @@ -5296,9 +5318,7 @@ begin begin g_Console_Add(Format(_lc[I_MSG_NO_MAP], [s])); // Òàêîé êàðòû íåò, èùåì WAD ôàéë - if Pos('.wad', LowerCase(P[1])) = 0 then - P[1] := P[1] + '.wad'; - + P[1] := addWadExtension(P[1]); if FileExists(MapsDir + P[1]) then begin // Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà @@ -5328,9 +5348,7 @@ begin end else begin // Óêàçàíî äâà ïàðàìåòðà, çíà÷èò ïåðâûé - WAD ôàéë, à âòîðîé - êàðòà - if Pos('.wad', LowerCase(P[1])) = 0 then - P[1] := P[1] + '.wad'; - + P[1] := addWadExtension(P[1]); if FileExists(MapsDir + P[1]) then begin // Íàøëè WAD ôàéë @@ -5389,9 +5407,7 @@ begin begin g_Console_Add(Format(_lc[I_MSG_NO_MAP], [s])); // Òàêîé êàðòû íåò, èùåì WAD ôàéë - if Pos('.wad', LowerCase(P[1])) = 0 then - P[1] := P[1] + '.wad'; - + P[1] := addWadExtension(P[1]); if FileExists(MapsDir + P[1]) then begin // Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà @@ -5416,9 +5432,7 @@ begin end else begin // Óêàçàíî äâà ïàðàìåòðà, çíà÷èò ïåðâûé - WAD ôàéë, à âòîðîé - êàðòà - if Pos('.wad', LowerCase(P[1])) = 0 then - P[1] := P[1] + '.wad'; - + P[1] := addWadExtension(P[1]); if FileExists(MapsDir + P[1]) then begin // Íàøëè WAD ôàéë @@ -6068,7 +6082,7 @@ begin MapList := nil; MapIndex := -1; - if not FileExists(FileName) then Exit; + if not FileExists(FileName) then Exit; AssignFile(ListFile, FileName); Reset(ListFile); @@ -6245,7 +6259,7 @@ begin // Start map when game loads: map := LowerCase(Find_Param_Value(pars, '-map')); - if (map <> '') and (Pos('.wad:\', map) > 0) then + if isWadPath(map) then begin // Game mode: s := Find_Param_Value(pars, '-gm'); @@ -6291,7 +6305,11 @@ begin // Delete test map after play: s := Find_Param_Value(pars, '--testdelete'); if (s <> '') then + begin gMapToDelete := MapsDir + map; + e_WriteLog('"--testdelete" argument doesn''t supported anymore!', MSG_FATALERROR); + Halt(1); + end; // Delete temporary WAD after play: s := Find_Param_Value(pars, '--tempdelete');