ShowerheadAI.gml 1.6 KB

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