Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //hit_player.gml
- if(my_hitboxID.attack == AT_USPECIAL){
- old_hsp = -2;old_vsp = -8;
- window = 4;window_timer = 0;destroy_hitboxes();
- }
- //init.gml
- upb_angle = 0;
- upbhit = noone;
- upbhit2 = noone;
- //attack_update.gml REPLACE OLD USPEC CODE
- else if(attack == AT_USPECIAL){
- can_move = false;
- if(window != 3){
- fall_through = true;
- }else{
- fall_through = false;
- }
- if(window == 3){
- can_wall_jump = true;
- }
- if(window == 1 && !hitpause){
- hsp = 0;vsp = 0;
- if(window_timer == 1)move_cooldown[AT_USPECIAL] = 999;
- if (vsp > 0 && y > get_stage_data(SD_BOTTOM_BLASTZONE) - 20) vsp = 0;
- upb_angle = 0;
- if(!joy_pad_idle){
- upb_angle = round(joy_dir/5)*5;
- }else{
- upb_angle = 90;
- }if(upb_angle < 90 && upb_angle > 0 || upb_angle > 270){
- spr_dir = 1;
- }else if(upb_angle > 90 && upb_angle < 270){
- spr_dir = -1;
- }
- if(spr_dir == 1){
- set_hitbox_value(AT_USPECIAL, 1, HG_HITBOX_X, lengthdir_x(40,upb_angle));
- set_hitbox_value(AT_USPECIAL, 1, HG_HITBOX_Y, lengthdir_y(40,upb_angle));
- set_hitbox_value(AT_USPECIAL, 2, HG_HITBOX_X, lengthdir_x(40,upb_angle));
- set_hitbox_value(AT_USPECIAL, 2, HG_HITBOX_Y, lengthdir_y(40,upb_angle));
- }else{
- set_hitbox_value(AT_USPECIAL, 1, HG_HITBOX_X, lengthdir_x(40,180-upb_angle));
- set_hitbox_value(AT_USPECIAL, 1, HG_HITBOX_Y, lengthdir_y(40,180-upb_angle));
- set_hitbox_value(AT_USPECIAL, 2, HG_HITBOX_X, lengthdir_x(40,180-upb_angle));
- set_hitbox_value(AT_USPECIAL, 2, HG_HITBOX_Y, lengthdir_y(40,180-upb_angle));
- }
- if(window_timer < 6){
- 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
- }
- }
- if(window == 2 && !hitpause){
- if(window_timer == 1){
- upbhit = create_hitbox(AT_USPECIAL,2,x,y);upbhit2 = create_hitbox(AT_USPECIAL,1,x,y);
- }
- hsp = lengthdir_x(12, upb_angle);
- vsp = lengthdir_y(12, upb_angle);
- if(spr_dir == 1){
- spr_angle = upb_angle;
- }else{
- spr_angle = upb_angle-180;
- }
- }
- if(window == 3){
- hsp *= .92;vsp *= .92;
- if(window_timer == 19)spr_angle = 0;
- if(spr_angle > 180){
- spr_angle = ease_linear(round(spr_angle), round(360), 10, 20);
- }else{
- spr_angle = ease_linear(round(spr_angle), round(0), 10, 20);
- }
- }
- if(window == 4 && !hitpause){
- if(window_timer == 13)spr_angle = 0;
- if(spr_angle > 180){
- spr_angle = ease_linear(round(spr_angle), round(360), 10, 20);
- }else{
- spr_angle = ease_linear(round(spr_angle), round(0), 10, 20);
- }
- }
- if(window == 2 || window == 3 && window_timer <= 6){
- if(vsp > 1 && place_meeting(x,y+10,asset_get("par_block"))){
- window = 4;
- if(vsp < 4){
- vsp = -6;
- }else {
- vsp = -vsp*1.1;
- }
- shake_camera(5, 3);sound_play(asset_get("sfx_blow_heavy1"));destroy_hitboxes();
- }
- }
- if(instance_exists(upbhit)){
- if(abs(hsp) > abs(vsp)){ //horizontal
- if(hsp > 0 && spr_dir == 1 || hsp < 0 && spr_dir == -1){
- upbhit.kb_angle = 45;
- if (instance_exists(upbhit2)){
- upbhit2.kb_angle = 45;
- }
- }else{
- upbhit.kb_angle = 135;
- if (instance_exists(upbhit2)){
- upbhit2.kb_angle = 135;
- }
- }
- }else{ //vertical
- if(vsp < 0){
- upbhit.kb_angle = 90;
- if (instance_exists(upbhit2)){
- upbhit2.kb_angle = 90;
- }
- }else{
- upbhit.kb_angle = 270;
- if (instance_exists(upbhit2)){
- upbhit2.kb_angle = 270;
- }
- }
- }
- if(upbhit.kb_angle == 270){ //nerf the knockback if it spikes lol
- upbhit.kb_value = 4;upbhit.kb_scale = .4;
- if (instance_exists(upbhit2)){
- upbhit2.kb_value = 6;upbhit2.kb_scale = .6;
- }
- }else{
- upbhit.kb_value = get_hitbox_value(AT_USPECIAL, 2, HG_BASE_KNOCKBACK);upbhit.kb_scale = get_hitbox_value(AT_USPECIAL, 2, HG_KNOCKBACK_SCALING);
- if (instance_exists(upbhit2)){
- upbhit2.kb_value = get_hitbox_value(AT_USPECIAL, 1, HG_BASE_KNOCKBACK);upbhit2.kb_scale = get_hitbox_value(AT_USPECIAL, 1, HG_KNOCKBACK_SCALING);
- }
- }
- }
- if(!snapped_to_ledge){
- snapped_to_ledge = ledge_snap();
- }
- }
- //Put above other atatck_update.gml defines at the bottom of the script!
- #define ledge_snap
- //allows a moving attack to snap onto and over the ledge without getting caught,
- // similar to Maypul and Orcane's Forward-Specials.
- // returns 'true' when the attack successfully snaps over a ledge
- //code example by Mawral - free to use without credit.
- var step = 32; //the maximum distance to move up from the ledge. must be a power of 2. '16' or '32' is recommended.
- var xx = x + (spr_dir*4); //use 'xx = x - spr_dir' if the attack moves backwards.
- //check if there is a ledge ahead. if there is not, return 'false' and end the script.
- var par_block = asset_get("par_block");
- if (!place_meeting(xx, y, par_block) || place_meeting(xx, y - step, par_block)) return false;
- //move the player onto and above the ledge.
- X = xx;
- y -= step;
- //then, move downwards as far as possible without cutting into the stage.
- for (step /= 2; step >= 1; step /= 2) {
- if (!place_meeting(x, y + step/4, par_block)) y += step/4;
- }
- //ledge snap successful. return 'true'.
- return true;
Add Comment
Please, Sign In to add comment