You are on page 1of 6

PSEUDOCODE FSM

class EnemyFSM:
patrolSpeed: float
attackSpeed: float
attackRange: float
maxHealth: int
currentHealth: int
player: Transform
patrolWaypoints: Transform[]
currentWaypointIndex: int
currentState: EnemyState
animator: Animator

method Start():
// Inisialisasi variabel dan waypoints
currentHealth = maxHealth
player = FindPlayerWithTag("Player")
patrolWaypoints = CreateDummyWaypoints()
currentWaypointIndex = 0
currentState = EnemyState.Patrol
animator = GetComponent<Animator>()
ChangeState(EnemyState.Patrol)

method Update():
// Memanggil metode sesuai dengan state saat ini
switch currentState:
case EnemyState.Patrol:
Patrol()
CheckForAttackMode()
case EnemyState.AttackMode:
MoveToPlayer()
CheckForPatrol()
CheckForAttacks()
case EnemyState.SpecialAttack:
SpecialAttack()
case EnemyState.ComboAttack:
ComboAttack()
case EnemyState.BasicAttack:
BasicAttack()
case EnemyState.Die:
Die()

method Patrol():
// Bergerak menuju waypoint dan memeriksa transisi ke AttackMode
targetPosition = patrolWaypoints[currentWaypointIndex].position
LookAt(targetPosition)
MoveForward(patrolSpeed)
animator.SetBool("isPatrolling", true)

// Pengecekan transisi ke AttackMode


if DistanceToPlayer() < attackRange:
ChangeState(EnemyState.AttackMode)

// Pengecekan apakah sudah dekat dengan waypoint


if DistanceToTarget(targetPosition) < 0.1:
UpdateWaypoint()

method MoveToPlayer():
// Bergerak menuju pemain dan mengaktifkan animasi
LookAt(player.position)
MoveForward(attackSpeed)
animator.SetBool("isMovingToPlayer", true)

method CheckForAttackMode():
// Memeriksa apakah pemain dalam jangkauan untuk beralih ke
AttackMode
if DistanceToPlayer() < attackRange:
ChangeState(EnemyState.AttackMode)

method CheckForPatrol():
// Memeriksa apakah pemain di luar jangkauan untuk beralih kembali ke
Patrol
if DistanceToPlayer() > attackRange:
ChangeState(EnemyState.Patrol)

method CheckForAttacks():
// Memeriksa kesehatan untuk beralih antar state Attack
if currentHealth > 70%:
ChangeState(EnemyState.SpecialAttack)
else if currentHealth > 30%:
ChangeState(EnemyState.ComboAttack)
else if currentHealth > 0:
ChangeState(EnemyState.BasicAttack)
else:
ChangeState(EnemyState.Die)

method SpecialAttack():
// Logika SpecialAttack, mengaktifkan animasi dan mengurangkan
kesehatan pemain
animator.SetBool("isAttacking1", true)
playerHealth.TakeDamage(100)

// Pengecekan transisi ke ComboAttack


if currentHealth <= 70%:
animator.SetBool("isAttacking1", false)
ChangeState(EnemyState.ComboAttack)

method ComboAttack():
// Logika ComboAttack, mengaktifkan animasi dan mengurangkan
kesehatan pemain
animator.SetBool("isAttacking2", true)
playerHealth.TakeDamage(80)
// Pengecekan transisi ke BasicAttack
if currentHealth <= 30%:
animator.SetBool("isAttacking2", false)
ChangeState(EnemyState.BasicAttack)

method BasicAttack():
// Logika BasicAttack, mengaktifkan animasi dan mengurangkan
kesehatan pemain
animator.SetBool("isAttacking3", true)
playerHealth.TakeDamage(60)

method Die():
// Logika kematian, mengaktifkan animasi dan menghancurkan musuh
setelah animasi selesai
animator.SetBool("isDead", true)
Destroy(gameObject, GetAnimationLength("Death"))

method ChangeState(newState: EnemyState):


// Mengganti state dan mengatur ulang parameter animator
ResetAnimatorParameters()
currentState = newState

switch newState:
case EnemyState.Patrol:
// Implementasi logic untuk masuk ke dalam state Patrol
case EnemyState.AttackMode:
// Implementasi logic untuk masuk ke dalam state AttackMode
case EnemyState.SpecialAttack:
// Implementasi logic untuk masuk ke dalam state SpecialAttack
case EnemyState.ComboAttack:
// Implementasi logic untuk masuk ke dalam state ComboAttack
case EnemyState.BasicAttack:
// Implementasi logic untuk masuk ke dalam state BasicAttack
case EnemyState.Die:
// Implementasi logic untuk masuk ke dalam state Die

method ResetAnimatorParameters():
// Menonaktifkan semua parameter animasi
animator.SetBool("isPatrolling", false)
animator.SetBool("isMovingToPlayer", false)
animator.SetBool("isAttacking1", false)
animator.SetBool("isAttacking2", false)
animator.SetBool("isAttacking3", false)
animator.SetBool("isDead", false)

You might also like