From 65ea7e07d9013a7a20438a0ef9a398e67fcafcf7 Mon Sep 17 00:00:00 2001 From: ComicIronic Date: Mon, 20 Apr 2015 03:48:01 -0700 Subject: [PATCH 1/2] Ventcrawl Overhaul Ventcrawling mobs now no longer get a teleportation menu, instead, they are put inside the vents, the client gets an overlay of the pipes in the pipe network, and it is up to them to navigate. --- code/ATMOSPHERICS/atmospherics.dm | 61 +++++-- .../components/unary/vent_pump.dm | 19 +-- code/_onclick/ventcrawl.dm | 37 ++++ .../living/carbon/alien/humanoid/empress.dm | 2 +- .../mob/living/carbon/alien/humanoid/queen.dm | 2 +- .../modules/mob/living/carbon/alien/powers.dm | 6 +- code/modules/mob/living/carbon/carbon.dm | 161 ++++++++---------- .../mob/living/carbon/metroid/powers.dm | 6 +- .../mob/living/carbon/monkey/powers.dm | 4 +- code/modules/mob/living/living_defines.dm | 3 + .../modules/mob/living/simple_animal/borer.dm | 4 +- .../living/simple_animal/friendly/mouse.dm | 51 +----- .../simple_animal/friendly/spiderbot.dm | 46 +---- paradise.dme | 1 + sound/machines/ventcrawl.ogg | Bin 0 -> 40591 bytes 15 files changed, 181 insertions(+), 222 deletions(-) create mode 100644 code/_onclick/ventcrawl.dm create mode 100644 sound/machines/ventcrawl.ogg diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index a1ed1bf3648..2444031a8c2 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -15,26 +15,38 @@ Pipelines + Other Objects -> Pipe network active_power_usage = 0 power_channel = ENVIRON var/nodealert = 0 - - layer = 2.4 //under wires with their 2.44 + + layer = 2.4 //under wires with their 2.44 var/connect_types[] = list(1) //1=regular, 2=supply, 3=scrubber var/connected_to = 1 //same as above, currently not used for anything var/icon_connect_type = "" //"-supply" or "-scrubbers" - + var/initialize_directions = 0 var/pipe_color - + var/global/datum/pipe_icon_manager/icon_manager +/obj/machinery/atmospherics/Destroy() + for(var/mob/living/M in src) //ventcrawling is serious business + M.remove_ventcrawl() + M.loc = src.loc + ..() + +// 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)) + if(target.initialize_directions & get_dir(target,src)) + return target + /obj/machinery/atmospherics/New() if(!icon_manager) icon_manager = new() - + if(!pipe_color) pipe_color = color color = null - + if(!pipe_color_check(pipe_color)) pipe_color = null ..() @@ -84,22 +96,22 @@ obj/machinery/atmospherics/proc/check_connect_types_construction(obj/machinery/a if(list1[i] == list2[j]) var/n = list1[i] return n - return 0 - + return 0 + /obj/machinery/atmospherics/proc/check_icon_cache(var/safety = 0) if(!istype(icon_manager)) if(!safety) //to prevent infinite loops icon_manager = new() check_icon_cache(1) return 0 - + return 1 /obj/machinery/atmospherics/proc/color_cache_name(var/obj/machinery/atmospherics/node) //Don't use this for standard pipes if(!istype(node)) return null - + return node.pipe_color /obj/machinery/atmospherics/process() @@ -134,4 +146,31 @@ obj/machinery/atmospherics/proc/check_connect_types_construction(obj/machinery/a /obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) /obj/machinery/atmospherics/update_icon() - return null \ No newline at end of file + return null + +#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 + + var/obj/machinery/atmospherics/target_move = findConnecting(direction) + if(target_move) + if(is_type_in_list(target_move, ventcrawl_machinery)) + user.remove_ventcrawl() + user.forceMove(target_move.loc) //handles entering and so on + user.visible_message("You hear something squeezing through the ducts.", "You climb out the ventilation system.") + else + user.loc = target_move + user.client.eye = target_move //if we don't do this, Byond only updates the eye every tick - required for smooth movement + if(world.time - user.last_played_vent > VENT_SOUND_DELAY) + user.last_played_vent = world.time + playsound(src, 'sound/machines/ventcrawl.ogg', 50, 1, -3) + else + if((direction & initialize_directions) || is_type_in_list(src, ventcrawl_machinery)) //if we move in a way the pipe can connect, but doesn't - or we're in a vent + user.remove_ventcrawl() + user.forceMove(src.loc) + user.visible_message("You hear something squeezing through the pipes.", "You climb out the ventilation system.") + user.canmove = 0 + spawn(1) + user.canmove = 1 \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index d2092ce7e54..a96d5b1acd4 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -39,7 +39,7 @@ var/radio_filter_out var/radio_filter_in - + connect_types = list(1,2) //connects to regular and supply pipes /obj/machinery/atmospherics/unary/vent_pump/on @@ -80,7 +80,7 @@ return overlays.Cut() - + var/vent_icon = "vent" var/turf/T = get_turf(src) @@ -89,7 +89,7 @@ if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) vent_icon += "h" - + if(welded) vent_icon += "weld" else if(!powered()) @@ -375,16 +375,3 @@ initial_loc.air_vent_names -= id_tag ..() return - -/* - Alt-click to ventcrawl - Monkeys, aliens, slimes and mice. - This is a little buggy but somehow that just seems to plague ventcrawl. - I am sorry, I don't know why. -*/ -/obj/machinery/atmospherics/unary/vent_pump/AltClick(var/mob/living/ML) - if(istype(ML)) - var/list/ventcrawl_verbs = list(/mob/living/carbon/monkey/verb/ventcrawl, /mob/living/carbon/alien/verb/alien_ventcrawl, /mob/living/carbon/slime/verb/ventcrawl,/mob/living/simple_animal/mouse/verb/ventcrawl) - if(length(ML.verbs & ventcrawl_verbs)) // alien queens have this removed, an istype would be complicated - ML.handle_ventcrawl(src) - return - ..() diff --git a/code/_onclick/ventcrawl.dm b/code/_onclick/ventcrawl.dm new file mode 100644 index 00000000000..f80b0933a71 --- /dev/null +++ b/code/_onclick/ventcrawl.dm @@ -0,0 +1,37 @@ +var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /obj/machinery/atmospherics/unary/vent_scrubber) + +/mob/living/carbon/slime/AltClickOn(var/atom/A) + if(is_type_in_list(A,ventcrawl_machinery)) + src.ventcrawl(A) + return + ..(A) + +/mob/living/carbon/monkey/AltClickOn(var/atom/A) + if(is_type_in_list(A,ventcrawl_machinery)) + src.ventcrawl(A) + return + ..(A) + +/mob/living/simple_animal/borer/AltClickOn(var/atom/A) + if(is_type_in_list(A,ventcrawl_machinery)) + src.ventcrawl(A) + return + ..(A) + +/mob/living/simple_animal/mouse/AltClickOn(var/atom/A) + if(is_type_in_list(A,ventcrawl_machinery)) + src.ventcrawl(A) + return + ..(A) + +/mob/living/simple_animal/spiderbot/AltClickOn(var/atom/A) + if(is_type_in_list(A,ventcrawl_machinery)) + src.ventcrawl(A) + return + ..(A) + +/mob/living/carbon/alien/AltClickOn(var/atom/A) + if(is_type_in_list(A,ventcrawl_machinery)) + src.ventcrawl(A) + return + ..(A) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm index 867804f87c2..dd99aa3fe86 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm @@ -47,7 +47,7 @@ real_name = src.name verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/resin) - verbs -= /mob/living/carbon/alien/verb/alien_ventcrawl + verbs -= /mob/living/carbon/alien/verb/ventcrawl ..() /mob/living/carbon/alien/humanoid/empress diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 2c4ba4a7e43..85f898640ab 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -24,7 +24,7 @@ real_name = src.name verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin,/mob/living/carbon/alien/humanoid/proc/resin) - verbs -= /mob/living/carbon/alien/verb/alien_ventcrawl + verbs -= /mob/living/carbon/alien/verb/ventcrawl ..() diff --git a/code/modules/mob/living/carbon/alien/powers.dm b/code/modules/mob/living/carbon/alien/powers.dm index 1af22f401eb..c735c43adf8 100644 --- a/code/modules/mob/living/carbon/alien/powers.dm +++ b/code/modules/mob/living/carbon/alien/powers.dm @@ -1,5 +1,5 @@ -/mob/living/carbon/alien/verb/alien_ventcrawl() // -- TLE - set name = "Crawl through vent (alien)" +/mob/living/carbon/alien/verb/ventcrawl(var/atom/pipe) // -- TLE + set name = "Crawl Through Vent(Alien)" set desc = "Enter an air vent and crawl through the pipe system." set category = "Alien" - handle_ventcrawl() \ No newline at end of file + handle_ventcrawl(pipe) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c52ba708661..2a8f173eb2f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1,3 +1,6 @@ +mob/living + var/canEnterVentWith = "/obj/item/weapon/implant=0&/obj/item/clothing/mask/facehugger=0&/obj/item/device/radio/borg=0&/obj/machinery/camera=0" + /mob/living/carbon/Login() ..() update_hud() @@ -256,104 +259,80 @@ /mob/living/carbon/can_use_vents() return -/mob/living/proc/handle_ventcrawl(var/obj/machinery/atmospherics/unary/vent_pump/vent_found = null, var/ignore_items = 0) // -- TLE -- Merged by Carn - if(stat) - src << "You must be conscious to do this!" - return - if(lying) - src << "You can't vent crawl while you're stunned!" - return +/mob/living/proc/handle_ventcrawl(var/atom/clicked_on) // -- TLE -- Merged by Carn + diary << "[src] is ventcrawling." + if(!stat) + if(!lying) - var/special_fail_msg = can_use_vents() - if(special_fail_msg) - src << "\red [special_fail_msg]" - return +/* + if(clicked_on) + world << "We start with [clicked_on], and [clicked_on.type]" +*/ + var/obj/machinery/atmospherics/unary/vent_found + + if(clicked_on && Adjacent(clicked_on)) + var/obj/machinery/atmospherics/unary/vent_pump/v = clicked_on + if(!istype(v) || !v.welded) + vent_found = clicked_on + + if(!vent_found) + for(var/obj/machinery/atmospherics/machine in range(1,src)) + if(is_type_in_list(machine, ventcrawl_machinery)) + vent_found = machine + + var/obj/machinery/atmospherics/unary/vent_pump/v = machine + if(istype(v) && v.welded) + vent_found = null + + if(vent_found) + if(vent_found.network && (vent_found.network.normal_members.len || vent_found.network.line_members.len)) + + src << "You begin climbing into the ventilation system..." + if(!do_after(src, 45)) + return + + if(!client) + return + + if(contents.len && !isrobot(src)) + for(var/obj/item/carried_item in contents)//If the ventcrawler got on objects. + if(!(isInTypes(carried_item, canEnterVentWith))) + src << "You can't be carrying items or have items equipped when vent crawling!" + return + + visible_message("[src] scrambles into the ventilation ducts!", "You climb into the ventilation system.") + + loc = vent_found + add_ventcrawl(vent_found) + + else + src << "This vent is not connected to anything." + + else + src << "You must be standing on or beside an air vent to enter it." + + else + src << "You can't vent crawl while you're stunned!" - if(vent_found) // one was passed in, probably from vent/AltClick() - if(vent_found.welded) - src << "That vent is welded shut." - return - if(!vent_found.Adjacent(src)) - return // don't even acknowledge that else - for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src)) - if(!v.welded) - if(v.Adjacent(src)) - vent_found = v - if(!vent_found) - src << "You'll need a non-welded vent to crawl into!" - return + src << "You must be conscious to do this!" + return - if(!vent_found.network || !vent_found.network.normal_members.len) - src << "This vent is not connected to anything." - return +/mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/unary/starting_machine) + for(var/datum/pipeline/pipeline in starting_machine.network.line_members) + for(var/atom/A in (pipeline.members || pipeline.edges)) + var/image/new_image = image(A, A.loc, dir = A.dir) + pipes_shown += new_image + client.images += new_image - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members) - if(temp_vent.welded) - continue - if(temp_vent in loc) - continue - var/turf/T = get_turf(temp_vent) +/mob/living/proc/remove_ventcrawl() + for(var/image/current_image in pipes_shown) + client.images -= current_image - if(!T || T.z != loc.z) - continue + pipes_shown.len = 0 - var/i = 1 - var/index = "[T.loc.name]\[[i]\]" - while(index in vents) - i++ - index = "[T.loc.name]\[[i]\]" - vents[index] = temp_vent - if(!vents.len) - src << "\red There are no available vents to travel to, they could be welded." - return - - var/obj/selection = input("Select a destination.", "Duct System") as null|anything in sortAssoc(vents) - if(!selection) return - - if(!vent_found.Adjacent(src)) - src << "Never mind, you left." - return - - if(!ignore_items) - for(var/obj/item/carried_item in contents)//If the monkey got on objects. - if( !istype(carried_item, /obj/item/weapon/implant) && !istype(carried_item, /obj/item/clothing/mask/facehugger) )//If it's not an implant or a facehugger - src << "\red You can't be carrying items or have items equipped when vent crawling!" - return - - if(isslime(src)) - var/mob/living/carbon/slime/S = src - if(S.Victim) - src << "\red You'll have to let [S.Victim] go or finish eating \him first." - return - - var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection] - if(!target_vent) - return - - for(var/mob/O in viewers(src, null)) - O.show_message(text("[src] scrambles into the ventillation ducts!"), 1) - loc = target_vent - - var/travel_time = round(get_dist(loc, target_vent.loc) / 2) - - spawn(travel_time) - - if(!target_vent) return - for(var/mob/O in hearers(target_vent,null)) - O.show_message("You hear something squeezing through the ventilation ducts.",2) - - sleep(travel_time) - - if(!target_vent) return - if(target_vent.welded) //the vent can be welded while alien scrolled through the list or travelled. - target_vent = vent_found //travel back. No additional time required. - src << "\red The vent you were heading to appears to be welded." - loc = target_vent.loc - var/area/new_area = get_area(loc) - if(new_area) - new_area.Entered(src) + if(client) + client.eye = src /mob/living/carbon/clean_blood() . = ..() diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm index bb7dcbe7bbc..23733bb9b87 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/metroid/powers.dm @@ -104,7 +104,7 @@ adjustBruteLoss(-10) adjustFireLoss(-10) adjustCloneLoss(-10) - + updatehealth() if(Victim) Victim.updatehealth() @@ -227,9 +227,9 @@ else src << "I am not old enough to reproduce yet..." -/mob/living/carbon/slime/verb/ventcrawl() +/mob/living/carbon/slime/verb/ventcrawl(var/atom/pipe) set name = "Crawl through Vent" set desc = "Enter an air vent and crawl through the pipe system." set category = "Slime" if(Victim) return - handle_ventcrawl() \ No newline at end of file + handle_ventcrawl(pipe) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/powers.dm b/code/modules/mob/living/carbon/monkey/powers.dm index e7c6937cda2..1ed34a6b73c 100644 --- a/code/modules/mob/living/carbon/monkey/powers.dm +++ b/code/modules/mob/living/carbon/monkey/powers.dm @@ -1,5 +1,5 @@ -/mob/living/carbon/monkey/verb/ventcrawl() +/mob/living/carbon/monkey/verb/ventcrawl(var/atom/pipe) set name = "Crawl through Vent" set desc = "Enter an air vent and crawl through the pipe system." set category = "Monkey" - handle_ventcrawl() + handle_ventcrawl(pipe) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 5bda59435af..7c235b0349a 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -44,3 +44,6 @@ var/silent = null //Can't talk. Value goes down every life proc. var/floating = 0 var/nightvision = 0 + + var/list/icon/pipes_shown = list() + var/last_played_vent \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index c0bdc6fe0eb..e9e80db0dd4 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -456,11 +456,11 @@ mob/living/simple_animal/borer/proc/detatch() host_brain.real_name = M.real_name host.status_flags |= PASSEMOTES -/mob/living/simple_animal/borer/verb/ventcrawl() +/mob/living/simple_animal/borer/verb/ventcrawl(var/atom/pipe) set name = "Crawl through vent (borer)" set desc = "Enter an air vent and crawl through the pipe system." set category = "Alien" - handle_ventcrawl() + handle_ventcrawl(pipe) /mob/living/simple_animal/borer/can_use_vents() return diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 76e9bcc276d..65b6447696e 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -70,58 +70,11 @@ client.time_died_as_mouse = world.time //copy paste from alien/larva, if that func is updated please update this one also -/mob/living/simple_animal/mouse/verb/ventcrawl() +/mob/living/simple_animal/mouse/verb/ventcrawl(var/atom/pipe) set name = "Crawl through Vent" set desc = "Enter an air vent and crawl through the pipe system." set category = "Mouse" - -// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent)) -// return - - if(src.stat != CONSCIOUS) return - - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/welded = 0 - for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src)) - if(!v.welded) - vent_found = v - break - else - welded = 1 - if(vent_found) - if(vent_found.network&&vent_found.network.normal_members.len) - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members) - if(temp_vent.loc == loc) - continue - vents.Add(temp_vent) - var/list/choices = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents) - if(vent.loc.z != loc.z) - continue - var/atom/a = get_turf(vent) - choices.Add(a.loc) - var/turf/startloc = loc - var/obj/selection = input("Select a destination.", "Duct System") in choices - var/selection_position = choices.Find(selection) - if(loc==startloc) - var/obj/target_vent = vents[selection_position] - if(target_vent) - /* - for(var/mob/O in oviewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[src] scrambles into the ventillation ducts!"), 1) - */ - loc = target_vent.loc - else - src << "\blue You need to remain still while entering a vent." - else - src << "\blue This vent is not connected to anything." - else if(welded) - src << "\red That vent is welded." - else - src << "\blue You must be standing on or beside an air vent to enter it." - return + handle_ventcrawl(pipe) //make mice fit under tables etc? this was hacky, and not working /* diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index 4729438839e..195d2212436 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -140,7 +140,7 @@ for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded ))) M.show_message("\red [user] gently taps [src] with the [O]. ") - + /mob/living/simple_animal/spiderbot/emag_act(user as mob) if (emagged) user << "\red [src] is already overloaded - better run." @@ -219,51 +219,11 @@ return //copy paste from alien/larva, if that func is updated please update this one also -/mob/living/simple_animal/spiderbot/verb/ventcrawl() +/mob/living/simple_animal/spiderbot/verb/ventcrawl(var/atom/pipe) set name = "Crawl through Vent" set desc = "Enter an air vent and crawl through the pipe system." set category = "Spiderbot" - -// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent)) -// return - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/welded = 0 - for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src)) - if(!v.welded) - vent_found = v - break - else - welded = 1 - if(vent_found) - if(vent_found.network&&vent_found.network.normal_members.len) - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members) - if(temp_vent.loc == loc) - continue - vents.Add(temp_vent) - var/list/choices = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents) - if(vent.loc.z != loc.z) - continue - var/atom/a = get_turf(vent) - choices.Add(a.loc) - var/turf/startloc = loc - var/obj/selection = input("Select a destination.", "Duct System") in choices - var/selection_position = choices.Find(selection) - if(loc==startloc) - var/obj/target_vent = vents[selection_position] - if(target_vent) - loc = target_vent.loc - else - src << "\blue You need to remain still while entering a vent." - else - src << "\blue This vent is not connected to anything." - else if(welded) - src << "\red That vent is welded." - else - src << "\blue You must be standing on or beside an air vent to enter it." - return - + handle_ventcrawl(pipe) //Cannibalized from the parrot mob. ~Zuhayr /mob/living/simple_animal/spiderbot/verb/drop_held_item() diff --git a/paradise.dme b/paradise.dme index 47cb9cbd971..8460f9bd996 100644 --- a/paradise.dme +++ b/paradise.dme @@ -47,6 +47,7 @@ #include "code\_onclick\other_mobs.dm" #include "code\_onclick\overmind.dm" #include "code\_onclick\telekinesis.dm" +#include "code\_onclick\ventcrawl.dm" #include "code\_onclick\hud\_defines.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alien.dm" diff --git a/sound/machines/ventcrawl.ogg b/sound/machines/ventcrawl.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2df8b5c8981fe20074a1d036ea6434ccd67b9481 GIT binary patch literal 40591 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 literal 0 HcmV?d00001 From b96f5ea7efb1b3718eccf0867ffff05b8a7a8bec Mon Sep 17 00:00:00 2001 From: ComicIronic Date: Mon, 20 Apr 2015 14:44:52 -0700 Subject: [PATCH 2/2] OOP pipe-crawling procs You can now weld scrubbers, which stops their airflow and also crawling through them. There is now a proc for if a mob can ventcrawl through a pipe. --- code/ATMOSPHERICS/atmospherics.dm | 11 ++++-- .../components/unary/vent_pump.dm | 3 ++ .../components/unary/vent_scrubber.dm | 36 ++++++++++++++++-- code/modules/mob/living/carbon/carbon.dm | 13 ++++--- icons/atmos/vent_scrubber.dmi | Bin 1032 -> 3984 bytes 5 files changed, 50 insertions(+), 13 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 2444031a8c2..84cfa9a8264 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -156,21 +156,24 @@ obj/machinery/atmospherics/proc/check_connect_types_construction(obj/machinery/a var/obj/machinery/atmospherics/target_move = findConnecting(direction) if(target_move) - if(is_type_in_list(target_move, ventcrawl_machinery)) + if(is_type_in_list(target_move, ventcrawl_machinery) && target_move.can_crawl_through()) user.remove_ventcrawl() user.forceMove(target_move.loc) //handles entering and so on user.visible_message("You hear something squeezing through the ducts.", "You climb out the ventilation system.") - else + else if(target_move.can_crawl_through()) user.loc = target_move user.client.eye = target_move //if we don't do this, Byond only updates the eye every tick - required for smooth movement if(world.time - user.last_played_vent > VENT_SOUND_DELAY) user.last_played_vent = world.time playsound(src, 'sound/machines/ventcrawl.ogg', 50, 1, -3) else - if((direction & initialize_directions) || is_type_in_list(src, ventcrawl_machinery)) //if we move in a way the pipe can connect, but doesn't - or we're in a vent + if((direction & initialize_directions) || is_type_in_list(src, ventcrawl_machinery) && target_move.can_crawl_through()) //if we move in a way the pipe can connect, but doesn't - or we're in a vent user.remove_ventcrawl() user.forceMove(src.loc) user.visible_message("You hear something squeezing through the pipes.", "You climb out the ventilation system.") user.canmove = 0 spawn(1) - user.canmove = 1 \ No newline at end of file + user.canmove = 1 + +/obj/machinery/atmospherics/proc/can_crawl_through() + return 1 \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index a96d5b1acd4..4c6a529e3bb 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -307,6 +307,9 @@ update_icon() return +/obj/machinery/atmospherics/unary/vent_pump/can_crawl_through() + return !welded + /obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 05d60c80c96..23b1f7899de 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -23,13 +23,14 @@ var/volume_rate = 120 var/panic = 0 //is this scrubber panicked? + var/welded = 0 var/area_uid var/radio_filter_out var/radio_filter_in connect_types = list(1,3) //connects to regular and scrubber pipes - + /obj/machinery/atmospherics/unary/vent_scrubber/New() icon = null @@ -50,7 +51,7 @@ return overlays.Cut() - + var/scrubber_icon = "scrubber" var/turf/T = get_turf(src) @@ -61,6 +62,8 @@ scrubber_icon += "off" else scrubber_icon += "[on ? "[scrubbing ? "on" : "in"]" : "off"]" + if(welded) + scrubber_icon = "scrubberweld" overlays += icon_manager.get_atmos_icon("device", , , scrubber_icon) @@ -127,6 +130,8 @@ return if (!node) on = 0 + if(welded) + return 0 //broadcast_status() if(!on) return 0 @@ -151,7 +156,7 @@ removed.oxygen = 0 if(scrub_N2) filtered_out.nitrogen = removed.nitrogen - removed.nitrogen = 0 + removed.nitrogen = 0 if(scrub_Toxins) filtered_out.toxins = removed.toxins removed.toxins = 0 @@ -229,7 +234,7 @@ scrubbing = text2num(signal.data["scrubbing"]) if(signal.data["toggle_scrubbing"]) scrubbing = !scrubbing - + if(signal.data["o2_scrub"] != null) scrub_O2 = text2num(signal.data["o2_scrub"]) if(signal.data["toggle_o2_scrub"]) @@ -276,7 +281,30 @@ if(old_stat != stat) update_icon() +/obj/machinery/atmospherics/unary/vent_scrubber/can_crawl_through() + return !welded + /obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if (WT.remove_fuel(0,user)) + user << "Now welding the scrubber." + if(do_after(user, 20)) + if(!src || !WT.isOn()) return + playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1) + if(!welded) + user.visible_message("[user] welds the scrubber shut.", "You weld the vent scrubber.", "You hear welding.") + welded = 1 + update_icon() + else + user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.") + welded = 0 + update_icon() + else + user << "The welding tool needs to be on to start this task." + else + user << "You need more welding fuel to complete this task." + return 1 if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && on) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 2a8f173eb2f..c99cf3e2b31 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -271,19 +271,22 @@ mob/living var/obj/machinery/atmospherics/unary/vent_found if(clicked_on && Adjacent(clicked_on)) - var/obj/machinery/atmospherics/unary/vent_pump/v = clicked_on - if(!istype(v) || !v.welded) - vent_found = clicked_on + vent_found = clicked_on + if(!istype(vent_found) || !vent_found.can_crawl_through()) + vent_found = null + if(!vent_found) for(var/obj/machinery/atmospherics/machine in range(1,src)) if(is_type_in_list(machine, ventcrawl_machinery)) vent_found = machine - var/obj/machinery/atmospherics/unary/vent_pump/v = machine - if(istype(v) && v.welded) + if(!vent_found.can_crawl_through()) vent_found = null + if(vent_found) + break + if(vent_found) if(vent_found.network && (vent_found.network.normal_members.len || vent_found.network.line_members.len)) diff --git a/icons/atmos/vent_scrubber.dmi b/icons/atmos/vent_scrubber.dmi index e8e7f91640877a551bf139d8191cca32502fca5d..f1d3c3cba6d194e05df8148c44b1c75db076be9a 100644 GIT binary patch literal 3984 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 delta 1023 zcmVfFDZ*Bkpc$`yK zaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+ zH?bhTIJu}aDJiu`iHkEOv#1!Pmy0v4C^0t`#5P1I&QD82s4>K$CXb+!OdLu~fugB7 ziIpH>9Vp~dR)28ya{+q|02HS_6#5fX^#A|@%t=H+RA_CNuFtSMK|J8M`2{z$l)y`A0#7eEo}Zx80b>QJ$Ah|UtHYsc+gd;W zGa8N;`CVrUNLK)k=K`4NyvL)~-2`Au0nBx9Z9m|c*SE`Qzdv1WAb@o<8jg#P3Sa_X zEg+{Y&@^nfV@)${0qJi6tcibi4_wd3vOJ!z8-Lsb^iKi#I6yuUlFtRmWVOv~7@2Od z>3Xa6KxDxYU$AVpA__0L{sfe@odV)zH@)#7w_fDtliYr1Wc+7fvt4o?wdZMh+@2@q z@g-Se{tbJcmVaYe{synU@p(ROObkC*gm~rhRVd%-^ExZcni+mD{1DP@XF^c zF@N`K`N8l*h*vIOh4Pi*mCs#c_T2J=;fD~fT)qnBE5j?_{sLytE&u8QKRm3&Idw~8aARhd0c??hIq!;guNl=9V6c@V{rQeO25MU15d3mvVRcy zb{&J;A5h@mRd{~@ynU@A`v-b&An^MFRDj(dfUCDH;P>}q3xxRKFDx*S-vjhd0r@yU tJ`$481*!c%E+Do4M-^oMpONuz@de1Y3rJWkvzq__002ovPDHLkV1fej+&cgO