From 4f3938d68b0674ae1fce6fa7509b5a274ea11a9a Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Thu, 24 Sep 2015 15:52:10 -0700 Subject: [PATCH 1/3] -tg- buckling system This commit overhauls a bunch of systems so that buckling works for any subtype of /obj. This means that space vines and chairs and beds all use the same system. A lot of stuff has been touched. --- code/ATMOSPHERICS/atmospherics.dm | 50 ++--- code/ATMOSPHERICS/pipes/pipe.dm | 15 +- .../pipes/simple/pipe_simple_he.dm | 46 +++- code/_onclick/click.dm | 11 +- code/datums/helper_datums/teleport.dm | 2 +- code/datums/spells/area_teleport.dm | 2 +- code/datums/spells/ethereal_jaunt.dm | 4 +- code/game/atoms.dm | 3 + .../shadowling/shadowling_abilities.dm | 2 +- code/game/gamemodes/vampire/vampire_powers.dm | 8 +- code/game/objects/buckling.dm | 100 +++++++++ .../items/weapons/implants/implantfreedom.dm | 2 + code/game/objects/items/weapons/scrolls.dm | 2 +- code/game/objects/items/weapons/tools.dm | 20 +- code/game/objects/structures.dm | 7 +- code/game/objects/structures/janicart.dm | 56 +++-- code/game/objects/structures/segway.dm | 80 +++---- .../stool_bed_chair_nest/alien_nests.dm | 110 +++++----- .../structures/stool_bed_chair_nest/bed.dm | 199 +++++------------- .../structures/stool_bed_chair_nest/chairs.dm | 29 +-- .../structures/stool_bed_chair_nest/stools.dm | 4 +- .../stool_bed_chair_nest/wheelchair.dm | 16 +- code/game/turfs/turf.dm | 7 + .../modules/clothing/spacesuits/chronosuit.dm | 2 +- .../hydroponics/spreading/spreading.dm | 1 - .../spreading/spreading_response.dm | 38 +--- code/modules/mob/living/bloodcrawl.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 7 +- .../mob/living/carbon/human/human_damage.dm | 21 +- .../mob/living/carbon/human/human_defense.dm | 2 +- code/modules/mob/living/living.dm | 13 +- code/modules/mob/living/living_defense.dm | 6 +- code/modules/mob/mob.dm | 80 ++----- code/modules/mob/mob_movement.dm | 24 +-- .../effects/unknown_effect_teleport.dm | 6 +- .../modules/vehicle/train/trains/ambulance.dm | 3 +- code/modules/vehicle/vehicle.dm | 2 + paradise.dme | 1 + 38 files changed, 457 insertions(+), 526 deletions(-) create mode 100644 code/game/objects/buckling.dm diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 3db4914cb35..4dfe8d70812 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -24,12 +24,12 @@ Pipelines + Other Objects -> Pipe network var/icon_connect_type = "" //"-supply" or "-scrubbers" var/initialize_directions = 0 - + var/pipe_color var/obj/item/pipe/stored var/image/pipe_image var/global/datum/pipe_icon_manager/icon_manager - + /obj/machinery/atmospherics/New() if(!icon_manager) icon_manager = new() @@ -40,10 +40,10 @@ Pipelines + Other Objects -> Pipe network if(!pipe_color_check(pipe_color)) pipe_color = null - + if(can_unwrench) stored = new(src, make_from = src) - + ..() /obj/machinery/atmospherics/Destroy() @@ -54,10 +54,10 @@ Pipelines + Other Objects -> Pipe network del(pipe_image) //we have to del it, or it might keep a ref somewhere else return ..() -// Icons/overlays/underlays +// Icons/overlays/underlays /obj/machinery/atmospherics/update_icon() return null - + /obj/machinery/atmospherics/proc/check_icon_cache(var/safety = 0) if(!istype(icon_manager)) if(!safety) //to prevent infinite loops @@ -92,7 +92,7 @@ Pipelines + Other Objects -> Pipe network else return 0 -// Connect types +// Connect types /obj/machinery/atmospherics/proc/check_connect_types(obj/machinery/atmospherics/atmos1, obj/machinery/atmospherics/atmos2) var/i var/list1[] = atmos1.connect_types @@ -117,7 +117,7 @@ Pipelines + Other Objects -> Pipe network return n return 0 -// Pipenet related functions +// Pipenet related functions /obj/machinery/atmospherics/proc/returnPipenet() return @@ -135,8 +135,8 @@ Pipelines + Other Objects -> Pipe network return /obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) - return - + return + /obj/machinery/atmospherics/proc/nullifyPipenet(datum/pipeline/P) if(P) P.other_atmosmch -= src @@ -151,7 +151,7 @@ Pipelines + Other Objects -> Pipe network var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() add_fingerprint(user) - + var/unsafe_wrenching = FALSE var/internal_pressure = int_air.return_pressure()-env_air.return_pressure() @@ -160,21 +160,21 @@ Pipelines + Other Objects -> Pipe network if (internal_pressure > 2*ONE_ATMOSPHERE) user << "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?" unsafe_wrenching = TRUE //Oh dear oh dear - + if (do_after(user, 40, target = src) && isnull(gcDestroyed)) user.visible_message( \ "[user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear ratchet.") investigate_log("was REMOVED by [key_name(usr)]", "atmos") - + //You unwrenched a pipe full of pressure? let's splat you into the wall silly. if(unsafe_wrenching) - unsafe_pressure_release(user,internal_pressure) + unsafe_pressure_release(user,internal_pressure) Deconstruct() else return ..() - + //Called when an atmospherics object is unwrenched while having a large pressure difference //with it's locs air contents. /obj/machinery/atmospherics/proc/unsafe_pressure_release(var/mob/user,var/pressures) @@ -191,7 +191,7 @@ Pipelines + Other Objects -> Pipe network user.visible_message("[user] is sent flying by pressure!","The pressure sends you flying!") //Values based on 2*ONE_ATMOS (the unsafe pressure), resulting in 20 range and 4 speed user.throw_at(general_direction,pressures/10,pressures/50) - + /obj/machinery/atmospherics/proc/Deconstruct() if(can_unwrench) var/turf/T = get_turf(src) @@ -203,7 +203,7 @@ Pipelines + Other Objects -> Pipe network new /obj/item/pipe_meter(T) qdel(meter) qdel(src) - + /obj/machinery/atmospherics/construction(D, P, C) if(C) color = C @@ -217,7 +217,7 @@ Pipelines + Other Objects -> Pipe network A.initialize() A.addMember(src) build_network() - + // Find a connecting /obj/machinery/atmospherics in specified direction. /obj/machinery/atmospherics/proc/findConnecting(var/direction) for(var/obj/machinery/atmospherics/target in get_step(src,direction)) @@ -225,12 +225,15 @@ Pipelines + Other Objects -> Pipe network if(can_connect && (target.initialize_directions & get_dir(target,src))) return target -// Ventcrawling +// Ventcrawling #define VENT_SOUND_DELAY 30 /obj/machinery/atmospherics/relaymove(mob/living/user, direction) if(!(direction & initialize_directions)) //can't go in a way we aren't connecting to return + if(buckled_mob == user) + return + var/obj/machinery/atmospherics/target_move = findConnecting(direction) if(target_move) if(is_type_in_list(target_move, ventcrawl_machinery) && target_move.can_crawl_through()) @@ -263,7 +266,7 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/can_crawl_through() return 1 - + /obj/machinery/atmospherics/proc/change_color(var/new_color) //only pass valid pipe colors please ~otherwise your pipe will turn invisible if(!pipe_color_check(new_color)) @@ -272,7 +275,7 @@ Pipelines + Other Objects -> Pipe network pipe_color = new_color update_icon() -// Additional icon procs +// Additional icon procs /obj/machinery/atmospherics/proc/universal_underlays(var/obj/machinery/atmospherics/node, var/direction) var/turf/T = get_turf(src) if(!istype(T)) return @@ -303,8 +306,7 @@ Pipelines + Other Objects -> Pipe network underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) else underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "retracted" + icon_connect_type) - + /obj/machinery/atmospherics/singularity_pull(S, current_size) if(current_size >= STAGE_FIVE) - Deconstruct() - \ No newline at end of file + Deconstruct() diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/ATMOSPHERICS/pipes/pipe.dm index 7ff4141076b..3f3a21e7789 100644 --- a/code/ATMOSPHERICS/pipes/pipe.dm +++ b/code/ATMOSPHERICS/pipes/pipe.dm @@ -7,13 +7,19 @@ use_power = 0 can_unwrench = 1 var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called - + + //Buckling + can_buckle = 1 + buckle_requires_restraints = 1 + buckle_lying = -1 + + /obj/machinery/atmospherics/pipe/New() ..() //so pipes under walls are hidden if(istype(get_turf(src), /turf/simulated/wall) || istype(get_turf(src), /turf/simulated/shuttle/wall) || istype(get_turf(src), /turf/unsimulated/wall)) level = 1 - + /obj/machinery/atmospherics/pipe/Destroy() releaseAirToTurf() qdel(air_temporary) @@ -39,7 +45,7 @@ //Return null if parent should stop checking other pipes. Recall: del(src) will by default return null return 1 - + /obj/machinery/atmospherics/pipe/proc/releaseAirToTurf() if(air_temporary) var/turf/T = loc @@ -55,7 +61,7 @@ if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) - + /obj/machinery/atmospherics/pipe/setPipenet(datum/pipeline/P) parent = P @@ -69,4 +75,3 @@ return node.pipe_color else return pipe_color - \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm index dd0e00fa248..d61126b1414 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm @@ -9,23 +9,55 @@ minimum_temperature_difference = 20 thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT + color = "#404040" + buckle_lying = 1 + var/icon_temperature = T20C //stop small changes in temperature causing icon refresh + /obj/machinery/atmospherics/pipe/simple/heat_exchanging/process() var/environment_temperature = 0 - if(istype(loc, /turf/simulated)) - if(loc:blocks_air) - environment_temperature = loc:temperature + var/datum/gas_mixture/pipe_air = return_air() + + var/turf/simulated/T = loc + if(istype(T)) + if(T.blocks_air) + environment_temperature = T.temperature else - var/datum/gas_mixture/environment = loc.return_air() + var/datum/gas_mixture/environment = T.return_air() environment_temperature = environment.temperature else - environment_temperature = loc:temperature - var/datum/gas_mixture/pipe_air = return_air() + environment_temperature = T.temperature + if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(loc, volume, thermal_conductivity) + parent.temperature_interact(T, volume, thermal_conductivity) + + //Heat causes pipe to glow + if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //glow starts at 500K + if(abs(pipe_air.temperature - icon_temperature) > 10) + icon_temperature = pipe_air.temperature + + var/h_r = heat2color_r(icon_temperature) + var/h_g = heat2color_g(icon_temperature) + var/h_b = heat2color_b(icon_temperature) + + if(icon_temperature < 2000)//scale glow until 2000K + var/scale = (icon_temperature - 500) / 1500 + h_r = 64 + (h_r - 64) * scale + h_g = 64 + (h_g - 64) * scale + h_b = 64 + (h_b - 64) * scale + + animate(src, color = rgb(h_r, h_g, h_b), time = 20, easing = SINE_EASING) + + //burn any mobs buckled based on temperature + if(buckled_mob) + var/heat_limit = 1000 + if(pipe_air.temperature > heat_limit + 1) + buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, "chest") + /obj/machinery/atmospherics/pipe/simple/heat_exchanging/New() ..() initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe + color = "#404040" /obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize() normalize_dir() diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 799d5ee8ee0..94ed1568ae0 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -385,16 +385,16 @@ // Simple helper to face what you clicked on, in case it should be needed in more than one place /mob/proc/face_atom(var/atom/A) - // Snowflake for space vines. +/* // Snowflake for space vines. //Are you fucking kidding me? var/is_buckled = 0 if(buckled) if(istype(buckled)) if(!buckled.movable) is_buckled = 1 else - is_buckled = 0 + is_buckled = 0*/ - if( stat || is_buckled || !A || !x || !y || !A.x || !A.y ) return + if( stat || buckled || !A || !x || !y || !A.x || !A.y ) return var/dx = A.x - x var/dy = A.y - y if(!dx && !dy) return @@ -407,6 +407,7 @@ if(dx > 0) direction = EAST else direction = WEST usr.dir = direction - if(buckled && buckled.movable) + +/* if(buckled && buckled.movable) buckled.dir = direction - buckled.handle_rotation() + buckled.handle_rotation()*/ \ No newline at end of file diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index d1f856d954c..048eaa55fd3 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -124,7 +124,7 @@ if(isliving(teleatom)) var/mob/living/L = teleatom if(L.buckled) - L.buckled.unbuckle() + L.buckled.unbuckle_mob() destarea.Entered(teleatom) diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm index 610efe96b14..6a087a2a643 100644 --- a/code/datums/spells/area_teleport.dm +++ b/code/datums/spells/area_teleport.dm @@ -46,7 +46,7 @@ return if(target && target.buckled) - target.buckled.unbuckle() + target.buckled.unbuckle_mob() var/list/tempL = L var/attempt = null diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index 591aa0d877e..eb68f6a2dc7 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -23,7 +23,7 @@ if(target.buckled) var/obj/structure/stool/bed/buckled_to = target.buckled. - buckled_to.unbuckle() + buckled_to.unbuckle_mob() var/mobloc = get_turf(target.loc) var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc ) @@ -37,7 +37,7 @@ animation.master = holder target.ExtinguishMob() if(target.buckled) - target.buckled.unbuckle() + target.buckled.unbuckle_mob() if(phaseshift == 1) animation.dir = target.dir flick("phase_shift",animation) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index dc2698f017f..a257cbae129 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -448,6 +448,9 @@ its easier to just keep the beam vertical. else return 0 +/atom/proc/handle_fall() + return + /atom/proc/singularity_act() return diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index f1778935ef8..fbc3b08e60a 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -139,7 +139,7 @@ user.incorporeal_move = 1 user.alpha = 0 if(user.buckled) - user.buckled.unbuckle() + user.buckled.unbuckle_mob() sleep(40) //4 seconds user.visible_message("[user] suddenly manifests!", "The pressure becomes too much and you vacate the interdimensional darkness.") user.incorporeal_move = 0 diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index b25aa1b6ae8..9914ba1c582 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -372,7 +372,7 @@ if(!M) return if(M.current.vampire_power(30, 0)) - if(M.current.buckled) M.current.buckled.unbuckle() + if(M.current.buckled) M.current.buckled.unbuckle_mob() spawn(0) var/originalloc = get_turf(M.current.loc) var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( originalloc ) @@ -386,7 +386,7 @@ animation.master = holder M.current.ExtinguishMob() if(M.current.buckled) - M.current.buckled.unbuckle() + M.current.buckled.unbuckle_mob() flick("liquify",animation) M.current.loc = holder M.current.client.eye = holder @@ -436,7 +436,7 @@ var/max_lum = 1 if(M.current.vampire_power(30, 0)) - if(M.current.buckled) M.current.buckled.unbuckle() + if(M.current.buckled) M.current.buckled.unbuckle_mob() spawn(0) var/list/turfs = new/list() for(var/turf/T in range(usr,outer_tele_radius)) @@ -463,7 +463,7 @@ return M.current.ExtinguishMob() if(M.current.buckled) - M.current.buckled.unbuckle() + M.current.buckled.unbuckle_mob() var/atom/movable/overlay/animation = new /atom/movable/overlay( get_turf(usr) ) animation.name = usr.name animation.density = 0 diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm new file mode 100644 index 00000000000..f113ffde15b --- /dev/null +++ b/code/game/objects/buckling.dm @@ -0,0 +1,100 @@ + + +/obj + var/can_buckle = 0 + var/buckle_lying = -1 //bed-like behaviour, forces mob.lying = buckle_lying if != -1 + var/buckle_requires_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes + var/mob/living/buckled_mob = null + + +//Interaction +/obj/attack_hand(mob/living/user) + . = ..() + if(can_buckle && buckled_mob) + return user_unbuckle_mob(user) + +/obj/MouseDrop_T(mob/living/M, mob/living/user) + . = ..() + if(can_buckle && istype(M)) + return user_buckle_mob(M, user) + + +//Cleanup +/obj/Destroy() + . = ..() + unbuckle_mob() + +//procs that handle the actual buckling and unbuckling +/obj/proc/buckle_mob(mob/living/M) + if(!can_buckle || !istype(M) || (M.loc != loc) || M.buckled || (buckle_requires_restraints && !M.restrained())) + return 0 + + if (isslime(M) || isAI(M)) + if(M == usr) + M << "You are unable to buckle yourself to the [src]!" + else + usr << "You are unable to buckle [M] to the [src]!" + return 0 + + M.buckled = src + M.dir = dir + buckled_mob = M + M.update_canmove() + post_buckle_mob(M) + return 1 + +/obj/proc/unbuckle_mob() + if(buckled_mob && buckled_mob.buckled == src) + . = buckled_mob + buckled_mob.buckled = null + buckled_mob.anchored = initial(buckled_mob.anchored) + buckled_mob.update_canmove() + buckled_mob = null + + post_buckle_mob(.) + + +//Handle any extras after buckling/unbuckling +//Called on buckle_mob() and unbuckle_mob() +/obj/proc/post_buckle_mob(mob/living/M) + return + + +//Wrapper procs that handle sanity and user feedback +/obj/proc/user_buckle_mob(mob/living/M, mob/user) + if(!in_range(user, src) || user.stat || user.restrained()) + return 0 + + add_fingerprint(user) + unbuckle_mob() + + if(buckle_mob(M)) + if(M == user) + M.visible_message(\ + "[M] buckles themself to [src].",\ + "You buckle yourself to [src].",\ + "You hear metal clanking.") + else + M.visible_message(\ + "[user] buckles [M] to [src]!",\ + "[user] buckles you to [src]!",\ + "You hear metal clanking.") + return 1 + +/obj/proc/user_unbuckle_mob(mob/user) + var/mob/living/M = unbuckle_mob() + if(M) + if(M != user) + M.visible_message(\ + "[user] unbuckles [M] from [src].",\ + "[user] unbuckles you from [src].",\ + "You hear metal clanking.") + else + M.visible_message(\ + "[M] unbuckles themselves from [src].",\ + "You unbuckle yourself from [src].",\ + "You hear metal clanking.") + add_fingerprint(user) + return M + + diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm index 68497e500b7..282717b606c 100644 --- a/code/game/objects/items/weapons/implants/implantfreedom.dm +++ b/code/game/objects/items/weapons/implants/implantfreedom.dm @@ -23,6 +23,8 @@ if (source.handcuffed) var/obj/item/weapon/W = source.handcuffed source.handcuffed = null + if(source.buckled && source.buckled.buckle_requires_restraints) + source.buckled.unbuckle_mob() source.update_inv_handcuffed() if (source.client) source.client.screen -= W diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index e7a9272aa6d..0ba86215713 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -74,7 +74,7 @@ return if(user && user.buckled) - user.buckled.unbuckle() + user.buckled.unbuckle_mob() var/list/tempL = L var/attempt = null diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 9549727af4d..73a9e6ebc7e 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -125,6 +125,8 @@ "You cut \the [C]'s restraints with \the [src]!",\ "You hear cable being cut.") C.handcuffed = null + if(C.buckled && C.buckled.buckle_requires_restraints) + C.buckled.unbuckle_mob() C.update_inv_handcuffed() return else @@ -168,15 +170,15 @@ reagents.add_reagent("fuel", max_fuel) update_icon() return - + /obj/item/weapon/weldingtool/examine(mob/user) if(!..(user, 0)) user << "It contains [get_fuel()] unit\s of fuel out of [max_fuel]." - + /obj/item/weapon/weldingtool/suicide_act(mob/user) user.visible_message("[user] welds \his every orifice closed! It looks like \he's trying to commit suicide..") return (FIRELOSS) - + /obj/item/weapon/weldingtool/proc/update_torch() overlays.Cut() if(welding) @@ -235,7 +237,7 @@ var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting] if (!S) return - + if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP || S.open == 2) return ..() @@ -254,7 +256,7 @@ else if(S.open != 2) user << "Nothing to fix!" else - return ..() + return ..() /obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity) if(!proximity) return @@ -388,7 +390,7 @@ spawn(100) user.disabilities &= ~NEARSIGHTED return - + /obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) if(welding) user << "Turn it off first!" @@ -428,7 +430,7 @@ /obj/item/weapon/weldingtool/largetank/flamethrower_screwdriver() return - + /obj/item/weapon/weldingtool/mini name = "emergency welding tool" desc = "A miniature welder used during emergencies." @@ -439,8 +441,8 @@ change_icons = 0 /obj/item/weapon/weldingtool/mini/flamethrower_screwdriver() - return - + return + /obj/item/weapon/weldingtool/hugetank name = "Upgraded Welding Tool" desc = "An upgraded welder based of the industrial welder." diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index f353b40c785..bdf8a85286c 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -20,11 +20,6 @@ if(3.0) return -/obj/structure/Destroy() - if(hascall(src, "unbuckle")) - src:unbuckle() - return ..() - /obj/structure/mech_melee_attack(obj/mecha/M) if(M.damtype == "brute") M.occupant_message("You hit [src].") @@ -47,6 +42,8 @@ do_climb(usr) /obj/structure/MouseDrop_T(var/atom/movable/C, mob/user as mob) + if(..()) + return if(C == user) do_climb(user) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 3f4035b7462..2dae93cac5b 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -10,12 +10,6 @@ var/delay = 1 var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread -/obj/structure/stool/bed/chair/cart/Move() - ..() - if(buckled_mob) - if(buckled_mob.buckled == src) - buckled_mob.loc = loc - /obj/structure/stool/bed/chair/cart/process() if(empstun > 0) empstun-- @@ -145,29 +139,27 @@ inertia_dir = 0 return 1 -/obj/structure/stool/bed/chair/cart/buckle_mob(mob/M, mob/user) - if(M != user || !ismob(M) || get_dist(src, user) > 1 || user.restrained() || user.lying || user.stat || M.buckled || istype(user, /mob/living/silicon) || destroyed) +/obj/structure/stool/bed/chair/cart/user_buckle_mob(mob/living/M, mob/user) + if(user.incapacitated()) //user can't move the mob on the janicart's turf if incapacitated return - - unbuckle() - - M.visible_message(\ - "[M] climbs onto the [name]!",\ - "You climb onto the [name]!") - M.buckled = src - M.loc = loc - M.dir = dir - M.update_canmove() - buckled_mob = M - update_mob() - add_fingerprint(user) - return - -/obj/structure/stool/bed/chair/cart/unbuckle() - if(buckled_mob) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 0 + for(var/atom/movable/A in get_turf(src)) //we check for obstacles on the turf. + if(A.density) + if(A != src && A != M) + return + M.loc = loc //we move the mob on the janicart's turf before checking if we can buckle. ..() + update_mob() + +/obj/structure/stool/bed/chair/cart/post_buckle_mob(mob/living/M) + update_mob() + return ..() + +/obj/structure/stool/bed/chair/cart/unbuckle_mob() + var/mob/living/M = ..() + if(M) + M.pixel_x = 0 + M.pixel_y = 0 + return M /obj/structure/stool/bed/chair/cart/handle_rotation() if(dir == SOUTH) @@ -222,11 +214,11 @@ if(act >= 0) visible_message("[buckled_mob.name] is hit by [Proj]!") if(istype(Proj, /obj/item/projectile/energy)) - unbuckle() + unbuckle_mob() return if(istype(Proj, /obj/item/projectile/energy/electrode)) if(prob(25)) - unbuckle() + unbuckle_mob() visible_message("The [src.name] absorbs the [Proj]") if(!istype(buckled_mob, /mob/living/carbon/human)) return buckled_mob.bullet_act(Proj) @@ -245,7 +237,7 @@ destroyed = 1 density = 0 if(buckled_mob) - unbuckle() + unbuckle_mob() visible_message("The [name] explodes!") explosion(src.loc,-1,0,2,7,10) icon_state = "pussywagon_destroyed" @@ -316,7 +308,7 @@ /obj/structure/stool/bed/chair/cart/janicart/relaymove(mob/user, direction) if(user.stat || user.stunned || user.weakened || user.paralysis || destroyed) - unbuckle() + unbuckle_mob() return if(empstun > 0) if(user) @@ -353,7 +345,7 @@ /obj/structure/stool/bed/chair/cart/ambulance/relaymove(mob/user, direction) if(user.stat || user.stunned || user.weakened || user.paralysis || destroyed) - unbuckle() + unbuckle_mob() return if(empstun > 0) if(user) diff --git a/code/game/objects/structures/segway.dm b/code/game/objects/structures/segway.dm index 834f7d1c81e..4e781364af5 100644 --- a/code/game/objects/structures/segway.dm +++ b/code/game/objects/structures/segway.dm @@ -16,9 +16,19 @@ space_move = new /datum/global_iterator/space_movement(null,0) return +/obj/structure/stool/bed/chair/segway/user_buckle_mob(mob/living/M, mob/user) + if(user.incapacitated()) //user can't move the mob on the janicart's turf if incapacitated + return + for(var/atom/movable/A in get_turf(src)) //we check for obstacles on the turf. + if(A.density) + if(A != src && A != M) + return + M.loc = loc //we move the mob on the janicart's turf before checking if we can buckle. + ..() + /obj/structure/stool/bed/chair/segway/relaymove(mob/user, direction) if(user.stat || user.stunned || user.weakened || user.paralysis) - unbuckle() + unbuckle_mob() icon_state = "sec_seg_idle" if(istype(user.l_hand, /obj/item/sec_seg_key) || istype(user.r_hand, /obj/item/sec_seg_key)) if(!allowMove) @@ -38,7 +48,7 @@ playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) buckled_mob.Stun(8) buckled_mob.Weaken(5) - unbuckle() + unbuckle_mob() step(src, dir) sleep(delay) allowMove = 1 @@ -47,10 +57,6 @@ /obj/structure/stool/bed/chair/segway/Move() . = ..() - if(buckled_mob) - if(buckled_mob.buckled == src) - buckled_mob.loc = loc - return . /obj/structure/stool/bed/chair/segway/Bump(var/atom/obstacle) if(istype(obstacle, /mob)) @@ -59,47 +65,31 @@ obstacle.Bumped(src) return -/obj/structure/stool/bed/chair/segway/buckle_mob(mob/M, mob/user) - if(M != user || !ismob(M) || get_dist(src, user) > 1 || user.restrained() || user.lying || user.stat || M.buckled || istype(user, /mob/living/silicon)) - return +/obj/structure/stool/bed/chair/segway/post_buckle_mob(mob/living/M) + update_mob() + add_fingerprint(M) + M.pixel_x = 0 + M.pixel_y = 5 + return ..() - unbuckle() - - M.visible_message(\ - "[M] climbs onto the [src.name]!",\ - "You climb onto the [src.name]!") - M.buckled = src - M.loc = loc - M.dir = dir - M.update_canmove() - buckled_mob = M - update_mob() - add_fingerprint(user) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 5 - -/obj/structure/stool/bed/chair/segway/unbuckle() - if(buckled_mob) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 0 - ..() +/obj/structure/stool/bed/chair/segway/unbuckle_mob() + var/mob/living/M = ..() + if(M) + M.pixel_x = 0 + M.pixel_y = 0 + return M /obj/structure/stool/bed/chair/segway/handle_rotation() - if(dir == NORTH) - layer = OBJ_LAYER - else - layer = FLY_LAYER + if(dir == NORTH) + layer = OBJ_LAYER + else + layer = FLY_LAYER - if(buckled_mob) - if(buckled_mob.loc != loc) - buckled_mob.buckled = null - buckled_mob.buckled = src - - update_mob() + update_mob() /obj/structure/stool/bed/chair/segway/proc/update_mob() - if(buckled_mob) - buckled_mob.dir = dir + if(buckled_mob) + buckled_mob.dir = dir /obj/structure/stool/bed/chair/segway/bullet_act(var/obj/item/projectile/Proj) if(buckled_mob) @@ -147,7 +137,7 @@ /obj/structure/stool/bed/chair/segway/snowmobile/relaymove(mob/user, direction) if(user.stat || user.stunned || user.weakened || user.paralysis) - unbuckle() + unbuckle_mob() if(!allowMove) return if(src.space_move.active()) @@ -159,14 +149,14 @@ if(istype(src.loc, /turf/space)) src.space_move.start(list(src,direction)) if(istype(src.loc, /turf/simulated)) - health -= 5 + damage(5) usr << "Your snowmobile takes damage from not being on snow!" var/turf/simulated/T = src.loc - if(T.wet == 2) //Lube! Fall off! + if(T && T.wet == 2) //Lube! Fall off! playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) buckled_mob.Stun(8) buckled_mob.Weaken(5) - unbuckle() + unbuckle_mob() step(src, dir) sleep(delay) allowMove = 1 diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index 28c8129e2c7..98e3d01e542 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -1,5 +1,4 @@ //Alium nests. Essentially beds with an unbuckle delay that only aliums can buckle mobs to. -#define NEST_RESIST_TIME 1200 /obj/structure/stool/bed/nest name = "alien nest" @@ -7,68 +6,75 @@ icon = 'icons/mob/alien.dmi' icon_state = "nest" var/health = 100 + var/image/nest_overlay -/obj/structure/stool/bed/nest/manual_unbuckle(mob/user as mob) - if(buckled_mob) - if(buckled_mob.buckled == src) - if(buckled_mob != user) - buckled_mob.visible_message(\ - "[user.name] pulls [buckled_mob.name] free from the sticky nest!",\ - "[user.name] pulls you free from the gelatinous resin.",\ - "You hear squelching...") - buckled_mob.pixel_y = 0 - unbuckle() - else - if(world.time <= buckled_mob.last_special+NEST_RESIST_TIME) - return - buckled_mob.visible_message(\ - "[buckled_mob.name] struggles to break free of the gelatinous resin...",\ - "You struggle to break free from the gelatinous resin... (This will take around 2 minutes and you need to stay still)",\ - "You hear squelching...") - spawn(NEST_RESIST_TIME) - if(user && buckled_mob && user.buckled == src) - buckled_mob.last_special = world.time - buckled_mob.pixel_y = 0 - unbuckle() - src.add_fingerprint(user) - return +/obj/structure/stool/bed/nest/New() + nest_overlay = image('icons/mob/alien.dmi', "nestoverlay", layer=MOB_LAYER - 0.2) + return ..() -/obj/structure/stool/bed/nest/buckle_mob(mob/M as mob, mob/user as mob) +/obj/structure/stool/bed/nest/user_unbuckle_mob(mob/living/user) + if(buckled_mob && buckled_mob.buckled == src) + var/mob/living/M = buckled_mob + + if(isalien(user)) + unbuckle_mob() + add_fingerprint(user) + return + + if(M != user) + M.visible_message(\ + "[user.name] pulls [M.name] free from the sticky nest!",\ + "[user.name] pulls you free from the gelatinous resin.",\ + "You hear squelching...") + + else + buckled_mob.visible_message(\ + "[buckled_mob.name] struggles to break free of the gelatinous resin...",\ + "You struggle to break free from the gelatinous resin... (This will take around 2 minutes and you need to stay still)",\ + "You hear squelching...") + if(!do_after(M, 1200, target = src)) + if(M && M.buckled) + M << "You fail to escape \the [src]!" + return + if(!M.buckled) + return + M.visible_message(\ + "[M.name] breaks free from the gelatinous resin!",\ + "You break free from the gelatinous resin!",\ + "You hear squelching...") + unbuckle_mob() + add_fingerprint(user) + + +/obj/structure/stool/bed/nest/user_buckle_mob(mob/living/M, mob/living/user) if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) ) return - if(istype(M,/mob/living/carbon/alien)) + if(isalien(M)) return - if(!istype(user,/mob/living/carbon/alien/humanoid)) + if(!isalien(user)) return - unbuckle() + unbuckle_mob() - if(M == usr) - return - else + if(buckle_mob(M)) M.visible_message(\ - "[user.name] secretes a thick vile goo, securing [M.name] into [src]!",\ - "[user.name] drenches you in a foul-smelling resin, trapping you in the [src]!",\ - "You hear squelching...") - M.buckled = src - M.loc = src.loc - M.dir = src.dir - M.update_canmove() - M.pixel_y += 1 - M.pixel_x += 2 - M.anchored = anchored - src.buckled_mob = M - src.add_fingerprint(user) - src.overlays += image('icons/mob/alien.dmi', "nestoverlay", layer=6) - return + "[user.name] secretes a thick vile goo, securing [M.name] into [src]!",\ + "[user.name] drenches you in a foul-smelling resin, trapping you in [src]!",\ + "You hear squelching...") -/obj/structure/stool/bed/nest/unbuckle() - if(buckled_mob) - buckled_mob.pixel_y -= 1 - buckled_mob.pixel_x -= 2 - overlays.Cut() - ..() + +/obj/structure/stool/bed/nest/post_buckle_mob(mob/living/M) + if(M == buckled_mob) + M.pixel_y = 0 + M.pixel_x = initial(M.pixel_x) + 2 + M.layer = MOB_LAYER - 0.3 + overlays += nest_overlay + else + M.pixel_x = M.get_standard_pixel_x_offset(M.lying) + M.pixel_y = M.get_standard_pixel_y_offset(M.lying) + M.layer = initial(M.layer) + overlays -= nest_overlay /obj/structure/stool/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob, params) user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 559a63d0d1a..1eecaa972ee 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -11,111 +11,48 @@ name = "bed" desc = "This is used to lie in, sleep in or strap on." icon_state = "bed" - var/mob/living/buckled_mob + can_buckle = 1 + buckle_lying = 1 var/movable = 0 // For mobility checks +/obj/structure/stool/bed/MouseDrop(atom/over_object) + ..(over_object, 1) + /obj/structure/stool/psychbed name = "psych bed" desc = "For prime comfort during psychiatric evaluations." icon_state = "psychbed" - var/mob/living/buckled_mob + can_buckle = 1 + buckle_lying = 1 /obj/structure/stool/bed/alien name = "resting contraption" desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?" icon_state = "abed" -/obj/structure/stool/bed/Destroy() - unbuckle() +/obj/structure/stool/bed/Move(atom/newloc, direct) //Some bed children move + . = ..() + if(buckled_mob) + if(!buckled_mob.Move(loc, direct)) + loc = buckled_mob.loc //we gotta go back + last_move = buckled_mob.last_move + buckled_mob.inertia_dir = last_move + . = 0 + +/obj/structure/stool/bed/CanPass(atom/movable/mover, turf/target, height=1.5) + if(mover == buckled_mob) + return 1 return ..() -/obj/structure/stool/bed/attack_hand(mob/user as mob) - manual_unbuckle(user) - return - /obj/structure/stool/bed/proc/handle_rotation() return -/obj/structure/stool/bed/MouseDrop(atom/over_object) - return - /obj/structure/stool/bed/attack_animal(var/mob/living/simple_animal/M)//No more buckling hostile mobs to chairs to render them immobile forever if(M.environment_smash) new /obj/item/stack/sheet/metal(src.loc) qdel(src) -/obj/structure/stool/bed/MouseDrop_T(mob/M as mob, mob/user as mob) - if(!istype(M)) return - buckle_mob(M, user) - return - -/obj/structure/stool/bed/proc/afterbuckle(mob/M as mob) //Called after somebody buckled / unbuckled - return - -/obj/structure/stool/bed/proc/unbuckle() - if(buckled_mob) - if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt - buckled_mob.buckled = null - buckled_mob.anchored = initial(buckled_mob.anchored) - buckled_mob.update_canmove() - - var/M = buckled_mob - buckled_mob = null - - afterbuckle(M) - return - -/obj/structure/stool/bed/proc/manual_unbuckle(mob/user as mob) - if(buckled_mob) - if(buckled_mob.buckled == src) - if(buckled_mob != user) - buckled_mob.visible_message(\ - "\blue [buckled_mob.name] was unbuckled by [user.name]!",\ - "You were unbuckled from [src] by [user.name].",\ - "You hear metal clanking") - else - buckled_mob.visible_message(\ - "\blue [buckled_mob.name] unbuckled \himself!",\ - "You unbuckle yourself from [src].",\ - "You hear metal clanking") - unbuckle() - src.add_fingerprint(user) - return 1 - - return 0 - -/obj/structure/stool/bed/proc/buckle_mob(mob/M as mob, mob/user as mob) - if (!ticker) - user << "You can't buckle anyone in before the game starts." - if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.stunned || user.stat || M.buckled || istype(user, /mob/living/silicon/pai) ) - return - - if (istype(M, /mob/living/carbon/slime)) - user << "The [M] is too squishy to buckle in." - return - - unbuckle() - - if (M == usr) - M.visible_message(\ - "\blue [M.name] buckles in!",\ - "You buckle yourself to [src].",\ - "You hear metal clanking") - else - M.visible_message(\ - "\blue [M.name] is buckled in to [src] by [user.name]!",\ - "You are buckled in to [src] by [user.name].",\ - "You hear metal clanking") - M.buckled = src - M.loc = src.loc - M.dir = src.dir - M.update_canmove() - src.buckled_mob = M - src.add_fingerprint(user) - afterbuckle(M) - return - /* * Roller beds */ @@ -125,41 +62,44 @@ icon_state = "down" anchored = 0 -/obj/structure/stool/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W,/obj/item/roller_holder)) - if(buckled_mob) - manual_unbuckle() - else - visible_message("[user] collapses \the [src.name].") - new/obj/item/roller(get_turf(src)) - spawn(0) - qdel(src) - return - ..() +/obj/structure/stool/bed/roller/post_buckle_mob(mob/living/M) + if(M == buckled_mob) + density = 1 + icon_state = "up" + M.pixel_y = initial(M.pixel_y) + else + density = 0 + icon_state = "down" + M.pixel_x = M.get_standard_pixel_x_offset(M.lying) + M.pixel_y = M.get_standard_pixel_y_offset(M.lying) + /obj/item/roller name = "roller bed" desc = "A collapsed roller bed that can be carried around." icon = 'icons/obj/rollerbed.dmi' icon_state = "folded" - w_class = 4.0 // Can't be put in backpacks. Oh well. + w_class = 4 // Can't be put in backpacks. + /obj/item/roller/attack_self(mob/user) - var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) - R.add_fingerprint(user) - qdel(src) - -/obj/item/roller/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - - if(istype(W,/obj/item/roller_holder)) - var/obj/item/roller_holder/RH = W - if(!RH.held) - user << "\blue You collect the roller bed." - src.loc = RH - RH.held = src - return + var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) + R.add_fingerprint(user) + qdel(src) +/obj/structure/stool/bed/roller/MouseDrop(over_object, src_location, over_location) ..() + if(over_object == usr && Adjacent(usr) && (in_range(src, usr) || usr.contents.Find(src))) + if(!ishuman(usr)) + return + if(buckled_mob) + return 0 + usr.visible_message("[usr] collapses \the [src.name].", "You collapse \the [src.name].") + new/obj/item/roller(get_turf(src)) + qdel(src) + return + + /obj/item/roller_holder name = "roller bed rack" @@ -173,7 +113,6 @@ held = new /obj/item/roller(src) /obj/item/roller_holder/attack_self(mob/user as mob) - if(!held) user << "\blue The rack is empty." return @@ -182,46 +121,4 @@ var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) R.add_fingerprint(user) qdel(held) - held = null - - -/obj/structure/stool/bed/roller/Move() - ..() - if(buckled_mob) - if(buckled_mob.buckled == src) - buckled_mob.loc = src.loc - else - buckled_mob = null - -/obj/structure/stool/bed/roller/buckle_mob(mob/M as mob, mob/user as mob) - if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.lying || user.stat || M.buckled || istype(usr, /mob/living/silicon/pai) ) - return - M.pixel_y = 6 - density = 1 - icon_state = "up" - ..() - return - -/obj/structure/stool/bed/roller/manual_unbuckle(mob/user as mob) - if(buckled_mob) - if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt - buckled_mob.pixel_y = 0 - buckled_mob.anchored = initial(buckled_mob.anchored) - buckled_mob.buckled = null - buckled_mob.update_canmove() - buckled_mob = null - density = 0 - icon_state = "down" - ..() - return - -/obj/structure/stool/bed/roller/MouseDrop(over_object, src_location, over_location) - ..() - if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src)))) - if(!ishuman(usr)) return - if(buckled_mob) return 0 - visible_message("[usr] collapses \the [src.name]") - new/obj/item/roller(get_turf(src)) - spawn(0) - qdel(src) - return + held = null \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 44ac7b6497b..875d1f766d8 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -2,12 +2,10 @@ name = "chair" desc = "You sit in this. Either by will or force." icon_state = "chair" + buckle_lying = 0 //you sit in a chair, not lay var/propelled = 0 // Check for fire-extinguisher-driven chairs -/obj/structure/stool/MouseDrop(atom/over_object) - return - /obj/structure/stool/bed/chair/New() if(anchored) src.verbs -= /atom/movable/verb/pull @@ -66,11 +64,6 @@ handle_rotation() return -/obj/structure/stool/bed/chair/MouseDrop_T(mob/M as mob, mob/user as mob) - if(!istype(M)) return - buckle_mob(M, user) - return - // Chair types /obj/structure/stool/bed/chair/wood // TODO: Special ash subtype that looks like charred chair legs @@ -106,7 +99,7 @@ return ..() -/obj/structure/stool/bed/chair/comfy/afterbuckle() +/obj/structure/stool/bed/chair/comfy/post_buckle_mob(mob/living/M) if(buckled_mob) overlays += armrest else @@ -143,29 +136,13 @@ anchored = 0 movable = 1 -/obj/structure/stool/bed/chair/office/Move() - ..() - if(buckled_mob) - var/mob/living/occupant = buckled_mob - occupant.buckled = null - occupant.Move(src.loc) - occupant.buckled = src - if (occupant && (src.loc != occupant.loc)) - if (propelled) - for (var/mob/O in src.loc) - if (O != occupant) - Bump(O) - else - unbuckle() - handle_rotation() - /obj/structure/stool/bed/chair/office/Bump(atom/A) ..() if(!buckled_mob) return if(propelled) var/mob/living/occupant = buckled_mob - unbuckle() + unbuckle_mob() occupant.throw_at(A, 3, propelled) occupant.apply_effect(6, STUN, 0) occupant.apply_effect(6, WEAKEN, 0) diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index 00e267a48f5..890d84a1f70 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -32,7 +32,9 @@ qdel(src) return -/obj/structure/stool/MouseDrop(atom/over_object) +/obj/structure/stool/MouseDrop(atom/over_object, skip_fucking_stool_shit = 0) + if(skip_fucking_stool_shit) + return ..(over_object) if (istype(over_object, /mob/living/carbon/human)) var/mob/living/carbon/human/H = over_object if (H==usr && !H.restrained() && !H.stat && in_range(src, over_object)) diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 0a9917fda9d..03d74cee94e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -42,6 +42,16 @@ user << "\red You cannot drive while being pushed." return + if(istype(user.loc, /turf/space)) + return + + if(ishuman(user)) + var/mob/living/carbon/human/driver = user + var/obj/item/organ/external/l_hand = driver.get_organ("l_hand") + var/obj/item/organ/external/r_hand = driver.get_organ("r_hand") + if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED))) + return // No hands to drive your chair? Tough luck! + // Let's roll driving = 1 var/turf/T = null @@ -88,7 +98,7 @@ if (O != occupant) Bump(O) else - unbuckle() + unbuckle_mob() if (pulling && (get_dist(src, pulling) > 1)) pulling.pulledby = null pulling << "\red You lost your grip!" @@ -102,7 +112,7 @@ if (pulling) MouseDrop(usr) else - manual_unbuckle(user) + user_unbuckle_mob(user, user) return /obj/structure/stool/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location) @@ -135,7 +145,7 @@ if(propelled || (pulling && (pulling.a_intent == I_HARM))) var/mob/living/occupant = buckled_mob - unbuckle() + unbuckle_mob() if (pulling && (pulling.a_intent == "hurt")) occupant.throw_at(A, 3, 3, pulling) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 8191421e8c8..3def899f4da 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -387,6 +387,13 @@ //////////////////////////////////////////////////// +/turf/handle_fall(mob/faller, forced) + faller.lying = pick(90, 270) + if(!forced) + return + if(has_gravity(src)) + playsound(src, "bodyfall", 50, 1) + /turf/singularity_act() if(intact) for(var/obj/O in contents) //this is for deleting things like wires contained in the turf diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 88428822184..45cee4ad1b0 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -83,7 +83,7 @@ phaseanim.master = user user.ExtinguishMob() if(user.buckled) - user.buckled.unbuckle() + user.buckled.unbuckle_mob() user.loc = holder flick("chronophase", phaseanim) spawn(7) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 1a5370910d0..a6aa9e2dcbb 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -67,7 +67,6 @@ var/last_tick = 0 var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/plant - var/mob/living/buckled_mob = null var/movable = 0 /obj/effect/plant/Destroy() diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 228cd73fc24..53abedd3c78 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -15,7 +15,7 @@ /obj/effect/plant/attack_hand(mob/user as mob) // Todo, cause damage. - manual_unbuckle(user) + user_unbuckle_mob(user, user) /obj/effect/plant/proc/trodden_on(var/mob/living/victim) if(!is_mature()) @@ -26,37 +26,6 @@ seed.do_thorns(victim,src) seed.do_sting(victim,src,pick("r_foot","l_foot","r_leg","l_leg")) -/obj/effect/plant/proc/unbuckle() - if(buckled_mob) - if(buckled_mob.buckled == src) - buckled_mob.buckled = null - buckled_mob.anchored = initial(buckled_mob.anchored) - buckled_mob.update_canmove() - buckled_mob = null - return - -/obj/effect/plant/proc/manual_unbuckle(mob/user as mob) - if(buckled_mob) - if(prob(seed ? min(max(0,100 - seed.get_trait(TRAIT_POTENCY)/2),100) : 50)) - if(buckled_mob.buckled == src) - if(buckled_mob != user) - buckled_mob.visible_message(\ - "[user.name] frees [buckled_mob.name] from \the [src].",\ - "[user.name] frees you from \the [src].",\ - "You hear shredding and ripping.") - else - buckled_mob.visible_message(\ - "[buckled_mob.name] struggles free of \the [src].",\ - "You untangle \the [src] from around yourself.",\ - "You hear shredding and ripping.") - unbuckle() - else - var/text = pick("rip","tear","pull") - user.visible_message(\ - "[user.name] [text]s at \the [src].",\ - "You [text] at \the [src].",\ - "You hear shredding and ripping.") - return /obj/effect/plant/proc/entangle(var/mob/living/victim) @@ -79,7 +48,6 @@ //entangling people if(victim.loc == src.loc) - victim.buckled = src - victim.update_canmove() - buckled_mob = victim victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!" + can_buckle = 1 + buckle_mob(victim) \ No newline at end of file diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 76c71cfeb87..8f2cfc88a03 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -24,7 +24,7 @@ src.ExtinguishMob() if(src.buckled) - src.buckled.unbuckle() + src.buckled.unbuckle_mob() if(src.pulling && src.bloodcrawl == BLOODCRAWL_EAT) if(istype(src.pulling, /mob/living/)) var/mob/living/victim = src.pulling diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index e74b1ec42ad..1ea6cc84bb8 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -529,6 +529,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, update_inv_wear_mask(0) else if(I == handcuffed) handcuffed = null + if(buckled && buckled.buckle_requires_restraints) + buckled.unbuckle_mob() update_inv_handcuffed(1) else if(I == legcuffed) legcuffed = null @@ -677,6 +679,9 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /mob/living/carbon/proc/canBeHandcuffed() return 0 +/mob/living/carbon/fall(forced) + loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing + /mob/living/carbon/is_muzzled() return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) @@ -686,7 +691,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, return -6 else return initial(pixel_y) - + /mob/living/carbon/get_all_slots() return list(l_hand, r_hand, diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index e4b601a529e..4f404d1f314 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -396,23 +396,4 @@ This function restores all organs. // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). updatehealth() hud_updateflag |= 1 << HEALTH_HUD - return 1 - - - -// incredibly important stuff follows -/mob/living/carbon/human/fall(var/forced) - ..() - if(forced) - playsound(loc, "bodyfall", 50, 1, -1) -/* if(head) - var/multiplier = 1 - if(stat || (status_flags & FAKEDEATH)) - multiplier = 2 - var/obj/item/clothing/head/H = head - if(!istype(H) || prob(H.loose * multiplier)) - unEquip(H) - if(prob(60)) - step_rand(H) - if(!stat) - src << "Your [H] fell off!" */ + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 39f526cb39b..a7056b0abc8 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -193,7 +193,7 @@ emp_act var/turf/picked = pick(turfs) if(!isturf(picked)) return if(buckled) - buckled.unbuckle() + buckled.unbuckle_mob() src.loc = picked return 1 return 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f606f4a16bc..bb797a597c1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -400,8 +400,11 @@ return /mob/living/Move(a, b, flag) - if (buckled) - return + if (buckled && buckled.loc != a) + if (!buckled.anchored) + return buckled.Move(a, b) + else + return 0 if (restrained()) stop_pulling() @@ -639,10 +642,10 @@ for(var/mob/O in viewers(C)) O.show_message("\red [usr] manages to unbuckle themself!", 1) C << "\blue You successfully unbuckle yourself." - C.buckled.manual_unbuckle(C) + C.buckled.user_unbuckle_mob(C,C) else - L.buckled.manual_unbuckle(L) + L.buckled.user_unbuckle_mob(L,L) /* resist_closet() allows a mob to break out of a welded/locked closet *///// @@ -779,6 +782,8 @@ CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) qdel(CM.handcuffed) CM.handcuffed = null + if(CM.buckled && CM.buckled.buckle_requires_restraints) + CM.buckled.unbuckle_mob() CM.update_inv_handcuffed() return diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 07fa3470a66..916b5b80195 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -12,7 +12,7 @@ */ /mob/living/proc/run_armor_check(var/def_zone = null, var/attack_flag = "melee", var/absorb_text = null, var/soften_text = null, armour_penetration, penetrated_text) var/armor = getarmor(def_zone, attack_flag) - + //the if "armor" check is because this is used for everything on /living, including humans if(armor && armor < 100 && armour_penetration) // Armor with 100+ protection can not be penetrated for admin items armor = max(0, armor - armour_penetration) @@ -368,3 +368,7 @@ else*///This is an example of how you can make special types of grabs simply based on direction. if(!supress_message) visible_message("[user] has grabbed [src] passively!") + +/mob/living/incapacitated() + if(stat || paralysis || stunned || weakened || restrained()) + return 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d1935d762b4..221b8962ca8 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -135,6 +135,9 @@ /mob/proc/restrained() return +/mob/proc/incapacitated() + return + //This proc is called whenever someone clicks an inventory ui slot. /mob/proc/attack_ui(slot) var/obj/item/W = get_active_hand() @@ -989,76 +992,29 @@ var/list/slot_equipment_priority = list( \ //Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. /mob/proc/update_canmove() var/ko = weakened || paralysis || stat || (status_flags & FAKEDEATH) - if(ko || resting || buckled) - canmove = 0 - if(!lying) - if(resting) //Presuming that you're resting on a bed, which would look goofy lying the wrong way - lying = 90 - else - lying = pick(90, 270) //180 looks like shit since BYOND inverts rather than turns in that case - else if(stunned) - drop_l_hand() + var/buckle_lying = !(buckled && !buckled.buckle_lying) + if(ko || resting || stunned) drop_r_hand() - canmove = 0 + drop_l_hand() else lying = 0 canmove = 1 - var/is_movable - if(buckled && istype(buckled)) - is_movable = buckled.movable - - if(istype(buckled, /obj/vehicle)) - var/obj/vehicle/V = buckled - if(stat || weakened || paralysis || resting || sleeping || (status_flags & FAKEDEATH)) - lying = 90 - canmove = 0 - pixel_y = V.mob_offset_y - 5 - else - lying = 0 - canmove = 1 - pixel_y = V.mob_offset_y - else if(buckled && (!buckled.movable)) - anchored = 1 - canmove = 0 - if( istype(buckled,/obj/structure/stool/bed/chair) ) - lying = 0 - else - lying = 90 - else if(buckled && is_movable) - anchored = 0 - canmove = 1 - lying = 0 - else if( stat || weakened || paralysis || resting || sleeping || (status_flags & FAKEDEATH)) - lying = 90 - canmove = 0 - else if( stunned ) - drop_l_hand() - drop_r_hand() - canmove = 0 + if(buckled) + lying = 90 * buckle_lying else - lying = 0 - canmove = 1 - - if(lying) - density = 0 - drop_l_hand() - drop_r_hand() - else - density = 1 - - //Temporarily moved here from the various life() procs - //I'm fixing stuff incrementally so this will likely find a better home. - //It just makes sense for now. ~Carn - - if(lying != lying_prev) - if(lying && !lying_prev) + if((ko || resting) && !lying) fall(ko) - if(update_icon) //forces a full overlay update - update_icon = 0 - regenerate_icons() + canmove = !(ko || resting || stunned || buckled) + density = !lying + if(lying) + if(layer == initial(layer)) + layer = MOB_LAYER - 0.2 + else + if(layer == MOB_LAYER - 0.2) + layer = initial(layer) + update_transform() - lying_prev = lying return canmove /mob/proc/fall(var/forced) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index a9d8f2b595f..48ddfff992b 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -225,13 +225,15 @@ if(Process_Grab()) return + if(mob.buckled) //if we're buckled to something, tell it we moved. + return mob.buckled.relaymove(mob, direct) if(mob.remote_control) //we're controlling something, our movement is relayed to it return mob.remote_control.relaymove(mob, direct) if(isAI(mob)) - return AIMove(n,direct,mob) - + return AIMove(n,direct,mob) + if(!mob.canmove) return @@ -280,24 +282,6 @@ var/tickcomp = ((1/(world.tick_lag))*1.3) move_delay = move_delay + tickcomp - if(istype(mob.buckled, /obj/vehicle) || istype(mob.buckled, /obj/structure/stool/bed/chair/cart)) - return mob.buckled.relaymove(mob,direct) - - if(mob.pulledby || mob.buckled) // Wheelchair driving! - if(istype(mob.loc, /turf/space)) - return // No wheelchair driving in space - if(istype(mob.pulledby, /obj/structure/stool/bed/chair/wheelchair)) - return mob.pulledby.relaymove(mob, direct) - else if(istype(mob.buckled, /obj/structure/stool/bed/chair/wheelchair)) - if(ishuman(mob.buckled)) - var/mob/living/carbon/human/driver = mob.buckled - var/obj/item/organ/external/l_hand = driver.get_organ("l_hand") - var/obj/item/organ/external/r_hand = driver.get_organ("r_hand") - if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED))) - return // No hands to drive your chair? Tough luck! - move_delay += 2 - return mob.buckled.relaymove(mob,direct) - //We are now going to move moving = 1 //Something with pulling things diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm index 7302523d2af..ae7a19005f3 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm @@ -8,7 +8,7 @@ if(prob(100 * weakness)) user << "\red You are suddenly zapped away elsewhere!" if (user.buckled) - user.buckled.unbuckle() + user.buckled.unbuckle_mob() var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(user)) @@ -27,7 +27,7 @@ if(prob(100 * weakness)) M << "\red You are displaced by a strange force!" if(M.buckled) - M.buckled.unbuckle() + M.buckled.unbuckle_mob() var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(M)) @@ -46,7 +46,7 @@ if(prob(100 * weakness)) M << "\red You are displaced by a strange force!" if(M.buckled) - M.buckled.unbuckle() + M.buckled.unbuckle_mob() var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(M)) diff --git a/code/modules/vehicle/train/trains/ambulance.dm b/code/modules/vehicle/train/trains/ambulance.dm index 95589a3d369..5076dc97659 100644 --- a/code/modules/vehicle/train/trains/ambulance.dm +++ b/code/modules/vehicle/train/trains/ambulance.dm @@ -53,10 +53,11 @@ if(is_train_head() && !on) return 0 + . = ..() + handle_rotation() update_mob() - return ..() /obj/vehicle/train/ambulance/trolley/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(open && istype(W, /obj/item/weapon/wirecutters)) diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index 85d0acf03a3..6341bbc5c31 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -7,6 +7,8 @@ animate_movement=1 light_range = 3 + buckle_lying = 0 + var/attack_log = null var/on = 0 var/health = 0 //do not forget to set health for your vehicle! diff --git a/paradise.dme b/paradise.dme index 06fe4867395..06e21a947a2 100644 --- a/paradise.dme +++ b/paradise.dme @@ -569,6 +569,7 @@ #include "code\game\mecha\medical\odysseus.dm" #include "code\game\mecha\working\ripley.dm" #include "code\game\mecha\working\working.dm" +#include "code\game\objects\buckling.dm" #include "code\game\objects\empulse.dm" #include "code\game\objects\explosion.dm" #include "code\game\objects\items.dm" From 922105091bb941bfcb505f2f216bf18bce33063d Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Thu, 24 Sep 2015 16:03:55 -0700 Subject: [PATCH 2/3] Fix compile --- code/modules/hydroponics/spreading/spreading.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 3894d69e54f..9edb4436de0 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -71,13 +71,13 @@ /obj/effect/plant/Destroy() if(buckled_mob) - unbuckle() + unbuckle_mob() if(plant_controller) plant_controller.remove_plant(src) for(var/obj/effect/plant/neighbor in range(1,src)) plant_controller.add_plant(neighbor) return ..() - + /obj/effect/plant/single spread_chance = 0 From a4444b2ef27b3bddd66b7b1aea509db1c70f13a0 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Fri, 25 Sep 2015 10:15:44 -0700 Subject: [PATCH 3/3] Fix vehicles being able to drive in space Unfortunately, it COMPLETELY stops vehicles from moving in space, including via jetpack and other such things. Sorry, wizard car. :( --- code/modules/vehicle/train/train.dm | 9 ++++++ .../modules/vehicle/train/trains/ambulance.dm | 13 +------- .../vehicle/train/trains/cargo/cargo_train.dm | 12 -------- code/modules/vehicle/train/trains/janicart.dm | 12 +------- code/modules/vehicle/vehicle.dm | 30 ++++++++++++++----- 5 files changed, 33 insertions(+), 43 deletions(-) diff --git a/code/modules/vehicle/train/train.dm b/code/modules/vehicle/train/train.dm index aaf88bdbd18..cf318c04a64 100644 --- a/code/modules/vehicle/train/train.dm +++ b/code/modules/vehicle/train/train.dm @@ -36,6 +36,15 @@ unattach() return 0 +/obj/vehicle/train/can_move() + if(!is_train_head()) + return 1 //towed objects do not need power to Move() + + if(!..()) + return 0 + return 1 + + /obj/vehicle/train/Bump(atom/Obstacle) if(!istype(Obstacle, /atom/movable)) return diff --git a/code/modules/vehicle/train/trains/ambulance.dm b/code/modules/vehicle/train/trains/ambulance.dm index 5076dc97659..813a2a918aa 100644 --- a/code/modules/vehicle/train/trains/ambulance.dm +++ b/code/modules/vehicle/train/trains/ambulance.dm @@ -44,21 +44,10 @@ key = new() /obj/vehicle/train/ambulance/engine/Move() - if(on && cell.charge < charge_use) - turn_off() - update_stats() - if(load && is_train_head()) - load << "The drive motor briefly whines, then drones to a stop." - - if(is_train_head() && !on) - return 0 - . = ..() - handle_rotation() update_mob() - /obj/vehicle/train/ambulance/trolley/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(open && istype(W, /obj/item/weapon/wirecutters)) passenger_allowed = !passenger_allowed @@ -177,7 +166,7 @@ return 0 if(is_train_head()) - if(direction == reverse_direction(dir)) + if(direction == reverse_direction(dir) && tow) //can reverse with no tow return 0 if(Move(get_step(src, direction))) return 1 diff --git a/code/modules/vehicle/train/trains/cargo/cargo_train.dm b/code/modules/vehicle/train/trains/cargo/cargo_train.dm index 84ee2064045..338432fabad 100644 --- a/code/modules/vehicle/train/trains/cargo/cargo_train.dm +++ b/code/modules/vehicle/train/trains/cargo/cargo_train.dm @@ -47,18 +47,6 @@ overlays += I turn_off() //so engine verbs are correctly set -/obj/vehicle/train/cargo/engine/Move() - if(on && cell.charge < charge_use) - turn_off() - update_stats() - if(load && is_train_head()) - load << "The drive motor briefly whines, then drones to a stop." - - if(is_train_head() && !on) - return 0 - - return ..() - /obj/vehicle/train/cargo/trolley/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(open && istype(W, /obj/item/weapon/wirecutters)) passenger_allowed = !passenger_allowed diff --git a/code/modules/vehicle/train/trains/janicart.dm b/code/modules/vehicle/train/trains/janicart.dm index 6f912971308..a1fae332782 100644 --- a/code/modules/vehicle/train/trains/janicart.dm +++ b/code/modules/vehicle/train/trains/janicart.dm @@ -51,20 +51,10 @@ R.my_atom = src /obj/vehicle/train/janitor/engine/Move() - if(on && cell.charge < charge_use) - turn_off() - update_stats() - if(load && is_train_head()) - load << "The drive motor briefly whines, then drones to a stop." - - if(is_train_head() && !on) - return 0 - + . = ..() handle_rotation() update_mob() - return ..() - /obj/vehicle/train/janitor/trolley/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(openTop) W.loc = src diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index 6341bbc5c31..eb8c4f816b4 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -42,10 +42,7 @@ //spawn the cell you want in each vehicle /obj/vehicle/Move() - if(world.time > l_move_time + move_delay) - if(on && powered && cell.charge < charge_use) - turn_off() - + if(can_move()) var/init_anc = anchored anchored = 0 if(!..()) @@ -65,6 +62,23 @@ else return 0 +/obj/vehicle/proc/can_move() + if(world.time <= l_move_time + move_delay) + return 0 + + if(!on || !powered) + return 0 + + if(on && powered && cell.charge < charge_use) + turn_off() + return 0 + + if(istype(loc, /turf/space)) + return 0 + + return 1 + + /obj/vehicle/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/hand_labeler)) return @@ -224,19 +238,19 @@ /obj/vehicle/proc/powercheck() if(!cell && !powered) - return + return 0 if(!cell && powered) turn_off() - return + return 0 if(cell.charge < charge_use) turn_off() - return + return 0 if(cell && powered) turn_on() - return + return 1 /obj/vehicle/proc/insert_cell(var/obj/item/weapon/stock_parts/cell/C, var/mob/living/carbon/human/H) if(cell)