HexAI.gml 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. function enemy_hex_ai()
  2. {
  3. roll_spd = clamp(roll_spd, -20, 20);
  4. switch(state)
  5. {
  6. case "IDLE":
  7. enemy_roll_init();
  8. break;
  9. case "ROLL":
  10. rebounce_timer--;
  11. var _roll_spd;
  12. roll_angle *= global.time_scale;
  13. if abs(roll_angle + roll_spd) >= 60
  14. _roll_spd = (60 - abs(roll_angle)) * sign(roll_angle);
  15. else if sign(roll_angle) == -sign(roll_angle + roll_spd)
  16. _roll_spd = -roll_angle;
  17. else
  18. _roll_spd = roll_spd;
  19. if collision_line(x, y, x + 40 * sign(-_roll_spd), y, oParentSolid, false, false) != noone
  20. && rebounce_timer <= 0
  21. {
  22. roll_spd *= -1;
  23. rebounce_timer = 10;
  24. roll_acc *= -1;
  25. }
  26. roll_spd += roll_acc;
  27. if abs(roll_angle) == 60 || roll_angle == 0
  28. {
  29. roll_angle = 0;
  30. y = base_y;
  31. var _base_angle = (roll_spd > 0) ? 240 : 300;
  32. pivot_x = x + lengthdir_x(side_len, _base_angle);
  33. pivot_y = y + lengthdir_y(side_len, _base_angle);
  34. }
  35. roll_angle += _roll_spd;
  36. image_angle += _roll_spd;
  37. var _current_angle = point_direction(pivot_x, pivot_y, x, y);
  38. var _new_angle = _current_angle + _roll_spd;
  39. x = pivot_x + lengthdir_x(side_len, _new_angle);
  40. y = pivot_y + lengthdir_y(side_len, _new_angle);
  41. break;
  42. case "SPAWN":
  43. image_angle += abs(y_spd) * global.time_scale;
  44. x += x_spd * global.time_scale;
  45. y += y_spd * global.time_scale;
  46. if y_spd == 15
  47. {
  48. x_spd = 0;
  49. y_spd = 0;
  50. y_acc = 0;
  51. state = "IDLE";
  52. }
  53. y_spd += y_acc;
  54. break;
  55. }
  56. }
  57. function enemy_roll_init()
  58. {
  59. state = "ROLL";
  60. roll_spd = 5 * choose(-1, 1);
  61. roll_acc = -0.1 * sign(roll_spd);
  62. var _base_angle = (roll_spd > 0) ? 240 : 300;
  63. pivot_x = x + lengthdir_x(side_len, _base_angle);
  64. pivot_y = y + lengthdir_y(side_len, _base_angle);
  65. }
  66. function enemy_spawn_init()
  67. {
  68. y_spd = -15;
  69. x_spd = sign(global.player.x - x) * random_range(10, 15);
  70. y_acc = 0.6;
  71. state = "SPAWN";
  72. }