diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index 365c0444c34fcb21c0517f25ee98a8008b22ca30..11defaef712db172c478ce77c413ca20cb30725f 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
-(* 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
procedure g_Game_Update();
procedure g_Game_PreUpdate();
procedure g_Game_Quit();
-procedure g_Game_SetupScreenSize();
function g_Game_ModeToText(Mode: Byte): string;
function g_Game_TextToMode(Mode: string): Byte;
procedure g_Game_ExecuteEvent(Name: String);
STATFILE_VERSION = $03;
var
- gStdFont: DWORD;
gGameSettings: TGameSettings;
gPlayer1Settings: TPlayerSettings;
gPlayer2Settings: TPlayerSettings;
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;
g_playerLight: Boolean;
g_dynLights: array of TDynLight = nil;
g_dynLightCount: Integer = 0;
+ EndPicPath: AnsiString; // full path, used by render
implementation
{$IFDEF ENABLE_HOLMES}
g_holmes,
{$ENDIF}
- e_res, g_window, g_menu, r_render, r_textures, r_animations, r_gfx,
+ 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,
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;
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();
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
end;
procedure g_Game_Init();
-var
- SR: TSearchRec;
- knownFiles: array of AnsiString = nil;
- found: Boolean;
- wext, s: AnsiString;
- f: Integer;
begin
gExit := 0;
gMapToDelete := '';
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;
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_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');
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}
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_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');
e_WriteLog(Format(_lc[I_SIMPLE_ERROR], [Text]), TMsgType.Warning);
end;
-procedure g_Game_SetupScreenSize();
-const
- RES_FACTOR = 4.0 / 3.0;
-var
- s: Single;
- rf: Single;
- bw, bh: Word;
-begin
-// Размер экранов игроков:
- gPlayerScreenSize.X := gScreenWidth-196;
- if (gPlayer1 <> nil) and (gPlayer2 <> nil) then
- gPlayerScreenSize.Y := gScreenHeight div 2
- else
- gPlayerScreenSize.Y := gScreenHeight;
-
-// Размер заднего плана:
- if BackID <> DWORD(-1) then
- begin
- s := SKY_STRETCH;
- if (gScreenWidth*s > gMapInfo.Width) or
- (gScreenHeight*s > gMapInfo.Height) then
- begin
- gBackSize.X := gScreenWidth;
- gBackSize.Y := gScreenHeight;
- end
- else
- begin
- e_GetTextureSize(BackID, @bw, @bh);
- rf := Single(bw) / Single(bh);
- if (rf > RES_FACTOR) then bw := Round(Single(bh) * RES_FACTOR)
- else if (rf < RES_FACTOR) then bh := Round(Single(bw) / RES_FACTOR);
- s := Max(gScreenWidth / bw, gScreenHeight / bh);
- if (s < 1.0) then s := 1.0;
- gBackSize.X := Round(bw*s);
- gBackSize.Y := Round(bh*s);
- end;
- end;
-end;
-
procedure g_Game_AddPlayer(Team: Byte = TEAM_NONE);
begin
if ((not gGameOn) and (gState <> STATE_INTERCUSTOM))
g_Game_ExecuteEvent('ongamestart');
-// Установка размеров окон игроков:
- g_Game_SetupScreenSize();
-
// Создание первого игрока:
gPlayer1 := g_Player_Get(g_Player_Create(gPlayer1Settings.Model,
gPlayer1Settings.Color,
g_Game_ExecuteEvent('ongamestart');
-// Установка размеров окон игроков:
- g_Game_SetupScreenSize();
-
// Режим наблюдателя:
if nPlayers = 0 then
begin
g_Game_ExecuteEvent('ongamestart');
-// Установка размеров окна игрока
- g_Game_SetupScreenSize();
-
// Режим наблюдателя:
if nPlayers = 0 then
begin
g_Game_ExecuteEvent('ongamestart');
-// Установка размеров окон игроков:
- g_Game_SetupScreenSize();
-
NetState := NET_STATE_AUTH;
g_Game_SetLoadingText(_lc[I_LOAD_CONNECT], 0, False);
begin
//result := g_Map_Load(gGameSettings.WAD + ':\' + ResName);
result := g_Map_Load(NewWAD+':\'+ResName);
+ r_Render_LoadTextures;
end;
if Result then
begin
end;
procedure g_TakeScreenShot(Filename: string = '');
- var s: TStream; t: TDateTime; dir, date, name: String;
+ var t: TDateTime; dir, date, name: String;
begin
- if e_NoGraphics then Exit;
- try
- dir := e_GetWriteableDir(ScreenshotDirs);
+ if e_NoGraphics then
+ Exit;
- if Filename = '' then
- begin
- t := Now;
- DateTimeToString(date, 'yyyy-mm-dd-hh-nn-ss', t);
- Filename := 'screenshot-' + date;
- end;
-
- name := e_CatPath(dir, Filename + '.png');
- s := createDiskFile(name);
- try
- e_MakeScreenshot(s, gWinSizeX, gWinSizeY);
- s.Free;
- g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [name]))
- except
- g_Console_Add(Format(_lc[I_CONSOLE_ERROR_WRITE], [name]));
- s.Free;
- DeleteFile(name)
- end
- except
- g_Console_Add('oh shit, i can''t create screenshot!')
- end
+ dir := e_GetWriteableDir(ScreenshotDirs);
+ if Filename = '' then
+ begin
+ t := Now;
+ DateTimeToString(date, 'yyyy-mm-dd-hh-nn-ss', t);
+ Filename := 'screenshot-' + date;
+ end;
+
+ name := e_CatPath(dir, Filename + '.png');
+ if r_Render_WriteScreenShot(name) then
+ g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [name]))
+ else
+ g_Console_Add(Format(_lc[I_CONSOLE_ERROR_WRITE], [name]));
end;
procedure g_Game_InGameMenu(Show: Boolean);