X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_monsters.pas;h=5fb769dbdab703eb9daff973c5877a6ea556025b;hb=3cde28288f16b317ae049cc692aa95536f297d2d;hp=25b2555a492cefb4edcef2ca6172b4fca87cce91;hpb=082b546b38711030b4490facbefa37a331cb1a37;p=d2df-sdl.git diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index 25b2555..5fb769d 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -19,7 +19,7 @@ unit g_monsters; interface uses - g_basic, e_graphics, g_phys, g_textures, + g_basic, e_graphics, g_phys, g_textures, g_grid, g_saveload, BinEditor, g_panel, xprofiler; const @@ -79,9 +79,8 @@ type FFirePainTime: Integer; FFireAttacker: Word; vilefire: TAnimation; - - proxyId: Integer; // node in dyntree or -1 - arrIdx: Integer; // in gMonsters + mProxyId: Integer; // node in dyntree or -1 + mArrIdx: Integer; // in gMonsters FDieTriggers: Array of Integer; FSpawnTrigger: Integer; @@ -161,6 +160,9 @@ type property GameDirection: TDirection read FDirection write FDirection; property StartID: Integer read FStartID; + + property proxyId: Integer read mProxyId; + property arrIdx: Integer read mArrIdx; end; @@ -194,6 +196,8 @@ function g_Mons_ByIdx (uid: Integer): TMonster; inline; // can return null function g_Mons_ByIdx_NC (uid: Integer): TMonster; inline; +function g_Mons_TotalCount (): Integer; inline; + function g_Mons_IsAnyAliveAt (x, y: Integer; width, height: Integer): Boolean; function g_Mons_ForEach (cb: TEachMonsterCB): Boolean; @@ -206,9 +210,9 @@ function g_Mons_getNewTrapFrameId (): DWord; type - TMonsAlongLineCB = function (mon: TMonster; distSq: Integer): Boolean is nested; + TMonsAlongLineCB = function (mon: TMonster; tag: Integer): Boolean is nested; -function g_Mons_alongLine (x0, y0, x1, y1: Integer; cb: TMonsAlongLineCB): TMonster; +function g_Mons_AlongLine (x0, y0, x1, y1: Integer; cb: TMonsAlongLineCB; log: Boolean=false): TMonster; var @@ -226,13 +230,25 @@ var profMonsLOS: TProfiler = nil; //WARNING: FOR DEBUGGING ONLY! +type + TMonsterGrid = specialize TBodyGridBase; + +var + monsGrid: TMonsterGrid = nil; + + +var + gmon_debug_think: Boolean = true; + gmon_debug_one_think_step: Boolean = false; + + implementation uses e_log, g_main, g_sound, g_gfx, g_player, g_game, g_weapons, g_triggers, MAPDEF, g_items, g_options, g_console, g_map, Math, SysUtils, g_menu, wadreader, - g_language, g_netmsg, g_grid; + g_language, g_netmsg; // ////////////////////////////////////////////////////////////////////////// // @@ -278,44 +294,10 @@ end; // ////////////////////////////////////////////////////////////////////////// // -type - TMonsterGrid = specialize TBodyGridBase; - -var - monsGrid: TMonsterGrid = nil; - - -function g_Mons_alongLine (x0, y0, x1, y1: Integer; cb: TMonsAlongLineCB): TMonster; -//!!!FIXME!!! -{ - function sqchecker (mon: TMonster; var ray: Ray2D): Single; - var - aabb: AABB2D; - tmin: Single; - begin - result := -666.0; // invalid - aabb := mon.mapAABB; - if not aabb.valid then exit; - if aabb.intersects(ray, @tmin) then - begin - if (tmin <= 0.0) then tmin := 0.0; - result := tmin; - if cb(mon, tmin) then result := 0.0; // instant stop - end; - end; - -var - qr: TDynAABBTreeMons.TSegmentQueryResult; -} +function g_Mons_AlongLine (x0, y0, x1, y1: Integer; cb: TMonsAlongLineCB; log: Boolean=false): TMonster; begin - result := nil; -{ - if not assigned(cb) then exit; - if monsTree.segmentQuery(qr, x0, y0, x1, y1, sqchecker) then - begin - if (qr.flesh <> nil) then result := qr.flesh; - end; -} + if not assigned(cb) then begin result := nil; exit; end; + result := monsGrid.forEachAlongLine(x0, y0, x1, y1, cb, -1, log); end; @@ -325,32 +307,32 @@ var x, y: Integer; begin {$IF DEFINED(D2F_DEBUG_MONS_MOVE)} - //e_WriteLog(Format('monster #%d(%u): pos=(%d,%d); rpos=(%d,%d)', [arrIdx, UID, FObj.X, FObj.Y, FObj.Rect.X, FObj.Rect.Y]), MSG_NOTIFY); + //e_WriteLog(Format('monster #%d(%u): pos=(%d,%d); rpos=(%d,%d)', [mArrIdx, UID, FObj.X, FObj.Y, FObj.Rect.X, FObj.Rect.Y]), MSG_NOTIFY); {$ENDIF} - if (proxyId = -1) then + if (mProxyId = -1) then begin - proxyId := monsGrid.insertBody(self, FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y, FObj.Rect.Width, FObj.Rect.Height); + mProxyId := monsGrid.insertBody(self, FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y, FObj.Rect.Width, FObj.Rect.Height); {$IF DEFINED(D2F_DEBUG_MONS_MOVE)} - monsGrid.getBodyXY(proxyId, x, y); - e_WriteLog(Format('monster #%d(%u): inserted into the grid; proxyid=%d; x=%d; y=%d', [arrIdx, UID, proxyId, x, y]), MSG_NOTIFY); + monsGrid.getBodyXY(mProxyId, x, y); + e_WriteLog(Format('monster #%d(%u): inserted into the grid; mProxyid=%d; x=%d; y=%d', [mArrIdx, UID, mProxyId, x, y]), MSG_NOTIFY); {$ENDIF} end else begin - monsGrid.getBodyXY(proxyId, x, y); + monsGrid.getBodyXY(mProxyId, x, y); if (FObj.X+FObj.Rect.X = x) and (FObj.Y+FObj.Rect.Y = y) then exit; // nothing to do - {$IF DEFINED(D2F_DEBUG_MONS_MOVE)}e_WriteLog(Format('monster #%d(%u): updating tree; proxyid=%d; x=%d; y=%d', [arrIdx, UID, proxyId, x, y]), MSG_NOTIFY);{$ENDIF} + {$IF DEFINED(D2F_DEBUG_MONS_MOVE)}e_WriteLog(Format('monster #%d(%u): updating tree; mProxyid=%d; x=%d; y=%d', [mArrIdx, UID, mProxyId, x, y]), MSG_NOTIFY);{$ENDIF} {$IF TRUE} - monsGrid.moveBody(proxyId, FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y); + monsGrid.moveBody(mProxyId, FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y); {$ELSE} - monsGrid.removeBody(proxyId); - proxyId := monsGrid.insertBody(self, FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y, FObj.Rect.Width, FObj.Rect.Height); + monsGrid.removeBody(mProxyId); + mProxyId := monsGrid.insertBody(self, FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y, FObj.Rect.Width, FObj.Rect.Height); {$ENDIF} {$IF DEFINED(D2F_DEBUG_MONS_MOVE)} - monsGrid.getBodyXY(proxyId, x, y); - e_WriteLog(Format('monster #%d(%u): updated tree; proxyid=%d; x=%d; y=%d', [arrIdx, UID, proxyId, x, y]), MSG_NOTIFY); + monsGrid.getBodyXY(mProxyId, x, y); + e_WriteLog(Format('monster #%d(%u): updated tree; mProxyid=%d; x=%d; y=%d', [mArrIdx, UID, mProxyId, x, y]), MSG_NOTIFY); {$ENDIF} end; end; @@ -366,19 +348,6 @@ const ANIM_ATTACK2 = 5; ANIM_PAIN = 6; - STATE_SLEEP = 0; - STATE_GO = 1; - STATE_RUN = 2; - STATE_CLIMB = 3; - STATE_DIE = 4; - STATE_DEAD = 5; - STATE_ATTACK = 6; - STATE_SHOOT = 7; - STATE_PAIN = 8; - STATE_WAIT = 9; - STATE_REVIVE = 10; - STATE_RUNOUT = 11; - MONSTER_SIGNATURE = $534E4F4D; // 'MONS' // Òàáëèöà òèïîâ àíèìàöèè ìîíñòðîâ: @@ -701,7 +670,7 @@ function isCorpse (o: PObj; immediately: Boolean): Integer; begin atag := atag; // shut up, fpc! result := false; // don't stop - if (mon.FState = STATE_DEAD) and g_Obj_Collide(o, @mon.FObj) then + if (mon.FState = MONSTATE_DEAD) and g_Obj_Collide(o, @mon.FObj) then begin case mon.FMonsterType of // Íå âîñêðåñèòü: MONSTER_SOUL, MONSTER_PAIN, MONSTER_CYBER, MONSTER_SPIDER, @@ -725,13 +694,13 @@ begin if gmon_debug_use_sqaccel then begin mon := monsGrid.forEachInAABB(o.X+o.Rect.X, o.Y+o.Rect.Y, o.Rect.Width, o.Rect.Height, monsCollCheck); - if (mon <> nil) then result := mon.arrIdx; + if (mon <> nil) then result := mon.mArrIdx; end else begin for a := 0 to High(gMonsters) do begin - if (gMonsters[a] <> nil) and (gMonsters[a].FState = STATE_DEAD) and g_Obj_Collide(o, @gMonsters[a].FObj) then + if (gMonsters[a] <> nil) and (gMonsters[a].FState = MONSTATE_DEAD) and g_Obj_Collide(o, @gMonsters[a].FObj) then begin case gMonsters[a].FMonsterType of // Íå âîñêðåñèòü: MONSTER_SOUL, MONSTER_PAIN, MONSTER_CYBER, MONSTER_SPIDER, @@ -1253,8 +1222,8 @@ begin mon := TMonster.Create(MonsterType, find_id, ForcedUID); gMonsters[find_id] := mon; - mon.arrIdx := find_id; - mon.proxyId := -1; + mon.mArrIdx := find_id; + mon.mProxyId := -1; uidMap[mon.FUID] := mon; @@ -1296,9 +1265,9 @@ begin if (gMonsters[a] <> nil) then with gMonsters[a] do if (FMonsterType = MONSTER_MAN) and - (FState <> STATE_DEAD) and - (FState <> STATE_SLEEP) and - (FState <> STATE_DIE) then + (FState <> MONSTATE_DEAD) and + (FState <> MONSTATE_SLEEP) and + (FState <> MONSTATE_DIE) then begin g_Sound_PlayExAt('SOUND_MONSTER_TRUP', FObj.X, FObj.Y); Exit; @@ -1320,20 +1289,24 @@ begin gMon := True; // Äëÿ ðàáîòû BlockMon'à - for a := 0 to High(gMonsters) do + if gmon_debug_think or gmon_debug_one_think_step then begin - if (gMonsters[a] = nil) then continue; - if not gMonsters[a].FRemoved then + gmon_debug_one_think_step := false; + for a := 0 to High(gMonsters) do begin - if g_Game_IsClient then - gMonsters[a].ClientUpdate() + if (gMonsters[a] = nil) then continue; + if not gMonsters[a].FRemoved then + begin + if g_Game_IsClient then + gMonsters[a].ClientUpdate() + else + gMonsters[a].Update(); + end else - gMonsters[a].Update(); - end - else - begin - gMonsters[a].Free(); - gMonsters[a] := nil; + begin + gMonsters[a].Free(); + gMonsters[a] := nil; + end; end; end; @@ -1696,7 +1669,7 @@ begin FChainFire := False; FShellTimer := -1; - FState := STATE_SLEEP; + FState := MONSTATE_SLEEP; FCurAnim := ANIM_SLEEP; positionChanged(); // this updates spatial accelerators @@ -1724,7 +1697,7 @@ begin g_Obj_Init(@FObj); - FState := STATE_SLEEP; + FState := MONSTATE_SLEEP; FCurAnim := ANIM_SLEEP; FHealth := MONSTERTABLE[MonsterType].Health; FMaxHealth := FHealth; @@ -1741,8 +1714,8 @@ begin FFirePainTime := 0; FFireAttacker := 0; - proxyId := -1; - arrIdx := -1; + mProxyId := -1; + mArrIdx := -1; trapCheckFrameId := 0; if FMonsterType in [MONSTER_ROBO, MONSTER_BARREL] then @@ -1840,7 +1813,7 @@ begin Result := False; // Óìèðàåò, óìåð èëè âîñêðåøàåòñÿ => óðîí äåëàòü íåêîìó: - if (FState = STATE_DEAD) or (FState = STATE_DIE) or (FState = STATE_REVIVE) then + if (FState = MONSTATE_DEAD) or (FState = MONSTATE_DIE) or (FState = MONSTATE_REVIVE) then Exit; // Ðûáó â âîäå áüåò òîêîì => ïàíèêà áåç óðîíà: @@ -1852,7 +1825,7 @@ begin else FDirection := D_LEFT; Result := True; - SetState(STATE_RUN); + SetState(MONSTATE_RUN); Exit; end; @@ -1873,10 +1846,10 @@ begin FPain := FPain+aDamage; // Åñëè áîëü ñóùåñòâåííàÿ, òî ìåíÿåì ñîñòîÿíèå íà áîëåâîå: - if FState <> STATE_PAIN then + if FState <> MONSTATE_PAIN then if (FPain >= MONSTERTABLE[FMonsterType].MinPain) and (FMonsterType <> MONSTER_BARREL) then - SetState(STATE_PAIN); + SetState(MONSTATE_PAIN); // Åñëè ðàçðåøåíà êðîâü - ñîçäàåì áðûçãè êðîâè: if (gBloodCount > 0) then @@ -1965,12 +1938,12 @@ begin (FMonsterType = MONSTER_MAN)) then begin g_Sound_PlayExAt('SOUND_MONSTER_SLOP', FObj.X, FObj.Y); - SetState(STATE_DIE, ANIM_MESS); + SetState(MONSTATE_DIE, ANIM_MESS); end else begin DieSound(); - SetState(STATE_DIE); + SetState(MONSTATE_DIE); end; // Àêòèâèðîâàòü òðèããåðû, æäóùèå ñìåðòè ýòîãî ìîíñòðà: @@ -1979,10 +1952,10 @@ begin FHealth := 0; end else - if FState = STATE_SLEEP then + if FState = MONSTATE_SLEEP then begin // Ñïàë, ðàçáóäèëè íåñìåðòåëüíûì óäàðîì: FPain := MONSTERTABLE[FMonsterType].Pain; - SetState(STATE_GO); + SetState(MONSTATE_GO); end; if g_Game_IsServer and g_Game_IsNet then MH_SEND_MonsterState(FUID); @@ -2017,17 +1990,20 @@ begin vilefire.Free(); - if (proxyId <> -1) then + if (mProxyId <> -1) then begin - monsGrid.removeBody(proxyId); - {$IF DEFINED(D2F_DEBUG_MONS_MOVE)} - e_WriteLog(Format('monster #%d(%u): removed from tree; proxyid=%d', [arrIdx, UID, proxyId]), MSG_NOTIFY); - {$ENDIF} - proxyId := -1; + if (monsGrid <> nil) then + begin + monsGrid.removeBody(mProxyId); + {$IF DEFINED(D2F_DEBUG_MONS_MOVE)} + e_WriteLog(Format('monster #%d(%u): removed from tree; mProxyid=%d', [mArrIdx, UID, mProxyId]), MSG_NOTIFY); + {$ENDIF} + end; + mProxyId := -1; end; - if (arrIdx <> -1) then gMonsters[arrIdx] := nil; - arrIdx := -1; + if (mArrIdx <> -1) and (mArrIdx < Length(gMonsters)) then gMonsters[mArrIdx] := nil; + mArrIdx := -1; uidMap[FUID] := nil; @@ -2045,7 +2021,7 @@ begin // Åñëè êîëäóí ñòðåëÿåò, òî ðèñóåì îãîíü: if FMonsterType = MONSTER_VILE then - if FState = STATE_SHOOT then + if FState = MONSTATE_SHOOT then if GetPos(FTargetUID, @o) then vilefire.Draw(o.X+o.Rect.X+(o.Rect.Width div 2)-32, o.Y+o.Rect.Y+o.Rect.Height-128, M_NONE); @@ -2056,7 +2032,7 @@ begin Exit; // Ýòè ìîíñòðû, óìèðàÿ, íå îñòàâëÿþò òðóïîâ: - if FState = STATE_DEAD then + if FState = MONSTATE_DEAD then case FMonsterType of MONSTER_BARREL, MONSTER_SOUL, MONSTER_PAIN: Exit; end; @@ -2144,14 +2120,14 @@ var begin // Åñëè ñîñòîÿíèå = íà÷àëè óìèðàòü, à ýòîò ìîíñòð = Lost_Soul, // òî ñîáëþäàåì îãðàíè÷åíèå êîëè÷åñòâà Lost_Soul'îâ: - if (State = STATE_DIE) and (MonsterType = MONSTER_SOUL) then + if (State = MONSTATE_DIE) and (MonsterType = MONSTER_SOUL) then soulcount := soulcount-1; // Ïðèñìåðòè - íåëüçÿ ñðàçó íà÷èíàòü àòàêîâàòü èëè áåãàòü: case FState of - STATE_DIE, STATE_DEAD, STATE_REVIVE: - if (State <> STATE_DEAD) and (State <> STATE_REVIVE) and - (State <> STATE_GO) then + MONSTATE_DIE, MONSTATE_DEAD, MONSTATE_REVIVE: + if (State <> MONSTATE_DEAD) and (State <> MONSTATE_REVIVE) and + (State <> MONSTATE_GO) then Exit; end; @@ -2162,14 +2138,14 @@ begin // Íîâàÿ àíèìàöèÿ ïðè íîâîì ñîñòîÿíèè: case FState of - STATE_SLEEP: Anim := ANIM_SLEEP; - STATE_PAIN: Anim := ANIM_PAIN; - STATE_WAIT: Anim := ANIM_SLEEP; - STATE_CLIMB, STATE_RUN, STATE_RUNOUT, STATE_GO: Anim := ANIM_GO; - STATE_SHOOT: Anim := ANIM_ATTACK; - STATE_ATTACK: Anim := ANIM_ATTACK; - STATE_DIE: Anim := ANIM_DIE; - STATE_REVIVE: + MONSTATE_SLEEP: Anim := ANIM_SLEEP; + MONSTATE_PAIN: Anim := ANIM_PAIN; + MONSTATE_WAIT: Anim := ANIM_SLEEP; + MONSTATE_CLIMB, MONSTATE_RUN, MONSTATE_RUNOUT, MONSTATE_GO: Anim := ANIM_GO; + MONSTATE_SHOOT: Anim := ANIM_ATTACK; + MONSTATE_ATTACK: Anim := ANIM_ATTACK; + MONSTATE_DIE: Anim := ANIM_DIE; + MONSTATE_REVIVE: begin // íà÷àëè âîñðåøàòüñÿ Anim := FCurAnim; FAnim[Anim, FDirection].Revert(True); @@ -2278,15 +2254,15 @@ begin // Ðûáû "ëåòàþò" òîëüêî â âîäå: if FMonsterType = MONSTER_FISH then if g_Obj_CollidePanel(@FObj, 0, 0, PANEL_WATER or PANEL_ACID1 or PANEL_ACID2) then - if (FState <> STATE_DIE) and (FState <> STATE_DEAD) then + if (FState <> MONSTATE_DIE) and (FState <> MONSTATE_DEAD) then fall := False; // Ëåòàþùèå ìîíòñðû: if ((FMonsterType = MONSTER_SOUL) or (FMonsterType = MONSTER_PAIN) or (FMonsterType = MONSTER_CACO)) and - (FState <> STATE_DIE) and - (FState <> STATE_DEAD) then + (FState <> MONSTATE_DIE) and + (FState <> MONSTATE_DEAD) then fall := False; // Ìåíÿåì ñêîðîñòü òîëüêî ïî ÷åòíûì êàäðàì: @@ -2324,7 +2300,7 @@ begin oldvelx := FObj.Vel.X; // Ñîïðîòèâëåíèå âîçäóõà äëÿ òðóïà: - if (FState = STATE_DIE) or (FState = STATE_DEAD) then + if (FState = MONSTATE_DIE) or (FState = MONSTATE_DEAD) then FObj.Vel.X := z_dec(FObj.Vel.X, 1); if FFireTime > 0 then @@ -2335,7 +2311,7 @@ begin begin OnFireFlame(1); FFireTime := FFireTime - 1; - if (FState <> STATE_DIE) and (FState <> STATE_DEAD) then + if (FState <> MONSTATE_DIE) and (FState <> MONSTATE_DEAD) then if FFirePainTime = 0 then begin Damage(5, FFireAttacker, 0, 0, HIT_FLAME); @@ -2347,15 +2323,15 @@ begin end; // Ìåðòâûé íè÷åãî íå äåëàåò: - if (FState = STATE_DEAD) then + if (FState = MONSTATE_DEAD) then goto _end; // AI ìîíñòðîâ âûêëþ÷åí: if g_debug_MonsterOff then begin FSleep := 1; - if FState <> STATE_SLEEP then - SetState(STATE_SLEEP); + if FState <> MONSTATE_SLEEP then + SetState(MONSTATE_SLEEP); end; // Âîçìîæíî, ñîçäàåì ïóçûðüêè â âîäå: @@ -2381,7 +2357,7 @@ begin // Åñëè ïðîøåë ïåðâûé êàäð àíèìàöèè âçðûâà áî÷êè, òî âçðûâ: if FMonsterType = MONSTER_BARREL then begin - if (FState = STATE_DIE) and (FAnim[FCurAnim, FDirection].CurrentFrame = 1) and + if (FState = MONSTATE_DIE) and (FAnim[FCurAnim, FDirection].CurrentFrame = 1) and (FAnim[FCurAnim, FDirection].Counter = 0) then g_Weapon_Explode(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), FObj.Y+FObj.Rect.Y+FObj.Rect.Height-16, @@ -2426,8 +2402,8 @@ begin // Ïðîáóåì óâåðíóòüñÿ îò ëåòÿùåé ïóëè: if fall then - if (FState in [STATE_GO, STATE_RUN, STATE_RUNOUT, - STATE_ATTACK, STATE_SHOOT]) then + if (FState in [MONSTATE_GO, MONSTATE_RUN, MONSTATE_RUNOUT, + MONSTATE_ATTACK, MONSTATE_SHOOT]) then if g_Weapon_Danger(FUID, FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y, FObj.Rect.Width, FObj.Rect.Height, 50) then if (g_Obj_CollideLevel(@FObj, 0, 1) or g_Obj_StayOnStep(@FObj)) and @@ -2435,7 +2411,7 @@ begin FObj.Vel.Y := -MONSTERTABLE[FMonsterType].Jump; case FState of - STATE_PAIN: // Ñîñòîÿíèå - Áîëü + MONSTATE_PAIN: // Ñîñòîÿíèå - Áîëü begin // Áîëü ñèëüíàÿ => ìîíñòð êðè÷èò: if FPain >= MONSTERTABLE[FMonsterType].Pain then @@ -2454,11 +2430,11 @@ begin begin FPain := 0; FAmmo := -9; - SetState(STATE_GO); + SetState(MONSTATE_GO); end; end; - STATE_SLEEP: // Ñîñòîÿíèå - Ñîí + MONSTATE_SLEEP: // Ñîñòîÿíèå - Ñîí begin // Ñïèì: FSleep := FSleep + 1; @@ -2482,7 +2458,7 @@ begin FTargetUID := gPlayers[a].UID; FTargetTime := 0; WakeUpSound(); - SetState(STATE_GO); + SetState(MONSTATE_GO); Break; end; @@ -2511,30 +2487,30 @@ begin FTargetUID := gMonsters[a].UID; FTargetTime := 0; WakeUpSound(); - SetState(STATE_GO); + SetState(MONSTATE_GO); Break; end; end; end; - STATE_WAIT: // Ñîñòîÿíèå - Îæèäàíèå + MONSTATE_WAIT: // Ñîñòîÿíèå - Îæèäàíèå begin // Æäåì: FSleep := FSleep - 1; // Âûæäàëè äîñòàòî÷íî - èäåì: if FSleep < 0 then - SetState(STATE_GO); + SetState(MONSTATE_GO); end; - STATE_GO: // Ñîñòîÿíèå - Äâèæåíèå (ñ îñìîòðîì ñèòóàöèè) + MONSTATE_GO: // Ñîñòîÿíèå - Äâèæåíèå (ñ îñìîòðîì ñèòóàöèè) begin // Åñëè íàòêíóëèñü íà ÁëîêÌîí - óáåãàåì îò íåãî: if WordBool(st and MOVE_BLOCK) then begin Turn(); FSleep := 40; - SetState(STATE_RUNOUT); + SetState(MONSTATE_RUNOUT); goto _end; end; @@ -2544,7 +2520,7 @@ begin if isCorpse(@FObj, False) <> -1 then begin FObj.Vel.X := 0; - SetState(STATE_ATTACK, ANIM_ATTACK2); + SetState(MONSTATE_ATTACK, ANIM_ATTACK2); goto _end; end; @@ -2597,7 +2573,7 @@ begin if FMonsterType <> MONSTER_FISH then begin FSleep := 15; - SetState(STATE_RUN); + SetState(MONSTATE_RUN); if Random(2) = 0 then FDirection := D_LEFT else @@ -2613,7 +2589,7 @@ begin FObj.Rect.Height, FUID, ACTIVATE_MONSTERPRESS) <> nil then begin // Ñìîãëè íàæàòü êíîïêó - íåáîëüøîå îæèäàíèå FSleep := 4; - SetState(STATE_WAIT); + SetState(MONSTATE_WAIT); goto _end; end; @@ -2626,7 +2602,7 @@ begin begin // Ñòîèì íà òâåðäîì ïîëó èëè ñòóïåíè // Ïðûæîê ÷åðåç ñòåíó: FObj.Vel.Y := -MONSTERTABLE[FMonsterType].Jump; - SetState(STATE_CLIMB); + SetState(MONSTATE_CLIMB); end; end; @@ -2649,7 +2625,7 @@ begin end; // Ðûáå áîëüíî: - SetState(STATE_PAIN); + SetState(MONSTATE_PAIN); FPain := FPain + 50; end else // Ðûáà â âîäå @@ -2672,7 +2648,7 @@ begin else FDirection := D_RIGHT; FSleep := 20; - SetState(STATE_RUN); + SetState(MONSTATE_RUN); end; end; end @@ -2761,14 +2737,14 @@ begin FObj.Vel.X := 0; end; - STATE_RUN: // Ñîñòîÿíèå - Áåã + MONSTATE_RUN: // Ñîñòîÿíèå - Áåã begin // Åñëè íàòêíóëèñü íà ÁëîêÌîí - óáåãàåì îò íåãî: if WordBool(st and MOVE_BLOCK) then begin Turn(); FSleep := 40; - SetState(STATE_RUNOUT); + SetState(MONSTATE_RUNOUT); goto _end; end; @@ -2779,7 +2755,7 @@ begin if (FSleep <= 0) or (WordBool(st and MOVE_HITWALL) and ((FObj.Vel.Y+FObj.Accel.Y) = 0)) then begin FSleep := 0; - SetState(STATE_GO); + SetState(MONSTATE_GO); // Ñòåíà - èäåì îáðàòíî: if WordBool(st and (MOVE_HITWALL or MOVE_BLOCK)) then Turn(); @@ -2802,7 +2778,7 @@ begin FObj.Vel.X := 0; end; - STATE_RUNOUT: // Ñîñòîÿíèå - Óáåãàåò îò ÷åãî-òî + MONSTATE_RUNOUT: // Ñîñòîÿíèå - Óáåãàåò îò ÷åãî-òî begin // Âûøëè èç ÁëîêÌîíà: if (not WordBool(st and MOVE_BLOCK)) and (FSleep > 0) then @@ -2814,7 +2790,7 @@ begin if FSleep <= -18 then begin FSleep := 0; - SetState(STATE_GO); + SetState(MONSTATE_GO); // Ñòåíà/ÁëîêÌîí - èäåì îáðàòíî: if WordBool(st and (MOVE_HITWALL or MOVE_BLOCK)) then Turn(); @@ -2837,21 +2813,21 @@ begin FObj.Vel.X := 0; end; - STATE_CLIMB: // Ñîñòîÿíèå - Ïðûæîê (÷òîáû îáîéòè ñòåíó) + MONSTATE_CLIMB: // Ñîñòîÿíèå - Ïðûæîê (÷òîáû îáîéòè ñòåíó) begin // Äîñòèãëè âûñøåé òî÷êè ïðûæêà èëè ñòåíà êîí÷èëàñü => ïåðåõîäèì íà øàã: if ((FObj.Vel.Y+FObj.Accel.Y) >= 0) or (not WordBool(st and MOVE_HITWALL)) then begin FSleep := 0; - SetState(STATE_GO); + SetState(MONSTATE_GO); // Ñòåíà íå êîí÷èëàñü => áåæèì îò íåå: if WordBool(st and (MOVE_HITWALL or MOVE_BLOCK)) then begin Turn(); FSleep := 15; - SetState(STATE_RUN); + SetState(MONSTATE_RUN); end; end; @@ -2869,14 +2845,14 @@ begin FObj.Vel.X := 0; end; - STATE_ATTACK, // Ñîñòîÿíèå - Àòàêà - STATE_SHOOT: // Ñîñòîÿíèå - Ñòðåëüáà + MONSTATE_ATTACK, // Ñîñòîÿíèå - Àòàêà + MONSTATE_SHOOT: // Ñîñòîÿíèå - Ñòðåëüáà begin // Lost_Soul âðåçàëñÿ â ñòåíó ïðè àòàêå => ïåðåõîäèò íà øàã: if FMonsterType = MONSTER_SOUL then begin if WordBool(st and (MOVE_HITWALL or MOVE_HITCEIL or MOVE_HITLAND)) then - SetState(STATE_GO); + SetState(MONSTATE_GO); goto _end; end; @@ -2886,12 +2862,12 @@ begin FObj.Vel.X := z_dec(FObj.Vel.X, 1); // Íóæíî ñòðåëÿòü, à ìîíñòð - êîëäóí: - if (FMonsterType = MONSTER_VILE) and (FState = STATE_SHOOT) then + if (FMonsterType = MONSTER_VILE) and (FState = MONSTATE_SHOOT) then begin // Öåëü ïîãèáëà => èäåì äàëüøå: if not GetPos(FTargetUID, @o) then begin - SetState(STATE_GO); + SetState(MONSTATE_GO); goto _end; end; @@ -2899,7 +2875,7 @@ begin // Öåëü íå âèäíî => èäåì äàëüøå: if not g_Look(@FObj, @o, FDirection) then begin - SetState(STATE_GO); + SetState(MONSTATE_GO); goto _end; end; @@ -2907,7 +2883,7 @@ begin // Öåëü â âîäå - íå çàãîðèòñÿ => èäåì äàëüøå: if g_Obj_CollideWater(@o, 0, 0) then begin - SetState(STATE_GO); + SetState(MONSTATE_GO); goto _end; end; @@ -2923,11 +2899,11 @@ begin _end: // Ñîñòîÿíèå - Âîñêðåøåíèå: - if FState = STATE_REVIVE then + if FState = MONSTATE_REVIVE then if FAnim[FCurAnim, FDirection].Played then begin // Îáðàòíàÿ àíèìàöèÿ óìèðàíèÿ çàêîí÷èëàñü - èäåì äàëüøå: FAnim[FCurAnim, FDirection].Revert(False); - SetState(STATE_GO); + SetState(MONSTATE_GO); end; // Åñëè åñòü àíèìàöèÿ îãíÿ êîëäóíà - ïóñòü îíà èäåò: @@ -2935,12 +2911,12 @@ _end: vilefire.Update(); // Ñîñòîÿíèå - Óìèðàåò è òåêóùàÿ àíèìàöèÿ ïðîèãðàíà: - if (FState = STATE_DIE) and + if (FState = MONSTATE_DIE) and (FAnim[FCurAnim, FDirection] <> nil) and (FAnim[FCurAnim, FDirection].Played) then begin // Óìåð: - SetState(STATE_DEAD); + SetState(MONSTATE_DEAD); // Pain_Elemental ïðè ñìåðòè âûïóñêàåò 3 Lost_Soul'à: if (FMonsterType = MONSTER_PAIN) then @@ -2949,7 +2925,7 @@ _end: FObj.Y+FObj.Rect.Y+20, D_LEFT); if mon <> nil then begin - mon.SetState(STATE_GO); + mon.SetState(MONSTATE_GO); mon.FNoRespawn := True; Inc(gTotalMonsters); if g_Game_IsNet then MH_SEND_MonsterSpawn(mon.UID); @@ -2959,7 +2935,7 @@ _end: FObj.Y+FObj.Rect.Y+20, D_RIGHT); if mon <> nil then begin - mon.SetState(STATE_GO); + mon.SetState(MONSTATE_GO); mon.FNoRespawn := True; Inc(gTotalMonsters); if g_Game_IsNet then MH_SEND_MonsterSpawn(mon.UID); @@ -2969,7 +2945,7 @@ _end: FObj.Y+FObj.Rect.Y, D_RIGHT); if mon <> nil then begin - mon.SetState(STATE_GO); + mon.SetState(MONSTATE_GO); mon.FNoRespawn := True; Inc(gTotalMonsters); if g_Game_IsNet then MH_SEND_MonsterSpawn(mon.UID); @@ -2986,22 +2962,22 @@ _end: end; // Ñîâåðøåíèå àòàêè è ñòðåëüáû: - if (FState = STATE_ATTACK) or (FState = STATE_SHOOT) then + if (FState = MONSTATE_ATTACK) or (FState = MONSTATE_SHOOT) then if (FAnim[FCurAnim, FDirection] <> nil) then // Àíèìàöèÿ àòàêè åñòü - ìîæíî àòàêîâàòü if (FAnim[FCurAnim, FDirection].Played) then begin // Àíèìàöèÿ àòàêè çàêîí÷èëàñü => ïåðåõîäèì íà øàã - if FState = STATE_ATTACK then + if FState = MONSTATE_ATTACK then begin // Ñîñòîÿíèå - Àòàêà // Åñëè ìîíñòð íå Lost_Soul, òî ïîñëå àòàêè ïåðåõîäèì íà øàã: if FMonsterType <> MONSTER_SOUL then - SetState(STATE_GO); + SetState(MONSTATE_GO); end else // Ñîñòîÿíèå - Ñòðåëüáà begin // Ïåðåõîäèì íà øàã, åñëè íå íàäî ñòðåëÿòü åùå ðàç: if not FChainFire then - SetState(STATE_GO) + SetState(MONSTATE_GO) else begin // Íàäî ñòðåëÿòü åùå FChainFire := False; @@ -3021,7 +2997,7 @@ _end: (FAnim[FCurAnim, FDirection].TotalFrames div 2)) ) then begin // Àòàêè åùå íå áûëî è ýòî ñåðåäèíà àíèìàöèè àòàêè - if FState = STATE_ATTACK then + if FState = MONSTATE_ATTACK then begin // Ñîñòîÿíèå - Àòàêà // Åñëè ýòî Lost_Soul, òî ñáðàñûâàåì àíèìàöèþ àòàêè: if FMonsterType = MONSTER_SOUL then @@ -3033,7 +3009,7 @@ _end: if g_Weapon_Hit(@FObj, 15, FUID, HIT_SOME) <> 0 then // Lost_Soul óêóñèë êîãî-òî => ïåðåõîäèò íà øàã: if FMonsterType = MONSTER_SOUL then - SetState(STATE_GO); + SetState(MONSTATE_GO); MONSTER_FISH: // Ðûáà êóñàåò ïåðâîãî ïîïàâøåãîñÿ ñî çâóêîì: @@ -3057,7 +3033,7 @@ _end: sx := isCorpse(@FObj, True); if sx <> -1 then begin // Íàøëè, êîãî âîñêðåñèòü - gMonsters[sx].SetState(STATE_REVIVE); + gMonsters[sx].SetState(MONSTATE_REVIVE); g_Sound_PlayExAt('SOUND_MONSTER_SLOP', FObj.X, FObj.Y); // Âîñêðåøàòü - ñåáå âðåäèòü: {g_Weapon_HitUID(FUID, 5, 0, HIT_SOME);} @@ -3144,7 +3120,7 @@ _end: GetPos(FTargetUID, @o); mon.FTargetTime := 0; mon.FNoRespawn := True; - mon.SetState(STATE_GO); + mon.SetState(MONSTATE_GO); mon.shoot(@o, True); Inc(gTotalMonsters); @@ -3178,7 +3154,7 @@ _end: // Ïîñëåäíèé êàäð òåêóùåé àíèìàöèè: if FAnim[FCurAnim, FDirection].Counter = FAnim[FCurAnim, FDirection].Speed-1 then case FState of - STATE_GO, STATE_RUN, STATE_CLIMB, STATE_RUNOUT: + MONSTATE_GO, MONSTATE_RUN, MONSTATE_CLIMB, MONSTATE_RUNOUT: // Çâóêè ïðè ïåðåäâèæåíèè: case FMonsterType of MONSTER_CYBER: @@ -3201,7 +3177,7 @@ _end: end; if g_Obj_CollidePanel(@FObj, 0, 0, PANEL_LIFTLEFT or PANEL_LIFTRIGHT) and - not ((FState = STATE_DEAD) or (FState = STATE_DIE)) then + not ((FState = MONSTATE_DEAD) or (FState = MONSTATE_DIE)) then FObj.Vel.X := oldvelx; // Åñëè åñòü àíèìàöèÿ, òî ïóñòü îíà èäåò: @@ -3245,15 +3221,15 @@ begin // Ðûáû "ëåòàþò" òîëüêî â âîäå: if FMonsterType = MONSTER_FISH then if g_Obj_CollidePanel(@FObj, 0, 0, PANEL_WATER or PANEL_ACID1 or PANEL_ACID2) then - if (FState <> STATE_DIE) and (FState <> STATE_DEAD) then + if (FState <> MONSTATE_DIE) and (FState <> MONSTATE_DEAD) then fall := False; // Ëåòàþùèå ìîíòñðû: if ((FMonsterType = MONSTER_SOUL) or (FMonsterType = MONSTER_PAIN) or (FMonsterType = MONSTER_CACO)) and - (FState <> STATE_DIE) and - (FState <> STATE_DEAD) then + (FState <> MONSTATE_DIE) and + (FState <> MONSTATE_DEAD) then fall := False; // Ìåíÿåì ñêîðîñòü òîëüêî ïî ÷åòíûì êàäðàì: @@ -3284,7 +3260,7 @@ begin oldvelx := FObj.Vel.X; // Ñîïðîòèâëåíèå âîçäóõà äëÿ òðóïà: - if (FState = STATE_DIE) or (FState = STATE_DEAD) then + if (FState = MONSTATE_DIE) or (FState = MONSTATE_DEAD) then FObj.Vel.X := z_dec(FObj.Vel.X, 1); if FFireTime > 0 then @@ -3299,7 +3275,7 @@ begin end; // Ìåðòâûé íè÷åãî íå äåëàåò: - if (FState = STATE_DEAD) then + if (FState = MONSTATE_DEAD) then goto _end; // Âîçìîæíî, ñîçäàåì ïóçûðüêè â âîäå: @@ -3325,7 +3301,7 @@ begin // Åñëè ïðîøåë ïåðâûé êàäð àíèìàöèè âçðûâà áî÷êè, òî âçðûâ: if FMonsterType = MONSTER_BARREL then begin - if (FState = STATE_DIE) and (FAnim[FCurAnim, FDirection].CurrentFrame = 1) and + if (FState = MONSTATE_DIE) and (FAnim[FCurAnim, FDirection].CurrentFrame = 1) and (FAnim[FCurAnim, FDirection].Counter = 0) then g_Weapon_Explode(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), FObj.Y+FObj.Rect.Y+FObj.Rect.Height-16, @@ -3369,8 +3345,8 @@ begin // Ïðîáóåì óâåðíóòüñÿ îò ëåòÿùåé ïóëè: if fall then - if (FState in [STATE_GO, STATE_RUN, STATE_RUNOUT, - STATE_ATTACK, STATE_SHOOT]) then + if (FState in [MONSTATE_GO, MONSTATE_RUN, MONSTATE_RUNOUT, + MONSTATE_ATTACK, MONSTATE_SHOOT]) then if g_Weapon_Danger(FUID, FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y, FObj.Rect.Width, FObj.Rect.Height, 50) then if (g_Obj_CollideLevel(@FObj, 0, 1) or g_Obj_StayOnStep(@FObj)) and @@ -3378,7 +3354,7 @@ begin FObj.Vel.Y := -MONSTERTABLE[FMonsterType].Jump; case FState of - STATE_PAIN: // Ñîñòîÿíèå - Áîëü + MONSTATE_PAIN: // Ñîñòîÿíèå - Áîëü begin // Áîëü ñèëüíàÿ => ìîíñòð êðè÷èò: if FPain >= MONSTERTABLE[FMonsterType].Pain then @@ -3395,12 +3371,12 @@ begin // Áîëü óæå íå îøóòèìàÿ => èäåì äàëüøå: if FPain <= MONSTERTABLE[FMonsterType].MinPain then begin - SetState(STATE_GO); + SetState(MONSTATE_GO); FPain := 0; end; end; - STATE_SLEEP: // Ñîñòîÿíèå - Ñîí + MONSTATE_SLEEP: // Ñîñòîÿíèå - Ñîí begin // Ñïèì: FSleep := FSleep + 1; @@ -3412,20 +3388,20 @@ begin goto _end; end; - STATE_WAIT: // Ñîñòîÿíèå - Îæèäàíèå + MONSTATE_WAIT: // Ñîñòîÿíèå - Îæèäàíèå begin // Æäåì: FSleep := FSleep - 1; end; - STATE_GO: // Ñîñòîÿíèå - Äâèæåíèå (ñ îñìîòðîì ñèòóàöèè) + MONSTATE_GO: // Ñîñòîÿíèå - Äâèæåíèå (ñ îñìîòðîì ñèòóàöèè) begin // Åñëè íàòêíóëèñü íà ÁëîêÌîí - óáåãàåì îò íåãî: if WordBool(st and MOVE_BLOCK) then begin Turn(); FSleep := 40; - SetState(STATE_RUNOUT); + SetState(MONSTATE_RUNOUT); goto _end; end; @@ -3434,7 +3410,7 @@ begin if (FMonsterType = MONSTER_VILE) then if isCorpse(@FObj, False) <> -1 then begin - SetState(STATE_ATTACK, ANIM_ATTACK2); + SetState(MONSTATE_ATTACK, ANIM_ATTACK2); FObj.Vel.X := 0; goto _end; @@ -3444,7 +3420,7 @@ begin if Abs(sx) < 40 then if FMonsterType <> MONSTER_FISH then begin - SetState(STATE_RUN); + SetState(MONSTATE_RUN); FSleep := 15; goto _end; @@ -3461,7 +3437,7 @@ begin begin // Ñòîèì íà òâåðäîì ïîëó èëè ñòóïåíè // Ïðûæîê ÷åðåç ñòåíó: FObj.Vel.Y := -MONSTERTABLE[FMonsterType].Jump; - SetState(STATE_CLIMB); + SetState(MONSTATE_CLIMB); end; end; @@ -3485,7 +3461,7 @@ begin end; // Ðûáå áîëüíî: - SetState(STATE_PAIN); + SetState(MONSTATE_PAIN); FPain := FPain + 50; end else // Ðûáà â âîäå @@ -3503,7 +3479,7 @@ begin // Âñïëûëè äî ïîâåðõíîñòè - ñòîï: FObj.Vel.Y := 0; // Ïëàâàåì òóäà-ñþäà: - SetState(STATE_RUN); + SetState(MONSTATE_RUN); FSleep := 20; end; end; @@ -3588,12 +3564,12 @@ begin FObj.Vel.X := 0; end; - STATE_RUN: // Ñîñòîÿíèå - Áåã + MONSTATE_RUN: // Ñîñòîÿíèå - Áåã begin // Åñëè íàòêíóëèñü íà ÁëîêÌîí - óáåãàåì îò íåãî: if WordBool(st and MOVE_BLOCK) then begin - SetState(STATE_RUNOUT); + SetState(MONSTATE_RUNOUT); FSleep := 40; goto _end; @@ -3604,7 +3580,7 @@ begin // Ïðîáåæàëè äîñòàòî÷íî èëè âðåçàëèñü â ñòåíó => ïåðåõîäèì íà øàã: if (FSleep <= 0) or (WordBool(st and MOVE_HITWALL) and ((FObj.Vel.Y+FObj.Accel.Y) = 0)) then begin - SetState(STATE_GO); + SetState(MONSTATE_GO); FSleep := 0; // Èíîãäà ðû÷èì: @@ -3626,7 +3602,7 @@ begin FObj.Vel.X := 0; end; - STATE_RUNOUT: // Ñîñòîÿíèå - Óáåãàåò îò ÷åãî-òî + MONSTATE_RUNOUT: // Ñîñòîÿíèå - Óáåãàåò îò ÷åãî-òî begin // Âûøëè èç ÁëîêÌîíà: if (not WordBool(st and MOVE_BLOCK)) and (FSleep > 0) then @@ -3637,7 +3613,7 @@ begin // Óáàæåëè äîñòàòî÷íî äàëåêî => ïåðåõîäèì íà øàã: if FSleep <= -18 then begin - SetState(STATE_GO); + SetState(MONSTATE_GO); FSleep := 0; // Èíîãäà ðû÷èì: @@ -3659,19 +3635,19 @@ begin FObj.Vel.X := 0; end; - STATE_CLIMB: // Ñîñòîÿíèå - Ïðûæîê (÷òîáû îáîéòè ñòåíó) + MONSTATE_CLIMB: // Ñîñòîÿíèå - Ïðûæîê (÷òîáû îáîéòè ñòåíó) begin // Äîñòèãëè âûñøåé òî÷êè ïðûæêà èëè ñòåíà êîí÷èëàñü => ïåðåõîäèì íà øàã: if ((FObj.Vel.Y+FObj.Accel.Y) >= 0) or (not WordBool(st and MOVE_HITWALL)) then begin - SetState(STATE_GO); + SetState(MONSTATE_GO); FSleep := 0; // Ñòåíà íå êîí÷èëàñü => áåæèì îò íåå: if WordBool(st and (MOVE_HITWALL or MOVE_BLOCK)) then begin - SetState(STATE_RUN); + SetState(MONSTATE_RUN); FSleep := 15; end; end; @@ -3690,14 +3666,14 @@ begin FObj.Vel.X := 0; end; - STATE_ATTACK, // Ñîñòîÿíèå - Àòàêà - STATE_SHOOT: // Ñîñòîÿíèå - Ñòðåëüáà + MONSTATE_ATTACK, // Ñîñòîÿíèå - Àòàêà + MONSTATE_SHOOT: // Ñîñòîÿíèå - Ñòðåëüáà begin // Lost_Soul âðåçàëñÿ â ñòåíó ïðè àòàêå => ïåðåõîäèò íà øàã: if FMonsterType = MONSTER_SOUL then begin if WordBool(st and (MOVE_HITWALL or MOVE_HITCEIL or MOVE_HITLAND)) then - SetState(STATE_GO); + SetState(MONSTATE_GO); goto _end; end; @@ -3707,12 +3683,12 @@ begin FObj.Vel.X := z_dec(FObj.Vel.X, 1); // Íóæíî ñòðåëÿòü, à ìîíñòð - êîëäóí: - if (FMonsterType = MONSTER_VILE) and (FState = STATE_SHOOT) then + if (FMonsterType = MONSTER_VILE) and (FState = MONSTATE_SHOOT) then begin // Öåëü ïîãèáëà => èäåì äàëüøå: if not GetPos(FTargetUID, @o) then begin - SetState(STATE_GO); + SetState(MONSTATE_GO); goto _end; end; @@ -3720,7 +3696,7 @@ begin // Öåëü íå âèäíî => èäåì äàëüøå: if not g_Look(@FObj, @o, FDirection) then begin - SetState(STATE_GO); + SetState(MONSTATE_GO); goto _end; end; @@ -3728,7 +3704,7 @@ begin // Öåëü â âîäå - íå çàãîðèòñÿ => èäåì äàëüøå: if g_Obj_CollideWater(@o, 0, 0) then begin - SetState(STATE_GO); + SetState(MONSTATE_GO); goto _end; end; @@ -3739,11 +3715,11 @@ begin _end: // Ñîñòîÿíèå - Âîñêðåøåíèå: - if FState = STATE_REVIVE then + if FState = MONSTATE_REVIVE then if FAnim[FCurAnim, FDirection].Played then begin // Îáðàòíàÿ àíèìàöèÿ óìèðàíèÿ çàêîí÷èëàñü - èäåì äàëüøå: FAnim[FCurAnim, FDirection].Revert(False); - SetState(STATE_GO); + SetState(MONSTATE_GO); end; // Åñëè åñòü àíèìàöèÿ îãíÿ êîëäóíà - ïóñòü îíà èäåò: @@ -3751,12 +3727,12 @@ _end: vilefire.Update(); // Ñîñòîÿíèå - Óìèðàåò è òåêóùàÿ àíèìàöèÿ ïðîèãðàíà: - if (FState = STATE_DIE) and + if (FState = MONSTATE_DIE) and (FAnim[FCurAnim, FDirection] <> nil) and (FAnim[FCurAnim, FDirection].Played) then begin // Óìåð: - SetState(STATE_DEAD); + SetState(MONSTATE_DEAD); // Ó ýòèõ ìîíñòðîâ íåò òðóïîâ: if (FMonsterType = MONSTER_PAIN) or @@ -3768,22 +3744,22 @@ _end: end; // Ñîâåðøåíèå àòàêè è ñòðåëüáû: - if (FState = STATE_ATTACK) or (FState = STATE_SHOOT) then + if (FState = MONSTATE_ATTACK) or (FState = MONSTATE_SHOOT) then if (FAnim[FCurAnim, FDirection] <> nil) then // Àíèìàöèÿ àòàêè åñòü - ìîæíî àòàêîâàòü if (FAnim[FCurAnim, FDirection].Played) then begin // Àíèìàöèÿ àòàêè çàêîí÷èëàñü => ïåðåõîäèì íà øàã - if FState = STATE_ATTACK then + if FState = MONSTATE_ATTACK then begin // Ñîñòîÿíèå - Àòàêà // Åñëè ìîíñòð íå Lost_Soul, òî ïîñëå àòàêè ïåðåõîäèì íà øàã: if FMonsterType <> MONSTER_SOUL then - SetState(STATE_GO); + SetState(MONSTATE_GO); end else // Ñîñòîÿíèå - Ñòðåëüáà begin // Ïåðåõîäèì íà øàã, åñëè íå íàäî ñòðåëÿòü åùå ðàç: if not FChainFire then - SetState(STATE_GO) + SetState(MONSTATE_GO) else begin // Íàäî ñòðåëÿòü åùå FChainFire := False; @@ -3803,7 +3779,7 @@ _end: (FAnim[FCurAnim, FDirection].TotalFrames div 2)) ) then begin // Àòàêè åùå íå áûëî è ýòî ñåðåäèíà àíèìàöèè àòàêè - if FState = STATE_ATTACK then + if FState = MONSTATE_ATTACK then begin // Ñîñòîÿíèå - Àòàêà // Åñëè ýòî Lost_Soul, òî ñáðàñûâàåì àíèìàöèþ àòàêè: if FMonsterType = MONSTER_SOUL then @@ -3815,7 +3791,7 @@ _end: if g_Weapon_Hit(@FObj, 15, FUID, HIT_SOME) <> 0 then // Lost_Soul óêóñèë êîãî-òî => ïåðåõîäèò íà øàã: if FMonsterType = MONSTER_SOUL then - SetState(STATE_GO); + SetState(MONSTATE_GO); MONSTER_FISH: g_Weapon_Hit(@FObj, 10, FUID, HIT_SOME); @@ -3867,7 +3843,7 @@ _end: // Ïîñëåäíèé êàäð òåêóùåé àíèìàöèè: if FAnim[FCurAnim, FDirection].Counter = FAnim[FCurAnim, FDirection].Speed-1 then case FState of - STATE_GO, STATE_RUN, STATE_CLIMB, STATE_RUNOUT: + MONSTATE_GO, MONSTATE_RUN, MONSTATE_CLIMB, MONSTATE_RUNOUT: // Çâóêè ïðè ïåðåäâèæåíèè: case FMonsterType of MONSTER_CYBER: @@ -3891,7 +3867,7 @@ _end: // Êîñòûëü äëÿ ïîòîêîâ if g_Obj_CollidePanel(@FObj, 0, 0, PANEL_LIFTLEFT or PANEL_LIFTRIGHT) and - not ((FState = STATE_DEAD) or (FState = STATE_DIE)) then + not ((FState = MONSTATE_DEAD) or (FState = MONSTATE_DIE)) then FObj.Vel.X := oldvelx; // Åñëè åñòü àíèìàöèÿ, òî ïóñòü îíà èäåò: @@ -4102,24 +4078,24 @@ begin case FMonsterType of MONSTER_FISH: begin - SetState(STATE_ATTACK); + SetState(MONSTATE_ATTACK); Result := True; end; MONSTER_DEMON: begin - SetState(STATE_ATTACK); + SetState(MONSTATE_ATTACK); g_Sound_PlayExAt('SOUND_MONSTER_DEMON_ATTACK', FObj.X, FObj.Y); Result := True; end; MONSTER_IMP: begin - SetState(STATE_ATTACK); + SetState(MONSTATE_ATTACK); g_Sound_PlayExAt('SOUND_MONSTER_IMP_ATTACK', FObj.X, FObj.Y); Result := True; end; MONSTER_SKEL, MONSTER_ROBO, MONSTER_CYBER: begin - SetState(STATE_ATTACK, ANIM_ATTACK2); + SetState(MONSTATE_ATTACK, ANIM_ATTACK2); g_Sound_PlayExAt('SOUND_MONSTER_SKEL_ATTACK', FObj.X, FObj.Y); Result := True; end; @@ -4202,19 +4178,19 @@ begin case FMonsterType of MONSTER_IMP, MONSTER_BARON, MONSTER_KNIGHT, MONSTER_CACO: begin - SetState(STATE_SHOOT); + SetState(MONSTATE_SHOOT); {nn} end; MONSTER_SKEL: begin - SetState(STATE_SHOOT); + SetState(MONSTATE_SHOOT); {nn} end; MONSTER_VILE: begin // Çàæèãàåì îãîíü tx := o^.X+o^.Rect.X+(o^.Rect.Width div 2); ty := o^.Y+o^.Rect.Y; - SetState(STATE_SHOOT); + SetState(MONSTATE_SHOOT); vilefire.Reset(); @@ -4223,7 +4199,7 @@ begin end; MONSTER_SOUL: begin // Ëåòèò â ñòîðîíó öåëè: - SetState(STATE_ATTACK); + SetState(MONSTATE_ATTACK); g_Sound_PlayExAt('SOUND_MONSTER_SOUL_ATTACK', FObj.X, FObj.Y); xd := tx-(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)); @@ -4243,7 +4219,7 @@ begin if FAmmo = 1 then g_Sound_PlayExAt('SOUND_MONSTER_MANCUB_ATTACK', FObj.X, FObj.Y); - SetState(STATE_SHOOT); + SetState(MONSTATE_SHOOT); end; else Exit; end; @@ -4253,7 +4229,7 @@ end; function TMonster.Live(): Boolean; begin - Result := (FState <> STATE_DIE) and (FState <> STATE_DEAD) and (FHealth > 0); + Result := (FState <> MONSTATE_DIE) and (FState <> MONSTATE_DEAD) and (FHealth > 0); end; procedure TMonster.SetHealth(aH: Integer); @@ -4269,7 +4245,7 @@ end; procedure TMonster.WakeUp(); begin if g_Game_IsClient then Exit; - SetState(STATE_GO); + SetState(MONSTATE_GO); FTargetTime := MAX_ATM; WakeUpSound(); end; @@ -4496,7 +4472,7 @@ begin Anim := TAnimation.Create(id, False, 3); Anim.Alpha := 0; g_GFX_OnceAnim(Obj.X+Obj.Rect.X+Random(Obj.Rect.Width+Times*2)-(Anim.Width div 2), - Obj.Y+8+Random(8+Times*2)+IfThen(FState = STATE_DEAD, 16, 0), Anim, ONCEANIM_SMOKE); + Obj.Y+8+Random(8+Times*2)+IfThen(FState = MONSTATE_DEAD, 16, 0), Anim, ONCEANIM_SMOKE); Anim.Free(); end; end; @@ -4511,7 +4487,6 @@ begin 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 @@ -4519,6 +4494,11 @@ begin result := gMonsters[uid]; end; +function g_Mons_TotalCount (): Integer; inline; +begin + result := Length(gMonsters); +end; + function g_Mons_ForEach (cb: TEachMonsterCB): Boolean; var @@ -4593,13 +4573,10 @@ begin end; -///!!!FIXME!!! function g_Mons_ForEachAt (x, y: Integer; width, height: Integer; cb: TEachMonsterCB): Boolean; function monsCollCheck (mon: TMonster; atag: Integer): Boolean; begin - //result := false; - //if g_Obj_Collide(x, y, width, height, @mon.Obj) then result := cb(mon); result := cb(mon); end;