X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=101c3c544d06658454afb94777d730c333832545;hb=0944e70467355a7771d42015b6e548050e6fa3b7;hp=4b197e3ec74bf4e2ddbec3750e4624798ab307ab;hpb=15ef0fb2d44e381afb8d0ea07cdb31fd3903ba7b;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index 4b197e3..101c3c5 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -373,7 +373,7 @@ begin 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]) + if (pr <> nil) then e_LogWritefln('ERROR at (%s,%s): %s', [pr.tokLine, pr.tokCol, e.message]) else e_LogWritefln('ERROR: %s', [e.message]); pr.Free(); // will free `wst` result := nil; @@ -1293,10 +1293,11 @@ begin end; end; -procedure CreateTrigger (amapIdx: Integer; Trigger: TDynRecord; atpanid, atrigpanid: Integer; fTexturePanel1Type, fTexturePanel2Type: Word); +function CreateTrigger (amapIdx: Integer; Trigger: TDynRecord; atpanid, atrigpanid: Integer; fTexturePanel1Type, fTexturePanel2Type: Word): Integer; var _trigger: TTrigger; begin + result := -1; if g_Game_IsClient and not (Trigger.TriggerType in [TRIGGER_SOUND, TRIGGER_MUSIC]) then Exit; with _trigger do @@ -1332,7 +1333,7 @@ begin end; end; - g_Triggers_Create(_trigger); + result := Integer(g_Triggers_Create(_trigger)); end; procedure CreateMonster(monster: TDynRecord); @@ -1577,6 +1578,8 @@ type PTRec = ^TTRec; TTRec = record //TexturePanel: Integer; + tnum: Integer; + id: Integer; texPanIdx: Integer; LiftPanelIdx: Integer; DoorPanelIdx: Integer; @@ -1613,6 +1616,7 @@ var stt: UInt64; moveSpeed{, moveStart, moveEnd}: TDFPoint; //moveActive: Boolean; + pan: TPanel; begin mapGrid.Free(); mapGrid := nil; @@ -1677,6 +1681,12 @@ begin FreeMem(Data); + if (mapReader = nil) then + begin + e_LogWritefln('invalid map file: ''%s''', [mapResName]); + exit; + end; + generateExternalResourcesList(mapReader); mapTextureList := mapReader['texture']; // get all other lists here too @@ -2051,7 +2061,21 @@ begin else if (TriggersTable[trignum].MPlatPanelIdx <> -1) then tgpid := TriggersTable[trignum].MPlatPanelIdx else tgpid := -1; //e_LogWritefln('creating trigger #%s; texpantype=%s; shotpantype=%s (%d,%d)', [trignum, b, c, TriggersTable[trignum].texPanIdx, TriggersTable[trignum].ShotPanelIdx]); - CreateTrigger(trignum, rec, TriggersTable[trignum].texPanIdx, tgpid, Word(b), Word(c)); + TriggersTable[trignum].tnum := trignum; + TriggersTable[trignum].id := CreateTrigger(trignum, rec, TriggersTable[trignum].texPanIdx, tgpid, Word(b), Word(c)); + end; + end; + + //FIXME: use hashtable! + for pan in panByGUID do + begin + if (pan.endPosTrigId >= 0) and (pan.endPosTrigId < Length(TriggersTable)) then + begin + pan.endPosTrigId := TriggersTable[pan.endPosTrigId].id; + end; + if (pan.endSizeTrigId >= 0) and (pan.endSizeTrigId < Length(TriggersTable)) then + begin + pan.endSizeTrigId := TriggersTable[pan.endSizeTrigId].id; end; end; @@ -2224,6 +2248,8 @@ begin FreeMem(Data); + if (mapReader = nil) then exit; + if (mapReader.Width > 0) and (mapReader.Height > 0) then begin Result.Name := mapReader.MapName; @@ -2487,7 +2513,7 @@ begin if j > High(gPlayers) then j := 0; if gPlayers[j] <> nil then begin - if gPlayers[j].Live and g_Obj_Collide(@Obj, @gPlayers[j].Obj) then + if gPlayers[j].alive and g_Obj_Collide(@Obj, @gPlayers[j].Obj) then begin if gPlayers[j].GetFlag(a) then Break; end;