From c32fd8daaa3a8e2e52047c858f0343a9d26a3aaa Mon Sep 17 00:00:00 2001 From: AnturK Date: Tue, 5 Jan 2016 17:24:08 +0100 Subject: [PATCH 1/2] Fixes mechs using occupant spacemove --- code/game/mecha/mecha.dm | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 2c892b128a9..b550bc3ab2e 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -406,9 +406,31 @@ events.fireEvent("onMove",get_turf(src)) /obj/mecha/Process_Spacemove(var/movement_dir = 0) - if(occupant) - return occupant.Process_Spacemove(movement_dir) //We'll just say you used the clamp to grab the wall - return ..() + . = ..() + if(.) + return 1 + + var/atom/movable/dense_object_backup + for(var/atom/A in orange(1, get_turf(src))) + if(isarea(A)) + continue + else if(isturf(A)) + var/turf/turf = A + if(!turf.density) + continue + return 1 + else + var/atom/movable/AM = A + if(!AM.CanPass(src) || AM.density) + if(AM.anchored) + return 1 + dense_object_backup = AM + + if(movement_dir && dense_object_backup) + if(dense_object_backup.newtonian_move(turn(movement_dir, 180))) + if(occupant) + occupant << "You push off of [dense_object_backup] to propel yourself." + return 1 /obj/mecha/relaymove(mob/user,direction) if(!direction) From 8b1b75258be281857c96665db38d7d5dbd66c850 Mon Sep 17 00:00:00 2001 From: AnturK Date: Wed, 6 Jan 2016 20:41:37 +0100 Subject: [PATCH 2/2] Offloads finding backup to atom/movable proc --- code/game/atoms_movable.dm | 20 ++++++++++++++++++++ code/game/mecha/mecha.dm | 26 ++++++-------------------- code/modules/mob/mob_movement.dm | 29 +++++++++++++---------------- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index a3c326abfa1..fe2a2e34cbc 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -295,3 +295,23 @@ if(buckled_mob == mover) return 1 return ..() + + +/atom/movable/proc/get_spacemove_backup() + var/atom/movable/dense_object_backup + for(var/A in orange(1, get_turf(src))) + if(isarea(A)) + continue + else if(isturf(A)) + var/turf/turf = A + if(!turf.density) + continue + return turf + else + var/atom/movable/AM = A + if(!AM.CanPass(src) || AM.density) + if(AM.anchored) + return AM + dense_object_backup = AM + break + . = dense_object_backup \ No newline at end of file diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index b550bc3ab2e..a664b6227c5 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -410,26 +410,12 @@ if(.) return 1 - var/atom/movable/dense_object_backup - for(var/atom/A in orange(1, get_turf(src))) - if(isarea(A)) - continue - else if(isturf(A)) - var/turf/turf = A - if(!turf.density) - continue - return 1 - else - var/atom/movable/AM = A - if(!AM.CanPass(src) || AM.density) - if(AM.anchored) - return 1 - dense_object_backup = AM - - if(movement_dir && dense_object_backup) - if(dense_object_backup.newtonian_move(turn(movement_dir, 180))) - if(occupant) - occupant << "You push off of [dense_object_backup] to propel yourself." + var/atom/movable/backup = get_spacemove_backup() + if(backup) + if(istype(backup) && movement_dir && !!backup.anchored) + if(backup.newtonian_move(turn(movement_dir, 180))) + if(occupant) + occupant << "You push off of [backup] to propel yourself." return 1 /obj/mecha/relaymove(mob/user,direction) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 76d5f7d8cd8..a73108f2f6a 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -305,43 +305,40 @@ ///For moving in space ///Return 1 for movement 0 for none /mob/Process_Spacemove(movement_dir = 0) - if(..()) return 1 + var/atom/movable/backup = get_spacemove_backup() + if(backup) + if(istype(backup) && movement_dir && !backup.anchored) + if(backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves + src << "You push off of [backup] to propel yourself." + return 1 + return 0 +/mob/get_spacemove_backup() var/atom/movable/dense_object_backup - for(var/atom/A in orange(1, get_turf(src))) + for(var/A in orange(1, get_turf(src))) if(isarea(A)) continue - else if(isturf(A)) var/turf/turf = A if(istype(turf,/turf/space)) continue - if(!turf.density && !mob_negates_gravity()) continue - - return 1 - + return A else var/atom/movable/AM = A if(AM == buckled) //Kind of unnecessary but let's just be sure continue if(!AM.CanPass(src) || AM.density) if(AM.anchored) - return 1 + return AM if(pulling == AM) continue dense_object_backup = AM - - if(movement_dir && dense_object_backup) - if(dense_object_backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves - src << "You push off of [dense_object_backup] to propel yourself." - - - return 1 - return 0 + break + . = dense_object_backup /mob/proc/mob_has_gravity(turf/T) return has_gravity(src, T)