X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=f2922d4a9622c4f47d342a973a4e58b79d8b4694;hb=2b647061c5ce08e02c046c3ef8e0a31917cc28f3;hp=1695460c162e06e3b8b36e9c0f3b6b629390cc4a;hpb=923fa980434e55419f35422119af2faae2bf68d7;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index 1695460..f2922d4 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -1190,7 +1190,7 @@ begin end; end; -procedure CreateTrigger(Trigger: TDynRecord; atpanid, ashotpanid: Integer; fTexturePanel1Type, fTexturePanel2Type: Word); +procedure CreateTrigger (amapIdx: Integer; Trigger: TDynRecord; atpanid, atrigpanid: Integer; fTexturePanel1Type, fTexturePanel2Type: Word); var _trigger: TTrigger; begin @@ -1198,21 +1198,35 @@ begin with _trigger do begin + mapId := Trigger.id; + mapIndex := amapIdx; X := Trigger.X; Y := Trigger.Y; Width := Trigger.Width; Height := Trigger.Height; - Enabled := ByteBool(Trigger.Enabled); - TexturePanel := Trigger.TexturePanel; + Enabled := Trigger.Enabled; + //TexturePanel := Trigger.TexturePanel; + TexturePanel := atpanid; TexturePanelType := fTexturePanel1Type; ShotPanelType := fTexturePanel2Type; TriggerType := Trigger.TriggerType; ActivateType := Trigger.ActivateType; Keys := Trigger.Keys; - trigPanelId := atpanid; - trigShotPanelId := ashotpanid; + trigPanelId := atrigpanid; + //trigShotPanelId := ashotpanid; //Data.Default := Trigger.DATA; - trigData := Trigger.trigRec.clone(); + if (Trigger.trigRec = nil) then + begin + trigData := nil; + if (TriggerType <> TRIGGER_SECRET) then + begin + e_LogWritefln('trigger of type %s has no triggerdata; wtf?!', [TriggerType], MSG_WARNING); + end; + end + else + begin + trigData := Trigger.trigRec.clone(); + end; end; g_Triggers_Create(_trigger); @@ -1251,6 +1265,7 @@ procedure g_Map_ReAdd_DieTriggers(); function monsDieTrig (mon: TMonster): Boolean; var a: Integer; + //tw: TStrTextWriter; begin result := false; // don't stop mon.ClearTriggers(); @@ -1259,6 +1274,15 @@ procedure g_Map_ReAdd_DieTriggers(); if gTriggers[a].TriggerType in [TRIGGER_PRESS, TRIGGER_ON, TRIGGER_OFF, TRIGGER_ONOFF] then begin //if (gTriggers[a].Data.MonsterID-1) = Integer(mon.StartID) then mon.AddTrigger(a); + { + tw := TStrTextWriter.Create(); + try + gTriggers[a].trigData.writeTo(tw); + e_LogWritefln('=== trigger #%s ==='#10'%s'#10'---', [a, tw.str]); + finally + tw.Free(); + end; + } if (gTriggers[a].trigData.trigMonsterId) = Integer(mon.StartID) then mon.AddTrigger(a); end; end; @@ -1462,11 +1486,8 @@ type end; var WAD: TWADFile; - //MapReader: TMapReader_1; mapReader: TDynRecord = nil; - //Header: TMapHeaderRec_1; - _textures: TDynField = nil; //TTexturesRec1Array; tagInt: texture index - //_texnummap: array of Integer = nil; // `_textures` -> `Textures` + mapTextureList: TDynField = nil; //TTexturesRec1Array; tagInt: texture index panels: TDynField = nil; //TPanelsRec1Array; items: TDynField = nil; //TItemsRec1Array; monsters: TDynField = nil; //TMonsterRec1Array; @@ -1475,7 +1496,6 @@ var b, c, k: Integer; PanelID: DWORD; AddTextures: TAddTextureArray; - //texture: TTextureRec_1; TriggersTable: array of TTRec; FileName, mapResName, s, TexName: String; Data: Pointer; @@ -1484,12 +1504,7 @@ var CurTex, ntn: Integer; rec, texrec: TDynRecord; pttit: PTRec; - pannum, trignum, cnt: Integer; - // key: panel index; value: `TriggersTable` index - hashTextPan: THashIntInt = nil; - hashLiftPan: THashIntInt = nil; - hashDoorPan: THashIntInt = nil; - hashShotPan: THashIntInt = nil; + pannum, trignum, cnt, tgpid: Integer; begin mapGrid.Free(); mapGrid := nil; @@ -1501,7 +1516,6 @@ begin gMapInfo.Map := Res; TriggersTable := nil; mapReader := nil; - //FillChar(texture, SizeOf(texture), 0); sfsGCDisable(); // temporary disable removing of temporary volumes try @@ -1551,31 +1565,18 @@ begin FreeMem(Data); - hashTextPan := hashNewIntInt(); - hashLiftPan := hashNewIntInt(); - hashDoorPan := hashNewIntInt(); - hashShotPan := hashNewIntInt(); - - generateExternalResourcesList(MapReader); - //_textures := GetTextures(mapReader); - _textures := mapReader['texture']; - //_texnummap := nil; + generateExternalResourcesList(mapReader); + mapTextureList := mapReader['texture']; // get all other lists here too - //panels := GetPanels(mapReader); panels := mapReader['panel']; - //triggers := GetTriggers(mapReader); triggers := mapReader['trigger']; - //items := GetItems(mapReader); items := mapReader['item']; - //areas := GetAreas(mapReader); areas := mapReader['area']; - //monsters := GetMonsters(mapReader); monsters := mapReader['monster']; // Çàãðóçêà îïèñàíèÿ êàðòû: e_WriteLog(' Reading map info...', MSG_NOTIFY); g_Game_SetLoadingText(_lc[I_LOAD_MAP_HEADER], 0, False); - //Header := GetMapHeader(mapReader); with gMapInfo do begin @@ -1591,14 +1592,13 @@ begin // Çàãðóçêà òåêñòóð: g_Game_SetLoadingText(_lc[I_LOAD_TEXTURES], 0, False); // Äîáàâëåíèå òåêñòóð â Textures[]: - if (_textures <> nil) and (_textures.count > 0) then + if (mapTextureList <> nil) and (mapTextureList.count > 0) then begin e_WriteLog(' Loading textures:', MSG_NOTIFY); - g_Game_SetLoadingText(_lc[I_LOAD_TEXTURES], _textures.count-1, False); - //SetLength(_texnummap, _textures.count); + g_Game_SetLoadingText(_lc[I_LOAD_TEXTURES], mapTextureList.count-1, False); cnt := -1; - for rec in _textures do + for rec in mapTextureList do begin Inc(cnt); s := rec.Resource; @@ -1620,8 +1620,7 @@ begin end; if (ntn < 0) then ntn := CreateNullTexture(rec.Resource); - //_texnummap[a] := ntn; // fix texture number - rec.tagInt := ntn; + rec.tagInt := ntn; // remember texture number g_Game_StepLoading(); end; @@ -1671,6 +1670,7 @@ begin SetLength(TriggersTable, Length(TriggersTable)+1); pttit := @TriggersTable[High(TriggersTable)]; pttit.trigrec := rec; + // Ñìåíà òåêñòóðû (âîçìîæíî, êíîïêè) pttit.texPan := mapReader.panel[rec.TexturePanel]; pttit.liftPan := nil; pttit.doorPan := nil; @@ -1679,34 +1679,22 @@ begin pttit.LiftPanelIdx := -1; pttit.DoorPanelIdx := -1; pttit.ShotPanelIdx := -1; - // Ñìåíà òåêñòóðû (âîçìîæíî, êíîïêè) - //if (rec.TexturePanel >= 0) and (pttit.texPan = nil) then e_WriteLog('error loading map: invalid texture panel index for trigger', MSG_WARNING); // Ëèôòû if rec.TriggerType in [TRIGGER_LIFTUP, TRIGGER_LIFTDOWN, TRIGGER_LIFT] then begin - //pttit.LiftPanel := TTriggerData(rec.DATA).PanelID pttit.liftPan := mapReader.panel[rec.trigRec.tgPanelID]; - //if (rec.trigRec.trigPanelID >= 0) and (pttit.liftPan = nil) then e_WriteLog('error loading map: invalid lift panel index for trigger', MSG_WARNING); end; // Äâåðè if rec.TriggerType in [TRIGGER_OPENDOOR, TRIGGER_CLOSEDOOR, TRIGGER_DOOR, TRIGGER_DOOR5, TRIGGER_CLOSETRAP, TRIGGER_TRAP] then begin - //pttit.DoorPanel := TTriggerData(rec.DATA).PanelID pttit.doorPan := mapReader.panel[rec.trigRec.tgPanelID]; end; // Òóðåëü if (rec.TriggerType = TRIGGER_SHOT) then begin - //pttit.ShotPanel := TTriggerData(rec.DATA).ShotPanelID pttit.shotPan := mapReader.panel[rec.trigRec.tgShotPanelID]; end; - // update hashes - if (pttit.texPan <> nil) then hashTextPan.put(rec.TexturePanel, High(TriggersTable)); - if (pttit.liftPan <> nil) then hashLiftPan.put(rec.trigRec.tgPanelID, High(TriggersTable)); - if (pttit.doorPan <> nil) then hashDoorPan.put(rec.trigRec.tgPanelID, High(TriggersTable)); - if (pttit.shotPan <> nil) then hashShotPan.put(rec.trigRec.tgShotPanelID, High(TriggersTable)); - g_Game_StepLoading(); end; end; @@ -1727,7 +1715,7 @@ begin CurTex := -1; ok := false; - if (_textures <> nil) then + if (mapTextureList <> nil) then begin texrec := rec.TextureRec; ok := (texrec <> nil); @@ -1738,7 +1726,7 @@ begin // Ñìîòðèì, ññûëàþòñÿ ëè íà ýòó ïàíåëü òðèããåðû. // Åñëè äà - òî íàäî ñîçäàòü åùå òåêñòóð ok := false; - if (TriggersTable <> nil) and (_textures <> nil) then + if (TriggersTable <> nil) and (mapTextureList <> nil) then begin for b := 0 to High(TriggersTable) do begin @@ -1827,8 +1815,7 @@ begin begin // Çàíîñèì òåêóùóþ òåêñòóðó íà ñâîå ìåñòî SetLength(AddTextures, Length(AddTextures)+1); - //AddTextures[High(AddTextures)].Texture := _texnummap[rec.TextureNum]; //panels[a].TextureNum; - AddTextures[High(AddTextures)].Texture := rec.tagInt; //panels[a].TextureNum; + AddTextures[High(AddTextures)].Texture := rec.tagInt; // internal texture number, not map index AddTextures[High(AddTextures)].Anim := texrec.Anim; CurTex := High(AddTextures); ok := true; @@ -1848,66 +1835,32 @@ begin begin // Çàíîñèì òîëüêî òåêóùóþ òåêñòóðó SetLength(AddTextures, 1); - AddTextures[0].Texture := rec.tagInt; //panels[a].TextureNum; + AddTextures[0].Texture := rec.tagInt; // internal texture number, not map index AddTextures[0].Anim := false; if (texrec <> nil) then AddTextures[0].Anim := texrec.Anim; 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); + //e_WriteLog(Format('panel #%d: TextureNum=%d; ht=%d; ht1=%d; atl=%d', [a, panels[a].TextureNum, High(mapTextureList), High(Textures), High(AddTextures)]), MSG_NOTIFY); // Ñîçäàåì ïàíåëü è çàïîìèíàåì åå íîìåð PanelID := CreatePanel(rec, AddTextures, CurTex, trigRef); //e_LogWritefln('panel #%s of type %s got id #%s', [pannum, rec.PanelType, PanelID]); - - // Åñëè èñïîëüçóåòñÿ â òðèããåðàõ, òî ñòàâèì òî÷íûé ID - if hashTextPan.get(pannum, b) then TriggersTable[b].texPanIdx := PanelID; - if hashLiftPan.get(pannum, b) then TriggersTable[b].LiftPanelIdx := PanelID; - if hashDoorPan.get(pannum, b) then TriggersTable[b].DoorPanelIdx := PanelID; - if hashShotPan.get(pannum, b) then TriggersTable[b].ShotPanelIdx := PanelID; - - (* - if (TriggersTable <> nil) then - begin - for b := 0 to High(TriggersTable) do - begin - if (TriggersTable[b].texPan = rec) then TriggersTable[b].texPanIdx := PanelID; - if (TriggersTable[b].liftPan = rec) then TriggersTable[b].LiftPanelIdx := PanelID; - if (TriggersTable[b].doorPan = rec) then TriggersTable[b].DoorPanelIdx := PanelID; - if (TriggersTable[b].shotPan = rec) then TriggersTable[b].ShotPanelIdx := PanelID; - { - // Òðèããåð äâåðè/ëèôòà - if (TriggersTable[b].LiftPanel = pannum) or - (TriggersTable[b].DoorPanel = pannum) then - //TTriggerData(TriggersTable[b].trigrec.DATA).PanelID := PanelID; - TriggersTable[b].trigrec.trigRec.trigPanelID := PanelID; - // Òðèããåð ñìåíû òåêñòóðû - if TriggersTable[b].texPanIdx = pannum then - TriggersTable[b].trigrec.TexturePanel := PanelID; - // Òðèããåð "Òóðåëü" - if TriggersTable[b].ShotPanel = pannum then - TriggersTable[b].trigrec.trigRec.trigShotPanelID := PanelID; - } - end; - end; - *) + // set 'gamePanelId' field to panel id + rec.gamePanelId := PanelID; // remember game panel id, we'll fix triggers later g_Game_StepLoading(); end; end; - (* + // ×èíèì ID'û ïàíåëåé, êîòîðûå èñïîëüçóþòñÿ â òðèããåðàõ + for b := 0 to High(TriggersTable) do begin - for b := 0 to High(TriggersTable) do - begin - // Òðèããåð äâåðè/ëèôòà - if (TriggersTable[b].texPan <> nil) then e_LogWritefln('trigger #%s: textPan=%s; panidx=%s', [b, TriggersTable[b].texPanIdx, mapReader.panelIndex[TriggersTable[b].texPan]]); - if (TriggersTable[b].liftPan <> nil) then e_LogWritefln('trigger #%s: liftPan=%s; panidx=%s', [b, TriggersTable[b].LiftPanelIdx, mapReader.panelIndex[TriggersTable[b].liftPan]]); - if (TriggersTable[b].doorPan <> nil) then e_LogWritefln('trigger #%s: doorPan=%s; panidx=%s', [b, TriggersTable[b].DoorPanelIdx, mapReader.panelIndex[TriggersTable[b].doorPan]]); - if (TriggersTable[b].shotPan <> nil) then e_LogWritefln('trigger #%s: shotPan=%s; panidx=%s', [b, TriggersTable[b].ShotPanelIdx, mapReader.panelIndex[TriggersTable[b].shotPan]]); - end; + if (TriggersTable[b].texPan <> nil) then TriggersTable[b].texPanIdx := TriggersTable[b].texPan.gamePanelId; + if (TriggersTable[b].liftPan <> nil) then TriggersTable[b].LiftPanelIdx := TriggersTable[b].liftPan.gamePanelId; + if (TriggersTable[b].doorPan <> nil) then TriggersTable[b].DoorPanelIdx := TriggersTable[b].doorPan.gamePanelId; + if (TriggersTable[b].shotPan <> nil) then TriggersTable[b].ShotPanelIdx := TriggersTable[b].shotPan.gamePanelId; end; - *) // create map grid, init other grids (for monsters, for example) e_WriteLog('Creating map grid', MSG_NOTIFY); @@ -1925,42 +1878,13 @@ begin Inc(trignum); if (TriggersTable[trignum].texPan <> nil) then b := TriggersTable[trignum].texPan.PanelType else b := 0; if (TriggersTable[trignum].shotPan <> nil) then c := TriggersTable[trignum].shotPan.PanelType else c := 0; - (* - if (rec.TexturePanel <> -1) then - begin - { - if (TriggersTable[trignum].TexturePanel < 0) or (TriggersTable[trignum].TexturePanel >= panels.count) then - begin - e_WriteLog('error loading map: invalid panel index for trigger', MSG_FATALERROR); - result := false; - exit; - end; - } - //b := panels[TriggersTable[a].TexturePanel].PanelType; - //b := mapReader.panel[TriggersTable[trignum].texPanIdx].PanelType; - assert(TriggersTable[trignum].texPanIdx >= 0); - b := TriggersTable[trignum].texPanIdx; - end - else - begin - b := 0; - end; - e_LogWritefln('trigger #%s: type=%s; texPanIdx=%s; b=%s', [trignum, rec.TriggerType, TriggersTable[trignum].texPanIdx, b]); - if (rec.TriggerType = TRIGGER_SHOT) then e_LogWritefln(' SHOT: shotpanidx=%s', [rec.trigRec.trigShotPanelID]); - if (rec.TriggerType = TRIGGER_SHOT) and {(rec.trigRec.trigShotPanelID <> -1)} (TriggersTable[trignum].shotPan <> nil) then - begin - //c := panels[TriggersTable[a].ShotPanel].PanelType; - //c := mapReader.panel[TriggersTable[trignum].ShotPanel].PanelType; - assert(TriggersTable[trignum].ShotPanelIdx >= 0); - c := TriggersTable[trignum].ShotPanelIdx; - end - else - begin - c := 0; - end; - *) + // we can have only one of those + if (TriggersTable[trignum].LiftPanelIdx <> -1) then tgpid := TriggersTable[trignum].LiftPanelIdx + else if (TriggersTable[trignum].DoorPanelIdx <> -1) then tgpid := TriggersTable[trignum].DoorPanelIdx + else if (TriggersTable[trignum].ShotPanelIdx <> -1) then tgpid := TriggersTable[trignum].ShotPanelIdx + else tgpid := -1; //e_LogWritefln('creating trigger #%s; texpantype=%s; shotpantype=%s (%d,%d)', [trignum, b, c, TriggersTable[trignum].texPanIdx, TriggersTable[trignum].ShotPanelIdx]); - CreateTrigger(rec, TriggersTable[trignum].texPanIdx, TriggersTable[trignum].ShotPanelIdx, Word(b), Word(c)); + CreateTrigger(trignum, rec, TriggersTable[trignum].texPanIdx, tgpid, Word(b), Word(c)); end; end; @@ -2002,8 +1926,7 @@ begin for rec in monsters do CreateMonster(rec); end; - //MapReader.Free(); - gCurrentMap := mapReader; + gCurrentMap := mapReader; // this will be our current map now mapReader := nil; // Çàãðóçêà íåáà @@ -2063,7 +1986,7 @@ begin if not gLoadGameMode then g_GFX_Init(); // Ñáðîñ ëîêàëüíûõ ìàññèâîâ: - _textures := nil; + mapTextureList := nil; panels := nil; items := nil; areas := nil; @@ -2084,20 +2007,17 @@ begin finally sfsGCEnable(); // enable releasing unused volumes mapReader.Free(); - hashTextPan.Free(); - hashLiftPan.Free(); - hashDoorPan.Free(); - hashShotPan.Free(); end; e_WriteLog('Done loading map.', MSG_NOTIFY); Result := True; end; + function g_Map_GetMapInfo(Res: String): TMapInfo; var WAD: TWADFile; - MapReader: TDynRecord; + mapReader: TDynRecord; //Header: TMapHeaderRec_1; FileName: String; Data: Pointer;