diff --git a/src/game/g_window.pas b/src/game/g_window.pas
index f5249cc0e810e168e58409423eae45e306f9dc58..ec3f1167d39f5d2709e44f06edf94ac361125bda 100644 (file)
--- a/src/game/g_window.pas
+++ b/src/game/g_window.pas
procedure KillGLWindow();
procedure PushExitEvent();
function ProcessMessage(): Boolean;
procedure KillGLWindow();
procedure PushExitEvent();
function ProcessMessage(): Boolean;
-procedure ProcessLoading();
+procedure ProcessLoading (forceUpdate: Boolean=false);
procedure ReDrawWindow();
procedure SwapBuffers();
procedure Sleep(ms: LongWord);
procedure ReDrawWindow();
procedure SwapBuffers();
procedure Sleep(ms: LongWord);
gwin_dump_extensions: Boolean = false;
gwin_has_stencil: Boolean = false;
gwin_k8_enable_light_experiments: Boolean = false;
gwin_dump_extensions: Boolean = false;
gwin_has_stencil: Boolean = false;
gwin_k8_enable_light_experiments: Boolean = false;
+ g_dbg_aimline_on: Boolean = false;
implementation
uses
{$IFDEF WINDOWS}Windows,{$ENDIF}
implementation
uses
{$IFDEF WINDOWS}Windows,{$ENDIF}
+ SysUtils, Classes, MAPDEF,
SDL2, GL, GLExt, e_graphics, e_log, g_main,
SDL2, GL, GLExt, e_graphics, e_log, g_main,
- g_console, SysUtils, e_input, g_options, g_game,
+ g_console, e_input, g_options, g_game,
g_basic, g_textures, e_sound, g_sound, g_menu, ENet, g_net,
g_basic, g_textures, e_sound, g_sound, g_menu, ENet, g_net,
- g_map, g_gfx, g_monsters, g_holmes;
+ g_map, g_gfx, g_monsters, g_holmes, xprofiler, utils;
var
h_Wnd: PSDL_Window;
var
h_Wnd: PSDL_Window;
curMsX: Integer = 0;
curMsY: Integer = 0;
curMsX: Integer = 0;
curMsY: Integer = 0;
-const
- // TODO: move this to a separate file
- CP1251: array [0..127] of Word = (
- $0402,$0403,$201A,$0453,$201E,$2026,$2020,$2021,$20AC,$2030,$0409,$2039,$040A,$040C,$040B,$040F,
- $0452,$2018,$2019,$201C,$201D,$2022,$2013,$2014,$003F,$2122,$0459,$203A,$045A,$045C,$045B,$045F,
- $00A0,$040E,$045E,$0408,$00A4,$0490,$00A6,$00A7,$0401,$00A9,$0404,$00AB,$00AC,$00AD,$00AE,$0407,
- $00B0,$00B1,$0406,$0456,$0491,$00B5,$00B6,$00B7,$0451,$2116,$0454,$00BB,$0458,$0405,$0455,$0457,
- $0410,$0411,$0412,$0413,$0414,$0415,$0416,$0417,$0418,$0419,$041A,$041B,$041C,$041D,$041E,$041F,
- $0420,$0421,$0422,$0423,$0424,$0425,$0426,$0427,$0428,$0429,$042A,$042B,$042C,$042D,$042E,$042F,
- $0430,$0431,$0432,$0433,$0434,$0435,$0436,$0437,$0438,$0439,$043A,$043B,$043C,$043D,$043E,$043F,
- $0440,$0441,$0442,$0443,$0444,$0445,$0446,$0447,$0448,$0449,$044A,$044B,$044C,$044D,$044E,$044F
- );
-
-// TODO: make a transition table or something
-function WCharToCP1251(wc: Word): Word;
-var
- n: Word;
-begin
- Result := 0;
- for n := 0 to 127 do
- if CP1251[n] = wc then begin Result := n; break end;
- Result := Result + 128;
-end;
-
function g_Window_SetDisplay(PreserveGL: Boolean = False): Boolean;
var
mode, cmode: TSDL_DisplayMode;
function g_Window_SetDisplay(PreserveGL: Boolean = False): Boolean;
var
mode, cmode: TSDL_DisplayMode;
begin
curMsButState := 0;
curKbState := 0;
begin
curMsButState := 0;
curKbState := 0;
+ e_UnpressAllKeys();
if not wMinimized then
begin
e_ResizeWindow(0, 0);
if not wMinimized then
begin
e_ResizeWindow(0, 0);
curMsButState := 0;
curKbState := 0;
wDeactivate := True;
curMsButState := 0;
curKbState := 0;
wDeactivate := True;
+ e_UnpressAllKeys();
//e_WriteLog('window lost focus!', MSG_NOTIFY);
g_Holmes_WindowBlured();
end;
//e_WriteLog('window lost focus!', MSG_NOTIFY);
g_Holmes_WindowBlured();
end;
Result := True;
end;
Result := True;
end;
- SDL_KEYDOWN,
- SDL_KEYUP:
+ SDL_KEYDOWN, SDL_KEYUP:
begin
key := ev.key.keysym.scancode;
if (g_holmes_enabled) then
begin
key := ev.key.keysym.scancode;
if (g_holmes_enabled) then
kbev.sym := ev.key.keysym.sym;
kbev.bstate := curMsButState;
kbev.kstate := curKbState;
kbev.sym := ev.key.keysym.sym;
kbev.bstate := curMsButState;
kbev.kstate := curKbState;
- if g_Holmes_keyEvent(kbev) then exit;
+ {$IF not DEFINED(HEADLESS)}
+ if g_Holmes_keyEvent(kbev) then
+ begin
+ if (ev.type_ <> SDL_KEYDOWN) then e_KeyUpDown(ev.key.keysym.scancode, false);
+ exit;
+ end;
+ {$ENDIF}
end;
if (ev.type_ = SDL_KEYDOWN) then KeyPress(key);
end;
if (ev.type_ = SDL_KEYDOWN) then KeyPress(key);
+ e_KeyUpDown(ev.key.keysym.scancode, (ev.type_ = SDL_KEYDOWN));
end;
end;
+ {$IF not DEFINED(HEADLESS)}
SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP:
begin
msev.dx := ev.button.x-curMsX;
SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP:
begin
msev.dx := ev.button.x-curMsX;
if (msev.but <> 0) then
begin
// ev.button.clicks: Byte
if (msev.but <> 0) then
begin
// ev.button.clicks: Byte
- curMsButState := curMsButState or msev.but;
+ if (ev.type_ = SDL_MOUSEBUTTONDOWN) then curMsButState := curMsButState or msev.but else curMsButState := curMsButState and (not msev.but);
msev.bstate := curMsButState;
msev.kstate := curKbState;
if (g_holmes_enabled) then g_Holmes_mouseEvent(msev);
msev.bstate := curMsButState;
msev.kstate := curKbState;
if (g_holmes_enabled) then g_Holmes_mouseEvent(msev);
msev.kstate := curKbState;
if (g_holmes_enabled) then g_Holmes_mouseEvent(msev);
end;
msev.kstate := curKbState;
if (g_holmes_enabled) then g_Holmes_mouseEvent(msev);
end;
+ {$ENDIF}
SDL_TEXTINPUT:
begin
Utf8ToUnicode(@uc, PChar(ev.text.text), 1);
keychr := Word(uc);
SDL_TEXTINPUT:
begin
Utf8ToUnicode(@uc, PChar(ev.text.text), 1);
keychr := Word(uc);
- if (keychr > 127) then keychr := WCharToCP1251(keychr);
- CharPress(Chr(keychr));
+ if (keychr > 127) then keychr := Word(wchar2win(WideChar(keychr)));
+ CharPress(AnsiChar(keychr));
end;
// other key presses and joysticks are handled in e_input
end;
// other key presses and joysticks are handled in e_input
SDL_PushEvent(@ev);
end;
SDL_PushEvent(@ev);
end;
-procedure ProcessLoading();
+
+var
+ prevLoadingUpdateTime: UInt64 = 0;
+
+procedure ProcessLoading (forceUpdate: Boolean=false);
var
ev: TSDL_Event;
ID: DWORD;
var
ev: TSDL_Event;
ID: DWORD;
+ stt: UInt64;
begin
FillChar(ev, SizeOf(ev), 0);
//wNeedFree := False;
begin
FillChar(ev, SizeOf(ev), 0);
//wNeedFree := False;
if not wMinimized then
begin
if not wMinimized then
begin
- if g_Texture_Get('INTER', ID) then
- e_DrawSize(ID, 0, 0, 0, False, False, gScreenWidth, gScreenHeight)
+ if forceUpdate then
+ begin
+ prevLoadingUpdateTime := curTimeMilli();
+ end
else
else
- e_Clear(GL_COLOR_BUFFER_BIT, 0, 0, 0);
+ begin
+ stt := curTimeMilli();
+ if (stt < prevLoadingUpdateTime) or (stt-prevLoadingUpdateTime >= 400) then
+ begin
+ prevLoadingUpdateTime := stt;
+ forceUpdate := true;
+ end;
+ end;
+
+ if forceUpdate then
+ begin
+ if g_Texture_Get('INTER', ID) then
+ begin
+ e_DrawSize(ID, 0, 0, 0, False, False, gScreenWidth, gScreenHeight)
+ end
+ else
+ begin
+ e_Clear(GL_COLOR_BUFFER_BIT, 0, 0, 0);
+ end;
- DrawLoadingStat();
- SwapBuffers();
+ DrawLoadingStat();
+ SwapBuffers();
- ReShowCursor();
+ ReShowCursor();
+ end;
end;
e_SoundUpdate();
if NetMode = NET_SERVER then
end;
e_SoundUpdate();
if NetMode = NET_SERVER then
- g_Net_Host_Update
+ begin
+ g_Net_Host_Update();
+ end
else
else
- if (NetMode = NET_CLIENT) and (NetState <> NET_STATE_AUTH) then
- g_Net_Client_UpdateWhileLoading;
+ begin
+ if (NetMode = NET_CLIENT) and (NetState <> NET_STATE_AUTH) then g_Net_Client_UpdateWhileLoading();
+ end;
wLoadingProgress := False;
end;
wLoadingProgress := False;
end;
var
idx: Integer;
ltmp: Integer;
var
idx: Integer;
ltmp: Integer;
+ arg: AnsiString;
+ mdfo: TStream;
begin
{$IFDEF HEADLESS}
e_NoGraphics := True;
{$ENDIF}
begin
{$IFDEF HEADLESS}
e_NoGraphics := True;
{$ENDIF}
- for idx := 1 to ParamCount do
- begin
- if ParamStr(idx) = '--opengl-dump-exts' then gwin_dump_extensions := true;
- if ParamStr(idx) = '--twinkletwinkle' then gwin_k8_enable_light_experiments := true;
- if ParamStr(idx) = '--jah' then g_profile_history_size := 100;
- //if ParamStr(idx) = '--tree-draw' then gdbg_map_use_tree_draw := true;
- //if ParamStr(idx) = '--grid-draw' then gdbg_map_use_tree_draw := false;
- //if ParamStr(idx) = '--tree-coldet' then gdbg_map_use_tree_coldet := true;
- //if ParamStr(idx) = '--grid-coldet' then gdbg_map_use_tree_coldet := false;
- if ParamStr(idx) = '--no-particles' then gpart_dbg_enabled := false;
- if ParamStr(idx) = '--no-los' then gmon_dbg_los_enabled := false;
-
- if ParamStr(idx) = '--profile-render' then g_profile_frame_draw := true;
- if ParamStr(idx) = '--profile-coldet' then g_profile_collision := true;
- if ParamStr(idx) = '--profile-los' then g_profile_los := true;
-
- if ParamStr(idx) = '--no-part-phys' then gpart_dbg_phys_enabled := false;
- if ParamStr(idx) = '--no-part-physics' then gpart_dbg_phys_enabled := false;
- if ParamStr(idx) = '--no-particles-phys' then gpart_dbg_phys_enabled := false;
- if ParamStr(idx) = '--no-particles-physics' then gpart_dbg_phys_enabled := false;
- if ParamStr(idx) = '--no-particle-phys' then gpart_dbg_phys_enabled := false;
- if ParamStr(idx) = '--no-particle-physics' then gpart_dbg_phys_enabled := false;
-
- if ParamStr(idx) = '--holmes' then begin g_holmes_enabled := true; g_Game_SetDebugMode(); end;
- end;
+ idx := 1;
+ while (idx <= ParamCount) do
+ begin
+ arg := ParamStr(idx);
+ Inc(idx);
+ if arg = '--opengl-dump-exts' then gwin_dump_extensions := true;
+ if arg = '--twinkletwinkle' then gwin_k8_enable_light_experiments := true;
+ if arg = '--jah' then g_profile_history_size := 100;
+ if arg = '--no-particles' then gpart_dbg_enabled := false;
+ if arg = '--no-los' then gmon_dbg_los_enabled := false;
+
+ if arg = '--profile-render' then g_profile_frame_draw := true;
+ if arg = '--profile-coldet' then g_profile_collision := true;
+ if arg = '--profile-los' then g_profile_los := true;
+
+ if arg = '--no-part-phys' then gpart_dbg_phys_enabled := false;
+ if arg = '--no-part-physics' then gpart_dbg_phys_enabled := false;
+ if arg = '--no-particles-phys' then gpart_dbg_phys_enabled := false;
+ if arg = '--no-particles-physics' then gpart_dbg_phys_enabled := false;
+ if arg = '--no-particle-phys' then gpart_dbg_phys_enabled := false;
+ if arg = '--no-particle-physics' then gpart_dbg_phys_enabled := false;
+
+ {$IF DEFINED(D2F_DEBUG)}
+ if arg = '--aimline' then g_dbg_aimline_on := false;
+ {$ENDIF}
+
+ if arg = '--holmes' then begin g_holmes_enabled := true; g_Game_SetDebugMode(); end;
+ if (arg = '--holmes-ui-scale') or (arg = '-holmes-ui-scale') then
+ begin
+ if (idx <= ParamCount) then
+ begin
+ if not conParseFloat(g_holmes_ui_scale, ParamStr(idx)) then g_holmes_ui_scale := 1.0;
+ Inc(idx);
+ end;
+ end;
- //if gdbg_map_use_tree_draw then e_WriteLog('using TREE renderer', MSG_NOTIFY);
- //if not gdbg_map_use_tree_draw then e_WriteLog('using GRID renderer', MSG_NOTIFY);
+ {$IF DEFINED(D2F_DEBUG)}
+ if (arg = '--game-scale') or (arg = '-game-scale') then
+ begin
+ if (idx <= ParamCount) then
+ begin
+ if not conParseFloat(g_dbg_scale, ParamStr(idx)) then g_dbg_scale := 1.0;
+ Inc(idx);
+ end;
+ end;
+ {$ENDIF}
- //if gdbg_map_use_tree_coldet then e_WriteLog('using TREE coldet', MSG_NOTIFY);
- //if not gdbg_map_use_tree_coldet then e_WriteLog('using GRID coldet', MSG_NOTIFY);
+ if (arg = '--write-mapdef') or (arg = '-write-mapdef') then
+ begin
+ mdfo := createDiskFile('mapdef.txt');
+ mdfo.WriteBuffer(defaultMapDef[1], Length(defaultMapDef));
+ mdfo.Free();
+ Halt(0);
+ end;
+ end;
e_WriteLog('Initializing OpenGL', MSG_NOTIFY);
InitOpenGL(gVSync);
e_WriteLog('Initializing OpenGL', MSG_NOTIFY);
InitOpenGL(gVSync);