X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=2ce5d95e7107a6b547b0e99670db518ec0335e59;hb=c49ad9c9183b5120afb2d64af2584febe6a1c856;hp=af3d8ad0c99ffcdd01002045a44084cde72561c2;hpb=fbb649f409620a55ae48f1bffd655c5a04489371;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index af3d8ad..2ce5d95 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -87,7 +87,6 @@ procedure g_Game_Update(); procedure g_Game_PreUpdate(); procedure g_Game_Quit(); procedure g_Game_SetupScreenSize(); -procedure g_Game_ChangeResolution(newWidth, newHeight: Word; nowFull, nowMax: Boolean); function g_Game_ModeToText(Mode: Byte): string; function g_Game_TextToMode(Mode: string): Byte; procedure g_Game_ExecuteEvent(Name: String); @@ -236,7 +235,6 @@ const STATFILE_VERSION = $03; var - gStdFont: DWORD; gGameSettings: TGameSettings; gPlayer1Settings: TPlayerSettings; gPlayer2Settings: TPlayerSettings; @@ -424,7 +422,6 @@ function gPause (): Boolean; inline; StatShotDone: Boolean; StatFilename: string = ''; // used by stat screenshot to save with the same name as the csv SingleStat: TEndSingleGameStat; - hasPBarGfx: Boolean; LoadingStat: TLoadingStat; MessageText: String; IsDrawStat: Boolean; @@ -433,6 +430,7 @@ function gPause (): Boolean; inline; g_playerLight: Boolean; g_dynLights: array of TDynLight = nil; g_dynLightCount: Integer = 0; + EndPicPath: AnsiString; // full path, used by render implementation @@ -440,7 +438,7 @@ uses {$IFDEF ENABLE_HOLMES} g_holmes, {$ENDIF} - e_res, g_textures, g_window, g_menu, + e_res, g_window, g_menu, r_render, r_gfx, e_input, e_log, g_console, r_console, g_items, g_map, g_panel, g_playermodel, g_gfx, g_options, Math, g_triggers, g_monsters, e_sound, CONFIG, @@ -899,22 +897,7 @@ var info: TMegaWADInfo; endpic: String; endmus: String; - res: record - text: Array of ShortString; - anim: Array of ShortString; - pic: Array of ShortString; - mus: Array of ShortString; - end; - triggers: Array of record - event: ShortString; - actions: Array of record - action, p1, p2: Integer; - end; - end; - cur_trigger: Integer; - cur_action: Integer; end; - //InterPic: String; InterText: record lines: SSArray; img: String; @@ -1103,37 +1086,20 @@ begin FreeMem(p); end; -procedure g_Game_FreeWAD(); -var - a: Integer; -begin - for a := 0 to High(MegaWAD.res.pic) do - if MegaWAD.res.pic[a] <> '' then - g_Texture_Delete(MegaWAD.res.pic[a]); - - for a := 0 to High(MegaWAD.res.mus) do - if MegaWAD.res.mus[a] <> '' then - g_Sound_Delete(MegaWAD.res.mus[a]); - - MegaWAD.res.pic := nil; - MegaWAD.res.text := nil; - MegaWAD.res.anim := nil; - MegaWAD.res.mus := nil; - MegaWAD.triggers := nil; - - g_Texture_Delete('TEXTURE_endpic'); - g_Sound_Delete('MUSIC_endmus'); - - ZeroMemory(@MegaWAD, SizeOf(MegaWAD)); - gGameSettings.WAD := ''; -end; + procedure g_Game_FreeWAD; + begin + EndPicPath := ''; + g_Sound_Delete('MUSIC_endmus'); + ZeroMemory(@MegaWAD, SizeOf(MegaWAD)); + gGameSettings.WAD := ''; + end; procedure g_Game_LoadWAD(WAD: string); var w: TWADFile; cfg: TConfig; p: Pointer; - {b, }len: Integer; + len: Integer; s: AnsiString; begin g_Game_FreeWAD(); @@ -1154,38 +1120,11 @@ begin cfg := TConfig.CreateMem(p, len); - {b := 1; - while True do - begin - s := cfg.ReadStr('pic', 'pic'+IntToStr(b), ''); - if s = '' then Break; - b := b+1; - - SetLength(MegaWAD.res.pic, Length(MegaWAD.res.pic)+1); - MegaWAD.res.pic[High(MegaWAD.res.pic)] := s; - - g_Texture_CreateWADEx(s, s); - end; - - b := 1; - while True do - begin - s := cfg.ReadStr('mus', 'mus'+IntToStr(b), ''); - if s = '' then Break; - b := b+1; - - SetLength(MegaWAD.res.mus, Length(MegaWAD.res.mus)+1); - MegaWAD.res.mus[High(MegaWAD.res.mus)] := s; - - g_Music_CreateWADEx(s, s); - end;} - + EndPicPath := ''; MegaWAD.endpic := cfg.ReadStr('megawad', 'endpic', ''); if MegaWAD.endpic <> '' then - begin - s := e_GetResourcePath(WadDirs, MegaWAD.endpic, WAD); - g_Texture_CreateWADEx('TEXTURE_endpic', s, gTextureFilter); - end; + EndPicPath := e_GetResourcePath(WadDirs, MegaWAD.endpic, WAD); + MegaWAD.endmus := cfg.ReadStr('megawad', 'endmus', 'Standart.wad:D2DMUS\КОНЕЦ'); if MegaWAD.endmus <> '' then begin @@ -1262,7 +1201,7 @@ begin gDelayedEvents[n].DENum := Num; gDelayedEvents[n].DEStr := Str; if DEType = DE_GLOBEVENT then - gDelayedEvents[n].Time := (sys_GetTicks() {div 1000}) + Time + gDelayedEvents[n].Time := (GetTickCount64() {div 1000}) + Time else gDelayedEvents[n].Time := gTime + Time; Result := n; @@ -1440,12 +1379,6 @@ begin end; procedure g_Game_Init(); -var - SR: TSearchRec; - knownFiles: array of AnsiString = nil; - found: Boolean; - wext, s: AnsiString; - f: Integer; begin gExit := 0; gMapToDelete := ''; @@ -1454,56 +1387,11 @@ begin sfsGCDisable(); // temporary disable removing of temporary volumes try - g_Texture_CreateWADEx('MENU_BACKGROUND', GameWAD+':TEXTURES\TITLE', gTextureFilter); - g_Texture_CreateWADEx('INTER', GameWAD+':TEXTURES\INTER', gTextureFilter); - g_Texture_CreateWADEx('ENDGAME_EN', GameWAD+':TEXTURES\ENDGAME_EN', gTextureFilter); - g_Texture_CreateWADEx('ENDGAME_RU', GameWAD+':TEXTURES\ENDGAME_RU', gTextureFilter); - - 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_MODELS], 0, False); - // 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; +// g_Game_SetLoadingText(_lc[I_LOAD_MODELS], 0, False); gGameOn := false; gPauseMain := false; @@ -2235,6 +2123,7 @@ begin g_Weapon_Update(); g_Monsters_Update(); g_GFX_Update(); + r_GFX_Update; g_Player_UpdateAll(); g_Player_UpdatePhysicalObjects(); @@ -2334,7 +2223,7 @@ begin if gResolutionChange then begin e_WriteLog('Changing resolution', TMsgType.Notify); - g_Game_ChangeResolution(gRC_Width, gRC_Height, gRC_FullScreen, gRC_Maximized); + r_Render_Apply; gResolutionChange := False; g_ActiveWindow := nil; end; @@ -2361,7 +2250,7 @@ begin KeyPress(IK_F10); end; - Time := sys_GetTicks() {div 1000}; + Time := GetTickCount64() {div 1000}; // Обработка отложенных событий: if gDelayedEvents <> nil then @@ -2466,61 +2355,11 @@ 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...', TMsgType.Notify); - g_Texture_CreateWADEx('NOTEXTURE', GameWAD+':TEXTURES\NOTEXTURE'); - g_Texture_CreateWADEx('TEXTURE_PLAYER_HUD', GameWAD+':TEXTURES\HUD'); - g_Texture_CreateWADEx('TEXTURE_PLAYER_HUDAIR', GameWAD+':TEXTURES\AIRBAR'); - 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_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'); - g_Texture_CreateWADEx('TEXTURE_PLAYER_INDICATOR', GameWAD+':TEXTURES\PLRIND'); - - 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_Frames_CreateWAD(nil, 'FRAMES_PUNCH', GameWAD+':WEAPONS\PUNCH', 64, 64, 4, False); - g_Frames_CreateWAD(nil, 'FRAMES_PUNCH_UP', GameWAD+':WEAPONS\PUNCH_UP', 64, 64, 4, False); - g_Frames_CreateWAD(nil, 'FRAMES_PUNCH_DN', GameWAD+':WEAPONS\PUNCH_DN', 64, 64, 4, False); - g_Frames_CreateWAD(nil, 'FRAMES_PUNCH_BERSERK', GameWAD+':WEAPONS\PUNCHB', 64, 64, 4, False); - g_Frames_CreateWAD(nil, 'FRAMES_PUNCH_BERSERK_UP', GameWAD+':WEAPONS\PUNCHB_UP', 64, 64, 4, False); - g_Frames_CreateWAD(nil, 'FRAMES_PUNCH_BERSERK_DN', GameWAD+':WEAPONS\PUNCHB_DN', 64, 64, 4, False); g_Sound_CreateWADEx('SOUND_GAME_TELEPORT', GameWAD+':SOUNDS\TELEPORT'); g_Sound_CreateWADEx('SOUND_GAME_NOTELEPORT', GameWAD+':SOUNDS\NOTELEPORT'); g_Sound_CreateWADEx('SOUND_GAME_SECRET', GameWAD+':SOUNDS\SECRET'); @@ -2619,8 +2458,6 @@ begin gMusic.Free(); g_Game_FreeData(); g_PlayerModel_FreeData(); - g_Texture_DeleteAll(); - g_Frames_DeleteAll(); {$IFNDEF HEADLESS} //g_Menu_Free(); //k8: this segfaults after resolution change; who cares? {$ENDIF} @@ -2645,25 +2482,6 @@ begin e_WriteLog('Releasing game data...', TMsgType.Notify); - g_Texture_Delete('NOTEXTURE'); - g_Texture_Delete('TEXTURE_PLAYER_HUD'); - g_Texture_Delete('TEXTURE_PLAYER_HUDBG'); - g_Texture_Delete('TEXTURE_PLAYER_ARMORHUD'); - g_Texture_Delete('TEXTURE_PLAYER_REDFLAG'); - g_Texture_Delete('TEXTURE_PLAYER_REDFLAG_S'); - g_Texture_Delete('TEXTURE_PLAYER_REDFLAG_D'); - g_Texture_Delete('TEXTURE_PLAYER_BLUEFLAG'); - g_Texture_Delete('TEXTURE_PLAYER_BLUEFLAG_S'); - g_Texture_Delete('TEXTURE_PLAYER_BLUEFLAG_D'); - g_Texture_Delete('TEXTURE_PLAYER_TALKBUBBLE'); - g_Texture_Delete('TEXTURE_PLAYER_INVULPENTA'); - g_Frames_DeleteByName('FRAMES_TELEPORT'); - g_Frames_DeleteByName('FRAMES_PUNCH'); - g_Frames_DeleteByName('FRAMES_PUNCH_UP'); - g_Frames_DeleteByName('FRAMES_PUNCH_DN'); - g_Frames_DeleteByName('FRAMES_PUNCH_BERSERK'); - g_Frames_DeleteByName('FRAMES_PUNCH_BERSERK_UP'); - g_Frames_DeleteByName('FRAMES_PUNCH_BERSERK_DN'); g_Sound_Delete('SOUND_GAME_TELEPORT'); g_Sound_Delete('SOUND_GAME_NOTELEPORT'); g_Sound_Delete('SOUND_GAME_SECRET'); @@ -2782,11 +2600,6 @@ begin end; end; -procedure g_Game_ChangeResolution(newWidth, newHeight: Word; nowFull, nowMax: Boolean); -begin - sys_SetDisplayMode(newWidth, newHeight, gBPP, nowFull, nowMax); -end; - procedure g_Game_AddPlayer(Team: Byte = TEAM_NONE); begin if ((not gGameOn) and (gState <> STATE_INTERCUSTOM)) @@ -3521,6 +3334,7 @@ begin begin //result := g_Map_Load(gGameSettings.WAD + ':\' + ResName); result := g_Map_Load(NewWAD+':\'+ResName); + r_Render_LoadTextures; end; if Result then begin @@ -5928,16 +5742,7 @@ begin g_Game_Quit(); end; 'r_reset': - begin - gRC_Width := Max(1, gRC_Width); - gRC_Height := Max(1, gRC_Height); - gBPP := Max(1, gBPP); - if sys_SetDisplayMode(gRC_Width, gRC_Height, gBPP, gRC_FullScreen, gRC_Maximized) = True then - e_LogWriteln('resolution changed') - else - e_LogWriteln('resolution not changed'); - sys_EnableVSync(gVSync); - end; + r_Render_Apply; 'r_maxfps': begin if Length(p) = 2 then