BossShowerheadAI.gml 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. function boss_showerhead_ai()
  2. {
  3. facing_x = sign(global.player.x - x);
  4. image_xscale = facing_x;
  5. switch(state)
  6. {
  7. case "SPAWN":
  8. state = "IDLE";
  9. idle_timer = 60;
  10. break;
  11. case "IDLE":
  12. if --idle_timer <= 0
  13. {
  14. var _next = attack_queue[attack_index];
  15. attack_index = (attack_index + 1) % array_length(attack_queue);
  16. switch(_next)
  17. {
  18. case 1:
  19. state = "WINDUP";
  20. set_sprite(sBossShowerheadWindup);
  21. break;
  22. case 2:
  23. state = "SLAM";
  24. set_sprite(sBossShowerheadSlam);
  25. break;
  26. case 3:
  27. state = "RETREAT";
  28. x_spd = -boss_side * retreat_spd;
  29. set_sprite(sBossShowerheadRetreat);
  30. break;
  31. }
  32. }
  33. break;
  34. case "WINDUP":
  35. if animation_end()
  36. {
  37. shoot_count = 0;
  38. state = "SHOOT";
  39. set_sprite(sBossShowerheadShoot);
  40. }
  41. break;
  42. case "SHOOT":
  43. if animation_end()
  44. {
  45. var _bomb = icl(oShowerheadBomb);
  46. _bomb.x_spd = facing_x * (8 + shoot_count * 2);
  47. _bomb.y_spd = -10;
  48. shoot_count++;
  49. if shoot_count >= 3
  50. {
  51. state = "IDLE";
  52. idle_timer = 60;
  53. set_sprite(sBossShowerheadIdle);
  54. }
  55. }
  56. break;
  57. case "SLAM":
  58. if animation_end()
  59. {
  60. // 生成预警线控制器
  61. var _warn = icl(oBossWarning);
  62. _warn.phase = phase;
  63. state = "IDLE";
  64. idle_timer = 60;
  65. set_sprite(sBossShowerheadIdle);
  66. }
  67. break;
  68. case "RETREAT":
  69. var _target = (boss_side == 1) ? anchor_l : anchor_r;
  70. if abs(x - _target) < abs(x_spd)
  71. {
  72. x = _target;
  73. x_spd = 0;
  74. state = "CHARGE";
  75. x_spd = boss_side * charge_spd;
  76. set_sprite(sBossShowerheadCharge);
  77. }
  78. break;
  79. case "CHARGE":
  80. var _target = (boss_side == 1) ? anchor_r : anchor_l;
  81. if abs(x - _target) < abs(x_spd)
  82. {
  83. x = _target;
  84. x_spd = 0;
  85. boss_side *= -1; // 换边
  86. state = "IDLE";
  87. idle_timer = 60;
  88. set_sprite(sBossShowerheadIdle);
  89. }
  90. break;
  91. }
  92. }