Advertisement
madman404

teleport code example (not copy-pastable)

Oct 18th, 2020
3,489
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. case AT_USPECIAL: //double teleport
  2.         var tele_distance = 150;
  3.         if window != 5 {
  4.             can_move = false;
  5.         }
  6.         switch window {
  7.             case 1:
  8.                 if window_timer == 1 {
  9.                     set_window_value(attack, 5, AG_WINDOW_TYPE, 7); //window 5 is the last window
  10.                 }
  11.                 if window_timer == get_window_value(attack, window, AG_WINDOW_LENGTH) {
  12.                     current_angle = joy_dir; //current_angle is being reused from previous code, it's just where you're aiming
  13.                     target_x = x + lengthdir_x(tele_distance,current_angle); //figure out where we're gonna go
  14.                     target_y = y + lengthdir_y(tele_distance,current_angle);
  15.                 }
  16.             break;
  17.             case 2:
  18.                 visible = false;
  19.                 invincible = true;
  20.                 if window_timer == 2 {
  21.                     //time to make sure it's actually a reasonable location
  22.                     var object_colliding = place_meeting(target_x,target_y,all);
  23.                     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
  24.  
  25.                     }
  26.                     else {
  27.                         x = target_x;
  28.                         y = target_y;
  29.                     }
  30.                 }
  31.             break;
  32.             case 3:
  33.                 visible = true;
  34.                 invincible = false;
  35.                 if window_timer == get_window_value(attack, window, AG_WINDOW_LENGTH) {
  36.                     current_angle = joy_dir;
  37.                     target_x = x + lengthdir_x(tele_distance,current_angle); //figure out where we're gonna go
  38.                     target_y = y + lengthdir_y(tele_distance,current_angle);
  39.                     //make sure location is reasonable
  40.                     if place_meeting(target_x,target_y,asset_get("par_block")) || position_meeting(target_x,target_y,asset_get("obj_article_solid")) {
  41.                         //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
  42.                         var object_colliding;
  43.                         if place_meeting(target_x,target_y,asset_get("par_block")) {
  44.                             object_colliding = asset_get("par_block");
  45.                         }
  46.                         else if place_meeting(target_x,target_y,asset_get("obj_article_solid")) {
  47.                             object_colliding = asset_get("obj_article_solid");
  48.                         }
  49.                         var collision_lenience = 70;
  50.                         for (var i = 0; i < collision_lenience; i++) {
  51.                             if !place_meeting(target_x,target_y - i, object_colliding) { //if this new spot is not inside the colliding object
  52.                                 target_y = target_y - i;
  53.                                 print_debug("putting player at new offset x = " + string(target_x) + ", y = " + string(target_y) + "!");
  54.                                 break; //end the loop early
  55.                             }
  56.                             else if (i == collision_lenience - 1) { //if we're at the end of the loop and there is still a collision happening
  57.                                 print_debug("i == " + string(i));
  58.                                
  59.                                 var line_length_r = 0;
  60.                                 var line_length_l = 0;
  61.                                 var final_x_offset = 0;
  62.                                 var y_bump_offset = collision_lenience - 1; //distance to bump the player up when not putting them on the floor
  63.                                 var r_check_done = false;
  64.                                 var l_check_done = false;
  65.                                 for (var p = 0; p >= 0; p++) { //infinite loop, this is probably a bad idea
  66.                                     if (!place_meeting(target_x + p, target_y, object_colliding) && !r_check_done) {
  67.                                         line_length_r = p;
  68.                                         r_check_done = true;
  69.                                         print_debug("right check success! distance = " + string(line_length_r) + "!");
  70.                                     }
  71.                                     if (!place_meeting(target_x - p, target_y, object_colliding) && !l_check_done) {
  72.                                         line_length_l = p;
  73.                                         l_check_done = true;
  74.                                         print_debug("left check success! distance = " + string(line_length_l) + "!");
  75.                                     }
  76.                                     if r_check_done || l_check_done { //&& is more stable(?) but runs a lot of unnecessary math
  77.                                         break;
  78.                                     }
  79.                                     if p > room_width {
  80.                                         break; //if we somehow checked collision way outside even the width of the stage, we should probably stop cause this cant be right
  81.                                         print_debug("something went wrong on the collision check!");
  82.                                         print_debug("left line length: " + string(line_length_l));
  83.                                         print_debug("right line length: " + string(line_length_r));
  84.                                     }
  85.                                 }
  86.                                 //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
  87.                                 final_x_offset = r_check_done >= l_check_done ? line_length_r : line_length_l*(-1);
  88.                                 if (line_length_l == line_length_r) {
  89.                                     final_x_offset = 0;
  90.                                 }
  91.                                 target_x += final_x_offset; //adjust x to be outside the collision
  92.                                 target_y -= y_bump_offset;
  93.                                 break; //ending the loop, just to be safe
  94.                             }
  95.                         }
  96.  
  97.                     }
  98.                 }
  99.             break;
  100.             case 4:
  101.                 visible = false;
  102.                 invincible = true;
  103.                 if window_timer == 3 {
  104.                     x = target_x;
  105.                     y = target_y;
  106.                 }
  107.             break;
  108.             case 5:
  109.                 visible = true;
  110.                 invincible = false;
  111.             break;
  112.         }
  113.     break;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement