BossShowerheadAI.gml 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. function boss_showerhead_ai()
  2. {
  3. image_xscale = -boss_side;
  4. switch(state)
  5. {
  6. case "SPAWN":
  7. if animation_end()
  8. {
  9. for(var i = 0; i < 5; i++)
  10. icd(oShockwave, x, y, 0, {delay : i * 10});
  11. screen_shake(20);
  12. state = "IDLE";
  13. idle_timer = 60;
  14. }
  15. break;
  16. case "WINDUP":
  17. if animation_end()
  18. {
  19. shoot_count = 0;
  20. state = "SHOOT";
  21. set_sprite(sBossShowerheadShoot);
  22. }
  23. break;
  24. case "SHOOT":
  25. if animation_end()
  26. {
  27. var _bomb = icl(oShowerheadBomb, x, y - 64);
  28. _bomb.x_spd = -boss_side * (4 - shoot_count * 1.5);
  29. _bomb.y_spd = -10;
  30. image_index = 0;
  31. if ++shoot_count >= 3
  32. {
  33. state = "IDLE";
  34. idle_timer = 60;
  35. set_sprite(sBossShowerheadIdle);
  36. }
  37. }
  38. break;
  39. case "SLAM":
  40. if animation_end()
  41. {
  42. var _sep = 240;
  43. var _start = irandom(_sep - 1);
  44. var _x = _start;
  45. while _x < room_width
  46. {
  47. icl(oShowerheadColumn, _x, room_height);
  48. _x += _sep;
  49. }
  50. screen_shake(10);
  51. state = "IDLE";
  52. idle_timer = 60;
  53. set_sprite(sBossShowerheadIdle);
  54. }
  55. break;
  56. case "IDLE":
  57. if --idle_timer <= 0
  58. {
  59. var _next = attack_queue[attack_index];
  60. attack_index = (attack_index + 1) % array_length(attack_queue);
  61. switch(_next)
  62. {
  63. case 1:
  64. state = "WINDUP";
  65. set_sprite(sBossShowerheadWindup);
  66. break;
  67. case 2:
  68. state = "SLAM";
  69. set_sprite(sBossShowerheadSlam);
  70. break;
  71. case 3:
  72. x_spd = boss_side * retreat_spd;
  73. state = "RETREAT";
  74. set_sprite(sBossShowerheadRetreat);
  75. break;
  76. }
  77. }
  78. break;
  79. case "RETREAT":
  80. var _target = (boss_side == 1) ? anchor_r + 128 : anchor_l - 128;
  81. if (boss_side == 1 && x >= _target) || (boss_side == -1 && x <= _target)
  82. {
  83. x = _target;
  84. x_spd = -boss_side * charge_spd;
  85. state = "CHARGE";
  86. set_sprite(sBossShowerheadCharge);
  87. }
  88. break;
  89. case "CHARGE":
  90. var _target = (boss_side == 1) ? anchor_l : anchor_r;
  91. if (boss_side == 1 && x <= _target) || (boss_side == -1 && x >= _target)
  92. {
  93. x = _target;
  94. x_spd = 0;
  95. boss_side *= -1;
  96. state = "IDLE";
  97. idle_timer = 60;
  98. set_sprite(sBossShowerheadIdle);
  99. }
  100. break;
  101. }
  102. }