diff --git a/src/game/g_map.pas b/src/game/g_map.pas
index 681e182d7b1583834630e5a8fd7999ac4b65cbf9..924dc000ada380a2b1b7a9010bffa327148b06fa 100644 (file)
--- a/src/game/g_map.pas
+++ b/src/game/g_map.pas
interface
uses
interface
uses
- e_graphics, g_basic, MAPSTRUCT, g_textures, Classes,
- g_phys, wadreader, BinEditor, g_panel, g_grid, md5, binheap, xprofiler;
+ e_graphics, g_basic, MAPDEF, g_textures, Classes,
+ g_phys, wadreader, BinEditor, g_panel, g_grid, md5, binheap, xprofiler, xparser, xdynrec;
type
TMapInfo = record
type
TMapInfo = record
procedure g_Map_ProfilersEnd ();
procedure g_Map_ProfilersEnd ();
+function g_Map_ParseMap (data: Pointer; dataLen: Integer): TDynRecord;
+
+const
+ NNF_NO_NAME = 0;
+ NNF_NAME_BEFORE = 1;
+ NNF_NAME_EQUALS = 2;
+ NNF_NAME_AFTER = 3;
+
+function g_Texture_NumNameFindStart(name: String): Boolean;
+function g_Texture_NumNameFindNext(var newName: String): Byte;
+
const
RESPAWNPOINT_PLAYER1 = 1;
RESPAWNPOINT_PLAYER2 = 2;
const
RESPAWNPOINT_PLAYER1 = 1;
RESPAWNPOINT_PLAYER2 = 2;
gFlags: array [FLAG_RED..FLAG_BLUE] of TFlag;
//gDOMFlags: array of TFlag;
gMapInfo: TMapInfo;
gFlags: array [FLAG_RED..FLAG_BLUE] of TFlag;
//gDOMFlags: array of TFlag;
gMapInfo: TMapInfo;
- gBackSize: TPoint;
+ gBackSize: TDFPoint;
gDoorMap: array of array of DWORD;
gLiftMap: array of array of DWORD;
gWADHash: TMD5Digest;
gDoorMap: array of array of DWORD;
gLiftMap: array of array of DWORD;
gWADHash: TMD5Digest;
uses
g_main, e_log, SysUtils, g_items, g_gfx, g_console,
GL, GLExt, g_weapons, g_game, g_sound, e_sound, CONFIG,
uses
g_main, e_log, SysUtils, g_items, g_gfx, g_console,
GL, GLExt, g_weapons, g_game, g_sound, e_sound, CONFIG,
- g_options, MAPREADER, g_triggers, g_player, MAPDEF,
+ g_options, g_triggers, g_player,
Math, g_monsters, g_saveload, g_language, g_netmsg,
Math, g_monsters, g_saveload, g_language, g_netmsg,
- utils, sfs,
+ utils, sfs, xstreams,
ImagingTypes, Imaging, ImagingUtility,
ImagingGif, ImagingNetworkGraphics;
ImagingTypes, Imaging, ImagingUtility,
ImagingGif, ImagingNetworkGraphics;
FLAG_SIGNATURE = $47414C46; // 'FLAG'
FLAG_SIGNATURE = $47414C46; // 'FLAG'
+var
+ dfmapdef: TDynMapDef = nil;
+
+
+procedure loadMapDefinition ();
+var
+ pr: TTextParser = nil;
+ st: TStream = nil;
+ WAD: TWADFile = nil;
+begin
+ if (dfmapdef <> nil) then exit;
+ try
+ e_LogWritefln('parsing "mapdef.txt"...', []);
+ st := openDiskFileRO(DataDir+'mapdef.txt');
+ except
+ st := nil;
+ e_LogWritefln('local "%smapdef.txt" not found', [DataDir]);
+ end;
+ if (st = nil) then
+ begin
+ WAD := TWADFile.Create();
+ if not WAD.ReadFile(GameWAD) then
+ begin
+ //raise Exception.Create('cannot load "game.wad"');
+ st := nil;
+ end
+ else
+ begin
+ st := WAD.openFileStream('mapdef.txt');
+ end;
+ end;
+
+ if (st = nil) then
+ begin
+ //raise Exception.Create('cannot open "mapdef.txt"');
+ e_LogWritefln('using default "mapdef.txt"...', [], MSG_WARNING);
+ pr := TStrTextParser.Create(defaultMapDef);
+ end
+ else
+ begin
+ pr := TFileTextParser.Create(st);
+ end;
+
+ try
+ dfmapdef := TDynMapDef.Create(pr);
+ except on e: Exception do
+ raise Exception.Create(Format('ERROR in "mapdef.txt" at (%s,%s): %s', [pr.line, pr.col, e.message]));
+ end;
+
+ st.Free();
+ WAD.Free();
+end;
+
+
+function g_Map_ParseMap (data: Pointer; dataLen: Integer): TDynRecord;
+var
+ wst: TSFSMemoryChunkStream = nil;
+ pr: TTextParser = nil;
+begin
+ result := nil;
+ if (dataLen < 4) then exit;
+ loadMapDefinition();
+ if (dfmapdef = nil) then raise Exception.Create('internal map loader error');
+
+ wst := TSFSMemoryChunkStream.Create(data, dataLen);
+
+ if (PAnsiChar(data)[0] = 'M') and (PAnsiChar(data)[1] = 'A') and (PAnsiChar(data)[2] = 'P') and (PByte(data)[3] = 1) then
+ begin
+ // binary map
+ try
+ result := dfmapdef.parseBinMap(wst);
+ except on e: Exception do
+ begin
+ e_LogWritefln('ERROR: %s', [e.message]);
+ wst.Free();
+ result := nil;
+ exit;
+ end;
+ end;
+ wst.Free();
+ end
+ else
+ begin
+ // text map
+ pr := TFileTextParser.Create(wst);
+ try
+ result := dfmapdef.parseMap(pr);
+ except on e: Exception do
+ begin
+ if (pr <> nil) then e_LogWritefln('ERROR at (%s,%s): %s', [pr.line, pr.col, e.message])
+ else e_LogWritefln('ERROR: %s', [e.message]);
+ pr.Free(); // will free `wst`
+ result := nil;
+ exit;
+ end;
+ end;
+ pr.Free(); // will free `wst`
+ end;
+end;
+
+
+var
+ NNF_PureName: String; // Èìÿ òåêñòóðû áåç öèôð â êîíöå
+ NNF_FirstNum: Integer; // ×èñëî ó íà÷àëüíîé òåêñòóðû
+ NNF_CurrentNum: Integer; // Ñëåäóþùåå ÷èñëî ó òåêñòóðû
+
+
+function g_Texture_NumNameFindStart(name: String): Boolean;
+var
+ i: Integer;
+
+begin
+ Result := False;
+ NNF_PureName := '';
+ NNF_FirstNum := -1;
+ NNF_CurrentNum := -1;
+
+ for i := Length(name) downto 1 do
+ if (name[i] = '_') then // "_" - ñèìâîë íà÷àëà íîìåðíîãî ïîñòôèêñà
+ begin
+ if i = Length(name) then
+ begin // Íåò öèôð â êîíöå ñòðîêè
+ Exit;
+ end
+ else
+ begin
+ NNF_PureName := Copy(name, 1, i);
+ Delete(name, 1, i);
+ Break;
+ end;
+ end;
+
+// Íå ïåðåâåñòè â ÷èñëî:
+ if not TryStrToInt(name, NNF_FirstNum) then
+ Exit;
+
+ NNF_CurrentNum := 0;
+
+ Result := True;
+end;
+
+
+function g_Texture_NumNameFindNext(var newName: String): Byte;
+begin
+ if (NNF_PureName = '') or (NNF_CurrentNum < 0) then
+ begin
+ newName := '';
+ Result := NNF_NO_NAME;
+ Exit;
+ end;
+
+ newName := NNF_PureName + IntToStr(NNF_CurrentNum);
+
+ if NNF_CurrentNum < NNF_FirstNum then
+ Result := NNF_NAME_BEFORE
+ else
+ if NNF_CurrentNum > NNF_FirstNum then
+ Result := NNF_NAME_AFTER
+ else
+ Result := NNF_NAME_EQUALS;
+
+ Inc(NNF_CurrentNum);
+end;
+
+
function panelTypeToTag (panelType: Word): Integer;
begin
case panelType of
function panelTypeToTag (panelType: Word): Integer;
begin
case panelType of
Width := 1;
Height := 1;
Anim := False;
Width := 1;
Height := 1;
Anim := False;
- TextureID := TEXTURE_NONE;
+ TextureID := LongWord(TEXTURE_NONE);
end;
end;
end;
end;
TextureName := RecName;
if TextureName = TEXTURE_NAME_WATER then
TextureName := RecName;
if TextureName = TEXTURE_NAME_WATER then
- TextureID := TEXTURE_SPECIAL_WATER
+ TextureID := LongWord(TEXTURE_SPECIAL_WATER)
else
if TextureName = TEXTURE_NAME_ACID1 then
else
if TextureName = TEXTURE_NAME_ACID1 then
- TextureID := TEXTURE_SPECIAL_ACID1
+ TextureID := LongWord(TEXTURE_SPECIAL_ACID1)
else
if TextureName = TEXTURE_NAME_ACID2 then
else
if TextureName = TEXTURE_NAME_ACID2 then
- TextureID := TEXTURE_SPECIAL_ACID2;
+ TextureID := LongWord(TEXTURE_SPECIAL_ACID2);
Anim := False;
end;
Anim := False;
end;
gExternalResources.Add(res);
end;
gExternalResources.Add(res);
end;
-procedure generateExternalResourcesList(mapReader: TMapReader_1);
+procedure generateExternalResourcesList({mapReader: TMapReader_1}map: TDynRecord);
var
textures: TTexturesRec1Array;
mapHeader: TMapHeaderRec_1;
var
textures: TTexturesRec1Array;
mapHeader: TMapHeaderRec_1;
gExternalResources := TStringList.Create;
gExternalResources.Clear;
gExternalResources := TStringList.Create;
gExternalResources.Clear;
- textures := mapReader.GetTextures();
+ textures := GetTextures(map);
for i := 0 to High(textures) do
begin
addResToExternalResList(resFile);
for i := 0 to High(textures) do
begin
addResToExternalResList(resFile);
textures := nil;
textures := nil;
- mapHeader := mapReader.GetMapHeader;
+ mapHeader := GetMapHeader(map);
addResToExternalResList(mapHeader.MusicName);
addResToExternalResList(mapHeader.SkyName);
addResToExternalResList(mapHeader.MusicName);
addResToExternalResList(mapHeader.SkyName);
DefaultSkyRes = 'Standart.wad:STDSKY\SKY0';
var
WAD: TWADFile;
DefaultSkyRes = 'Standart.wad:STDSKY\SKY0';
var
WAD: TWADFile;
- MapReader: TMapReader_1;
+ //MapReader: TMapReader_1;
+ mapReader: TDynRecord = nil;
Header: TMapHeaderRec_1;
_textures: TTexturesRec1Array;
_texnummap: array of Integer; // `_textures` -> `Textures`
Header: TMapHeaderRec_1;
_textures: TTexturesRec1Array;
_texnummap: array of Integer; // `_textures` -> `Textures`
Len: Integer;
ok, isAnim, trigRef: Boolean;
CurTex, ntn: Integer;
Len: Integer;
ok, isAnim, trigRef: Boolean;
CurTex, ntn: Integer;
-
begin
mapGrid.Free();
mapGrid := nil;
begin
mapGrid.Free();
mapGrid := nil;
- //mapTree.Free();
- //mapTree := nil;
Result := False;
gMapInfo.Map := Res;
Result := False;
gMapInfo.Map := Res;
WAD.Free();
Exit;
end;
WAD.Free();
Exit;
end;
+
//k8: why loader ignores path here?
mapResName := g_ExtractFileName(Res);
if not WAD.GetMapResource(mapResName, Data, Len) then
//k8: why loader ignores path here?
mapResName := g_ExtractFileName(Res);
if not WAD.GetMapResource(mapResName, Data, Len) then
WAD.Free();
WAD.Free();
- // Çàãðóçêà êàðòû:
- e_WriteLog('Loading map: '+mapResName, MSG_NOTIFY);
+ if (Len < 4) then
+ begin
+ e_LogWritefln('invalid map file: ''%s''', [mapResName]);
+ FreeMem(Data);
+ exit;
+ end;
+
+ // Çàãðóçêà êàðòû:
+ e_LogWritefln('Loading map: %s', [mapResName], MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_MAP], 0, False);
g_Game_SetLoadingText(_lc[I_LOAD_MAP], 0, False);
- MapReader := TMapReader_1.Create();
+ {
+ if (PChar(Data)[0] = 'M') and (PChar(Data)[1] = 'A') and (PChar(Data)[2] = 'P') and (PByte(Data)[3] = 1) then
+ begin
+ // nothing
+ end
+ else
+ begin
+ e_LogWritefln('Loading text map: %s', [mapResName]);
+ loadMapDefinition();
+ if (dfmapdef = nil) then raise Exception.Create('internal map loader error');
+ //e_LogWritefln('***'#10'%s'#10'***', [dfmapdef.headerType.definition]);
+ wst := TSFSMemoryChunkStream.Create(Data, Len);
+ try
+ pr := TFileTextParser.Create(wst);
+ e_LogWritefln('parsing text map: %s', [mapResName]);
+ rec := dfmapdef.parseMap(pr);
+ except on e: Exception do
+ begin
+ if (pr <> nil) then e_LogWritefln('ERROR at (%s,%s): %s', [pr.line, pr.col, e.message])
+ else e_LogWritefln('ERROR: %s', [e.message]);
+ pr.Free();
+ wst.Free();
+ FreeMem(Data);
+ exit;
+ end;
+ end;
+ pr.Free();
+ //wst.Free(); // pr will do it
+ e_LogWritefln('writing text map to temporary bin storage...', []);
+ st := TMemoryStream.Create();
+ try
+ rec.writeBinTo(st);
+ Len := Integer(st.position);
+ st.position := 0;
+ FreeMem(Data);
+ GetMem(Data, Len);
+ st.ReadBuffer(Data^, Len);
+ except on e: Exception do
+ begin
+ rec.Free();
+ st.Free();
+ e_LogWritefln('ERROR: %s', [e.message]);
+ FreeMem(Data);
+ exit;
+ end;
+ end;
+ st.Free();
+ end;
+ }
+ try
+ mapReader := g_Map_ParseMap(Data, Len);
+ except
+ mapReader.Free();
+ g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [Res]));
+ FreeMem(Data);
+ MapReader.Free();
+ Exit;
+ end;
+
+ {
+ MapReader := TMapReader_1.Create();
if not MapReader.LoadMap(Data) then
begin
g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [Res]));
if not MapReader.LoadMap(Data) then
begin
g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [Res]));
MapReader.Free();
Exit;
end;
MapReader.Free();
Exit;
end;
+ }
FreeMem(Data);
generateExternalResourcesList(MapReader);
// Çàãðóçêà òåêñòóð:
g_Game_SetLoadingText(_lc[I_LOAD_TEXTURES], 0, False);
FreeMem(Data);
generateExternalResourcesList(MapReader);
// Çàãðóçêà òåêñòóð:
g_Game_SetLoadingText(_lc[I_LOAD_TEXTURES], 0, False);
- _textures := MapReader.GetTextures();
+ _textures := GetTextures(mapReader);
_texnummap := nil;
// Çàãðóçêà îïèñàíèÿ êàðòû:
e_WriteLog(' Reading map info...', MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_MAP_HEADER], 0, False);
_texnummap := nil;
// Çàãðóçêà îïèñàíèÿ êàðòû:
e_WriteLog(' Reading map info...', MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_MAP_HEADER], 0, False);
- Header := MapReader.GetMapHeader();
+ Header := GetMapHeader(mapReader);
with gMapInfo do
begin
with gMapInfo do
begin
SetLength(s, 64);
CopyMemory(@s[1], @_textures[a].Resource[0], 64);
for b := 1 to Length(s) do
SetLength(s, 64);
CopyMemory(@s[1], @_textures[a].Resource[0], 64);
for b := 1 to Length(s) do
+ begin
if s[b] = #0 then
begin
SetLength(s, b-1);
Break;
end;
if s[b] = #0 then
begin
SetLength(s, b-1);
Break;
end;
+ end;
+ {$IF DEFINED(D2F_DEBUG)}
e_WriteLog(Format(' Loading texture #%d: %s', [a, s]), MSG_NOTIFY);
e_WriteLog(Format(' Loading texture #%d: %s', [a, s]), MSG_NOTIFY);
+ {$ENDIF}
//if g_Map_IsSpecialTexture(s) then e_WriteLog(' SPECIAL!', MSG_NOTIFY);
// Àíèìèðîâàííàÿ òåêñòóðà:
if ByteBool(_textures[a].Anim) then
//if g_Map_IsSpecialTexture(s) then e_WriteLog(' SPECIAL!', MSG_NOTIFY);
// Àíèìèðîâàííàÿ òåêñòóðà:
if ByteBool(_textures[a].Anim) then
gTriggerClientID := 0;
e_WriteLog(' Loading triggers...', MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_TRIGGERS], 0, False);
gTriggerClientID := 0;
e_WriteLog(' Loading triggers...', MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_TRIGGERS], 0, False);
- triggers := MapReader.GetTriggers();
+ triggers := GetTriggers(mapReader);
// Çàãðóçêà ïàíåëåé:
e_WriteLog(' Loading panels...', MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_PANELS], 0, False);
// Çàãðóçêà ïàíåëåé:
e_WriteLog(' Loading panels...', MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_PANELS], 0, False);
- panels := MapReader.GetPanels();
+ panels := GetPanels(mapReader);
// check texture numbers for panels
for a := 0 to High(panels) do
// check texture numbers for panels
for a := 0 to High(panels) do
// Åñëè íå LoadState, òî ñîçäàåì òðèããåðû:
if (triggers <> nil) and not gLoadGameMode then
begin
// Åñëè íå LoadState, òî ñîçäàåì òðèããåðû:
if (triggers <> nil) and not gLoadGameMode then
begin
- e_WriteLog(' Creating triggers...', MSG_NOTIFY);
+ e_LogWritefln(' Creating triggers (%d)...', [Length(triggers)]);
g_Game_SetLoadingText(_lc[I_LOAD_CREATE_TRIGGERS], 0, False);
// Óêàçûâàåì òèï ïàíåëè, åñëè åñòü:
for a := 0 to High(triggers) do
begin
g_Game_SetLoadingText(_lc[I_LOAD_CREATE_TRIGGERS], 0, False);
// Óêàçûâàåì òèï ïàíåëè, åñëè åñòü:
for a := 0 to High(triggers) do
begin
- if triggers[a].TexturePanel <> -1 then
- b := panels[TriggersTable[a].TexturePanel].PanelType
+ if (triggers[a].TexturePanel <> -1) then
+ begin
+ if (TriggersTable[a].TexturePanel < 0) or (TriggersTable[a].TexturePanel > High(panels)) then
+ begin
+ e_WriteLog('error loading map: invalid panel index for trigger', MSG_FATALERROR);
+ result := false;
+ exit;
+ end;
+ b := panels[TriggersTable[a].TexturePanel].PanelType;
+ end
else
else
+ begin
b := 0;
b := 0;
- if (triggers[a].TriggerType = TRIGGER_SHOT) and
- (TTriggerData(triggers[a].DATA).ShotPanelID <> -1) then
+ end;
+ if (triggers[a].TriggerType = TRIGGER_SHOT) and (TTriggerData(triggers[a].DATA).ShotPanelID <> -1) then
+ begin
c := panels[TriggersTable[a].ShotPanel].PanelType
c := panels[TriggersTable[a].ShotPanel].PanelType
+ end
else
else
+ begin
c := 0;
c := 0;
+ end;
CreateTrigger(triggers[a], b, c);
end;
end;
// Çàãðóçêà ïðåäìåòîâ:
CreateTrigger(triggers[a], b, c);
end;
end;
// Çàãðóçêà ïðåäìåòîâ:
- e_WriteLog(' Loading triggers...', MSG_NOTIFY);
+ e_WriteLog(' Loading items...', MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_ITEMS], 0, False);
g_Game_SetLoadingText(_lc[I_LOAD_ITEMS], 0, False);
- items := MapReader.GetItems();
+ items := GetItems(mapReader);
// Åñëè íå LoadState, òî ñîçäàåì ïðåäìåòû:
if (items <> nil) and not gLoadGameMode then
// Åñëè íå LoadState, òî ñîçäàåì ïðåäìåòû:
if (items <> nil) and not gLoadGameMode then
// Çàãðóçêà îáëàñòåé:
e_WriteLog(' Loading areas...', MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_AREAS], 0, False);
// Çàãðóçêà îáëàñòåé:
e_WriteLog(' Loading areas...', MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_AREAS], 0, False);
- areas := MapReader.GetAreas();
+ areas := GetAreas(mapReader);
// Åñëè íå LoadState, òî ñîçäàåì îáëàñòè:
if areas <> nil then
// Åñëè íå LoadState, òî ñîçäàåì îáëàñòè:
if areas <> nil then
// Çàãðóçêà ìîíñòðîâ:
e_WriteLog(' Loading monsters...', MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_MONSTERS], 0, False);
// Çàãðóçêà ìîíñòðîâ:
e_WriteLog(' Loading monsters...', MSG_NOTIFY);
g_Game_SetLoadingText(_lc[I_LOAD_MONSTERS], 0, False);
- monsters := MapReader.GetMonsters();
+ monsters := GetMonsters(mapReader);
gTotalMonsters := 0;
gTotalMonsters := 0;
function g_Map_GetMapInfo(Res: String): TMapInfo;
var
WAD: TWADFile;
function g_Map_GetMapInfo(Res: String): TMapInfo;
var
WAD: TWADFile;
- MapReader: TMapReader_1;
+ MapReader: TDynRecord;
Header: TMapHeaderRec_1;
FileName: String;
Data: Pointer;
Header: TMapHeaderRec_1;
FileName: String;
Data: Pointer;
WAD.Free();
WAD.Free();
+ {
MapReader := TMapReader_1.Create();
MapReader := TMapReader_1.Create();
-
if not MapReader.LoadMap(Data) then
begin
g_Console_Add(Format(_lc[I_GAME_ERROR_MAP_LOAD], [Res]), True);
if not MapReader.LoadMap(Data) then
begin
g_Console_Add(Format(_lc[I_GAME_ERROR_MAP_LOAD], [Res]), True);
Result.Name := Header.MapName;
Result.Description := Header.MapDescription;
end;
Result.Name := Header.MapName;
Result.Description := Header.MapDescription;
end;
+ }
+ try
+ mapReader := g_Map_ParseMap(Data, Len);
+ except
+ mapReader := nil;
+ end;
FreeMem(Data);
FreeMem(Data);
+ //MapReader.Free();
+
+ if (mapReader <> nil) then Header := GetMapHeader(mapReader) else FillChar(Header, sizeof(Header), 0);
MapReader.Free();
MapReader.Free();
+ if (Header.Width > 0) and (Header.Height > 0) then
+ begin
+ Result.Name := Header.MapName;
+ Result.Description := Header.MapDescription;
+ end
+ else
+ begin
+ g_Console_Add(Format(_lc[I_GAME_ERROR_MAP_LOAD], [Res]), True);
+ ZeroMemory(@Header, SizeOf(Header));
+ Result.Name := _lc[I_GAME_ERROR_MAP_SELECT];
+ Result.Description := _lc[I_GAME_ERROR_MAP_SELECT];
+ end;
+
Result.Map := Res;
Result.Author := Header.MapAuthor;
Result.Height := Header.Height;
Result.Map := Res;
Result.Author := Header.MapAuthor;
Result.Height := Header.Height;
if Textures[a].Anim then
g_Frames_DeleteByID(Textures[a].FramesID)
else
if Textures[a].Anim then
g_Frames_DeleteByID(Textures[a].FramesID)
else
- if Textures[a].TextureID <> TEXTURE_NONE then
+ if Textures[a].TextureID <> LongWord(TEXTURE_NONE) then
e_DeleteTexture(Textures[a].TextureID);
Textures := nil;
e_DeleteTexture(Textures[a].TextureID);
Textures := nil;
begin
dplClear();
//tagmask := panelTypeToTag(PanelType);
begin
dplClear();
//tagmask := panelTypeToTag(PanelType);
-
- {if gdbg_map_use_tree_draw then
- begin
- mapTree.aabbQuery(x0, y0, wdt, hgt, checker, (GridTagBack or GridTagStep or GridTagWall or GridTagDoor or GridTagAcid1 or GridTagAcid2 or GridTagWater or GridTagFore));
- end
- else}
- begin
- mapGrid.forEachInAABB(x0, y0, wdt, hgt, checker, GridDrawableMask);
- end;
+ mapGrid.forEachInAABB(x0, y0, wdt, hgt, checker, GridDrawableMask);
// list will be rendered in `g_game.DrawPlayer()`
end;
// list will be rendered in `g_game.DrawPlayer()`
end;
@@ -2101,14 +2375,7 @@ procedure g_Map_DrawPanelShadowVolumes(lightX: Integer; lightY: Integer; radius:
end;
begin
end;
begin
- {if gdbg_map_use_tree_draw then
- begin
- mapTree.aabbQuery(lightX-radius, lightY-radius, radius*2, radius*2, checker, (GridTagWall or GridTagDoor));
- end
- else}
- begin
- mapGrid.forEachInAABB(lightX-radius, lightY-radius, radius*2, radius*2, checker, (GridTagWall or GridTagDoor));
- end;
+ mapGrid.forEachInAABB(lightX-radius, lightY-radius, radius*2, radius*2, checker, (GridTagWall or GridTagDoor));
end;
end;
end;
begin
end;
begin
- texid := TEXTURE_NONE;
+ texid := LongWord(TEXTURE_NONE);
result := texid;
if not checkPanels(gWater) then
if not checkPanels(gAcid1) then
result := texid;
if not checkPanels(gWater) then
if not checkPanels(gAcid1) then
if (profMapCollision <> nil) then profMapCollision.sectionBeginAccum('*solids');
if gdbg_map_use_accel_coldet then
begin
if (profMapCollision <> nil) then profMapCollision.sectionBeginAccum('*solids');
if gdbg_map_use_accel_coldet then
begin
- {if gdbg_map_use_tree_coldet then
+ if (Width = 1) and (Height = 1) then
begin
begin
- //e_WriteLog(Format('coldet query: x=%d; y=%d; w=%d; h=%d', [X, Y, Width, Height]), MSG_NOTIFY);
- result := (mapTree.aabbQuery(X, Y, Width, Height, checker, tagmask) <> nil);
- if (gdbg_map_dump_coldet_tree_queries) and (mapTree.nodesVisited <> 0) then
+ if ((tagmask and SlowMask) <> 0) then
+ begin
+ // slow
+ result := (mapGrid.forEachAtPoint(X, Y, checker, tagmask) <> nil);
+ end
+ else
begin
begin
- //e_WriteLog(Format('map collision: %d nodes visited (%d deep)', [mapTree.nodesVisited, mapTree.nodesDeepVisited]), MSG_NOTIFY);
- g_Console_Add(Format('map collision: %d nodes visited (%d deep)', [mapTree.nodesVisited, mapTree.nodesDeepVisited]));
+ // fast
+ result := (mapGrid.forEachAtPoint(X, Y, nil, tagmask) <> nil);
end;
end
end;
end
- else}
+ else
begin
begin
- if (Width = 1) and (Height = 1) then
+ if ((tagmask and SlowMask) <> 0) then
begin
begin
- if ((tagmask and SlowMask) <> 0) then
- begin
- // slow
- result := (mapGrid.forEachAtPoint(X, Y, checker, tagmask) <> nil);
- end
- else
- begin
- // fast
- result := (mapGrid.forEachAtPoint(X, Y, nil, tagmask) <> nil);
- end;
+ // slow
+ result := (mapGrid.forEachInAABB(X, Y, Width, Height, checker, tagmask) <> nil);
end
else
begin
end
else
begin
- if ((tagmask and SlowMask) <> 0) then
- begin
- // slow
- result := (mapGrid.forEachInAABB(X, Y, Width, Height, checker, tagmask) <> nil);
- end
- else
- begin
- // fast
- result := (mapGrid.forEachInAABB(X, Y, Width, Height, nil, tagmask) <> nil);
- end;
+ // fast
+ result := (mapGrid.forEachInAABB(X, Y, Width, Height, nil, tagmask) <> nil);
end;
end;
end
end;
end;
end
if (profMapCollision <> nil) then profMapCollision.sectionBeginAccum('liquids');
if gdbg_map_use_accel_coldet then
begin
if (profMapCollision <> nil) then profMapCollision.sectionBeginAccum('liquids');
if gdbg_map_use_accel_coldet then
begin
- texid := TEXTURE_NONE;
- {if gdbg_map_use_tree_coldet then
+ texid := LongWord(TEXTURE_NONE);
+ if (Width = 1) and (Height = 1) then
begin
begin
- mapTree.aabbQuery(X, Y, Width, Height, checker, (GridTagWater or GridTagAcid1 or GridTagAcid2));
+ mapGrid.forEachAtPoint(X, Y, checker, (GridTagWater or GridTagAcid1 or GridTagAcid2));
end
end
- else}
+ else
begin
begin
- if (Width = 1) and (Height = 1) then
- begin
- mapGrid.forEachAtPoint(X, Y, checker, (GridTagWater or GridTagAcid1 or GridTagAcid2));
- end
- else
- begin
- mapGrid.forEachInAABB(X, Y, Width, Height, checker, (GridTagWater or GridTagAcid1 or GridTagAcid2));
- end;
+ mapGrid.forEachInAABB(X, Y, Width, Height, checker, (GridTagWater or GridTagAcid1 or GridTagAcid2));
end;
result := texid;
end
end;
result := texid;
end