FSM.gd 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. extends Node
  2. #
  3. signal enter_login
  4. signal exit_login
  5. signal enter_login_progress
  6. signal exit_login_progress
  7. signal enter_char
  8. signal exit_char
  9. signal enter_char_progress
  10. signal exit_char_progress
  11. signal enter_game
  12. signal exit_game
  13. #
  14. enum States { NONE = 0, LOGIN_SCREEN, LOGIN_PROGRESS, CHAR_SCREEN, CHAR_PROGRESS, IN_GAME, QUIT }
  15. enum Phases { ENTER = 0, UPDATE, EXIT }
  16. #
  17. var lastState : States = States.NONE
  18. var currentState : States = States.NONE
  19. var nextState : States = States.NONE
  20. #
  21. func GetPhase() -> Phases:
  22. if lastState != currentState:
  23. return Phases.ENTER
  24. elif currentState != nextState:
  25. return Phases.EXIT
  26. return Phases.UPDATE
  27. func IsLoginState() -> bool:
  28. return currentState == States.LOGIN_SCREEN or currentState == States.LOGIN_PROGRESS
  29. func IsCharacterState() -> bool:
  30. return currentState == States.CHAR_SCREEN or currentState == States.CHAR_PROGRESS
  31. func IsGameState() -> bool:
  32. return currentState == States.IN_GAME
  33. func EnterState(state : States):
  34. Util.PrintLog("Launcher", "Entering new FSM state: %s" % str(States.keys()[state]))
  35. nextState = state
  36. UpdateStates.call_deferred()
  37. #
  38. func UpdateStates():
  39. match currentState:
  40. States.LOGIN_SCREEN:
  41. match GetPhase():
  42. Phases.ENTER:
  43. enter_login.emit()
  44. Phases.EXIT:
  45. exit_login.emit()
  46. States.LOGIN_PROGRESS:
  47. match GetPhase():
  48. Phases.ENTER:
  49. enter_login_progress.emit()
  50. Phases.EXIT:
  51. exit_login_progress.emit()
  52. States.CHAR_SCREEN:
  53. match GetPhase():
  54. Phases.ENTER:
  55. enter_char.emit()
  56. Phases.EXIT:
  57. exit_char.emit()
  58. States.CHAR_PROGRESS:
  59. match GetPhase():
  60. Phases.ENTER:
  61. enter_char_progress.emit()
  62. Phases.EXIT:
  63. exit_char_progress.emit()
  64. States.IN_GAME:
  65. match GetPhase():
  66. Phases.ENTER:
  67. enter_game.emit()
  68. Phases.EXIT:
  69. exit_game.emit()
  70. States.QUIT:
  71. Launcher._quit()
  72. return
  73. lastState = currentState
  74. currentState = nextState
  75. if lastState != currentState or currentState != nextState:
  76. UpdateStates.call_deferred()