X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=25b1bfe8e086400f050d115a78c9ffc64010d0ab;hb=ac201b02f10ef558087d50f6b03b4519ab567558;hp=584a88f2b637679b28d719d0def9c9d38cfe6e42;hpb=cc934f758d8d3036fa3bca8a3cca949814e04d89;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index 584a88f..25b1bfe 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -1,10 +1,11 @@ +{$MODE DELPHI} unit g_map; interface uses e_graphics, g_basic, MAPSTRUCT, g_textures, Classes, - g_phys, WADEDITOR, BinEditor, g_panel, md5; + g_phys, wadreader, BinEditor, g_panel, md5; type TMapInfo = record @@ -346,9 +347,10 @@ begin Result := len; end; -procedure CreateNullTexture(RecName: String); +function CreateNullTexture(RecName: String): Integer; begin SetLength(Textures, Length(Textures)+1); + result := High(Textures); with Textures[High(Textures)] do begin @@ -360,22 +362,22 @@ begin end; end; -function CreateTexture(RecName: String; Map: string; log: Boolean): Boolean; +function CreateTexture(RecName: String; Map: string; log: Boolean): Integer; var - WAD: TWADEditor_1; + WAD: TWADFile; TextureData: Pointer; WADName: String; SectionName: String; TextureName: String; a, ResLength: Integer; begin - Result := False; + Result := -1; if Textures <> nil then for a := 0 to High(Textures) do if Textures[a].TextureName = RecName then begin // Òåêñòóðà ñ òàêèì èìåíåì óæå åñòü - Result := True; + Result := a; Exit; end; @@ -402,14 +404,14 @@ begin Anim := False; end; - Result := True; + result := High(Textures); Exit; end; // Çàãðóæàåì ðåñóðñ òåêñòóðû â ïàìÿòü èç WAD'à: g_ProcessResourceStr(RecName, WADName, SectionName, TextureName); - WAD := TWADEditor_1.Create(); + WAD := TWADFile.Create(); if WADName <> '' then WADName := GameDir+'/wads/'+WADName @@ -430,7 +432,7 @@ begin Textures[High(Textures)].TextureName := RecName; Textures[High(Textures)].Anim := False; - Result := True; + result := High(Textures); end else // Íåò òàêîãî ðåóñðñà â WAD'å if log then @@ -442,9 +444,9 @@ begin WAD.Free(); end; -function CreateAnimTexture(RecName: String; Map: string; log: Boolean): Boolean; +function CreateAnimTexture(RecName: String; Map: string; log: Boolean): Integer; var - WAD: TWADEditor_1; + WAD: TWADFile; TextureWAD: Pointer; TextData: Pointer; TextureData: Pointer; @@ -457,12 +459,12 @@ var _width, _height, _framecount, _speed: Integer; _backanimation: Boolean; begin - Result := False; + Result := -1; // ×èòàåì WAD-ðåñóðñ àíèì.òåêñòóðû èç WAD'à â ïàìÿòü: g_ProcessResourceStr(RecName, WADName, SectionName, TextureName); - WAD := TWADEditor_1.Create(); + WAD := TWADFile.Create(); if WADName <> '' then WADName := GameDir+'/wads/'+WADName @@ -545,7 +547,7 @@ begin FramesCount := _framecount; Speed := _speed; - Result := True; + result := High(Textures); end else if log then @@ -754,10 +756,11 @@ const DefaultMusRes = 'Standart.wad:STDMUS\MUS1'; DefaultSkyRes = 'Standart.wad:STDSKY\SKY0'; var - WAD: TWADEditor_1; + WAD: TWADFile; MapReader: TMapReader_1; Header: TMapHeaderRec_1; _textures: TTexturesRec1Array; + _texnummap: array of Integer; // `_textures` -> `Textures` panels: TPanelsRec1Array; items: TItemsRec1Array; monsters: TMonsterRec1Array; @@ -778,7 +781,7 @@ var Data: Pointer; Len: Integer; ok, isAnim, trigRef: Boolean; - CurTex: Integer; + CurTex, ntn: Integer; begin Result := False; gMapInfo.Map := Res; @@ -792,7 +795,7 @@ begin e_WriteLog('Loading map WAD: ' + FileName, MSG_NOTIFY); g_Game_SetLoadingText(_lc[I_LOAD_WAD_FILE], 0, False); - WAD := TWADEditor_1.Create(); + WAD := TWADFile.Create(); if not WAD.ReadFile(FileName) then begin g_FatalError(Format(_lc[I_GAME_ERROR_MAP_WAD], [FileName])); @@ -825,12 +828,14 @@ begin // Çàãðóçêà òåêñòóð: g_Game_SetLoadingText(_lc[I_LOAD_TEXTURES], 0, False); _textures := MapReader.GetTextures(); + _texnummap := nil; // Äîáàâëåíèå òåêñòóð â Textures[]: if _textures <> nil then begin e_WriteLog(' Loading textures:', MSG_NOTIFY); g_Game_SetLoadingText(_lc[I_LOAD_TEXTURES], High(_textures), False); + SetLength(_texnummap, length(_textures)); for a := 0 to High(_textures) do begin @@ -842,23 +847,27 @@ begin SetLength(s, b-1); Break; end; - e_WriteLog(' Loading texture: ' + s, MSG_NOTIFY); + e_WriteLog(Format(' Loading texture #%d: %s', [a, s]), MSG_NOTIFY); + //if g_Map_IsSpecialTexture(s) then e_WriteLog(' SPECIAL!', MSG_NOTIFY); // Àíèìèðîâàííàÿ òåêñòóðà: if ByteBool(_textures[a].Anim) then begin - if not CreateAnimTexture(_textures[a].Resource, FileName, True) then + ntn := CreateAnimTexture(_textures[a].Resource, FileName, True); + if ntn < 0 then begin g_SimpleError(Format(_lc[I_GAME_ERROR_TEXTURE_ANIM], [s])); - CreateNullTexture(_textures[a].Resource); + ntn := CreateNullTexture(_textures[a].Resource); end; end else // Îáû÷íàÿ òåêñòóðà: - if not CreateTexture(_textures[a].Resource, FileName, True) then + ntn := CreateTexture(_textures[a].Resource, FileName, True); + if ntn < 0 then begin g_SimpleError(Format(_lc[I_GAME_ERROR_TEXTURE_SIMPLE], [s])); - CreateNullTexture(_textures[a].Resource); + ntn := CreateNullTexture(_textures[a].Resource); end; + _texnummap[a] := ntn; // fix texture number g_Game_StepLoading(); end; end; @@ -874,6 +883,18 @@ begin g_Game_SetLoadingText(_lc[I_LOAD_PANELS], 0, False); panels := MapReader.GetPanels(); + // check texture numbers for panels + for a := 0 to High(panels) do + begin + if panels[a].TextureNum > High(_textures) then + begin + e_WriteLog('error loading map: invalid texture index for panel', MSG_FATALERROR); + result := false; + exit; + end; + panels[a].TextureNum := _texnummap[panels[a].TextureNum]; + end; + // Ñîçäàíèå òàáëèöû òðèããåðîâ (ñîîòâåòñòâèå ïàíåëåé òðèããåðàì): if triggers <> nil then begin @@ -981,21 +1002,21 @@ begin if ByteBool(texture.Anim) then begin // Íà÷àëüíàÿ - àíèìèðîâàííàÿ, èùåì àíèìèðîâàííóþ isAnim := True; - ok := CreateAnimTexture(TexName, FileName, False); + ok := CreateAnimTexture(TexName, FileName, False) >= 0; if not ok then begin // Íåò àíèìèðîâàííîé, èùåì îáû÷íóþ isAnim := False; - ok := CreateTexture(TexName, FileName, False); + ok := CreateTexture(TexName, FileName, False) >= 0; end; end else begin // Íà÷àëüíàÿ - îáû÷íàÿ, èùåì îáû÷íóþ isAnim := False; - ok := CreateTexture(TexName, FileName, False); + ok := CreateTexture(TexName, FileName, False) >= 0; if not ok then begin // Íåò îáû÷íîé, èùåì àíèìèðîâàííóþ isAnim := True; - ok := CreateAnimTexture(TexName, FileName, False); + ok := CreateAnimTexture(TexName, FileName, False) >= 0; end; end; @@ -1039,6 +1060,8 @@ begin CurTex := 0; end; + //e_WriteLog(Format('panel #%d: TextureNum=%d; ht=%d; ht1=%d; atl=%d', [a, panels[a].TextureNum, High(_textures), High(Textures), High(AddTextures)]), MSG_NOTIFY); + // Ñîçäàåì ïàíåëü è çàïîìèíàåì åå íîìåð: PanelID := CreatePanel(panels[a], AddTextures, CurTex, trigRef); @@ -1231,7 +1254,7 @@ end; function g_Map_GetMapInfo(Res: String): TMapInfo; var - WAD: TWADEditor_1; + WAD: TWADFile; MapReader: TMapReader_1; Header: TMapHeaderRec_1; FileName, SectionName, ResName: String; @@ -1241,7 +1264,7 @@ begin FillChar(Result, SizeOf(Result), 0); g_ProcessResourceStr(Res, FileName, SectionName, ResName); - WAD := TWADEditor_1.Create(); + WAD := TWADFile.Create(); if not WAD.ReadFile(FileName) then begin WAD.Free(); @@ -1283,7 +1306,7 @@ end; function g_Map_GetMapsList(WADName: string): SArray; var - WAD: TWADEditor_1; + WAD: TWADFile; a: Integer; ResList: SArray; Data: Pointer; @@ -1292,7 +1315,7 @@ var begin Result := nil; - WAD := TWADEditor_1.Create(); + WAD := TWADFile.Create(); if not WAD.ReadFile(WADName) then begin WAD.Free(); @@ -1322,7 +1345,7 @@ end; function g_Map_Exist(Res: string): Boolean; var - WAD: TWADEditor_1; + WAD: TWADFile; FileName, SectionName, ResName: string; ResList: SArray; a: Integer; @@ -1333,7 +1356,7 @@ begin FileName := addWadExtension(FileName); - WAD := TWADEditor_1.Create; + WAD := TWADFile.Create; if not WAD.ReadFile(FileName) then begin WAD.Free();