Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- case AT_USPECIAL: //double teleport
- var tele_distance = 150;
- if window != 5 {
- can_move = false;
- }
- switch window {
- case 1:
- if window_timer == 1 {
- set_window_value(attack, 5, AG_WINDOW_TYPE, 7); //window 5 is the last window
- }
- if window_timer == get_window_value(attack, window, AG_WINDOW_LENGTH) {
- current_angle = joy_dir; //current_angle is being reused from previous code, it's just where you're aiming
- target_x = x + lengthdir_x(tele_distance,current_angle); //figure out where we're gonna go
- target_y = y + lengthdir_y(tele_distance,current_angle);
- }
- break;
- case 2:
- visible = false;
- invincible = true;
- if window_timer == 2 {
- //time to make sure it's actually a reasonable location
- var object_colliding = place_meeting(target_x,target_y,all);
- if object_colliding != oPlayer && object_colliding != noone && object_colliding != asset_get("par_fallthrough") && !place_free(target_x,target_y) { //if it isn't a player or platform and it isn't nothing, it's solid
- }
- else {
- x = target_x;
- y = target_y;
- }
- }
- break;
- case 3:
- visible = true;
- invincible = false;
- if window_timer == get_window_value(attack, window, AG_WINDOW_LENGTH) {
- current_angle = joy_dir;
- target_x = x + lengthdir_x(tele_distance,current_angle); //figure out where we're gonna go
- target_y = y + lengthdir_y(tele_distance,current_angle);
- //make sure location is reasonable
- if place_meeting(target_x,target_y,asset_get("par_block")) || position_meeting(target_x,target_y,asset_get("obj_article_solid")) {
- //if we collide with a solid object at the given position, store its type in object_colliding for a collision test a few lines down
- var object_colliding;
- if place_meeting(target_x,target_y,asset_get("par_block")) {
- object_colliding = asset_get("par_block");
- }
- else if place_meeting(target_x,target_y,asset_get("obj_article_solid")) {
- object_colliding = asset_get("obj_article_solid");
- }
- var collision_lenience = 70;
- for (var i = 0; i < collision_lenience; i++) {
- if !place_meeting(target_x,target_y - i, object_colliding) { //if this new spot is not inside the colliding object
- target_y = target_y - i;
- print_debug("putting player at new offset x = " + string(target_x) + ", y = " + string(target_y) + "!");
- break; //end the loop early
- }
- else if (i == collision_lenience - 1) { //if we're at the end of the loop and there is still a collision happening
- print_debug("i == " + string(i));
- var line_length_r = 0;
- var line_length_l = 0;
- var final_x_offset = 0;
- var y_bump_offset = collision_lenience - 1; //distance to bump the player up when not putting them on the floor
- var r_check_done = false;
- var l_check_done = false;
- for (var p = 0; p >= 0; p++) { //infinite loop, this is probably a bad idea
- if (!place_meeting(target_x + p, target_y, object_colliding) && !r_check_done) {
- line_length_r = p;
- r_check_done = true;
- print_debug("right check success! distance = " + string(line_length_r) + "!");
- }
- if (!place_meeting(target_x - p, target_y, object_colliding) && !l_check_done) {
- line_length_l = p;
- l_check_done = true;
- print_debug("left check success! distance = " + string(line_length_l) + "!");
- }
- if r_check_done || l_check_done { //&& is more stable(?) but runs a lot of unnecessary math
- break;
- }
- if p > room_width {
- break; //if we somehow checked collision way outside even the width of the stage, we should probably stop cause this cant be right
- print_debug("something went wrong on the collision check!");
- print_debug("left line length: " + string(line_length_l));
- print_debug("right line length: " + string(line_length_r));
- }
- }
- //final_x_offset = line_length_r < line_length_l ? line_length_r : (line_length_l)*(-1); //if length r is longer, the final offset should be r, if not, it should be l
- final_x_offset = r_check_done >= l_check_done ? line_length_r : line_length_l*(-1);
- if (line_length_l == line_length_r) {
- final_x_offset = 0;
- }
- target_x += final_x_offset; //adjust x to be outside the collision
- target_y -= y_bump_offset;
- break; //ending the loop, just to be safe
- }
- }
- }
- }
- break;
- case 4:
- visible = false;
- invincible = true;
- if window_timer == 3 {
- x = target_x;
- y = target_y;
- }
- break;
- case 5:
- visible = true;
- invincible = false;
- break;
- }
- break;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement