Dongt

flow

Jul 7th, 2023 (edited)
7
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.40 KB | None | 0 0
  1. //hit_player.gml
  2. if(my_hitboxID.attack == AT_USPECIAL){
  3. old_hsp = -2;old_vsp = -8;
  4. window = 4;window_timer = 0;destroy_hitboxes();
  5. }
  6.  
  7. //init.gml
  8. upb_angle = 0;
  9. upbhit = noone;
  10. upbhit2 = noone;
  11.  
  12. //attack_update.gml REPLACE OLD USPEC CODE
  13. else if(attack == AT_USPECIAL){
  14. can_move = false;
  15. if(window != 3){
  16. fall_through = true;
  17. }else{
  18. fall_through = false;
  19. }
  20. if(window == 3){
  21. can_wall_jump = true;
  22. }
  23. if(window == 1 && !hitpause){
  24. hsp = 0;vsp = 0;
  25. if(window_timer == 1)move_cooldown[AT_USPECIAL] = 999;
  26. if (vsp > 0 && y > get_stage_data(SD_BOTTOM_BLASTZONE) - 20) vsp = 0;
  27. upb_angle = 0;
  28. if(!joy_pad_idle){
  29. upb_angle = round(joy_dir/5)*5;
  30. }else{
  31. upb_angle = 90;
  32. }if(upb_angle < 90 && upb_angle > 0 || upb_angle > 270){
  33. spr_dir = 1;
  34. }else if(upb_angle > 90 && upb_angle < 270){
  35. spr_dir = -1;
  36. }
  37. if(spr_dir == 1){
  38. set_hitbox_value(AT_USPECIAL, 1, HG_HITBOX_X, lengthdir_x(40,upb_angle));
  39. set_hitbox_value(AT_USPECIAL, 1, HG_HITBOX_Y, lengthdir_y(40,upb_angle));
  40. set_hitbox_value(AT_USPECIAL, 2, HG_HITBOX_X, lengthdir_x(40,upb_angle));
  41. set_hitbox_value(AT_USPECIAL, 2, HG_HITBOX_Y, lengthdir_y(40,upb_angle));
  42. }else{
  43. set_hitbox_value(AT_USPECIAL, 1, HG_HITBOX_X, lengthdir_x(40,180-upb_angle));
  44. set_hitbox_value(AT_USPECIAL, 1, HG_HITBOX_Y, lengthdir_y(40,180-upb_angle));
  45. set_hitbox_value(AT_USPECIAL, 2, HG_HITBOX_X, lengthdir_x(40,180-upb_angle));
  46. set_hitbox_value(AT_USPECIAL, 2, HG_HITBOX_Y, lengthdir_y(40,180-upb_angle));
  47. }
  48. if(window_timer < 6){
  49. if(hsp*spr_dir < 0 && (spr_dir == 1 && right_down || spr_dir == -1 && left_down))hsp *= 0.5;//if moving backwards and the player is holding forward, slow down the hsp
  50. }
  51. }
  52. if(window == 2 && !hitpause){
  53. if(window_timer == 1){
  54. upbhit = create_hitbox(AT_USPECIAL,2,x,y);upbhit2 = create_hitbox(AT_USPECIAL,1,x,y);
  55. }
  56. hsp = lengthdir_x(12, upb_angle);
  57. vsp = lengthdir_y(12, upb_angle);
  58. if(spr_dir == 1){
  59. spr_angle = upb_angle;
  60. }else{
  61. spr_angle = upb_angle-180;
  62. }
  63. }
  64. if(window == 3){
  65. hsp *= .92;vsp *= .92;
  66. if(window_timer == 19)spr_angle = 0;
  67. if(spr_angle > 180){
  68. spr_angle = ease_linear(round(spr_angle), round(360), 10, 20);
  69. }else{
  70. spr_angle = ease_linear(round(spr_angle), round(0), 10, 20);
  71. }
  72. }
  73. if(window == 4 && !hitpause){
  74. if(window_timer == 13)spr_angle = 0;
  75. if(spr_angle > 180){
  76. spr_angle = ease_linear(round(spr_angle), round(360), 10, 20);
  77. }else{
  78. spr_angle = ease_linear(round(spr_angle), round(0), 10, 20);
  79. }
  80. }
  81. if(window == 2 || window == 3 && window_timer <= 6){
  82. if(vsp > 1 && place_meeting(x,y+10,asset_get("par_block"))){
  83. window = 4;
  84. if(vsp < 4){
  85. vsp = -6;
  86. }else {
  87. vsp = -vsp*1.1;
  88. }
  89. shake_camera(5, 3);sound_play(asset_get("sfx_blow_heavy1"));destroy_hitboxes();
  90. }
  91. }
  92. if(instance_exists(upbhit)){
  93. if(abs(hsp) > abs(vsp)){ //horizontal
  94. if(hsp > 0 && spr_dir == 1 || hsp < 0 && spr_dir == -1){
  95. upbhit.kb_angle = 45;
  96. if (instance_exists(upbhit2)){
  97. upbhit2.kb_angle = 45;
  98. }
  99. }else{
  100. upbhit.kb_angle = 135;
  101. if (instance_exists(upbhit2)){
  102. upbhit2.kb_angle = 135;
  103. }
  104. }
  105. }else{ //vertical
  106. if(vsp < 0){
  107. upbhit.kb_angle = 90;
  108. if (instance_exists(upbhit2)){
  109. upbhit2.kb_angle = 90;
  110. }
  111. }else{
  112. upbhit.kb_angle = 270;
  113. if (instance_exists(upbhit2)){
  114. upbhit2.kb_angle = 270;
  115. }
  116. }
  117. }
  118. if(upbhit.kb_angle == 270){ //nerf the knockback if it spikes lol
  119. upbhit.kb_value = 4;upbhit.kb_scale = .4;
  120. if (instance_exists(upbhit2)){
  121. upbhit2.kb_value = 6;upbhit2.kb_scale = .6;
  122. }
  123. }else{
  124. upbhit.kb_value = get_hitbox_value(AT_USPECIAL, 2, HG_BASE_KNOCKBACK);upbhit.kb_scale = get_hitbox_value(AT_USPECIAL, 2, HG_KNOCKBACK_SCALING);
  125. if (instance_exists(upbhit2)){
  126. upbhit2.kb_value = get_hitbox_value(AT_USPECIAL, 1, HG_BASE_KNOCKBACK);upbhit2.kb_scale = get_hitbox_value(AT_USPECIAL, 1, HG_KNOCKBACK_SCALING);
  127. }
  128. }
  129. }
  130. if(!snapped_to_ledge){
  131. snapped_to_ledge = ledge_snap();
  132. }
  133. }
  134. //Put above other atatck_update.gml defines at the bottom of the script!
  135. #define ledge_snap
  136. //allows a moving attack to snap onto and over the ledge without getting caught,
  137. // similar to Maypul and Orcane's Forward-Specials.
  138. // returns 'true' when the attack successfully snaps over a ledge
  139. //code example by Mawral - free to use without credit.
  140.  
  141. var step = 32; //the maximum distance to move up from the ledge. must be a power of 2. '16' or '32' is recommended.
  142. var xx = x + (spr_dir*4); //use 'xx = x - spr_dir' if the attack moves backwards.
  143.  
  144. //check if there is a ledge ahead. if there is not, return 'false' and end the script.
  145. var par_block = asset_get("par_block");
  146. if (!place_meeting(xx, y, par_block) || place_meeting(xx, y - step, par_block)) return false;
  147.  
  148.  
  149. //move the player onto and above the ledge.
  150. X = xx;
  151. y -= step;
  152. //then, move downwards as far as possible without cutting into the stage.
  153. for (step /= 2; step >= 1; step /= 2) {
  154. if (!place_meeting(x, y + step/4, par_block)) y += step/4;
  155. }
  156. //ledge snap successful. return 'true'.
  157. return true;
Add Comment
Please, Sign In to add comment