/mob/verb/up() set name = "Move Upwards" set category = "IC" if(zMove(UP)) to_chat(src, "You move upwards.") /mob/verb/down() set name = "Move Down" set category = "IC" if(zMove(DOWN)) to_chat(src, "You move down.") /mob/proc/zMove(direction) if(eyeobj) return eyeobj.zMove(direction) if(!can_ztravel()) to_chat(src, "You lack means of travel in that direction.") return var/turf/start = loc if(!istype(start)) to_chat(src, "You are unable to move from here.") return 0 var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) if(!destination) to_chat(src, "There is nothing of interest in this direction.") return 0 if(!start.CanZPass(src, direction)) to_chat(src, "\The [start] is in the way.") return 0 if(!destination.CanZPass(src, direction)) to_chat(src, "\The [destination] blocks your way.") return 0 var/area/area = get_area(src) if(direction == UP && area.has_gravity) var/obj/structure/lattice/lattice = locate() in destination.contents if(lattice) var/pull_up_time = max(5 SECONDS + (src.movement_delay() * 10), 1) to_chat(src, "You grab \the [lattice] and start pulling yourself upward...") destination.audible_message("You hear something climbing up \the [lattice].") if(do_after(src, pull_up_time)) to_chat(src, "You pull yourself up.") else to_chat(src, "You gave up on pulling yourself up.") return 0 else to_chat(src, "Gravity stops you from moving upward.") return 0 for(var/atom/A in destination) if(!A.CanPass(src, start, 1.5, 0)) to_chat(src, "\The [A] blocks you.") return 0 Move(destination) return 1 /mob/observer/zMove(direction) var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) if(destination) forceMove(destination) else to_chat(src, "There is nothing of interest in this direction.") /mob/observer/eye/zMove(direction) var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) if(destination) setLoc(destination) else to_chat(src, "There is nothing of interest in this direction.") /mob/proc/can_ztravel() return 0 /mob/observer/can_ztravel() return 1 /mob/living/carbon/human/can_ztravel() if(incapacitated()) return 0 if(Process_Spacemove()) return 1 if(Check_Shoegrip()) //scaling hull with magboots for(var/turf/simulated/T in trange(1,src)) if(T.density) return 1 /mob/living/silicon/robot/can_ztravel() if(incapacitated() || is_dead()) return 0 if(Process_Spacemove()) //Checks for active jetpack return 1 for(var/turf/simulated/T in trange(1,src)) //Robots get "magboots" if(T.density) return 1 // TODO - Leshana Experimental //Execution by grand piano! /atom/movable/proc/get_fall_damage() return 42 //If atom stands under open space, it can prevent fall, or not /atom/proc/can_prevent_fall(var/atom/movable/mover, var/turf/coming_from) return (!CanPass(mover, coming_from)) //////////////////////////// //FALLING STUFF //Holds fall checks that should not be overriden by children /atom/movable/proc/fall() if(!isturf(loc)) return var/turf/below = GetBelow(src) if(!below) return var/turf/T = loc if(!T.CanZPass(src, DOWN) || !below.CanZPass(src, DOWN)) return // No gravity in space, apparently. var/area/area = get_area(src) if(!area.has_gravity()) return if(throwing) return if(can_fall()) handle_fall(below) // TODO - handle fall on damage! //For children to override /atom/movable/proc/can_fall() if(anchored) return FALSE // See if something in current turf prevents us from falling out of it // TODO - Make this more generic if(locate(/obj/structure/lattice, loc)) return FALSE if(locate(/obj/structure/catwalk, loc)) return FALSE // See if something in turf below prevents us from falling into it. // TODO - Investigate - Doesn't this actually check if these atoms would prevent moving up INTO our current location!? Granted thats probably the same thing but still... var/turf/below = GetBelow(src) for(var/atom/A in below) if(!A.CanPass(src, src.loc)) return FALSE return TRUE /obj/effect/can_fall() return FALSE /obj/effect/decal/cleanable/can_fall() return TRUE /obj/item/pipe/can_fall() . = ..() if(anchored) return FALSE var/turf/below = GetBelow(src) if((locate(/obj/structure/disposalpipe/up) in below) || locate(/obj/machinery/atmospherics/pipe/zpipe/up in below)) return FALSE /mob/living/simple_animal/parrot/can_fall() // Poly can fly. return FALSE /mob/living/simple_animal/hostile/carp/can_fall() // So can carp apparently. return FALSE /atom/movable/proc/handle_fall(var/turf/landing) // Say something before it falls! var/turf/oldloc = loc // Now lets move there! Move(landing) // Detect if we made a soft landing. // TODO - Do this less snowflaky than hard coding stairs! if(locate(/obj/structure/stairs) in landing) return 1 if(isopenspace(oldloc)) visible_message("\The [src] falls down through \the [landing]!", "You hear something falling through the air.") // TODO - Detect if it will stop here becuase it lands on a catwalk or something if(isopenspace(landing)) visible_message("\The [src] falls from the deck above through \the [landing]!", "You hear a whoosh of displaced air.") return 1 // Don't hit the open space - TODO-its not quite this simple ~Leshana else visible_message("\The [src] falls from the deck above and slams into \the [landing]!", "You hear something slam into the deck.") /mob/living/carbon/human/handle_fall(var/turf/landing) if(..()) return to_chat(src, "You fall off and hit \the [landing]!") playsound(loc, "punch", 25, 1, -1) var/damage = 15 // Because wounds heal rather quickly, 15 should be enough to discourage jumping off but not be enough to ruin you, at least for the first time. apply_damage(rand(0, damage), BRUTE, BP_HEAD) apply_damage(rand(0, damage), BRUTE, BP_TORSO) apply_damage(rand(0, damage), BRUTE, BP_L_LEG) apply_damage(rand(0, damage), BRUTE, BP_R_LEG) apply_damage(rand(0, damage), BRUTE, BP_L_ARM) apply_damage(rand(0, damage), BRUTE, BP_R_ARM) Weaken(4) updatehealth() // TODO - This is a hack until someone can think of a better way of solving it. // Issue is that blood splatter is New()'d already in the turf, so Entered() is never called. // Leshana - This should not be required anymore, we are handling items New()'d into turfs in the open space controller now // TODO - Test // /obj/effect/decal/cleanable/initialize() // if(isopenspace(loc)) // src.fall() // return ..()