MonsterController
Simple AI that always hunts down players as enemies.
// note ut2004 monster controller code is just about identical
// but ut2004 has a problem a serious one the monsters jump though states too fast
// and will crash the entire game by calling the find new enemy function untill the recursions exceed 10000
Properties
All MonsterController properties are hidden.
Magic numbers
(from remark in code) "Distance based, so scale to bot speed/weapon range"
- MAXSTAKEOUTDIST = 2000 (const)
- ENEMYLOCATIONFUZZ = 1200 (const)
- TACTICALHEIGHTADVANTAGE = 320 (const)
- MINSTRAFEDIST = 200 (const)
- MINVIEWDIST = 200 (const)
Flags
- bool bCanFire
- Used by TacticalMove and Charging states
- bool bStrafeDir
- bool bLeadTarget
- Lead target with projectile attack
- bool bChangeDir
- Tactical move boolean
- bool bEnemyIsVisible
- bool bMustCharge
- bool bJustLanded
- bool bRecommendFastMove
- bool bHasFired
- bool bForcedDirection
Advanced AI
- float AcquireTime
- Time at which current enemy was acquired
- float LoseEnemyCheckTime
- Not implemented.
- float StartTacticalTime
- vector HidingSpot
- float ChallengeTime
Modifiable AI
- float Accuracy
- -1 to 1 (0 is default, higher is more accurate)
- float StrafingAbility
- -1 to 1 (higher uses strafing more)
- float CombatStyle
- -1 to 1 = low means tends to stay off and snipe, high means tends to charge and melee
- float ReactionTime
Team AI
- string GoalString
- For debugging - used to show what bot is thinking (with 'ShowDebug')
- string SoakString
- For debugging - shows problem when soaking
Used in ChooseAttackMode() State
- int ChoosingAttackLevel
- float ChooseAttackTime
- int ChooseAttackCounter
- float EnemyVisibilityTime
- Pawn VisibleEnemy
- Pawn OldEnemy
- float StopStartTime
- float LastRespawnTime
- float FailedHuntTime
- Pawn FailedHuntEnemy
Miscellaneous
- int NumRandomJumps
- Attempts to free monster from being stuck
Functions
(incomplete)
- Trigger( Actor Other, Pawn EventInstigator )
- If Other is a Pawn and Pawn.Health >= 0, calls SetEnemy( EventInstigator, true ).
- FightEnemy( bool bCanCharge )
- Decides how to attack: Hunt, StakeOut, Melee, Ranged, etc. Also performs a "teleport" (SetLocation() to a PlayerStart), if the FailedHuntTime is reached and the controlled Pawn not currently seen by the enemy.
- ChooseAttackMode()
- Handles tactical attacking state selection - choose which type of attack to do from here.
- bool FindBestPathToward( Actor A, bool bCheckedReach, bool bAllowDetour )
- Assumes the desired destination is not directly reachable. It tries to set Destination to the location of the best waypoint, and returns true if successful.
- bool NearWall( float walldist )
- Returns true if there is a nearby barrier at eyeheight, and changes FocalPoint to a suggested place to look.
- rotator AdjustAim( FireProperties? FiredAmmunition, vector projStart, int aimerror )
- Returns a rotation which is the direction the bot should aim - after introducing the appropriate aiming error.
- bool Formation()
- Returns false.
- DoStakeOut()
- Switches to state StakeOut.
- DoCharge()
- If in WaterVolume and bCanSwim is false or if bCanFly and bCanWalk are false, calls DoTacticalMove(). Otherwise, switches to state Charging.
- DoTacticalMove()
- Switches to state TacticalMove.
- bool DefendMelee( float Dist )
- Return true if defending against melee attack.
- bool IsStrafing()
- Returns false.
- bool IsHunting()
- Returns false.
- bool Stopped()
- Returns bPreparingMove.
- GameHasEnded()
- EMPTY
States
NoGoal
EMPTY
RestFormation
Ignores EnemyNotVisible(). Calls WaitForLanding().
Functions
- CancelCampFor( Controller C )
- Calls DirectedWander(Normal(Pawn.Location - C.Pawn.Location)).
- bool Formation()
- Returns true.
- Timer()
- Calls and enables NotifyBump.
- PickDestination()
- If TestDirection(VRand(),Destination), return. Otherwise, call TestDirection(VRand(),Destination).
- BeginState()
- Sets Enemy = None, Pawn.bCanJump = false, Pawn.bAvoidLedges = true, Pawn.bStopAtLedges = true, calls Pawn.SetWalking(true) and sets MinHitWall += 0.15.
- EndState()
- Sets MonitoredPawn = None and MinHitWall -= 0.15. If Pawn != None, sets Pawn.bStopAtLedges = false and Pawn.bAvoidLedges = false, calls Pawn.SetWalking(false) and if Pawn.JumpZ > 0, sets Pawn.bCanJump = true.
Events
- MonitoredPawnAlert()
- Calls WhatToDoNext(6).
- Begin
- Calls WaitForLanding(); ...
- Camping
- Sets Pawn.Acceleration = vect(0,0,0), Focus = None, FocalPoint = VRand(). Calls NearWall(MINVIEWDIST), FinishRotation() and Sleep(3 + FRand()) ...
- Moving
- Calls WaitForLanding() and PickDestination() ...
- WaitForAnim
- If Monster(Pawn).bShotAnim, calls Sleep(0.5) and goes to WaitForAnim. Calls MoveTo(Destination,,true). If Pawn.bCanFly and Physics == PHYS_Walking, calls SetPhysics(PHYS_Flying). Calls WhatToDoNext(8). Goes to Begin.
MoveToGoal
MoveToGoalNoEnemy extends MoveToGoal
EMPTY
MoveToGoalWithEnemy extends MoveToGoal
When Timer() is called, calls TimedFireWeaponAtEnemy().
Roaming extends MoveToGoalNoEnemy
Ignores EnemyNotVisible.
- Begin
- Calls SwitchToBestWeapon(), WaitForLanding() and MoveToward(MoveTarget,FaceActor(1),,ShouldStrafeTo(MoveTarget)).
- DoneRoaming
Charging extends MoveToGoalWithEnemy
Ignores SeePlayer and HearNoise.
- Begin
- WaitForAnim
- Moving
TacticalMove
Ignores SeePlayer and HearNoise.
- TacticalTick
- Begin
- DoMove
- WaitForAnim
- DoStrafeMove
- RecoverEnemy
- FinishedStrafe
Hunting extends MoveToGoalWithEnemy
Ignores EnemyNotVisible.
- AdjustFromWall
- Begin
- WaitForAnim
- SpecialNavig
StakeOut
Ignores EnemyNotVisible.
- Begin
RangedAttack
Ignores SeePlayer, HearNoise and Bump.
- Begin
WaitForAnim
Ignores SeePlayer, HearNoise, KilledBy, NotifyBump, HitWall, NotifyPhysicsVolumeChange, NotifyHeadVolumeChange, Falling, TakeDamage and ReceiveWarning.
Events
- AnimEnd( int Channel )
- Calls Pawn.AnimEnd(Channel). If !Monster(Pawn).bShotAnim, calls WhatToDoNext(99).
WaitingForLanding
Functions
- bool DoWaitForLanding()
- bool NotifyLanded( vector HitNormal )
- Timer()
- If Focus == Enemy, call TimedFireWeaponAtEnemy(), else call SetCombatTimer().
- BeginState()
- Set bJustLanded = false. If MoveTarget != None and Enemy == None or Focus != Enemy, set FaceActor(1.5). If Enemy == None or Focus != Enemy, call StopFiring().
Related Topics
- Monster
- Controller Overview
- Artificial Intelligence - Super topic for all AI (bots, Monsters, NPCs, etc)
Discussion
SuperApe: Created. Could use brief definitions of each state. Rest of functions need to be added.
Category To Do – Finish state definitions.