ShowerheadAI.gml 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. function enemy_showerhead_ai()
  2. {
  3. facing_x = sign(global.player.x - x);
  4. image_xscale = facing_x;
  5. var _margin = 320;
  6. var _sink_wait = (global.player.x < _margin || global.player.x > room_width - _margin);
  7. switch(state)
  8. {
  9. case "WAIT":
  10. if _sink_wait
  11. wake_timer = irandom(60);
  12. else if --wake_timer <= 0
  13. {
  14. x = global.player.x + choose(-1, 1) * irandom_range(160, 192);
  15. state = "EMERGE";
  16. y_spd = -15;
  17. set_sprite(sEnemyShowerheadEmerge);
  18. }
  19. break;
  20. case "IDLE":
  21. if --idle_timer <= 0
  22. {
  23. state = nxt_state;
  24. if state == "RETREAT"
  25. {
  26. x_spd = -facing_x * 10;
  27. set_sprite(sEnemyShowerheadRetreat);
  28. }
  29. else if state == "SINK"
  30. {
  31. y_spd = 15;
  32. set_sprite(sEnemyShowerheadSink);
  33. }
  34. else if state == "CHARGE"
  35. {
  36. x_spd = facing_x * 30;
  37. set_sprite(sEnemyShowerheadCharge);
  38. }
  39. }
  40. break;
  41. case "SINK":
  42. if animation_end()
  43. {
  44. state = "WAIT";
  45. y_spd = 0;
  46. }
  47. break;
  48. case "EMERGE":
  49. if animation_end()
  50. {
  51. y_spd = 0;
  52. set_sprite(sEnemyShowerheadIdle);
  53. idle_timer = 40;
  54. state = "IDLE";
  55. nxt_state = "RETREAT";
  56. }
  57. break;
  58. case "RETREAT":
  59. if animation_end()
  60. {
  61. x_spd = 0;
  62. idle_timer = 6;
  63. state = "IDLE";
  64. nxt_state = "CHARGE";
  65. }
  66. break;
  67. case "CHARGE":
  68. if animation_end()
  69. {
  70. x_spd = 0;
  71. idle_timer = 40;
  72. state = "IDLE";
  73. nxt_state = "SINK";
  74. set_sprite(sEnemyShowerheadIdle);
  75. }
  76. }
  77. }