X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_monsters.pas;h=e7ee1d0eb784275870b6aa872acb8158049d3256;hb=6820eae460a9c99136ab5e679ffe2f6236c3540f;hp=02bea1f632bb906c89b5b56a220b757ec2d1b484;hpb=5c84a2c9f706bc450a00bda4f7d2afc858ce75b0;p=d2df-sdl.git diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index 02bea1f..e7ee1d0 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -2,8 +2,7 @@ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * the Free Software Foundation, version 3 of the License ONLY. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -1994,6 +1993,9 @@ var begin Result := False; +// Ìîíñòð ñòàòè÷åí ïîêà èäåò warmup + if (gLMSRespawn = LMS_RESPAWN_WARMUP) then exit; + // Óìèðàåò, óìåð èëè âîñêðåøàåòñÿ => óðîí äåëàòü íåêîìó: if (FState = MONSTATE_DEAD) or (FState = MONSTATE_DIE) or (FState = MONSTATE_REVIVE) then Exit; @@ -2008,6 +2010,15 @@ begin Exit; end; +// Àð÷è íå ãîðÿò, ÷åðåïà óæå ãîðÿò + if (t = HIT_FLAME) and (FMonsterType in [MONSTER_VILE, MONSTER_SOUL]) then + begin + // Ïðîñíóòüñÿ âñå-òàêè ñòîèò + if FState = MONSTATE_SLEEP then + SetState(MONSTATE_GO); + Exit; + end; + // Ëîâóøêà óáèâàåò ñðàçó: if t = HIT_TRAP then FHealth := -100; @@ -2435,11 +2446,16 @@ var o, co: TObj; fall: Boolean; mon: TMonster; + mit: PMonster; + it: TMonsterGrid.Iter; label _end; begin fall := True; +// Ìîíñòð ñòàòè÷åí ïîêà èäåò warmup + if (gLMSRespawn = LMS_RESPAWN_WARMUP) then exit; + // Ðûáû "ëåòàþò" òîëüêî â âîäå: if FMonsterType = MONSTER_FISH then if g_Obj_CollidePanel(@FObj, 0, 0, PANEL_WATER or PANEL_ACID1 or PANEL_ACID2) then @@ -2473,11 +2489,12 @@ begin // Åñëè ãîðèì - ïîäæèãàåì äðóãèõ ìîíñòðîâ, íî íå íà 100 òèêîâ êàæäûé ðàç: if FFireTime > 0 then - for a := 0 to High(gMonsters) do - if (gMonsters[a] <> nil) and (gMonsters[a].alive) and - (gMonsters[a].FUID <> FUID) and - g_Obj_Collide(@FObj, @gMonsters[a].Obj) then - gMonsters[a].CatchFire(FFireAttacker, FFireTime); + begin + it := monsGrid.forEachInAABB(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y, FObj.Rect.Width, FObj.Rect.Height); + for mit in it do + if mit.UID <> FUID then + mit.CatchFire(FFireAttacker, FFireTime); + end; // Âûëåòåë çà êàðòó - óäàëÿåì è çàïóñêàåì òðèããåðû: if WordBool(st and MOVE_FALLOUT) or (FObj.X < -1000) or @@ -3428,6 +3445,10 @@ begin sx := 0; // SHUT UP COMPILER sy := 0; fall := True; + +// Ìîíñòð ñòàòè÷åí ïîêà èäåò warmup + if (gLMSRespawn = LMS_RESPAWN_WARMUP) then exit; + // Ðûáû "ëåòàþò" òîëüêî â âîäå: if FMonsterType = MONSTER_FISH then if g_Obj_CollidePanel(@FObj, 0, 0, PANEL_WATER or PANEL_ACID1 or PANEL_ACID2) then @@ -4648,7 +4669,11 @@ end; procedure TMonster.CatchFire(Attacker: Word; Timeout: Integer = MON_BURN_TIME); begin + if FMonsterType in [MONSTER_SOUL, MONSTER_VILE] then + exit; // àð÷è íå ãîðÿò, ÷åðåïà óæå ãîðÿò if Timeout <= 0 then exit; + if g_Obj_CollidePanel(@FObj, 0, 0, PANEL_WATER or PANEL_ACID1 or PANEL_ACID2) then + exit; // íå ïîäãîðàåì â âîäå íà âñÿêèé ñëó÷àé if FFireTime <= 0 then g_Sound_PlayExAt('SOUND_IGNITE', FObj.X, FObj.Y); FFireTime := Timeout;