From: Ketmar Dark Date: Mon, 21 Aug 2017 05:12:48 +0000 (+0300) Subject: cosmetix X-Git-Url: http://deadsoftware.ru/gitweb?a=commitdiff_plain;h=ae5dd5cd82a0c9548c27d2e646de1492e66d98df;p=d2df-sdl.git cosmetix --- diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index f5f69a9..55a0210 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -183,8 +183,6 @@ function g_Monsters_GetKilledBy (MonsterType: Byte): String; type TEachMonsterCB = function (monidx: Integer; mon: TMonster): Boolean is nested; // return `true` to stop -function g_Mons_ForEach (cb: TEachMonsterCB): Boolean; - // throws on invalid uid function g_Mons_ByIdx (uid: Integer): TMonster; inline; @@ -193,8 +191,11 @@ function g_Mons_ByIdx_NC (uid: Integer): TMonster; inline; function g_Mons_IsAnyAliveAt (x, y: Integer; width, height: Integer): Boolean; +function g_Mons_ForEach (cb: TEachMonsterCB): Boolean; +function g_Mons_ForEachAlive (cb: TEachMonsterCB): Boolean; + function g_Mons_ForEachAt (x, y: Integer; width, height: Integer; cb: TEachMonsterCB): Boolean; -function g_Mons_ForEachAtAlive (x, y: Integer; width, height: Integer; cb: TEachMonsterCB): Boolean; +function g_Mons_ForEachAliveAt (x, y: Integer; width, height: Integer; cb: TEachMonsterCB): Boolean; function g_Mons_getNewTrapFrameId (): DWord; @@ -2866,7 +2867,7 @@ _end: mon.SetState(STATE_GO); mon.FNoRespawn := True; Inc(gTotalMonsters); - if g_Game_IsNet then MH_SEND_MonsterSpawn(gMonsters[sx].UID); + if g_Game_IsNet then MH_SEND_MonsterSpawn(mon.UID); end; mon := g_Monsters_Create(MONSTER_SOUL, FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), @@ -2876,7 +2877,7 @@ _end: mon.SetState(STATE_GO); mon.FNoRespawn := True; Inc(gTotalMonsters); - if g_Game_IsNet then MH_SEND_MonsterSpawn(gMonsters[sx].UID); + if g_Game_IsNet then MH_SEND_MonsterSpawn(mon.UID); end; mon := g_Monsters_Create(MONSTER_SOUL, FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-15, @@ -2886,9 +2887,10 @@ _end: mon.SetState(STATE_GO); mon.FNoRespawn := True; Inc(gTotalMonsters); - if g_Game_IsNet then MH_SEND_MonsterSpawn(gMonsters[sx].UID); + if g_Game_IsNet then MH_SEND_MonsterSpawn(mon.UID); end; - if g_Game_IsNet then MH_SEND_CoopStats(gMonsters[sx].UID); + + if g_Game_IsNet then MH_SEND_CoopStats(); end; // Ó ýòèõ ìîíñòðîâ íåò òðóïîâ: @@ -3061,7 +3063,7 @@ _end: mon.shoot(@o, True); Inc(gTotalMonsters); - if g_Game_IsNet then MH_SEND_MonsterSpawn(gMonsters[sx].UID); + if g_Game_IsNet then MH_SEND_MonsterSpawn(mon.UID); end; end; end; @@ -4417,15 +4419,33 @@ end; // ////////////////////////////////////////////////////////////////////////// // +// throws on invalid uid +function g_Mons_ByIdx (uid: Integer): TMonster; inline; +begin + result := g_Mons_ByIdx_NC(uid); + if (result = nil) then raise Exception.Create('g_Mons_ByIdx: invalid monster id'); +end; + + +// can return null +function g_Mons_ByIdx_NC (uid: Integer): TMonster; inline; +begin + if (uid < 0) or (uid > High(gMonsters)) then begin result := nil; exit; end; + result := gMonsters[uid]; +end; + + function g_Mons_ForEach (cb: TEachMonsterCB): Boolean; var idx: Integer; + mon: TMonster; begin result := false; if (gMonsters = nil) or not assigned(cb) then exit; for idx := 0 to High(gMonsters) do begin - if (gMonsters[idx] <> nil) then + mon := gMonsters[idx]; + if (mon <> nil) then begin result := cb(idx, gMonsters[idx]); if result then exit; @@ -4434,19 +4454,22 @@ begin end; -// throws on invalid uid -function g_Mons_ByIdx (uid: Integer): TMonster; inline; -begin - result := g_Mons_ByIdx_NC(uid); - if (result = nil) then raise Exception.Create('g_Mons_ByIdx: invalid monster id'); -end; - - -// can return null -function g_Mons_ByIdx_NC (uid: Integer): TMonster; inline; +function g_Mons_ForEachAlive (cb: TEachMonsterCB): Boolean; +var + idx: Integer; + mon: TMonster; begin - if (uid < 0) or (uid > High(gMonsters)) then begin result := nil; exit; end; - result := gMonsters[uid]; + result := false; + if (gMonsters = nil) or not assigned(cb) then exit; + for idx := 0 to High(gMonsters) do + begin + mon := gMonsters[idx]; + if (mon <> nil) and mon.Live then + begin + result := cb(idx, gMonsters[idx]); + if result then exit; + end; + end; end; @@ -4459,10 +4482,10 @@ function g_Mons_IsAnyAliveAt (x, y: Integer; width, height: Integer): Boolean; var idx: Integer; + mon: TMonster; begin result := false; if (width < 1) or (height < 1) then exit; - if gmon_debug_use_sqaccel then begin result := (monsTree.aabbQuery(x, y, width, height, monsCollCheck) <> nil); @@ -4471,9 +4494,10 @@ begin begin for idx := 0 to High(gMonsters) do begin - if (gMonsters[idx] <> nil) and gMonsters[idx].Live then + mon := gMonsters[idx]; + if (mon <> nil) and mon.Live then begin - if g_Obj_Collide(x, y, width, height, @gMonsters[idx].Obj) then + if g_Obj_Collide(x, y, width, height, @mon.Obj) then begin result := true; exit; @@ -4494,10 +4518,10 @@ function g_Mons_ForEachAt (x, y: Integer; width, height: Integer; cb: TEachMonst var idx: Integer; + mon: TMonster; begin result := false; if (width < 1) or (height < 1) then exit; - if gmon_debug_use_sqaccel then begin result := (monsTree.aabbQuery(x, y, width, height, monsCollCheck) <> nil); @@ -4506,11 +4530,12 @@ begin begin for idx := 0 to High(gMonsters) do begin - if (gMonsters[idx] <> nil) and gMonsters[idx].Live then + mon := gMonsters[idx]; + if (mon <> nil) and mon.Live then begin - if g_Obj_Collide(x, y, width, height, @gMonsters[idx].Obj) then + if g_Obj_Collide(x, y, width, height, @mon.Obj) then begin - result := cb(idx, gMonsters[idx]); + result := cb(idx, mon); if result then exit; end; end; @@ -4519,7 +4544,7 @@ begin end; -function g_Mons_ForEachAtAlive (x, y: Integer; width, height: Integer; cb: TEachMonsterCB): Boolean; +function g_Mons_ForEachAliveAt (x, y: Integer; width, height: Integer; cb: TEachMonsterCB): Boolean; function monsCollCheck (mon: TMonster; atag: Integer): Boolean; begin @@ -4529,10 +4554,10 @@ function g_Mons_ForEachAtAlive (x, y: Integer; width, height: Integer; cb: TEach var idx: Integer; + mon: TMonster; begin result := false; if (width < 1) or (height < 1) then exit; - if gmon_debug_use_sqaccel then begin if (width = 1) and (height = 1) then @@ -4548,11 +4573,12 @@ begin begin for idx := 0 to High(gMonsters) do begin - if (gMonsters[idx] <> nil) and gMonsters[idx].Live then + mon := gMonsters[idx]; + if (mon <> nil) and mon.Live then begin - if g_Obj_Collide(x, y, width, height, @gMonsters[idx].Obj) then + if g_Obj_Collide(x, y, width, height, @mon.Obj) then begin - result := cb(idx, gMonsters[idx]); + result := cb(idx, mon); if result then exit; end; end; diff --git a/src/game/g_triggers.pas b/src/game/g_triggers.pas index 8fb4590..999db6b 100644 --- a/src/game/g_triggers.pas +++ b/src/game/g_triggers.pas @@ -214,10 +214,7 @@ var function monsDamage (monidx: Integer; mon: TMonster): Boolean; begin result := false; // don't stop - if (mon <> nil) and mon.Live and g_Obj_Collide(wx, wy, ww, wh, @mon.Obj) then - begin - mon.Damage(TRAP_DAMAGE, 0, 0, 0, HIT_TRAP); - end; + if g_Obj_Collide(wx, wy, ww, wh, @mon.Obj) then mon.Damage(TRAP_DAMAGE, 0, 0, 0, HIT_TRAP); end; begin @@ -248,7 +245,8 @@ begin gPlayers[a].Collide(X, Y, Width, Height) then gPlayers[a].Damage(TRAP_DAMAGE, 0, 0, 0, HIT_TRAP); - g_Mons_ForEach(monsDamage); + //g_Mons_ForEach(monsDamage); + g_Mons_ForEachAliveAt(wx, wy, ww, wh, monsDamage); if not Enabled then g_Map_EnableWall(PanelID); end; @@ -304,7 +302,8 @@ begin gPlayers[a].Collide(X, Y, Width, Height) then gPlayers[a].Damage(TRAP_DAMAGE, 0, 0, 0, HIT_TRAP); - g_Mons_ForEach(monsDamage); + //g_Mons_ForEach(monsDamage); + g_Mons_ForEachAliveAt(wx, wy, ww, wh, monsDamage); (* if gMonsters <> nil then for a := 0 to High(gMonsters) do @@ -989,7 +988,7 @@ var function monsShotTarget (monidx: Integer; mon: TMonster): Boolean; begin result := false; // don't stop - if (mon <> nil) and mon.Live and tr_ShotAimCheck(Trigger, @(mon.Obj)) then + if mon.Live and tr_ShotAimCheck(Trigger, @(mon.Obj)) then begin xd := mon.GameX + mon.Obj.Rect.Width div 2; yd := mon.GameY + mon.Obj.Rect.Height div 2; @@ -1001,7 +1000,7 @@ var function monsShotTargetMonPlr (monidx: Integer; mon: TMonster): Boolean; begin result := false; // don't stop - if (mon <> nil) and mon.Live and tr_ShotAimCheck(Trigger, @(mon.Obj)) then + if mon.Live and tr_ShotAimCheck(Trigger, @(mon.Obj)) then begin xd := mon.GameX + mon.Obj.Rect.Width div 2; yd := mon.GameY + mon.Obj.Rect.Height div 2; @@ -1013,7 +1012,7 @@ var function monShotTargetPlrMon (monidx: Integer; mon: TMonster): Boolean; begin result := false; // don't stop - if (mon <> nil) and mon.Live and tr_ShotAimCheck(Trigger, @(mon.Obj)) then + if mon.Live and tr_ShotAimCheck(Trigger, @(mon.Obj)) then begin xd := mon.GameX + mon.Obj.Rect.Width div 2; yd := mon.GameY + mon.Obj.Rect.Height div 2; @@ -1930,7 +1929,8 @@ begin case Data.ShotTarget of TRIGGER_SHOT_TARGET_MON: // monsters - g_Mons_ForEach(monsShotTarget); + //TODO: accelerate this! + g_Mons_ForEachAlive(monsShotTarget); TRIGGER_SHOT_TARGET_PLR: // players if gPlayers <> nil then @@ -1972,7 +1972,8 @@ begin TRIGGER_SHOT_TARGET_MONPLR: // monsters then players begin - g_Mons_ForEach(monsShotTargetMonPlr); + //TODO: accelerate this! + g_Mons_ForEachAlive(monsShotTargetMonPlr); if (TargetUID = 0) and (gPlayers <> nil) then for idx := Low(gPlayers) to High(gPlayers) do @@ -1998,7 +1999,11 @@ begin TargetUID := gPlayers[idx].UID; break; end; - if TargetUID = 0 then g_Mons_ForEach(monShotTargetPlrMon); + if TargetUID = 0 then + begin + //TODO: accelerate this! + g_Mons_ForEachAlive(monShotTargetPlrMon); + end; end; else begin @@ -2448,6 +2453,7 @@ begin (TimeOut = 0) and (Keys = 0) then // Åñëè íå íóæíû êëþ÷è begin //g_Mons_ForEach(monsNear); + //Alive?! g_Mons_ForEachAt(gTriggers[a].X, gTriggers[a].Y, gTriggers[a].Width, gTriggers[a].Height, monsNear); end; diff --git a/src/game/g_weapons.pas b/src/game/g_weapons.pas index 9fde2f5..148f87c 100644 --- a/src/game/g_weapons.pas +++ b/src/game/g_weapons.pas @@ -324,7 +324,7 @@ begin end; //g_Mons_ForEach(monsWaterCheck); - g_Mons_ForEachAtAlive(pan.X, pan.Y, pan.Width, pan.Height, monsWaterCheck); + g_Mons_ForEachAliveAt(pan.X, pan.Y, pan.Width, pan.Height, monsWaterCheck); end; for f := 0 to plaCount-1 do gPlayers[chkTrap_pl[f]].Damage(dm, Shots[ID].SpawnerUID, 0, 0, t); @@ -462,7 +462,7 @@ begin if Result <> 0 then Exit; //if g_Mons_ForEach(monsCheck) then result := 2; - if g_Mons_ForEachAtAlive(X, Y, 1, 1, monsCheck) then result := 2; + if g_Mons_ForEachAliveAt(X, Y, 1, 1, monsCheck) then result := 2; end; procedure g_Weapon_BFG9000(X, Y: Integer; SpawnerUID: Word); @@ -831,7 +831,7 @@ var function MonsterHit(): Boolean; begin //result := g_Mons_ForEach(monsCheckHit); - result := g_Mons_ForEachAtAlive(obj.X+obj.Rect.X, obj.Y+obj.Rect.Y, obj.Rect.Width, obj.Rect.Height, monsCheckHit); + result := g_Mons_ForEachAliveAt(obj.X+obj.Rect.X, obj.Y+obj.Rect.Y, obj.Rect.Width, obj.Rect.Height, monsCheckHit); end; begin