X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fgame%2Fg_monsters.pas;h=83714cbdd0ec333d5f9a581bfd35c78aae655fd5;hb=5eaf38a53865288793931062dedeedc497075144;hp=4cba5acb10b21bd2487e25d577e7a4611455449a;hpb=4eec31fb4339e1eedd7380506e344a69af9976f5;p=d2df-sdl.git diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index 4cba5ac..83714cb 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -322,8 +322,8 @@ uses procedure g_Mons_ProfilersBegin (); begin if (profMonsLOS = nil) then profMonsLOS := TProfiler.Create('LOS CALC', g_profile_history_size); - profMonsLOS.mainBegin(g_profile_los); - if g_profile_los then + if (profMonsLOS <> nil) then profMonsLOS.mainBegin(g_profile_los); + if g_profile_los and (profMonsLOS <> nil) then begin profMonsLOS.sectionBegin('loscalc'); profMonsLOS.sectionEnd(); @@ -332,17 +332,17 @@ end; procedure g_Mons_ProfilersEnd (); begin - if (profMonsLOS <> nil) and (g_profile_los) then profMapCollision.mainEnd(); + if (profMonsLOS <> nil) and (g_profile_los) then profMonsLOS.mainEnd(); end; procedure g_Mons_LOS_Start (); inline; begin - profMonsLOS.sectionBeginAccum('loscalc'); + if (profMonsLOS <> nil) then profMonsLOS.sectionBeginAccum('loscalc'); end; procedure g_Mons_LOS_End (); inline; begin - profMonsLOS.sectionEnd(); + if (profMonsLOS <> nil) then profMonsLOS.sectionEnd(); end; @@ -2469,6 +2469,14 @@ begin st := g_Obj_Move(@FObj, fall, True, True); positionChanged(); // this updates spatial accelerators +// Åñëè ãîðèì - ïîäæèãàåì äðóãèõ ìîíñòðîâ: + 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); + // Âûëåòåë çà êàðòó - óäàëÿåì è çàïóñêàåì òðèããåðû: if WordBool(st and MOVE_FALLOUT) or (FObj.X < -1000) or (FObj.X > gMapInfo.Width+1000) or (FObj.Y < -1000) then @@ -2825,7 +2833,7 @@ begin // Ðûáà ïëûâåò ââåðõ: if FObj.Vel.Y < 0 then - if not g_Obj_CollideWater(@FObj, 0, -16) then + if not g_Obj_CollideLiquid(@FObj, 0, -16) then begin // Âñïëûëè äî ïîâåðõíîñòè - ñòîï: FObj.Vel.Y := 0; @@ -3243,6 +3251,19 @@ _end: wx := FObj.X + wx; wy := FObj.Y + MONSTER_ANIMTABLE[FMonsterType].wY; + // Ìîíñòð íå ìîæåò öåëèòüñÿ â îáúåêò çà ñïèíîé, ñòðåëÿÿ âëåâî: + if (FDirection = TDirection.D_LEFT) and (tx > wx) then + begin + tx := wx - 32; + ty := wy + Random(11) - 5; + end; + // È àíàëîãè÷íî, ñòðåëÿÿ âïðàâî: + if (FDirection = TDirection.D_RIGHT) and (tx < wx) then + begin + tx := wx + 32; + ty := wy + Random(11) - 5; + end; + // Äåëàåì âûñòðåë íóæíûì îðóæèåì: case FMonsterType of MONSTER_IMP: @@ -3661,7 +3682,7 @@ begin // Ðûáà ïëûâåò ââåðõ: if FObj.Vel.Y < 0 then - if not g_Obj_CollideWater(@FObj, 0, -16) then + if not g_Obj_CollideLiquid(@FObj, 0, -16) then begin // Âñïëûëè äî ïîâåðõíîñòè - ñòîï: FObj.Vel.Y := 0; @@ -4625,6 +4646,8 @@ end; procedure TMonster.CatchFire(Attacker: Word); begin + if FFireTime <= 0 then + g_Sound_PlayExAt('SOUND_IGNITE', FObj.X, FObj.Y); FFireTime := 100; FFireAttacker := Attacker; if g_Game_IsNet and g_Game_IsServer then MH_SEND_MonsterState(FUID);