diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 77bb9276f64..f2198e90718 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -15,7 +15,7 @@ persistent = TRUE appearance_flags = NO_CLIENT_COLOR cleanable_scent = "blood" - scent_descriptor = SCENT_DESC_ODOR + scent_descriptor = "odour" var/base_icon = 'icons/effects/blood.dmi' var/basecolor=COLOR_BLOOD_HUMAN // Color when wet. diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 66319d3ee89..d8cd0b321ec 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -14,7 +14,7 @@ var/cleanable_scent var/scent_type = /datum/extension/scent/custom var/scent_intensity = /decl/scent_intensity/normal - var/scent_descriptor = SCENT_DESC_SMELL + var/scent_descriptor = "smell" var/scent_range = 2 /obj/effect/decal/cleanable/Initialize(var/ml, var/_age) diff --git a/code/game/objects/items/weapons/circuitboards/broken.dm b/code/game/objects/items/circuitboards/broken.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/broken.dm rename to code/game/objects/items/circuitboards/broken.dm diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/circuitboard.dm rename to code/game/objects/items/circuitboards/circuitboard.dm diff --git a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm b/code/game/objects/items/circuitboards/computer/air_management.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/computer/air_management.dm rename to code/game/objects/items/circuitboards/computer/air_management.dm diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/circuitboards/computer/computer.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/computer/computer.dm rename to code/game/objects/items/circuitboards/computer/computer.dm diff --git a/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm b/code/game/objects/items/circuitboards/computer/holodeckcontrol.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm rename to code/game/objects/items/circuitboards/computer/holodeckcontrol.dm diff --git a/code/game/objects/items/weapons/circuitboards/computer/modular.dm b/code/game/objects/items/circuitboards/computer/modular.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/computer/modular.dm rename to code/game/objects/items/circuitboards/computer/modular.dm diff --git a/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm b/code/game/objects/items/circuitboards/computer/shuttle.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/computer/shuttle.dm rename to code/game/objects/items/circuitboards/computer/shuttle.dm diff --git a/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm b/code/game/objects/items/circuitboards/computer/station_alert.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/computer/station_alert.dm rename to code/game/objects/items/circuitboards/computer/station_alert.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm b/code/game/objects/items/circuitboards/machinery/biogenerator.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm rename to code/game/objects/items/circuitboards/machinery/biogenerator.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm b/code/game/objects/items/circuitboards/machinery/chemistry.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm rename to code/game/objects/items/circuitboards/machinery/chemistry.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm b/code/game/objects/items/circuitboards/machinery/cloning.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/cloning.dm rename to code/game/objects/items/circuitboards/machinery/cloning.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm b/code/game/objects/items/circuitboards/machinery/commsantenna.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm rename to code/game/objects/items/circuitboards/machinery/commsantenna.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/docking_beacon.dm b/code/game/objects/items/circuitboards/machinery/docking_beacon.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/docking_beacon.dm rename to code/game/objects/items/circuitboards/machinery/docking_beacon.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/engineering_circuits.dm b/code/game/objects/items/circuitboards/machinery/engineering_circuits.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/engineering_circuits.dm rename to code/game/objects/items/circuitboards/machinery/engineering_circuits.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/forensic.dm b/code/game/objects/items/circuitboards/machinery/forensic.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/forensic.dm rename to code/game/objects/items/circuitboards/machinery/forensic.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/holomap.dm b/code/game/objects/items/circuitboards/machinery/holomap.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/holomap.dm rename to code/game/objects/items/circuitboards/machinery/holomap.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/household.dm b/code/game/objects/items/circuitboards/machinery/household.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/household.dm rename to code/game/objects/items/circuitboards/machinery/household.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm b/code/game/objects/items/circuitboards/machinery/mech_recharger.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm rename to code/game/objects/items/circuitboards/machinery/mech_recharger.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/medical.dm b/code/game/objects/items/circuitboards/machinery/medical.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/medical.dm rename to code/game/objects/items/circuitboards/machinery/medical.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining.dm b/code/game/objects/items/circuitboards/machinery/mining.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/mining.dm rename to code/game/objects/items/circuitboards/machinery/mining.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm b/code/game/objects/items/circuitboards/machinery/mining_drill.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm rename to code/game/objects/items/circuitboards/machinery/mining_drill.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/network.dm b/code/game/objects/items/circuitboards/machinery/network.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/network.dm rename to code/game/objects/items/circuitboards/machinery/network.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/oxyregenerator.dm b/code/game/objects/items/circuitboards/machinery/oxyregenerator.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/oxyregenerator.dm rename to code/game/objects/items/circuitboards/machinery/oxyregenerator.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm b/code/game/objects/items/circuitboards/machinery/pacman.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/pacman.dm rename to code/game/objects/items/circuitboards/machinery/pacman.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/portable_atmospherics.dm b/code/game/objects/items/circuitboards/machinery/portable_atmospherics.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/portable_atmospherics.dm rename to code/game/objects/items/circuitboards/machinery/portable_atmospherics.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/power.dm b/code/game/objects/items/circuitboards/machinery/power.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/power.dm rename to code/game/objects/items/circuitboards/machinery/power.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm b/code/game/objects/items/circuitboards/machinery/recharge_station.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm rename to code/game/objects/items/circuitboards/machinery/recharge_station.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/circuitboards/machinery/research.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/research.dm rename to code/game/objects/items/circuitboards/machinery/research.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/self_destruct_storage.dm b/code/game/objects/items/circuitboards/machinery/self_destruct_storage.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/self_destruct_storage.dm rename to code/game/objects/items/circuitboards/machinery/self_destruct_storage.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm b/code/game/objects/items/circuitboards/machinery/shieldgen.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm rename to code/game/objects/items/circuitboards/machinery/shieldgen.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shipsensors.dm b/code/game/objects/items/circuitboards/machinery/shipsensors.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/shipsensors.dm rename to code/game/objects/items/circuitboards/machinery/shipsensors.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm b/code/game/objects/items/circuitboards/machinery/telecomms.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm rename to code/game/objects/items/circuitboards/machinery/telecomms.dm diff --git a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm b/code/game/objects/items/circuitboards/machinery/unary_atmos.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm rename to code/game/objects/items/circuitboards/machinery/unary_atmos.dm diff --git a/code/game/objects/items/weapons/circuitboards/other.dm b/code/game/objects/items/circuitboards/other.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/other.dm rename to code/game/objects/items/circuitboards/other.dm diff --git a/code/game/objects/items/weapons/circuitboards/wall.dm b/code/game/objects/items/circuitboards/wall.dm similarity index 100% rename from code/game/objects/items/weapons/circuitboards/wall.dm rename to code/game/objects/items/circuitboards/wall.dm diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/hailer.dm similarity index 100% rename from code/game/objects/items/devices/whistle.dm rename to code/game/objects/items/devices/hailer.dm diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm b/code/game/objects/items/stools.dm similarity index 100% rename from code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm rename to code/game/objects/items/stools.dm diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm similarity index 100% rename from code/game/objects/items/weapons/tools/crowbar.dm rename to code/game/objects/items/tools/crowbar.dm diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm similarity index 100% rename from code/game/objects/items/weapons/tools/screwdriver.dm rename to code/game/objects/items/tools/screwdriver.dm diff --git a/code/game/objects/items/weapons/tools/shears.dm b/code/game/objects/items/tools/shears.dm similarity index 100% rename from code/game/objects/items/weapons/tools/shears.dm rename to code/game/objects/items/tools/shears.dm diff --git a/code/game/objects/items/weapons/tools/wirecutter.dm b/code/game/objects/items/tools/wirecutter.dm similarity index 100% rename from code/game/objects/items/weapons/tools/wirecutter.dm rename to code/game/objects/items/tools/wirecutter.dm diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm similarity index 100% rename from code/game/objects/items/weapons/tools/wrench.dm rename to code/game/objects/items/tools/wrench.dm diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/locator.dm similarity index 96% rename from code/game/objects/items/weapons/teleportation.dm rename to code/game/objects/items/weapons/locator.dm index 3cb9f4a5dfc..a6ad7b1def9 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/locator.dm @@ -1,15 +1,9 @@ -/* Teleportation devices. - * Contains: - * Locator - * Hand-tele - */ - /* * Locator */ /obj/item/locator name = "locator" - desc = "Used to track those with locater implants." + desc = "Used to track those with locator implants." icon = 'icons/obj/items/device/locator.dmi' icon_state = ICON_STATE_WORLD var/temp = null diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm deleted file mode 100644 index 81ae83daba0..00000000000 --- a/code/game/objects/items/weapons/policetape.dm +++ /dev/null @@ -1,569 +0,0 @@ -#define MAX_BARRICADE_TAPE_LENGTH 32 //Maximum length of a continuous line of tape someone can place down. -#define TAPE_BARRICADE_V_NEIGHBORS (NORTH | SOUTH) -#define TAPE_BARRICADE_H_NEIGHBORS (EAST | WEST) -#define TAPE_BARRICADE_IS_CORNER_NEIGHBORS(X) ((X ^ TAPE_BARRICADE_V_NEIGHBORS) && (X ^ TAPE_BARRICADE_H_NEIGHBORS)) -#define TAPE_BARRICADE_IS_V_NEIGHBORS(X) ((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS && !((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS)) //Check we have neighbors connection on the vertical plane -#define TAPE_BARRICADE_IS_H_NEIGHBORS(X) ((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS && !((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS)) //Check we have neighbors connection on the horizontal plane -#define TAPE_BARRICADE_IS_3W_V_NEIGHBORS(X) (TAPE_BARRICADE_IS_V_NEIGHBORS(X) && ((X & TAPE_BARRICADE_H_NEIGHBORS) > 0)) -#define TAPE_BARRICADE_IS_3W_H_NEIGHBORS(X) (TAPE_BARRICADE_IS_H_NEIGHBORS(X) && ((X & TAPE_BARRICADE_V_NEIGHBORS) > 0)) -#define TAPE_BARRICADE_IS_4W_NEIGHBORS(X) (((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS) && ((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS)) -#define CONNECTION_BITS_TO_TEXT(X) "[(X & WEST) > 0][(X & EAST) > 0][(X & SOUTH) > 0][(X & NORTH) > 0]" -#define TAPE_BARRICADE_GET_NB_NEIGHBORS(X) (((X & NORTH) > 0) + ((X & SOUTH) > 0) + ((X & EAST) > 0) + ((X & WEST) > 0)) - -var/global/list/image/hazard_overlays //Cached hazard floor overlays for the barricade tape - -//////////////////////////////////////////////////////////////////// -// Barricade Tape Template -//////////////////////////////////////////////////////////////////// -//Singletons with data on the various templates of barricade tape -/decl/barricade_tape_template - var/tape_kind = "barricade" //Used as a prefix to the word "tape" when refering to the tape and roll - var/tape_desc = "A tape barricade." //Description for the tape barricade - var/roll_desc = "A roll of barricade tape." //Description for the tape roll - var/icon_file = 'icons/policetape.dmi' //Icon file used for both the tape and roll - var/base_icon_state = "tape" //For the barricade. Icon state used to fetch the applied tape directional icons for various states - var/list/req_access //Access required to automatically pass through tape barricades - var/tape_color //Color of the tape - var/detail_overlay //Overlay for the applied tape - var/detail_color //Color for the detail overlay - -/decl/barricade_tape_template/proc/make_line_barricade(var/mob/user, var/turf/T, var/pdir) - var/obj/structure/tape_barricade/bar = new(T,,,src) - bar.add_fingerprint(user) - return bar - -/decl/barricade_tape_template/proc/make_door_barricade(var/mob/user, var/obj/door) - var/obj/structure/tape_barricade/door/bar = new(get_turf(door)) - bar.set_tape_template(src) - bar.set_dir(door.dir) - bar.add_fingerprint(user) - return bar - -//////////////////////////////////////////////////////////////////// -// Barricade Tape Roll -//////////////////////////////////////////////////////////////////// -/obj/item/stack/tape_roll/barricade_tape - name = "barricade tape roll" - desc = "A roll of high visibility, non-sticky barricade tape. Used to deter passersby from crossing it." - icon = 'icons/policetape.dmi' - icon_state = "tape" - w_class = ITEM_SIZE_SMALL - var/tmp/turf/start //The turf we started unrolling from - var/tmp/weakref/unroller //The mob currently unrolling us - var/decl/barricade_tape_template/tape_template //Template containing details on how the tape roll will look and behave, along with what it will place down - -/obj/item/stack/tape_roll/barricade_tape/Initialize() - . = ..() - apply_template() - -/obj/item/stack/tape_roll/barricade_tape/Destroy() - stop_unrolling() - return ..() - -/**Update our appearence and data to match the specified tape template. */ -/obj/item/stack/tape_roll/barricade_tape/proc/apply_template() - if(ispath(tape_template)) - tape_template = GET_DECL(tape_template) - if(!tape_template) - return - - SetName("[tape_template.tape_kind] tape roll") - desc = tape_template.roll_desc - icon = tape_template.icon_file - set_color(tape_template.tape_color) - update_icon() - -/obj/item/stack/tape_roll/barricade_tape/on_update_icon() - . = ..() - if(ismob(loc)) - add_overlay(overlay_image(icon, start? "stop" : "start", flags = RESET_COLOR)) - -/obj/item/stack/tape_roll/barricade_tape/dropped(mob/user) - stop_unrolling() - update_icon() - return ..() - -/obj/item/stack/tape_roll/barricade_tape/on_picked_up(mob/user) - stop_unrolling() - update_icon() - return ..() - -/obj/item/stack/tape_roll/barricade_tape/attack_hand() - . = ..() - if(. && !QDELETED(src)) - update_icon() - -/**Callback used when whoever holds us moved to a new turf. */ -/obj/item/stack/tape_roll/barricade_tape/proc/user_moved_unrolling(var/mob/M, var/atom/old_loc, var/atom/new_loc) - if(QDELETED(src)) - return //Destructor will handle the rest - if(QDELETED(M) || !can_use(1) || M.incapacitated()) - stop_unrolling() - return - - if((old_loc.x != new_loc.x && old_loc.y != new_loc.y) || old_loc.z != new_loc.z) - to_chat(M, SPAN_WARNING("\The [src] can only be laid horizontally or vertically.")) - stop_unrolling() - return - //Use a length of tape and place a barricade line - if(!place_line(M, new_loc, get_dir(old_loc, new_loc))) - stop_unrolling() - return - if(get_dist(start, new_loc) >= MAX_BARRICADE_TAPE_LENGTH) - to_chat(M, SPAN_WARNING("You've stretched this line of tape to the maximum!")) - stop_unrolling() - return - -/obj/item/stack/tape_roll/barricade_tape/proc/stop_unrolling() - if(!start && !unroller) - return - var/mob/_uroller = unroller.resolve() - if(_uroller) - events_repository.unregister(/decl/observ/moved, _uroller, src, PROC_REF(user_moved_unrolling)) - unroller = null - start = null - slowdown_general = initial(slowdown_general) - if(_uroller) - to_chat(_uroller, SPAN_NOTICE("You stop unrolling \the [src].")) - if(!QDELETED(src)) - update_icon() - return TRUE - -/obj/item/stack/tape_roll/barricade_tape/proc/start_unrolling(var/mob/user) - if(start && unroller) - return - start = get_turf(src) - unroller = weakref(user) - slowdown_general = initial(slowdown_general) + 2 //While unrolling you're slightly slower - events_repository.unregister(/decl/observ/moved, user, src, PROC_REF(user_moved_unrolling)) - events_repository.register(/decl/observ/moved, user, src, PROC_REF(user_moved_unrolling)) - to_chat(user, SPAN_NOTICE("You start unrolling \the [src].")) - //Place the first one immediately - place_line(user, get_turf(user), user.dir) - update_icon() - return TRUE - -/**Place a tape line on the current turf. */ -/obj/item/stack/tape_roll/barricade_tape/proc/place_line(var/mob/user, var/turf/T, var/pdir) - if(!T || T.is_open() || T.is_wall()) - to_chat(user, SPAN_WARNING("You can't place tape here!")) - return - if(locate(/obj/structure/tape_barricade) in T) - return //Can't place 2 on the same tile! - - if(!can_use(1)) - to_chat(user, SPAN_WARNING("You are out of [tape_template.tape_kind] tape!")) - return - use(1) - playsound(user, 'sound/effects/pageturn2.ogg', 50, TRUE) - - var/obj/structure/tape_barricade/barricade = tape_template.make_line_barricade(user, T, pdir) - if(barricade) - barricade.matter = matter_per_piece?.Copy() - barricade.update_neighbors() - return barricade - -/obj/item/stack/tape_roll/barricade_tape/attack_self(mob/user) - if(start) - stop_unrolling() - return - if(!can_use(1)) - return //This shouldn't happen, but if it does, don't let them exploit it - - start_unrolling(user) - -/obj/item/stack/tape_roll/barricade_tape/afterattack(var/atom/A, mob/user, proximity) - if(!proximity) - return - - if (istype(A, /obj/machinery/door/airlock)) - if(!can_use(4)) - to_chat(user, SPAN_WARNING("There isn't enough [plural_name] in \the [src] to barricade \the [A]. You need at least 4 [plural_name].")) - return - - var/obj/structure/tape_barricade/door/bar = tape_template.make_door_barricade(user, A) - if(bar) - bar.matter = matter_per_piece?.Copy() - if(bar.matter) - for(var/mat in bar.matter) - bar.matter[mat] = round(bar.matter[mat] * 4) - - to_chat(user, SPAN_NOTICE("You finish placing \the [src].")) - use(4) - -//////////////////////////////////////////////////////////////////// -// Tape Line Barricade -//////////////////////////////////////////////////////////////////// -/obj/structure/tape_barricade - name = "tape line" - desc = "A line of barricade tape." - icon = 'icons/policetape.dmi' - icon_state = "tape_2w_0" - dir = SOUTH //This structure will try to turn its icon depending on what neighbors it has - layer = ABOVE_DOOR_LAYER - pass_flags = PASS_FLAG_TABLE //About the height of table - anchored = TRUE - material = /decl/material/solid/organic/plastic - current_health = 5 - var/neighbors = 0 //Contains all the direction flags of all the neighboring tape_barricades - var/is_lifted = 0 //Whether the tape is lifted and we're allowing everyone passage. - var/is_crumpled = 0 //Whether the tape was damaged - var/decl/barricade_tape_template/tape_template //Details about the behavior and looks of the barricade - -/obj/structure/tape_barricade/Initialize(ml, _mat, _reinf_mat, var/decl/barricade_tape_template/_tape_template) - . = ..() - if(!hazard_overlays) - hazard_overlays = list() - hazard_overlays["[NORTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "N") - hazard_overlays["[EAST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "E") - hazard_overlays["[SOUTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "S") - hazard_overlays["[WEST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "W") - set_tape_template(_tape_template) - -/obj/structure/tape_barricade/LateInitialize() - . = ..() - build_connection_bits() - update_neighbors() - -/obj/structure/tape_barricade/Destroy() - var/turf/old_loc = get_turf(src) - . = ..() - if(istype(old_loc)) - update_neighbors(old_loc) - -/obj/structure/tape_barricade/proc/set_tape_template(var/decl/barricade_tape_template/tmpl) - if(tmpl) - tape_template = tmpl - if(ispath(tape_template)) - tape_template = GET_DECL(tape_template) - if(!tape_template) - return - - SetName("[tape_template.tape_kind] tape line") - desc = tape_template.tape_desc - icon = tape_template.icon_file - req_access = tape_template.req_access - set_color(tape_template.tape_color) - update_icon() - -/**Cause neighbors to update their icon. */ -/obj/structure/tape_barricade/proc/update_neighbors(var/location = loc) - for (var/look_dir in global.cardinal) - var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, get_step(location, look_dir)) - if(!QDELETED(B)) - B.update_icon() - - if(!QDELETED(src)) - update_icon() - -/**Updates our connection bits to keep track of the things we're connected to */ -/obj/structure/tape_barricade/proc/build_connection_bits() - neighbors = 0 - for (var/look_dir in global.cardinal) - var/turf/target_turf = get_step(src, look_dir) - if(target_turf) - var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade) in target_turf - //We connect to walls and other tape_barricades - if((B && !QDELETED(B)) || (!B && target_turf.is_wall())) - neighbors |= look_dir - -/**Allow sutypes to override with their own forced icon state name.*/ -/obj/structure/tape_barricade/proc/icon_name_override() - return - -/obj/structure/tape_barricade/on_update_icon() - . = ..() - if(isnull(tape_template) || ispath(tape_template)) - return - //Look up our neighbors - build_connection_bits() - - var/icon_name = icon_name_override() - if(!icon_name) - //Build the icon state from whethere we've got a right angle with out neighbors or not - if(TAPE_BARRICADE_IS_4W_NEIGHBORS(neighbors)) - set_dir(SOUTH) - icon_name = "4w" - - //3 Ways - else if(TAPE_BARRICADE_IS_3W_H_NEIGHBORS(neighbors)) - set_dir(neighbors & TAPE_BARRICADE_V_NEIGHBORS) - icon_name = "3w" - else if(TAPE_BARRICADE_IS_3W_V_NEIGHBORS(neighbors)) - set_dir(neighbors & TAPE_BARRICADE_H_NEIGHBORS) - icon_name = "3w" - - //Lines - else if(TAPE_BARRICADE_IS_H_NEIGHBORS(neighbors)) - set_dir(EAST) - icon_name = "2w" - else if(TAPE_BARRICADE_IS_V_NEIGHBORS(neighbors)) - set_dir(SOUTH) - icon_name = "2w" - - //Endpoints/corners - else - if(neighbors > 0) - set_dir(neighbors) //Make sure if we have no connections we don't set a bad dir - icon_name = "dir" - - icon_state = "[tape_template.base_icon_state]_[icon_name]_[is_crumpled]" - - //Overlays - if(tape_template.detail_overlay) - var/image/ovr = overlay_image(icon, "[tape_template.base_icon_state]_[icon_name]_[tape_template.detail_overlay]", tape_template.detail_color, RESET_COLOR) - ovr.dir = dir - add_overlay(ovr) - -/obj/structure/tape_barricade/attack_hand(mob/user) - - if(user.check_intent(I_FLAG_HARM)) - user.visible_message(SPAN_DANGER("\The [user] tears \the [src]!")) - physically_destroyed() - return TRUE - - if (!user.check_intent(I_FLAG_HELP) || !allowed(user) || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE)) - return ..() - - if(TAPE_BARRICADE_IS_CORNER_NEIGHBORS(neighbors) || (TAPE_BARRICADE_GET_NB_NEIGHBORS(neighbors) > 2)) - to_chat(user, SPAN_WARNING("You can't lift up the pole. Try lifting the line itself.")) - return TRUE - - if(!allowed(user)) - user.visible_message(SPAN_NOTICE("\The [user] carelessly pulls \the [src] out of the way.")) - crumple() - else - user.visible_message(SPAN_NOTICE("\The [user] lifts \the [src], officially allowing passage.")) - - for(var/obj/structure/tape_barricade/B in get_tape_line()) - B.lift(10 SECONDS) //~10 seconds - return TRUE - -/obj/structure/tape_barricade/dismantle_structure(mob/user) - for (var/obj/structure/tape_barricade/B in get_tape_line()) - if(B == src || QDELETED(B)) - continue - if(B.neighbors & get_dir(B, src)) - B.physically_destroyed() - . = ..() - -/obj/structure/tape_barricade/CanPass(atom/movable/mover, turf/target, height, air_group) - if(!is_lifted && ismob(mover)) - var/mob/M = mover - if (!allowed(M) && M.check_intent(I_FLAG_HELP)) - return FALSE - return ..() - -/obj/structure/tape_barricade/Crossed(atom/movable/AM) - . = ..() - if(is_lifted || !isliving(AM)) - return - var/mob/living/M = AM - add_fingerprint(M) - shake_animation(2) - if (!allowed(M)) //only select few learn art of not crumpling the tape - to_chat(M, SPAN_NOTICE("You are not supposed to go past \the [src]...")) - if(!M.check_intent(I_FLAG_HELP)) - crumple() - -/obj/structure/tape_barricade/proc/crumple() - if(!is_crumpled) - playsound(src, 'sound/effects/rip1.ogg', 60, TRUE) - take_damage(5) - is_crumpled = TRUE - update_icon() - -/**Temporarily lifts the tape line, allowing passage to anyone for the specified time, until the timer expires. */ -/obj/structure/tape_barricade/proc/lift(var/time) - if(!is_lifted) - is_lifted = TRUE - layer = ABOVE_HUMAN_LAYER - pass_flags = PASS_FLAG_MOB - pixel_y += 8 - addtimer(CALLBACK(src, PROC_REF(on_unlift)), time, TIMER_UNIQUE) - playsound(src, 'sound/effects/pageturn2.ogg', 50, TRUE) - -/**Called by timer when the tape line falls back in place. */ -/obj/structure/tape_barricade/proc/on_unlift() - is_lifted = FALSE - pass_flags = initial(pass_flags) - reset_plane_and_layer() - pixel_y -= 8 - playsound(src, 'sound/effects/pageturn2.ogg', 20, TRUE) - -// Returns a list of all tape objects connected to src, including itself. -/obj/structure/tape_barricade/proc/get_tape_line(var/list/ignored, var/line_index = 0) - //Don't include more in the line than this - if(line_index >= MAX_BARRICADE_TAPE_LENGTH) - return list() - - var/list/dirs = list() - if(neighbors & NORTH) - dirs += NORTH - if(neighbors & SOUTH) - dirs += SOUTH - if(neighbors & WEST) - dirs += WEST - if(neighbors & EAST) - dirs += EAST - - //Grab all cached connected neighbors - LAZYDISTINCTADD(ignored, src) - var/list/obj/structure/tape_barricade/tapeline = list(src) - for(var/look_dir in dirs) - var/turf/T = get_step(src, look_dir) - var/obj/structure/tape_barricade/B = locate() in T - if(!QDELETED(B) && !(B in ignored)) - if(TAPE_BARRICADE_IS_CORNER_NEIGHBORS(neighbors) || (TAPE_BARRICADE_GET_NB_NEIGHBORS(neighbors) > 2)) - continue //We stop at intersections, and corners - tapeline += B.get_tape_line(ignored, line_index + 1) //Pass us to prevent infinite loops, and adding us to the resulting line - return tapeline - -//////////////////////////////////////////////////////////////////// -// Door Tape Barricade -//////////////////////////////////////////////////////////////////// - -//Barricade over a single door -/obj/structure/tape_barricade/door - icon_state = "tape_door_0" - layer = ABOVE_DOOR_LAYER - -/obj/structure/tape_barricade/door/update_neighbors() - //We completely ignore neighbors - neighbors = 0 - -/obj/structure/tape_barricade/door/icon_name_override() - return "door" //Override the icon picking to pick this icon label instead - -//////////////////////////////////////////////////////////////////// -// Police Tape -//////////////////////////////////////////////////////////////////// -/decl/barricade_tape_template/police - tape_kind = "police" - tape_desc = "A length of police tape. Do not cross." - roll_desc = "A roll of police tape used to block off crime scenes from the public." - tape_color = COLOR_RED - req_access = list(access_security) - -/obj/item/stack/tape_roll/barricade_tape/police - tape_template = /decl/barricade_tape_template/police - -//mapper type -/obj/structure/tape_barricade/police - icon_state = "tape_door_0" - color = COLOR_RED - tape_template = /decl/barricade_tape_template/police - -//////////////////////////////////////////////////////////////////// -// Engineering Tape -//////////////////////////////////////////////////////////////////// -/decl/barricade_tape_template/engineering - tape_kind = "engineering" - tape_desc = "A length of engineering tape. Better not cross it." - roll_desc = "A roll of engineering tape used to block off working areas from the public." - tape_color = COLOR_ORANGE - req_access = list(list(access_engine,access_atmospherics)) - -/obj/item/stack/tape_roll/barricade_tape/engineering - tape_template = /decl/barricade_tape_template/engineering - -//mapper type -/obj/structure/tape_barricade/engineering - icon_state = "stripetape_door_0" - color = COLOR_ORANGE - tape_template = /decl/barricade_tape_template/engineering - -//////////////////////////////////////////////////////////////////// -// Atmospheric Tape -//////////////////////////////////////////////////////////////////// -/decl/barricade_tape_template/atmos - tape_kind = "atmospherics" - tape_desc = "A length of atmospherics tape. Better not cross it." - roll_desc = "A roll of atmospherics tape used to block off working areas from the public." - tape_color = COLOR_BLUE_LIGHT - req_access = list(list(access_engine,access_atmospherics)) - base_icon_state = "stripetape" - detail_overlay = "stripes" - detail_color = COLOR_YELLOW - -/obj/item/stack/tape_roll/barricade_tape/atmos - tape_template = /decl/barricade_tape_template/atmos - -//mapper type -/obj/structure/tape_barricade/atmos - icon_state = "stripetape_h_0" - color = COLOR_BLUE_LIGHT - tape_template = /decl/barricade_tape_template/atmos - -//////////////////////////////////////////////////////////////////// -// Research Tape -//////////////////////////////////////////////////////////////////// -/decl/barricade_tape_template/research - tape_kind = "research" - tape_desc = "A length of research tape. Better not cross it." - roll_desc = "A roll of research tape used to block off working areas from the public." - tape_color = COLOR_WHITE - req_access = list(access_research) - -/obj/item/stack/tape_roll/barricade_tape/research - tape_template = /decl/barricade_tape_template/research - -//mapper type -/obj/structure/tape_barricade/research - color = COLOR_WHITE - tape_template = /decl/barricade_tape_template/research - -//////////////////////////////////////////////////////////////////// -// Medical Tape -//////////////////////////////////////////////////////////////////// -/decl/barricade_tape_template/medical - tape_kind = "medical" - tape_desc = "A length of medical tape. Better not cross it." - roll_desc = "A roll of medical tape used to block off working areas from the public." - tape_color = COLOR_PALE_BLUE_GRAY - req_access = list(access_medical) - base_icon_state = "stripetape" - detail_overlay = "stripes" - detail_color = COLOR_PALE_BLUE_GRAY - -/obj/item/stack/tape_roll/barricade_tape/medical - tape_template = /decl/barricade_tape_template/medical - -//mapper type -/obj/structure/tape_barricade/medical - icon_state = "stripetape_h_0" - color = COLOR_PALE_BLUE_GRAY - tape_template = /decl/barricade_tape_template/medical - -//////////////////////////////////////////////////////////////////// -// Bureacratic Tape -//////////////////////////////////////////////////////////////////// -/decl/barricade_tape_template/bureaucracy - tape_kind = "red" - tape_desc = "A length of bureaucratic red tape. Safely ignored, but darn obstructive sometimes." - roll_desc = "A roll of bureaucratic red tape used to block any meaningful work from being done." - tape_color = COLOR_RED - base_icon_state = "stripetape" - detail_overlay = "stripes" - detail_color = COLOR_RED - -/obj/item/stack/tape_roll/barricade_tape/bureaucracy - tape_template = /decl/barricade_tape_template/bureaucracy - -//mapper type -/obj/structure/tape_barricade/bureaucracy - icon_state = "stripetape_h_0" - color = COLOR_RED - tape_template = /decl/barricade_tape_template/bureaucracy - -#undef MAX_BARRICADE_TAPE_LENGTH -#undef TAPE_BARRICADE_IS_CORNER_NEIGHBORS -#undef TAPE_BARRICADE_V_NEIGHBORS -#undef TAPE_BARRICADE_H_NEIGHBORS -#undef TAPE_BARRICADE_IS_V_NEIGHBORS -#undef TAPE_BARRICADE_IS_H_NEIGHBORS -#undef TAPE_BARRICADE_IS_3W_V_NEIGHBORS -#undef TAPE_BARRICADE_IS_3W_H_NEIGHBORS -#undef TAPE_BARRICADE_IS_4W_NEIGHBORS -#undef CONNECTION_BITS_TO_TEXT -#undef TAPE_BARRICADE_GET_NB_NEIGHBORS \ No newline at end of file diff --git a/code/game/objects/items/weapons/electric_welder.dm b/code/game/objects/items/welding/electric_welder.dm similarity index 86% rename from code/game/objects/items/weapons/electric_welder.dm rename to code/game/objects/items/welding/electric_welder.dm index cb949be907d..b3bd7176196 100644 --- a/code/game/objects/items/weapons/electric_welder.dm +++ b/code/game/objects/items/welding/electric_welder.dm @@ -42,10 +42,11 @@ var/obj/item/cell/cell = get_cell() return cell ? cell.charge : 0 -/obj/item/weldingtool/electric/attackby(var/obj/item/W, var/mob/user) - if(istype(W,/obj/item/stack/material/rods) || istype(W, /obj/item/chems/welder_tank)) - return FALSE // NO ELECTRIC FLAMETHROWER - return ..() +/obj/item/weldingtool/electric/insert_tank(var/obj/item/chems/welder_tank/T, var/mob/user, var/no_updates = FALSE, var/quiet = FALSE) + return FALSE // No tanks! + +/obj/item/weldingtool/electric/attempt_modify(var/obj/item/W, var/mob/user) + return FALSE // NO ELECTRIC FLAMETHROWER /obj/item/weldingtool/electric/use_fuel(var/amount) var/obj/item/cell/cell = get_cell() diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/welding/weldbackpack.dm similarity index 100% rename from code/game/objects/items/weapons/weldbackpack.dm rename to code/game/objects/items/welding/weldbackpack.dm diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/welding/weldingtool.dm similarity index 72% rename from code/game/objects/items/weapons/tools/weldingtool.dm rename to code/game/objects/items/welding/weldingtool.dm index 615c0068291..6a2158acb84 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/welding/weldingtool.dm @@ -379,149 +379,5 @@ material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) -////////////////////////////////////////////////////////////////// -// Welding tool tanks -////////////////////////////////////////////////////////////////// -/obj/item/chems/welder_tank - name = "welding tank" - base_name = "welding tank" - desc = "An interchangeable fuel tank meant for a welding tool." - icon = 'icons/obj/items/tool/welders/welder_tanks.dmi' - icon_state = "tank_normal" - w_class = ITEM_SIZE_SMALL - atom_flags = ATOM_FLAG_OPEN_CONTAINER - obj_flags = OBJ_FLAG_HOLLOW - volume = 20 - show_reagent_name = TRUE - current_health = 40 - max_health = 40 - material = /decl/material/solid/metal/steel - var/can_refuel = TRUE - var/size_in_use = ITEM_SIZE_NORMAL - var/unlit_force = 7 - var/lit_force = 11 - -/obj/item/chems/welder_tank/populate_reagents() - add_to_reagents(/decl/material/liquid/fuel, reagents.maximum_volume) - -/obj/item/chems/welder_tank/examine(mob/user, distance) - . = ..() - if(distance > 1) - return - if(reagents.total_volume <= 0) - to_chat(user, "It is empty.") - else - to_chat(user, "It contains [reagents.total_volume] units of liquid.") - to_chat(user, " It can hold up to [reagents.maximum_volume] units.") - -/obj/item/chems/welder_tank/afterattack(obj/O, mob/user, proximity, click_parameters) - if (!ATOM_IS_OPEN_CONTAINER(src) || !proximity) - return - if(standard_dispenser_refill(user, O)) - return TRUE - if(standard_pour_into(user, O)) - return TRUE - if(handle_eaten_by_mob(user, O) != EATEN_INVALID) - return TRUE - if(user.check_intent(I_FLAG_HARM)) - if(standard_splash_mob(user, O)) - return TRUE - if(reagents && reagents.total_volume) - to_chat(user, SPAN_DANGER("You splash the contents of \the [src] onto \the [O].")) - reagents.splash(O, reagents.total_volume) - return TRUE - return ..() - -/obj/item/chems/welder_tank/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE) - if(!can_refuel) - to_chat(user, SPAN_DANGER("\The [src] does not have a refuelling port.")) - return FALSE - . = ..() - if(.) - playsound(src.loc, 'sound/effects/refill.ogg', 50, TRUE, -6) - -/obj/item/chems/welder_tank/standard_pour_into(mob/user, atom/target) - if(!can_refuel) - to_chat(user, SPAN_DANGER("\The [src] is sealed shut.")) - return FALSE - . = ..() - -/obj/item/chems/welder_tank/standard_splash_mob(mob/user, mob/target) - if(!can_refuel) - to_chat(user, SPAN_DANGER("\The [src] is sealed shut.")) - return FALSE - . = ..() - -/obj/item/chems/welder_tank/handle_eaten_by_mob(mob/user, mob/target) - if(!can_refuel) - to_chat(user, SPAN_DANGER("\The [src] is sealed shut.")) - return EATEN_UNABLE - return ..() - -/obj/item/chems/welder_tank/get_alt_interactions(var/mob/user) - . = ..() - if(!can_refuel) - LAZYREMOVE(., /decl/interaction_handler/set_transfer/chems) - -/obj/item/chems/welder_tank/mini - name = "small welding tank" - base_name = "small welding tank" - icon_state = "tank_small" - w_class = ITEM_SIZE_TINY - volume = 5 - size_in_use = ITEM_SIZE_SMALL - unlit_force = 5 - lit_force = 7 - _base_attack_force = 4 - -/obj/item/chems/welder_tank/large - name = "large welding tank" - base_name = "large welding tank" - icon_state = "tank_large" - w_class = ITEM_SIZE_SMALL - volume = 40 - size_in_use = ITEM_SIZE_NORMAL - _base_attack_force = 6 - -/obj/item/chems/welder_tank/huge - name = "huge welding tank" - base_name = "huge welding tank" - icon_state = "tank_huge" - w_class = ITEM_SIZE_NORMAL - volume = 80 - size_in_use = ITEM_SIZE_LARGE - unlit_force = 9 - lit_force = 15 - _base_attack_force = 8 - -/obj/item/chems/welder_tank/experimental - name = "experimental welding tank" - base_name = "experimental welding tank" - icon_state = "tank_experimental" - w_class = ITEM_SIZE_NORMAL - volume = 40 - can_refuel = FALSE - size_in_use = ITEM_SIZE_LARGE - unlit_force = 9 - lit_force = 15 - show_reagent_name = FALSE - _base_attack_force = 8 - var/tmp/last_gen = 0 - -/obj/item/chems/welder_tank/experimental/Initialize(ml, material_key) - . = ..() - atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER - START_PROCESSING(SSobj, src) - -/obj/item/chems/welder_tank/experimental/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/chems/welder_tank/experimental/Process() - if(REAGENT_VOLUME(reagents, /decl/material/liquid/fuel) < reagents.maximum_volume) - var/gen_amount = ((world.time-last_gen)/25) - add_to_reagents(/decl/material/liquid/fuel, gen_amount) - last_gen = world.time - #undef WELDING_TOOL_HOTSPOT_TEMP_ACTIVE #undef WELDING_TOOL_HOTSPOT_TEMP_IDLE \ No newline at end of file diff --git a/code/game/objects/items/welding/weldingtool_tank.dm b/code/game/objects/items/welding/weldingtool_tank.dm new file mode 100644 index 00000000000..7b5b455663a --- /dev/null +++ b/code/game/objects/items/welding/weldingtool_tank.dm @@ -0,0 +1,143 @@ +////////////////////////////////////////////////////////////////// +// Welding tool tanks +////////////////////////////////////////////////////////////////// +/obj/item/chems/welder_tank + name = "welding tank" + base_name = "welding tank" + desc = "An interchangeable fuel tank meant for a welding tool." + icon = 'icons/obj/items/tool/welders/welder_tanks.dmi' + icon_state = "tank_normal" + w_class = ITEM_SIZE_SMALL + atom_flags = ATOM_FLAG_OPEN_CONTAINER + obj_flags = OBJ_FLAG_HOLLOW + volume = 20 + show_reagent_name = TRUE + current_health = 40 + max_health = 40 + material = /decl/material/solid/metal/steel + var/can_refuel = TRUE + var/size_in_use = ITEM_SIZE_NORMAL + var/unlit_force = 7 + var/lit_force = 11 + +/obj/item/chems/welder_tank/populate_reagents() + add_to_reagents(/decl/material/liquid/fuel, reagents.maximum_volume) + +/obj/item/chems/welder_tank/examine(mob/user, distance) + . = ..() + if(distance > 1) + return + if(reagents.total_volume <= 0) + to_chat(user, "It is empty.") + else + to_chat(user, "It contains [reagents.total_volume] units of liquid.") + to_chat(user, " It can hold up to [reagents.maximum_volume] units.") + +/obj/item/chems/welder_tank/afterattack(obj/O, mob/user, proximity, click_parameters) + if (!ATOM_IS_OPEN_CONTAINER(src) || !proximity) + return + if(standard_dispenser_refill(user, O)) + return TRUE + if(standard_pour_into(user, O)) + return TRUE + if(handle_eaten_by_mob(user, O) != EATEN_INVALID) + return TRUE + if(user.check_intent(I_FLAG_HARM)) + if(standard_splash_mob(user, O)) + return TRUE + if(reagents && reagents.total_volume) + to_chat(user, SPAN_DANGER("You splash the contents of \the [src] onto \the [O].")) + reagents.splash(O, reagents.total_volume) + return TRUE + return ..() + +/obj/item/chems/welder_tank/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE) + if(!can_refuel) + to_chat(user, SPAN_DANGER("\The [src] does not have a refuelling port.")) + return FALSE + . = ..() + if(.) + playsound(src.loc, 'sound/effects/refill.ogg', 50, TRUE, -6) + +/obj/item/chems/welder_tank/standard_pour_into(mob/user, atom/target) + if(!can_refuel) + to_chat(user, SPAN_DANGER("\The [src] is sealed shut.")) + return FALSE + . = ..() + +/obj/item/chems/welder_tank/standard_splash_mob(mob/user, mob/target) + if(!can_refuel) + to_chat(user, SPAN_DANGER("\The [src] is sealed shut.")) + return FALSE + . = ..() + +/obj/item/chems/welder_tank/handle_eaten_by_mob(mob/user, mob/target) + if(!can_refuel) + to_chat(user, SPAN_DANGER("\The [src] is sealed shut.")) + return EATEN_UNABLE + return ..() + +/obj/item/chems/welder_tank/get_alt_interactions(var/mob/user) + . = ..() + if(!can_refuel) + LAZYREMOVE(., /decl/interaction_handler/set_transfer/chems) + +/obj/item/chems/welder_tank/mini + name = "small welding tank" + base_name = "small welding tank" + icon_state = "tank_small" + w_class = ITEM_SIZE_TINY + volume = 5 + size_in_use = ITEM_SIZE_SMALL + unlit_force = 5 + lit_force = 7 + _base_attack_force = 4 + +/obj/item/chems/welder_tank/large + name = "large welding tank" + base_name = "large welding tank" + icon_state = "tank_large" + w_class = ITEM_SIZE_SMALL + volume = 40 + size_in_use = ITEM_SIZE_NORMAL + _base_attack_force = 6 + +/obj/item/chems/welder_tank/huge + name = "huge welding tank" + base_name = "huge welding tank" + icon_state = "tank_huge" + w_class = ITEM_SIZE_NORMAL + volume = 80 + size_in_use = ITEM_SIZE_LARGE + unlit_force = 9 + lit_force = 15 + _base_attack_force = 8 + +/obj/item/chems/welder_tank/experimental + name = "experimental welding tank" + base_name = "experimental welding tank" + icon_state = "tank_experimental" + w_class = ITEM_SIZE_NORMAL + volume = 40 + can_refuel = FALSE + size_in_use = ITEM_SIZE_LARGE + unlit_force = 9 + lit_force = 15 + show_reagent_name = FALSE + _base_attack_force = 8 + var/tmp/last_gen = 0 + +/obj/item/chems/welder_tank/experimental/Initialize(ml, material_key) + . = ..() + atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER + START_PROCESSING(SSobj, src) + +/obj/item/chems/welder_tank/experimental/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/chems/welder_tank/experimental/Process() + if(REAGENT_VOLUME(reagents, /decl/material/liquid/fuel) < reagents.maximum_volume) + var/gen_amount = ((world.time-last_gen)/25) + add_to_reagents(/decl/material/liquid/fuel, gen_amount) + last_gen = world.time \ No newline at end of file diff --git a/code/game/objects/structures/beds/bed.dm b/code/game/objects/structures/beds/bed.dm new file mode 100644 index 00000000000..fdcdff9a143 --- /dev/null +++ b/code/game/objects/structures/beds/bed.dm @@ -0,0 +1,160 @@ +// Beds... get your mind out of the gutter, they're for sleeping! +// TODO by end of Q2 2025: Repath /obj/structure/bed/chair to just /obj/structure/chair. +// Remaining steps: +// - Move padding interactions and padding_color var onto an extension +// - Allow /obj/structure/grab_attack to handle buckling +/obj/structure/bed + name = "bed" + desc = "A raised, padded platform for sleeping on. This one has straps for ensuring restful snoozing in microgravity." + icon = 'icons/obj/furniture.dmi' + icon_state = "bed" + anchored = TRUE + can_buckle = TRUE + buckle_dir = SOUTH + buckle_lying = TRUE + buckle_sound = 'sound/effects/buckle.ogg' + material = DEFAULT_FURNITURE_MATERIAL + material_alteration = MAT_FLAG_ALTERATION_ALL + tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT + parts_amount = 2 + parts_type = /obj/item/stack/material/rods + user_comfort = 1 + obj_flags = OBJ_FLAG_SUPPORT_MOB + var/base_icon = "bed" + var/padding_color + +/obj/structure/bed/user_can_mousedrop_onto(mob/user, atom/being_dropped, incapacitation_flags, params) + if(user == being_dropped) + return user.Adjacent(src) && !user.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_KNOCKOUT) + return ..() + +/obj/structure/bed/get_base_value() + . = round(..() * 2.5) // Utility structures should be worth more than their matter (wheelchairs, rollers, etc). + +/obj/structure/bed/get_surgery_surface_quality(mob/living/victim, mob/living/user) + return OPERATE_PASSABLE + +/obj/structure/bed/get_surgery_success_modifier(delicate) + return delicate ? -5 : 0 + +/obj/structure/bed/update_material_name() + if(reinf_material) + SetName("[reinf_material.adjective_name] [initial(name)]") + else if(material) + SetName("[material.adjective_name] [initial(name)]") + else + SetName(initial(name)) + +/obj/structure/bed/update_material_desc() + if(reinf_material) + desc = "[initial(desc)] It's made of [material.use_name] and covered with [reinf_material.use_name]." + else + desc = "[initial(desc)] It's made of [material.use_name]." + +// Reuse the cache/code from stools, todo maybe unify. +/obj/structure/bed/on_update_icon() + ..() + icon_state = base_icon + if(istype(reinf_material)) + if(material_alteration & MAT_FLAG_ALTERATION_COLOR) + add_overlay(overlay_image(icon, "[icon_state]_padding", padding_color || reinf_material.color, RESET_COLOR)) + else + add_overlay(overlay_image(icon, "[icon_state]_padding")) + +/obj/structure/bed/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(istype(mover) && mover.checkpass(PASS_FLAG_TABLE)) + return 1 + return ..() + +/obj/structure/bed/explosion_act(severity) + . = ..() + if(. && !QDELETED(src) && (severity == 1 || (severity == 2 && prob(50)) || (severity == 3 && prob(5)))) + physically_destroyed() + +/obj/structure/bed/proc/can_apply_padding() + return TRUE + +/obj/structure/bed/attackby(obj/item/used_item, mob/user) + + if((. = ..())) + return + + if(istype(used_item, /obj/item/stack) && can_apply_padding()) + + if(reinf_material) + to_chat(user, SPAN_WARNING("\The [src] is already padded.")) + return TRUE + + var/obj/item/stack/cloth = used_item + if(cloth.get_amount() < 1) + to_chat(user, SPAN_WARNING("You need at least one unit of material to pad \the [src].")) + return TRUE + + var/padding_type + var/new_padding_color + if(istype(used_item, /obj/item/stack/tile) || istype(used_item, /obj/item/stack/material/bolt)) + padding_type = used_item.material?.type + new_padding_color = used_item.paint_color + + if(padding_type) + var/decl/material/padding_mat = GET_DECL(padding_type) + if(!istype(padding_mat) || !(padding_mat.flags & MAT_FLAG_PADDING)) + padding_type = null + + if(!padding_type) + to_chat(user, SPAN_WARNING("You cannot pad \the [src] with that.")) + return TRUE + + cloth.use(1) + if(!isturf(src.loc)) + src.forceMove(get_turf(src)) + playsound(src.loc, 'sound/effects/rustle5.ogg', 50, 1) + to_chat(user, SPAN_NOTICE("You add padding to \the [src].")) + add_padding(padding_type, new_padding_color) + return TRUE + + if(IS_WIRECUTTER(used_item)) + if(!reinf_material) + to_chat(user, SPAN_WARNING("\The [src] has no padding to remove.")) + else + to_chat(user, SPAN_NOTICE("You remove the padding from \the [src].")) + playsound(src, 'sound/items/Wirecutter.ogg', 100, 1) + remove_padding() + return TRUE + +/obj/structure/bed/grab_attack(obj/item/grab/grab, mob/user) + var/mob/living/victim = grab.get_affecting_mob() + if(istype(victim) && istype(user)) + user.visible_message(SPAN_NOTICE("\The [user] attempts to put \the [victim] onto \the [src]!")) + if(do_after(user, 2 SECONDS, src) && !QDELETED(victim) && !QDELETED(user) && !QDELETED(grab) && user_buckle_mob(victim, user)) + qdel(grab) + return TRUE + return ..() + +/obj/structure/bed/proc/add_padding(var/padding_type, var/new_padding_color) + reinf_material = GET_DECL(padding_type) + padding_color = new_padding_color + update_icon() + +/obj/structure/bed/proc/remove_padding() + if(reinf_material) + var/list/res = reinf_material.create_object(get_turf(src)) + if(padding_color) + for(var/obj/item/thing in res) + thing.set_color(padding_color) + reinf_material = null + padding_color = null + update_icon() + +/obj/structure/bed/psych + name = "psychiatrist's couch" + desc = "For prime comfort during psychiatric evaluations." + icon_state = "psychbed" + material = /decl/material/solid/organic/wood/walnut + +/obj/structure/bed/psych/leather + reinf_material = /decl/material/solid/organic/leather + +/obj/structure/bed/padded + material = /decl/material/solid/metal/aluminium + reinf_material = /decl/material/solid/organic/cloth diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bedroll.dm b/code/game/objects/structures/beds/bedroll.dm similarity index 100% rename from code/game/objects/structures/stool_bed_chair_nest_sofa/bedroll.dm rename to code/game/objects/structures/beds/bedroll.dm diff --git a/code/game/objects/structures/beds/mattress.dm b/code/game/objects/structures/beds/mattress.dm new file mode 100644 index 00000000000..8532a77a9e1 --- /dev/null +++ b/code/game/objects/structures/beds/mattress.dm @@ -0,0 +1,15 @@ +/* + * Mattresses + */ +// TODO: These sprites are terrible. Replace? +/obj/structure/mattress + name = "mattress" + icon = 'icons/obj/furniture.dmi' + icon_state = "mattress" + desc = "A bare mattress. It doesn't look very comfortable." + anchored = FALSE + +/obj/structure/mattress/dirty + name = "dirty mattress" + icon_state = "dirty_mattress" + desc = "A dirty, smelly mattress covered in body fluids. You wouldn't want to touch this." diff --git a/code/game/objects/structures/beds/rollerbed.dm b/code/game/objects/structures/beds/rollerbed.dm new file mode 100644 index 00000000000..4c0285d3b78 --- /dev/null +++ b/code/game/objects/structures/beds/rollerbed.dm @@ -0,0 +1,153 @@ +/* + * Roller beds + */ +/obj/structure/bed/roller + name = "roller bed" + icon = 'icons/obj/structures/rollerbed.dmi' + icon_state = "down" + anchored = FALSE + buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 6) + movable_flags = MOVABLE_FLAG_WHEELED + tool_interaction_flags = 0 + var/item_form_type = /obj/item/roller //The folded-up object path. + var/obj/item/chems/beaker + var/iv_attached = 0 + var/iv_stand = TRUE + +/obj/structure/bed/roller/on_update_icon() + cut_overlays() + if(density) + icon_state = "up" + else + icon_state = "down" + if(beaker) + var/image/iv = image(icon, "iv[iv_attached]") + var/percentage = round((beaker.reagents.total_volume / beaker.volume) * 100, 25) + var/image/filling = image(icon, "iv_filling[percentage]") + filling.color = beaker.reagents.get_color() + iv.overlays += filling + if(percentage < 25) + iv.overlays += image(icon, "light_low") + if(density) + iv.pixel_y = 6 + add_overlay(iv) + +/obj/structure/bed/roller/can_apply_padding() + return FALSE + +/obj/structure/bed/roller/attackby(obj/item/I, mob/user) + if(iv_stand && !beaker && istype(I, /obj/item/chems)) + if(!user.try_unequip(I, src)) + return TRUE + to_chat(user, "You attach \the [I] to \the [src].") + beaker = I + queue_icon_update() + return TRUE + return ..() + +/obj/structure/bed/roller/attack_hand(mob/user) + if(!beaker || buckled_mob || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) + return ..() + remove_beaker(user) + return TRUE + +/obj/structure/bed/roller/proc/collapse(mob/user) + visible_message("[user] collapses [src].") + new item_form_type(get_turf(src)) + qdel(src) + +/obj/structure/bed/roller/post_buckle_mob(mob/living/M) + . = ..() + if(M == buckled_mob) + set_density(1) + queue_icon_update() + else + set_density(0) + if(iv_attached) + detach_iv(M, usr) + queue_icon_update() + +/obj/structure/bed/roller/Process() + if(!iv_attached || !buckled_mob || !beaker) + return PROCESS_KILL + + //SSObj fires twice as fast as SSMobs, so gotta slow down to not OD our victims. + if(SSobj.times_fired % 2) + return + + if(beaker.volume > 0) + beaker.reagents.trans_to_mob(buckled_mob, beaker.amount_per_transfer_from_this, CHEM_INJECT) + queue_icon_update() + +/obj/structure/bed/roller/proc/remove_beaker(mob/user) + to_chat(user, "You detach \the [beaker] to \the [src].") + iv_attached = FALSE + beaker.dropInto(loc) + beaker = null + queue_icon_update() + +/obj/structure/bed/roller/proc/attach_iv(mob/living/human/target, mob/user) + if(!beaker) + return + if(do_IV_hookup(target, user, beaker)) + iv_attached = TRUE + queue_icon_update() + START_PROCESSING(SSobj,src) + +/obj/structure/bed/roller/proc/detach_iv(mob/living/human/target, mob/user) + visible_message("\The [target] is taken off the IV on \the [src].") + iv_attached = FALSE + queue_icon_update() + STOP_PROCESSING(SSobj,src) + +/obj/structure/bed/roller/handle_mouse_drop(atom/over, mob/user, params) + if(ishuman(user) || isrobot(user)) + if(over == buckled_mob && beaker) + if(iv_attached) + detach_iv(buckled_mob, user) + else + attach_iv(buckled_mob, user) + return TRUE + if(ishuman(over)) + var/mob/M = over + if(loc == M.loc && user_buckle_mob(M, user)) + attach_iv(buckled_mob, user) + return TRUE + if(beaker) + remove_beaker(user) + return TRUE + if(!buckled_mob) + collapse(user) + return TRUE + . = ..() + +/obj/item/roller + name = "roller bed" + desc = "A collapsed roller bed that can be carried around." + icon = 'icons/obj/items/rollerbed.dmi' + icon_state = ICON_STATE_WORLD + slot_flags = SLOT_BACK + w_class = ITEM_SIZE_LARGE + pickup_sound = 'sound/foley/pickup2.ogg' + material = /decl/material/solid/metal/steel + matter = list( + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/organic/cloth = MATTER_AMOUNT_REINFORCEMENT, + ) + var/structure_form_type = /obj/structure/bed/roller //The deployed form path. + +/obj/item/roller/get_single_monetary_worth() + . = structure_form_type ? atom_info_repository.get_combined_worth_for(structure_form_type) : ..() + +/obj/item/roller/attack_self(mob/user) + var/obj/structure/bed/roller/R = new structure_form_type(user.loc) + R.add_fingerprint(user) + qdel(src) + +/obj/item/robot_rack/roller + name = "roller bed rack" + desc = "A rack for carrying collapsed roller beds. Can also be used for carrying ironing boards." + icon = 'icons/obj/items/rollerbed.dmi' + icon_state = ICON_STATE_WORLD + object_type = /obj/item/roller + interact_type = /obj/structure/bed/roller \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/simple_bed.dm b/code/game/objects/structures/beds/simple_bed.dm similarity index 100% rename from code/game/objects/structures/stool_bed_chair_nest_sofa/simple_bed.dm rename to code/game/objects/structures/beds/simple_bed.dm diff --git a/code/game/objects/structures/beds/travois.dm b/code/game/objects/structures/beds/travois.dm new file mode 100644 index 00000000000..b1ce37f8540 --- /dev/null +++ b/code/game/objects/structures/beds/travois.dm @@ -0,0 +1,18 @@ +/* + * Travois used to drag mobs in low-tech settings. + */ +// TODO: Should this really be a bed subtype? +// Only really needs the base_icon and grab_attack handling from beds, doesn't it? +/obj/structure/bed/travois + name = "travois" + anchored = FALSE + icon_state = ICON_STATE_WORLD + base_icon = ICON_STATE_WORLD + icon = 'icons/obj/structures/travois.dmi' + buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 6) + movable_flags = MOVABLE_FLAG_WHEELED + user_comfort = 0 + material = /decl/material/solid/organic/wood/oak + +/obj/structure/bed/travois/can_apply_padding() + return FALSE \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm b/code/game/objects/structures/benches/bench.dm similarity index 68% rename from code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm rename to code/game/objects/structures/benches/bench.dm index 59da1232a7c..c2b6fb98c3b 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm +++ b/code/game/objects/structures/benches/bench.dm @@ -1,3 +1,4 @@ +// These are benches with backs. For backless benches that can't be buckled to, check for /obj/structure/table/bench. /obj/structure/bed/chair/bench name = "bench" desc = "A simple slatted bench." @@ -112,43 +113,3 @@ /obj/structure/bed/chair/bench/ebony color = WOOD_COLOR_BLACK material = /decl/material/solid/organic/wood/ebony - -/obj/structure/bed/chair/bench/pew - name = "pew" - desc = "A long bench with a backboard, commonly found in places of worship, courtrooms and so on. Not known for being particularly comfortable." - icon = 'icons/obj/structures/pews.dmi' - icon_state = "pew_standing" - base_icon = "pew" - -/obj/structure/bed/chair/bench/pew/get_material_icon() - return material?.pew_icon - -/obj/structure/bed/chair/bench/pew/single - name = "backed chair" - desc = "A tall chair with a sturdy back. Not very comfortable." - base_icon = "pew_standing" - connect_neighbors = FALSE - -/obj/structure/bed/chair/bench/pew/mahogany - color = /decl/material/solid/organic/wood/mahogany::color - material = /decl/material/solid/organic/wood/mahogany - -/obj/structure/bed/chair/bench/pew/ebony - color = /decl/material/solid/organic/wood/ebony::color - material = /decl/material/solid/organic/wood/ebony - -/obj/structure/bed/chair/bench/lounge - name = "lounge" - desc = "An elegant lounge, perfect for reclining on." - icon = 'icons/obj/structures/lounge.dmi' - icon_state = "lounge_standing" - base_icon = "lounge" - -/obj/structure/bed/chair/bench/lounge/get_material_icon() - return icon - -/obj/structure/bed/chair/bench/lounge/mapped - color = /decl/material/solid/organic/wood/mahogany::color - material = /decl/material/solid/organic/wood/mahogany - reinf_material = /decl/material/solid/organic/cloth - padding_color = COLOR_RED_GRAY diff --git a/code/game/objects/structures/benches/lounge.dm b/code/game/objects/structures/benches/lounge.dm new file mode 100644 index 00000000000..046ccc3c034 --- /dev/null +++ b/code/game/objects/structures/benches/lounge.dm @@ -0,0 +1,15 @@ +/obj/structure/bed/chair/bench/lounge + name = "lounge" + desc = "An elegant lounge, perfect for reclining on." + icon = 'icons/obj/structures/lounge.dmi' + icon_state = "lounge_standing" + base_icon = "lounge" + +/obj/structure/bed/chair/bench/lounge/get_material_icon() + return icon + +/obj/structure/bed/chair/bench/lounge/mapped + color = /decl/material/solid/organic/wood/mahogany::color + material = /decl/material/solid/organic/wood/mahogany + reinf_material = /decl/material/solid/organic/cloth + padding_color = COLOR_RED_GRAY diff --git a/code/game/objects/structures/benches/pew.dm b/code/game/objects/structures/benches/pew.dm new file mode 100644 index 00000000000..272d62c5116 --- /dev/null +++ b/code/game/objects/structures/benches/pew.dm @@ -0,0 +1,23 @@ +/obj/structure/bed/chair/bench/pew + name = "pew" + desc = "A long bench with a backboard, commonly found in places of worship, courtrooms and so on. Not known for being particularly comfortable." + icon = 'icons/obj/structures/pews.dmi' + icon_state = "pew_standing" + base_icon = "pew" + +/obj/structure/bed/chair/bench/pew/get_material_icon() + return material?.pew_icon + +/obj/structure/bed/chair/bench/pew/single + name = "backed chair" + desc = "A tall chair with a sturdy back. Not very comfortable." + base_icon = "pew_standing" + connect_neighbors = FALSE + +/obj/structure/bed/chair/bench/pew/mahogany + color = /decl/material/solid/organic/wood/mahogany::color + material = /decl/material/solid/organic/wood/mahogany + +/obj/structure/bed/chair/bench/pew/ebony + color = /decl/material/solid/organic/wood/ebony::color + material = /decl/material/solid/organic/wood/ebony diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/chairs.dm b/code/game/objects/structures/chairs/chairs.dm similarity index 100% rename from code/game/objects/structures/stool_bed_chair_nest_sofa/chairs.dm rename to code/game/objects/structures/chairs/chairs.dm diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/rustic_chairs.dm b/code/game/objects/structures/chairs/rustic_chairs.dm similarity index 100% rename from code/game/objects/structures/stool_bed_chair_nest_sofa/rustic_chairs.dm rename to code/game/objects/structures/chairs/rustic_chairs.dm diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm b/code/game/objects/structures/chairs/wheelchair.dm similarity index 100% rename from code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm rename to code/game/objects/structures/chairs/wheelchair.dm diff --git a/code/game/objects/structures/filter_stand.dm b/code/game/objects/structures/chemistry/filter_stand.dm similarity index 100% rename from code/game/objects/structures/filter_stand.dm rename to code/game/objects/structures/chemistry/filter_stand.dm diff --git a/code/game/objects/structures/chemistry/_chemistry.dm b/code/game/objects/structures/chemistry/heater.dm similarity index 100% rename from code/game/objects/structures/chemistry/_chemistry.dm rename to code/game/objects/structures/chemistry/heater.dm diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/sofa.dm b/code/game/objects/structures/sofa.dm similarity index 100% rename from code/game/objects/structures/stool_bed_chair_nest_sofa/sofa.dm rename to code/game/objects/structures/sofa.dm diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm deleted file mode 100644 index f1ec03d9f7c..00000000000 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm +++ /dev/null @@ -1,350 +0,0 @@ -/* Beds... get your mind out of the gutter, they're for sleeping! - * Contains: - * Beds - * Roller beds - * Mattresses - */ - -/* - * Beds - */ -/obj/structure/bed - name = "bed" - desc = "A raised, padded platform for sleeping on. This one has straps for ensuring restful snoozing in microgravity." - icon = 'icons/obj/furniture.dmi' - icon_state = "bed" - anchored = TRUE - can_buckle = TRUE - buckle_dir = SOUTH - buckle_lying = TRUE - buckle_sound = 'sound/effects/buckle.ogg' - material = DEFAULT_FURNITURE_MATERIAL - material_alteration = MAT_FLAG_ALTERATION_ALL - tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT - parts_amount = 2 - parts_type = /obj/item/stack/material/rods - user_comfort = 1 - obj_flags = OBJ_FLAG_SUPPORT_MOB - var/base_icon = "bed" - var/padding_color - -/obj/structure/bed/user_can_mousedrop_onto(mob/user, atom/being_dropped, incapacitation_flags, params) - if(user == being_dropped) - return user.Adjacent(src) && !user.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_KNOCKOUT) - return ..() - -/obj/structure/bed/get_base_value() - . = round(..() * 2.5) // Utility structures should be worth more than their matter (wheelchairs, rollers, etc). - -/obj/structure/bed/get_surgery_surface_quality(mob/living/victim, mob/living/user) - return OPERATE_PASSABLE - -/obj/structure/bed/get_surgery_success_modifier(delicate) - return delicate ? -5 : 0 - -/obj/structure/bed/update_material_name() - if(reinf_material) - SetName("[reinf_material.adjective_name] [initial(name)]") - else if(material) - SetName("[material.adjective_name] [initial(name)]") - else - SetName(initial(name)) - -/obj/structure/bed/update_material_desc() - if(reinf_material) - desc = "[initial(desc)] It's made of [material.use_name] and covered with [reinf_material.use_name]." - else - desc = "[initial(desc)] It's made of [material.use_name]." - -// Reuse the cache/code from stools, todo maybe unify. -/obj/structure/bed/on_update_icon() - ..() - icon_state = base_icon - if(istype(reinf_material)) - if(material_alteration & MAT_FLAG_ALTERATION_COLOR) - add_overlay(overlay_image(icon, "[icon_state]_padding", padding_color || reinf_material.color, RESET_COLOR)) - else - add_overlay(overlay_image(icon, "[icon_state]_padding")) - -/obj/structure/bed/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(istype(mover) && mover.checkpass(PASS_FLAG_TABLE)) - return 1 - return ..() - -/obj/structure/bed/explosion_act(severity) - . = ..() - if(. && !QDELETED(src) && (severity == 1 || (severity == 2 && prob(50)) || (severity == 3 && prob(5)))) - physically_destroyed() - -/obj/structure/bed/proc/can_apply_padding() - return TRUE - -/obj/structure/bed/attackby(obj/item/used_item, mob/user) - - if((. = ..())) - return - - if(istype(used_item, /obj/item/stack) && can_apply_padding()) - - if(reinf_material) - to_chat(user, SPAN_WARNING("\The [src] is already padded.")) - return TRUE - - var/obj/item/stack/cloth = used_item - if(cloth.get_amount() < 1) - to_chat(user, SPAN_WARNING("You need at least one unit of material to pad \the [src].")) - return TRUE - - var/padding_type - var/new_padding_color - if(istype(used_item, /obj/item/stack/tile) || istype(used_item, /obj/item/stack/material/bolt)) - padding_type = used_item.material?.type - new_padding_color = used_item.paint_color - - if(padding_type) - var/decl/material/padding_mat = GET_DECL(padding_type) - if(!istype(padding_mat) || !(padding_mat.flags & MAT_FLAG_PADDING)) - padding_type = null - - if(!padding_type) - to_chat(user, SPAN_WARNING("You cannot pad \the [src] with that.")) - return TRUE - - cloth.use(1) - if(!isturf(src.loc)) - src.forceMove(get_turf(src)) - playsound(src.loc, 'sound/effects/rustle5.ogg', 50, 1) - to_chat(user, SPAN_NOTICE("You add padding to \the [src].")) - add_padding(padding_type, new_padding_color) - return TRUE - - if(IS_WIRECUTTER(used_item)) - if(!reinf_material) - to_chat(user, SPAN_WARNING("\The [src] has no padding to remove.")) - else - to_chat(user, SPAN_NOTICE("You remove the padding from \the [src].")) - playsound(src, 'sound/items/Wirecutter.ogg', 100, 1) - remove_padding() - return TRUE - -/obj/structure/bed/grab_attack(obj/item/grab/grab, mob/user) - var/mob/living/victim = grab.get_affecting_mob() - if(istype(victim) && istype(user)) - user.visible_message(SPAN_NOTICE("\The [user] attempts to put \the [victim] onto \the [src]!")) - if(do_after(user, 2 SECONDS, src) && !QDELETED(victim) && !QDELETED(user) && !QDELETED(grab) && user_buckle_mob(victim, user)) - qdel(grab) - return TRUE - return ..() - -/obj/structure/bed/proc/add_padding(var/padding_type, var/new_padding_color) - reinf_material = GET_DECL(padding_type) - padding_color = new_padding_color - update_icon() - -/obj/structure/bed/proc/remove_padding() - if(reinf_material) - var/list/res = reinf_material.create_object(get_turf(src)) - if(padding_color) - for(var/obj/item/thing in res) - thing.set_color(padding_color) - reinf_material = null - padding_color = null - update_icon() - -/obj/structure/bed/psych - name = "psychiatrist's couch" - desc = "For prime comfort during psychiatric evaluations." - icon_state = "psychbed" - material = /decl/material/solid/organic/wood/walnut - -/obj/structure/bed/psych/leather - reinf_material = /decl/material/solid/organic/leather - -/obj/structure/bed/padded - material = /decl/material/solid/metal/aluminium - reinf_material = /decl/material/solid/organic/cloth - -/* - * Travois used to drag mobs in low-tech settings. - */ -/obj/structure/bed/travois - name = "travois" - anchored = FALSE - icon_state = ICON_STATE_WORLD - base_icon = ICON_STATE_WORLD - icon = 'icons/obj/structures/travois.dmi' - buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 6) - movable_flags = MOVABLE_FLAG_WHEELED - user_comfort = 0 - material = /decl/material/solid/organic/wood/oak - -/obj/structure/bed/travois/can_apply_padding() - return FALSE - -/* - * Roller beds - */ -/obj/structure/bed/roller - name = "roller bed" - icon = 'icons/obj/structures/rollerbed.dmi' - icon_state = "down" - anchored = FALSE - buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 6) - movable_flags = MOVABLE_FLAG_WHEELED - tool_interaction_flags = 0 - var/item_form_type = /obj/item/roller //The folded-up object path. - var/obj/item/chems/beaker - var/iv_attached = 0 - var/iv_stand = TRUE - -/obj/structure/bed/roller/on_update_icon() - cut_overlays() - if(density) - icon_state = "up" - else - icon_state = "down" - if(beaker) - var/image/iv = image(icon, "iv[iv_attached]") - var/percentage = round((beaker.reagents.total_volume / beaker.volume) * 100, 25) - var/image/filling = image(icon, "iv_filling[percentage]") - filling.color = beaker.reagents.get_color() - iv.overlays += filling - if(percentage < 25) - iv.overlays += image(icon, "light_low") - if(density) - iv.pixel_y = 6 - add_overlay(iv) - -/obj/structure/bed/roller/can_apply_padding() - return FALSE - -/obj/structure/bed/roller/attackby(obj/item/I, mob/user) - if(iv_stand && !beaker && istype(I, /obj/item/chems)) - if(!user.try_unequip(I, src)) - return TRUE - to_chat(user, "You attach \the [I] to \the [src].") - beaker = I - queue_icon_update() - return TRUE - return ..() - -/obj/structure/bed/roller/attack_hand(mob/user) - if(!beaker || buckled_mob || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) - return ..() - remove_beaker(user) - return TRUE - -/obj/structure/bed/roller/proc/collapse(mob/user) - visible_message("[user] collapses [src].") - new item_form_type(get_turf(src)) - qdel(src) - -/obj/structure/bed/roller/post_buckle_mob(mob/living/M) - . = ..() - if(M == buckled_mob) - set_density(1) - queue_icon_update() - else - set_density(0) - if(iv_attached) - detach_iv(M, usr) - queue_icon_update() - -/obj/structure/bed/roller/Process() - if(!iv_attached || !buckled_mob || !beaker) - return PROCESS_KILL - - //SSObj fires twice as fast as SSMobs, so gotta slow down to not OD our victims. - if(SSobj.times_fired % 2) - return - - if(beaker.volume > 0) - beaker.reagents.trans_to_mob(buckled_mob, beaker.amount_per_transfer_from_this, CHEM_INJECT) - queue_icon_update() - -/obj/structure/bed/roller/proc/remove_beaker(mob/user) - to_chat(user, "You detach \the [beaker] to \the [src].") - iv_attached = FALSE - beaker.dropInto(loc) - beaker = null - queue_icon_update() - -/obj/structure/bed/roller/proc/attach_iv(mob/living/human/target, mob/user) - if(!beaker) - return - if(do_IV_hookup(target, user, beaker)) - iv_attached = TRUE - queue_icon_update() - START_PROCESSING(SSobj,src) - -/obj/structure/bed/roller/proc/detach_iv(mob/living/human/target, mob/user) - visible_message("\The [target] is taken off the IV on \the [src].") - iv_attached = FALSE - queue_icon_update() - STOP_PROCESSING(SSobj,src) - -/obj/structure/bed/roller/handle_mouse_drop(atom/over, mob/user, params) - if(ishuman(user) || isrobot(user)) - if(over == buckled_mob && beaker) - if(iv_attached) - detach_iv(buckled_mob, user) - else - attach_iv(buckled_mob, user) - return TRUE - if(ishuman(over)) - var/mob/M = over - if(loc == M.loc && user_buckle_mob(M, user)) - attach_iv(buckled_mob, user) - return TRUE - if(beaker) - remove_beaker(user) - return TRUE - if(!buckled_mob) - collapse(user) - return TRUE - . = ..() - -/obj/item/roller - name = "roller bed" - desc = "A collapsed roller bed that can be carried around." - icon = 'icons/obj/items/rollerbed.dmi' - icon_state = ICON_STATE_WORLD - slot_flags = SLOT_BACK - w_class = ITEM_SIZE_LARGE - pickup_sound = 'sound/foley/pickup2.ogg' - material = /decl/material/solid/metal/steel - matter = list( - /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/organic/cloth = MATTER_AMOUNT_REINFORCEMENT, - ) - var/structure_form_type = /obj/structure/bed/roller //The deployed form path. - -/obj/item/roller/get_single_monetary_worth() - . = structure_form_type ? atom_info_repository.get_combined_worth_for(structure_form_type) : ..() - -/obj/item/roller/attack_self(mob/user) - var/obj/structure/bed/roller/R = new structure_form_type(user.loc) - R.add_fingerprint(user) - qdel(src) - -/obj/item/robot_rack/roller - name = "roller bed rack" - desc = "A rack for carrying collapsed roller beds. Can also be used for carrying ironing boards." - icon = 'icons/obj/items/rollerbed.dmi' - icon_state = ICON_STATE_WORLD - object_type = /obj/item/roller - interact_type = /obj/structure/bed/roller -/* - * Mattresses - */ -/obj/structure/mattress - name = "mattress" - icon = 'icons/obj/furniture.dmi' - icon_state = "mattress" - desc = "A bare mattress. It doesn't look very comfortable." - anchored = FALSE - -/obj/structure/mattress/dirty - name = "dirty mattress" - icon_state = "dirty_mattress" - desc = "A dirty, smelly mattress covered in body fluids. You wouldn't want to touch this." diff --git a/code/modules/barricade_tape/barricade_tape.dm b/code/modules/barricade_tape/barricade_tape.dm new file mode 100644 index 00000000000..b0f81d840a3 --- /dev/null +++ b/code/modules/barricade_tape/barricade_tape.dm @@ -0,0 +1,252 @@ +#define MAX_BARRICADE_TAPE_LENGTH 32 //Maximum length of a continuous line of tape someone can place down. +#define TAPE_BARRICADE_V_NEIGHBORS (NORTH | SOUTH) +#define TAPE_BARRICADE_H_NEIGHBORS (EAST | WEST) +#define TAPE_BARRICADE_IS_CORNER_NEIGHBORS(X) ((X ^ TAPE_BARRICADE_V_NEIGHBORS) && (X ^ TAPE_BARRICADE_H_NEIGHBORS)) +#define TAPE_BARRICADE_IS_V_NEIGHBORS(X) ((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS && !((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS)) //Check we have neighbors connection on the vertical plane +#define TAPE_BARRICADE_IS_H_NEIGHBORS(X) ((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS && !((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS)) //Check we have neighbors connection on the horizontal plane +#define TAPE_BARRICADE_IS_3W_V_NEIGHBORS(X) (TAPE_BARRICADE_IS_V_NEIGHBORS(X) && ((X & TAPE_BARRICADE_H_NEIGHBORS) > 0)) +#define TAPE_BARRICADE_IS_3W_H_NEIGHBORS(X) (TAPE_BARRICADE_IS_H_NEIGHBORS(X) && ((X & TAPE_BARRICADE_V_NEIGHBORS) > 0)) +#define TAPE_BARRICADE_IS_4W_NEIGHBORS(X) (((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS) && ((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS)) +#define CONNECTION_BITS_TO_TEXT(X) "[(X & WEST) > 0][(X & EAST) > 0][(X & SOUTH) > 0][(X & NORTH) > 0]" +#define TAPE_BARRICADE_GET_NB_NEIGHBORS(X) (((X & NORTH) > 0) + ((X & SOUTH) > 0) + ((X & EAST) > 0) + ((X & WEST) > 0)) + +var/global/list/image/hazard_overlays //Cached hazard floor overlays for the barricade tape + +//////////////////////////////////////////////////////////////////// +// Tape Line Barricade +//////////////////////////////////////////////////////////////////// +/obj/structure/tape_barricade + name = "tape line" + desc = "A line of barricade tape." + icon = 'icons/policetape.dmi' + icon_state = "tape_2w_0" + dir = SOUTH //This structure will try to turn its icon depending on what neighbors it has + layer = ABOVE_DOOR_LAYER + pass_flags = PASS_FLAG_TABLE //About the height of table + anchored = TRUE + material = /decl/material/solid/organic/plastic + current_health = 5 + var/neighbors = 0 //Contains all the direction flags of all the neighboring tape_barricades + var/is_lifted = 0 //Whether the tape is lifted and we're allowing everyone passage. + var/is_crumpled = 0 //Whether the tape was damaged + var/decl/barricade_tape_template/tape_template //Details about the behavior and looks of the barricade + +/obj/structure/tape_barricade/Initialize(ml, _mat, _reinf_mat, var/decl/barricade_tape_template/_tape_template) + . = ..() + if(!hazard_overlays) + hazard_overlays = list() + hazard_overlays["[NORTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "N") + hazard_overlays["[EAST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "E") + hazard_overlays["[SOUTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "S") + hazard_overlays["[WEST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "W") + set_tape_template(_tape_template) + +/obj/structure/tape_barricade/LateInitialize() + . = ..() + build_connection_bits() + update_neighbors() + +/obj/structure/tape_barricade/Destroy() + var/turf/old_loc = get_turf(src) + . = ..() + if(istype(old_loc)) + update_neighbors(old_loc) + +/obj/structure/tape_barricade/proc/set_tape_template(var/decl/barricade_tape_template/tmpl) + if(tmpl) + tape_template = tmpl + if(ispath(tape_template)) + tape_template = GET_DECL(tape_template) + if(!tape_template) + return + + SetName("[tape_template.tape_kind] tape line") + desc = tape_template.tape_desc + icon = tape_template.icon_file + req_access = tape_template.req_access + set_color(tape_template.tape_color) + update_icon() + +/**Cause neighbors to update their icon. */ +/obj/structure/tape_barricade/proc/update_neighbors(var/location = loc) + for (var/look_dir in global.cardinal) + var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, get_step(location, look_dir)) + if(!QDELETED(B)) + B.update_icon() + + if(!QDELETED(src)) + update_icon() + +/**Updates our connection bits to keep track of the things we're connected to */ +/obj/structure/tape_barricade/proc/build_connection_bits() + neighbors = 0 + for (var/look_dir in global.cardinal) + var/turf/target_turf = get_step(src, look_dir) + if(target_turf) + var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade) in target_turf + //We connect to walls and other tape_barricades + if((B && !QDELETED(B)) || (!B && target_turf.is_wall())) + neighbors |= look_dir + +/**Allow sutypes to override with their own forced icon state name.*/ +/obj/structure/tape_barricade/proc/icon_name_override() + return + +/obj/structure/tape_barricade/on_update_icon() + . = ..() + if(isnull(tape_template) || ispath(tape_template)) + return + //Look up our neighbors + build_connection_bits() + + var/icon_name = icon_name_override() + if(!icon_name) + //Build the icon state from whethere we've got a right angle with out neighbors or not + if(TAPE_BARRICADE_IS_4W_NEIGHBORS(neighbors)) + set_dir(SOUTH) + icon_name = "4w" + + //3 Ways + else if(TAPE_BARRICADE_IS_3W_H_NEIGHBORS(neighbors)) + set_dir(neighbors & TAPE_BARRICADE_V_NEIGHBORS) + icon_name = "3w" + else if(TAPE_BARRICADE_IS_3W_V_NEIGHBORS(neighbors)) + set_dir(neighbors & TAPE_BARRICADE_H_NEIGHBORS) + icon_name = "3w" + + //Lines + else if(TAPE_BARRICADE_IS_H_NEIGHBORS(neighbors)) + set_dir(EAST) + icon_name = "2w" + else if(TAPE_BARRICADE_IS_V_NEIGHBORS(neighbors)) + set_dir(SOUTH) + icon_name = "2w" + + //Endpoints/corners + else + if(neighbors > 0) + set_dir(neighbors) //Make sure if we have no connections we don't set a bad dir + icon_name = "dir" + + icon_state = "[tape_template.base_icon_state]_[icon_name]_[is_crumpled]" + + //Overlays + if(tape_template.detail_overlay) + var/image/ovr = overlay_image(icon, "[tape_template.base_icon_state]_[icon_name]_[tape_template.detail_overlay]", tape_template.detail_color, RESET_COLOR) + ovr.dir = dir + add_overlay(ovr) + +/obj/structure/tape_barricade/attack_hand(mob/user) + + if(user.check_intent(I_FLAG_HARM)) + user.visible_message(SPAN_DANGER("\The [user] tears \the [src]!")) + physically_destroyed() + return TRUE + + if (!user.check_intent(I_FLAG_HELP) || !allowed(user) || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE)) + return ..() + + if(TAPE_BARRICADE_IS_CORNER_NEIGHBORS(neighbors) || (TAPE_BARRICADE_GET_NB_NEIGHBORS(neighbors) > 2)) + to_chat(user, SPAN_WARNING("You can't lift up the pole. Try lifting the line itself.")) + return TRUE + + if(!allowed(user)) + user.visible_message(SPAN_NOTICE("\The [user] carelessly pulls \the [src] out of the way.")) + crumple() + else + user.visible_message(SPAN_NOTICE("\The [user] lifts \the [src], officially allowing passage.")) + + for(var/obj/structure/tape_barricade/B in get_tape_line()) + B.lift(10 SECONDS) //~10 seconds + return TRUE + +/obj/structure/tape_barricade/dismantle_structure(mob/user) + for (var/obj/structure/tape_barricade/B in get_tape_line()) + if(B == src || QDELETED(B)) + continue + if(B.neighbors & get_dir(B, src)) + B.physically_destroyed() + . = ..() + +/obj/structure/tape_barricade/CanPass(atom/movable/mover, turf/target, height, air_group) + if(!is_lifted && ismob(mover)) + var/mob/M = mover + if (!allowed(M) && M.check_intent(I_FLAG_HELP)) + return FALSE + return ..() + +/obj/structure/tape_barricade/Crossed(atom/movable/AM) + . = ..() + if(is_lifted || !isliving(AM)) + return + var/mob/living/M = AM + add_fingerprint(M) + shake_animation(2) + if (!allowed(M)) //only select few learn art of not crumpling the tape + to_chat(M, SPAN_NOTICE("You are not supposed to go past \the [src]...")) + if(!M.check_intent(I_FLAG_HELP)) + crumple() + +/obj/structure/tape_barricade/proc/crumple() + if(!is_crumpled) + playsound(src, 'sound/effects/rip1.ogg', 60, TRUE) + take_damage(5) + is_crumpled = TRUE + update_icon() + +/**Temporarily lifts the tape line, allowing passage to anyone for the specified time, until the timer expires. */ +/obj/structure/tape_barricade/proc/lift(var/time) + if(!is_lifted) + is_lifted = TRUE + layer = ABOVE_HUMAN_LAYER + pass_flags = PASS_FLAG_MOB + pixel_y += 8 + addtimer(CALLBACK(src, PROC_REF(on_unlift)), time, TIMER_UNIQUE) + playsound(src, 'sound/effects/pageturn2.ogg', 50, TRUE) + +/**Called by timer when the tape line falls back in place. */ +/obj/structure/tape_barricade/proc/on_unlift() + is_lifted = FALSE + pass_flags = initial(pass_flags) + reset_plane_and_layer() + pixel_y -= 8 + playsound(src, 'sound/effects/pageturn2.ogg', 20, TRUE) + +// Returns a list of all tape objects connected to src, including itself. +/obj/structure/tape_barricade/proc/get_tape_line(var/list/ignored, var/line_index = 0) + //Don't include more in the line than this + if(line_index >= MAX_BARRICADE_TAPE_LENGTH) + return list() + + var/list/dirs = list() + if(neighbors & NORTH) + dirs += NORTH + if(neighbors & SOUTH) + dirs += SOUTH + if(neighbors & WEST) + dirs += WEST + if(neighbors & EAST) + dirs += EAST + + //Grab all cached connected neighbors + LAZYDISTINCTADD(ignored, src) + var/list/obj/structure/tape_barricade/tapeline = list(src) + for(var/look_dir in dirs) + var/turf/T = get_step(src, look_dir) + var/obj/structure/tape_barricade/B = locate() in T + if(!QDELETED(B) && !(B in ignored)) + if(TAPE_BARRICADE_IS_CORNER_NEIGHBORS(neighbors) || (TAPE_BARRICADE_GET_NB_NEIGHBORS(neighbors) > 2)) + continue //We stop at intersections, and corners + tapeline += B.get_tape_line(ignored, line_index + 1) //Pass us to prevent infinite loops, and adding us to the resulting line + return tapeline + +#undef TAPE_BARRICADE_IS_CORNER_NEIGHBORS +#undef TAPE_BARRICADE_V_NEIGHBORS +#undef TAPE_BARRICADE_H_NEIGHBORS +#undef TAPE_BARRICADE_IS_V_NEIGHBORS +#undef TAPE_BARRICADE_IS_H_NEIGHBORS +#undef TAPE_BARRICADE_IS_3W_V_NEIGHBORS +#undef TAPE_BARRICADE_IS_3W_H_NEIGHBORS +#undef TAPE_BARRICADE_IS_4W_NEIGHBORS +#undef CONNECTION_BITS_TO_TEXT +#undef TAPE_BARRICADE_GET_NB_NEIGHBORS \ No newline at end of file diff --git a/code/modules/barricade_tape/barricade_tape_roll.dm b/code/modules/barricade_tape/barricade_tape_roll.dm new file mode 100644 index 00000000000..6ebf3b5d5d6 --- /dev/null +++ b/code/modules/barricade_tape/barricade_tape_roll.dm @@ -0,0 +1,151 @@ +//////////////////////////////////////////////////////////////////// +// Barricade Tape Roll +//////////////////////////////////////////////////////////////////// +/obj/item/stack/tape_roll/barricade_tape + name = "barricade tape roll" + desc = "A roll of high visibility, non-sticky barricade tape. Used to deter passersby from crossing it." + icon = 'icons/policetape.dmi' + icon_state = "tape" + w_class = ITEM_SIZE_SMALL + var/tmp/turf/start //The turf we started unrolling from + var/tmp/weakref/unroller //The mob currently unrolling us + var/decl/barricade_tape_template/tape_template //Template containing details on how the tape roll will look and behave, along with what it will place down + +/obj/item/stack/tape_roll/barricade_tape/Initialize() + . = ..() + apply_template() + +/obj/item/stack/tape_roll/barricade_tape/Destroy() + stop_unrolling() + return ..() + +/**Update our appearence and data to match the specified tape template. */ +/obj/item/stack/tape_roll/barricade_tape/proc/apply_template() + if(ispath(tape_template)) + tape_template = GET_DECL(tape_template) + if(!tape_template) + return + + SetName("[tape_template.tape_kind] tape roll") + desc = tape_template.roll_desc + icon = tape_template.icon_file + set_color(tape_template.tape_color) + update_icon() + +/obj/item/stack/tape_roll/barricade_tape/on_update_icon() + . = ..() + if(ismob(loc)) + add_overlay(overlay_image(icon, start? "stop" : "start", flags = RESET_COLOR)) + +/obj/item/stack/tape_roll/barricade_tape/dropped(mob/user) + stop_unrolling() + update_icon() + return ..() + +/obj/item/stack/tape_roll/barricade_tape/on_picked_up(mob/user) + stop_unrolling() + update_icon() + return ..() + +/obj/item/stack/tape_roll/barricade_tape/attack_hand() + . = ..() + if(. && !QDELETED(src)) + update_icon() + +/**Callback used when whoever holds us moved to a new turf. */ +/obj/item/stack/tape_roll/barricade_tape/proc/user_moved_unrolling(var/mob/M, var/atom/old_loc, var/atom/new_loc) + if(QDELETED(src)) + return //Destructor will handle the rest + if(QDELETED(M) || !can_use(1) || M.incapacitated()) + stop_unrolling() + return + + if((old_loc.x != new_loc.x && old_loc.y != new_loc.y) || old_loc.z != new_loc.z) + to_chat(M, SPAN_WARNING("\The [src] can only be laid horizontally or vertically.")) + stop_unrolling() + return + //Use a length of tape and place a barricade line + if(!place_line(M, new_loc, get_dir(old_loc, new_loc))) + stop_unrolling() + return + if(get_dist(start, new_loc) >= MAX_BARRICADE_TAPE_LENGTH) + to_chat(M, SPAN_WARNING("You've stretched this line of tape to the maximum!")) + stop_unrolling() + return + +/obj/item/stack/tape_roll/barricade_tape/proc/stop_unrolling() + if(!start && !unroller) + return + var/mob/_uroller = unroller.resolve() + if(_uroller) + events_repository.unregister(/decl/observ/moved, _uroller, src, PROC_REF(user_moved_unrolling)) + unroller = null + start = null + slowdown_general = initial(slowdown_general) + if(_uroller) + to_chat(_uroller, SPAN_NOTICE("You stop unrolling \the [src].")) + if(!QDELETED(src)) + update_icon() + return TRUE + +/obj/item/stack/tape_roll/barricade_tape/proc/start_unrolling(var/mob/user) + if(start && unroller) + return + start = get_turf(src) + unroller = weakref(user) + slowdown_general = initial(slowdown_general) + 2 //While unrolling you're slightly slower + events_repository.unregister(/decl/observ/moved, user, src, PROC_REF(user_moved_unrolling)) + events_repository.register(/decl/observ/moved, user, src, PROC_REF(user_moved_unrolling)) + to_chat(user, SPAN_NOTICE("You start unrolling \the [src].")) + //Place the first one immediately + place_line(user, get_turf(user), user.dir) + update_icon() + return TRUE + +/**Place a tape line on the current turf. */ +/obj/item/stack/tape_roll/barricade_tape/proc/place_line(var/mob/user, var/turf/T, var/pdir) + if(!T || T.is_open() || T.is_wall()) + to_chat(user, SPAN_WARNING("You can't place tape here!")) + return + if(locate(/obj/structure/tape_barricade) in T) + return //Can't place 2 on the same tile! + + if(!can_use(1)) + to_chat(user, SPAN_WARNING("You are out of [tape_template.tape_kind] tape!")) + return + use(1) + playsound(user, 'sound/effects/pageturn2.ogg', 50, TRUE) + + var/obj/structure/tape_barricade/barricade = tape_template.make_line_barricade(user, T, pdir) + if(barricade) + barricade.matter = matter_per_piece?.Copy() + barricade.update_neighbors() + return barricade + +/obj/item/stack/tape_roll/barricade_tape/attack_self(mob/user) + if(start) + stop_unrolling() + return + if(!can_use(1)) + return //This shouldn't happen, but if it does, don't let them exploit it + + start_unrolling(user) + +/obj/item/stack/tape_roll/barricade_tape/afterattack(var/atom/A, mob/user, proximity) + if(!proximity) + return + + if (istype(A, /obj/machinery/door/airlock)) + if(!can_use(4)) + to_chat(user, SPAN_WARNING("There isn't enough [plural_name] in \the [src] to barricade \the [A]. You need at least 4 [plural_name].")) + return + + var/obj/structure/tape_barricade/door/bar = tape_template.make_door_barricade(user, A) + if(bar) + bar.matter = matter_per_piece?.Copy() + if(bar.matter) + for(var/mat in bar.matter) + bar.matter[mat] = round(bar.matter[mat] * 4) + + to_chat(user, SPAN_NOTICE("You finish placing \the [src].")) + use(4) \ No newline at end of file diff --git a/code/modules/barricade_tape/barricade_tape_subtypes.dm b/code/modules/barricade_tape/barricade_tape_subtypes.dm new file mode 100644 index 00000000000..44cf66cef29 --- /dev/null +++ b/code/modules/barricade_tape/barricade_tape_subtypes.dm @@ -0,0 +1,136 @@ +//////////////////////////////////////////////////////////////////// +// Door Tape Barricade +//////////////////////////////////////////////////////////////////// + +//Barricade over a single door +/obj/structure/tape_barricade/door + icon_state = "tape_door_0" + layer = ABOVE_DOOR_LAYER + +/obj/structure/tape_barricade/door/update_neighbors() + //We completely ignore neighbors + neighbors = 0 + +/obj/structure/tape_barricade/door/icon_name_override() + return "door" //Override the icon picking to pick this icon label instead + +//////////////////////////////////////////////////////////////////// +// Police Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/police + tape_kind = "police" + tape_desc = "A length of police tape. Do not cross." + roll_desc = "A roll of police tape used to block off crime scenes from the public." + tape_color = COLOR_RED + req_access = list(access_security) + +/obj/item/stack/tape_roll/barricade_tape/police + tape_template = /decl/barricade_tape_template/police + +//mapper type +/obj/structure/tape_barricade/police + icon_state = "tape_door_0" + color = COLOR_RED + tape_template = /decl/barricade_tape_template/police + +//////////////////////////////////////////////////////////////////// +// Engineering Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/engineering + tape_kind = "engineering" + tape_desc = "A length of engineering tape. Better not cross it." + roll_desc = "A roll of engineering tape used to block off working areas from the public." + tape_color = COLOR_ORANGE + req_access = list(list(access_engine,access_atmospherics)) + +/obj/item/stack/tape_roll/barricade_tape/engineering + tape_template = /decl/barricade_tape_template/engineering + +//mapper type +/obj/structure/tape_barricade/engineering + icon_state = "stripetape_door_0" + color = COLOR_ORANGE + tape_template = /decl/barricade_tape_template/engineering + +//////////////////////////////////////////////////////////////////// +// Atmospheric Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/atmos + tape_kind = "atmospherics" + tape_desc = "A length of atmospherics tape. Better not cross it." + roll_desc = "A roll of atmospherics tape used to block off working areas from the public." + tape_color = COLOR_BLUE_LIGHT + req_access = list(list(access_engine,access_atmospherics)) + base_icon_state = "stripetape" + detail_overlay = "stripes" + detail_color = COLOR_YELLOW + +/obj/item/stack/tape_roll/barricade_tape/atmos + tape_template = /decl/barricade_tape_template/atmos + +//mapper type +/obj/structure/tape_barricade/atmos + icon_state = "stripetape_h_0" + color = COLOR_BLUE_LIGHT + tape_template = /decl/barricade_tape_template/atmos + +//////////////////////////////////////////////////////////////////// +// Research Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/research + tape_kind = "research" + tape_desc = "A length of research tape. Better not cross it." + roll_desc = "A roll of research tape used to block off working areas from the public." + tape_color = COLOR_WHITE + req_access = list(access_research) + +/obj/item/stack/tape_roll/barricade_tape/research + tape_template = /decl/barricade_tape_template/research + +//mapper type +/obj/structure/tape_barricade/research + color = COLOR_WHITE + tape_template = /decl/barricade_tape_template/research + +//////////////////////////////////////////////////////////////////// +// Medical Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/medical + tape_kind = "medical" + tape_desc = "A length of medical tape. Better not cross it." + roll_desc = "A roll of medical tape used to block off working areas from the public." + tape_color = COLOR_PALE_BLUE_GRAY + req_access = list(access_medical) + base_icon_state = "stripetape" + detail_overlay = "stripes" + detail_color = COLOR_PALE_BLUE_GRAY + +/obj/item/stack/tape_roll/barricade_tape/medical + tape_template = /decl/barricade_tape_template/medical + +//mapper type +/obj/structure/tape_barricade/medical + icon_state = "stripetape_h_0" + color = COLOR_PALE_BLUE_GRAY + tape_template = /decl/barricade_tape_template/medical + +//////////////////////////////////////////////////////////////////// +// Bureacratic Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/bureaucracy + tape_kind = "red" + tape_desc = "A length of bureaucratic red tape. Safely ignored, but darn obstructive sometimes." + roll_desc = "A roll of bureaucratic red tape used to block any meaningful work from being done." + tape_color = COLOR_RED + base_icon_state = "stripetape" + detail_overlay = "stripes" + detail_color = COLOR_RED + +/obj/item/stack/tape_roll/barricade_tape/bureaucracy + tape_template = /decl/barricade_tape_template/bureaucracy + +//mapper type +/obj/structure/tape_barricade/bureaucracy + icon_state = "stripetape_h_0" + color = COLOR_RED + tape_template = /decl/barricade_tape_template/bureaucracy \ No newline at end of file diff --git a/code/modules/barricade_tape/barricade_tape_template.dm b/code/modules/barricade_tape/barricade_tape_template.dm new file mode 100644 index 00000000000..2b386b4dc4d --- /dev/null +++ b/code/modules/barricade_tape/barricade_tape_template.dm @@ -0,0 +1,26 @@ +//////////////////////////////////////////////////////////////////// +// Barricade Tape Template +//////////////////////////////////////////////////////////////////// +//Singletons with data on the various templates of barricade tape +/decl/barricade_tape_template + var/tape_kind = "barricade" //Used as a prefix to the word "tape" when refering to the tape and roll + var/tape_desc = "A tape barricade." //Description for the tape barricade + var/roll_desc = "A roll of barricade tape." //Description for the tape roll + var/icon_file = 'icons/policetape.dmi' //Icon file used for both the tape and roll + var/base_icon_state = "tape" //For the barricade. Icon state used to fetch the applied tape directional icons for various states + var/list/req_access //Access required to automatically pass through tape barricades + var/tape_color //Color of the tape + var/detail_overlay //Overlay for the applied tape + var/detail_color //Color for the detail overlay + +/decl/barricade_tape_template/proc/make_line_barricade(var/mob/user, var/turf/T, var/pdir) + var/obj/structure/tape_barricade/bar = new(T,,,src) + bar.add_fingerprint(user) + return bar + +/decl/barricade_tape_template/proc/make_door_barricade(var/mob/user, var/obj/door) + var/obj/structure/tape_barricade/door/bar = new(get_turf(door)) + bar.set_tape_template(src) + bar.set_dir(door.dir) + bar.add_fingerprint(user) + return bar \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/modules/implants/implant.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implant.dm rename to code/modules/implants/implant.dm diff --git a/code/game/objects/items/weapons/implants/implants/adrenaline.dm b/code/modules/implants/implant_types/adrenaline.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implants/adrenaline.dm rename to code/modules/implants/implant_types/adrenaline.dm diff --git a/code/game/objects/items/weapons/implants/implants/chem.dm b/code/modules/implants/implant_types/chem.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implants/chem.dm rename to code/modules/implants/implant_types/chem.dm diff --git a/code/game/objects/items/weapons/implants/implants/compressed.dm b/code/modules/implants/implant_types/compressed.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implants/compressed.dm rename to code/modules/implants/implant_types/compressed.dm diff --git a/code/game/objects/items/weapons/implants/implants/death_alarm.dm b/code/modules/implants/implant_types/death_alarm.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implants/death_alarm.dm rename to code/modules/implants/implant_types/death_alarm.dm diff --git a/code/game/objects/items/weapons/implants/implants/explosive.dm b/code/modules/implants/implant_types/explosive.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implants/explosive.dm rename to code/modules/implants/implant_types/explosive.dm diff --git a/code/game/objects/items/weapons/implants/implants/freedom.dm b/code/modules/implants/implant_types/freedom.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implants/freedom.dm rename to code/modules/implants/implant_types/freedom.dm diff --git a/code/game/objects/items/weapons/implants/implants/imprinting.dm b/code/modules/implants/implant_types/imprinting.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implants/imprinting.dm rename to code/modules/implants/implant_types/imprinting.dm diff --git a/code/game/objects/items/weapons/implants/implants/loyalty.dm b/code/modules/implants/implant_types/loyalty.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implants/loyalty.dm rename to code/modules/implants/implant_types/loyalty.dm diff --git a/code/game/objects/items/weapons/implants/implants/tracking.dm b/code/modules/implants/implant_types/tracking.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implants/tracking.dm rename to code/modules/implants/implant_types/tracking.dm diff --git a/code/game/objects/items/weapons/implants/implants/translator.dm b/code/modules/implants/implant_types/translator.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implants/translator.dm rename to code/modules/implants/implant_types/translator.dm diff --git a/code/game/objects/items/weapons/implants/implants/uplink.dm b/code/modules/implants/implant_types/uplink.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implants/uplink.dm rename to code/modules/implants/implant_types/uplink.dm diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/modules/implants/implantcase.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implantcase.dm rename to code/modules/implants/implantcase.dm diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/modules/implants/implantchair.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implantchair.dm rename to code/modules/implants/implantchair.dm diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/modules/implants/implanter.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implanter.dm rename to code/modules/implants/implanter.dm diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/modules/implants/implantpad.dm similarity index 100% rename from code/game/objects/items/weapons/implants/implantpad.dm rename to code/modules/implants/implantpad.dm diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 2aa6db1885e..d5965e1caa1 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -305,7 +305,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/scent //refer to _scent.dm var/scent_intensity = /decl/scent_intensity/normal - var/scent_descriptor = SCENT_DESC_SMELL + var/scent_descriptor = "smell" var/scent_range = 1 var/list/neutron_interactions // Associative List of potential neutron interactions for the material to undergo, corresponding to the ideal diff --git a/code/game/objects/effects/decals/posters/_poster.dm b/code/modules/posters/_poster.dm similarity index 100% rename from code/game/objects/effects/decals/posters/_poster.dm rename to code/modules/posters/_poster.dm diff --git a/code/game/objects/effects/decals/posters/_poster_design.dm b/code/modules/posters/_poster_design.dm similarity index 100% rename from code/game/objects/effects/decals/posters/_poster_design.dm rename to code/modules/posters/_poster_design.dm diff --git a/code/game/objects/effects/decals/posters/bs12.dm b/code/modules/posters/bs12.dm similarity index 100% rename from code/game/objects/effects/decals/posters/bs12.dm rename to code/modules/posters/bs12.dm diff --git a/code/game/objects/effects/projectile/projectile_effects.dm b/code/modules/projectiles/projectile/effects/projectile_effects.dm similarity index 100% rename from code/game/objects/effects/projectile/projectile_effects.dm rename to code/modules/projectiles/projectile/effects/projectile_effects.dm diff --git a/code/game/objects/effects/projectile/projectile_impact.dm b/code/modules/projectiles/projectile/effects/projectile_impact.dm similarity index 100% rename from code/game/objects/effects/projectile/projectile_impact.dm rename to code/modules/projectiles/projectile/effects/projectile_impact.dm diff --git a/code/game/objects/effects/projectile/projectile_muzzle.dm b/code/modules/projectiles/projectile/effects/projectile_muzzle.dm similarity index 100% rename from code/game/objects/effects/projectile/projectile_muzzle.dm rename to code/modules/projectiles/projectile/effects/projectile_muzzle.dm diff --git a/code/game/objects/effects/projectile/projectile_tracer.dm b/code/modules/projectiles/projectile/effects/projectile_tracer.dm similarity index 100% rename from code/game/objects/effects/projectile/projectile_tracer.dm rename to code/modules/projectiles/projectile/effects/projectile_tracer.dm diff --git a/code/modules/reagents/chems/chems_cleaner.dm b/code/modules/reagents/chems/chems_cleaner.dm index 6b9108b98ef..d14189ec181 100644 --- a/code/modules/reagents/chems/chems_cleaner.dm +++ b/code/modules/reagents/chems/chems_cleaner.dm @@ -19,7 +19,7 @@ touch_met = 5 toxicity = 5 scent = "clean linen" - scent_descriptor = SCENT_DESC_FRAGRANCE + scent_descriptor = "fragrance" value = 0.25 dirtiness = DIRTINESS_DECONTAMINATE decontamination_dose = 5 diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index a1506fb403d..45a828e3a60 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -323,7 +323,7 @@ color = "#684b3c" scannable = 1 scent = "cigarette smoke" - scent_descriptor = SCENT_DESC_ODOR + scent_descriptor = "odour" scent_range = 4 hidden_from_codex = TRUE uid = "chem_tobacco" @@ -339,7 +339,7 @@ taste_description = "fine tobacco" value = 1.5 scent = "fine tobacco smoke" - scent_descriptor = SCENT_DESC_FRAGRANCE + scent_descriptor = "fragrance" uid = "chem_tobacco_fine" /decl/material/solid/tobacco/bad @@ -348,7 +348,7 @@ value = 0.5 scent = "acrid tobacco smoke" scent_intensity = /decl/scent_intensity/strong - scent_descriptor = SCENT_DESC_ODOR + scent_descriptor = "odour" uid = "chem_tobacco_terrible" /decl/material/solid/tobacco/liquid diff --git a/code/modules/reagents/chems/chems_fuel.dm b/code/modules/reagents/chems/chems_fuel.dm index 0c532bd6711..7853f2f5579 100644 --- a/code/modules/reagents/chems/chems_fuel.dm +++ b/code/modules/reagents/chems/chems_fuel.dm @@ -38,7 +38,7 @@ /decl/material/liquid/fuel/hydrazine name = "hydrazine" - lore_text = "A toxic, colorless, flammable liquid with a strong ammonia-like odor, in hydrate form." + lore_text = "A toxic, colorless, flammable liquid with a strong ammonia-like odour, in hydrate form." taste_description = "sweet tasting metal" color = "#808080" metabolism = REM * 0.2 diff --git a/code/game/objects/items/devices/scanners/_scanner.dm b/code/modules/scanners/_scanner.dm similarity index 100% rename from code/game/objects/items/devices/scanners/_scanner.dm rename to code/modules/scanners/_scanner.dm diff --git a/code/game/objects/items/devices/scanners/breath.dm b/code/modules/scanners/breath.dm similarity index 100% rename from code/game/objects/items/devices/scanners/breath.dm rename to code/modules/scanners/breath.dm diff --git a/code/game/objects/items/devices/scanners/gas.dm b/code/modules/scanners/gas.dm similarity index 100% rename from code/game/objects/items/devices/scanners/gas.dm rename to code/modules/scanners/gas.dm diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/modules/scanners/health.dm similarity index 100% rename from code/game/objects/items/devices/scanners/health.dm rename to code/modules/scanners/health.dm diff --git a/code/game/objects/items/devices/scanners/mass_spectrometer.dm b/code/modules/scanners/mass_spectrometer.dm similarity index 100% rename from code/game/objects/items/devices/scanners/mass_spectrometer.dm rename to code/modules/scanners/mass_spectrometer.dm diff --git a/code/game/objects/items/devices/scanners/mining.dm b/code/modules/scanners/mining.dm similarity index 100% rename from code/game/objects/items/devices/scanners/mining.dm rename to code/modules/scanners/mining.dm diff --git a/code/game/objects/items/devices/scanners/network.dm b/code/modules/scanners/network.dm similarity index 100% rename from code/game/objects/items/devices/scanners/network.dm rename to code/modules/scanners/network.dm diff --git a/code/game/objects/items/devices/scanners/plant.dm b/code/modules/scanners/plant.dm similarity index 100% rename from code/game/objects/items/devices/scanners/plant.dm rename to code/modules/scanners/plant.dm diff --git a/code/game/objects/items/devices/scanners/price.dm b/code/modules/scanners/price.dm similarity index 100% rename from code/game/objects/items/devices/scanners/price.dm rename to code/modules/scanners/price.dm diff --git a/code/game/objects/items/devices/scanners/reagents.dm b/code/modules/scanners/reagents.dm similarity index 100% rename from code/game/objects/items/devices/scanners/reagents.dm rename to code/modules/scanners/reagents.dm diff --git a/code/game/objects/items/devices/scanners/xenobio.dm b/code/modules/scanners/xenobio.dm similarity index 100% rename from code/game/objects/items/devices/scanners/xenobio.dm rename to code/modules/scanners/xenobio.dm diff --git a/code/datums/extensions/scent/_scent.dm b/code/modules/scent/_scent.dm similarity index 94% rename from code/datums/extensions/scent/_scent.dm rename to code/modules/scent/_scent.dm index cdf60ec83e0..2298b57494d 100644 --- a/code/datums/extensions/scent/_scent.dm +++ b/code/modules/scent/_scent.dm @@ -1,6 +1,6 @@ -#define SCENT_DESC_ODOR "odour" -#define SCENT_DESC_SMELL "smell" -#define SCENT_DESC_FRAGRANCE "fragrance" +var/global/const/SCENT_DESC_ODOR = "odour" +var/global/const/SCENT_DESC_SMELL = "smell" +var/global/const/SCENT_DESC_FRAGRANCE = "fragrance" /***** Scent intensity @@ -43,7 +43,7 @@ Scent intensity var/scent = "something" var/decl/scent_intensity/intensity = /decl/scent_intensity - var/descriptor = SCENT_DESC_SMELL //unambiguous descriptor of smell; food is generally good, sewage is generally bad. how 'nice' the scent is + var/descriptor = "smell" //unambiguous descriptor of smell; food is generally good, sewage is generally bad. how 'nice' the scent is var/range = 1 //range in tiles /datum/extension/scent/New() diff --git a/code/datums/extensions/scent/scent_candle.dm b/code/modules/scent/scent_candle.dm similarity index 95% rename from code/datums/extensions/scent/scent_candle.dm rename to code/modules/scent/scent_candle.dm index b8821fbe4ef..37830e311c0 100644 --- a/code/datums/extensions/scent/scent_candle.dm +++ b/code/modules/scent/scent_candle.dm @@ -1,6 +1,6 @@ /datum/extension/scent/candle intensity = /decl/scent_intensity/normal - descriptor = SCENT_DESC_FRAGRANCE + descriptor = "fragrance" range = 4 /datum/extension/scent/candle/rose diff --git a/code/datums/scents/scent_decls.dm b/code/modules/scent/scent_decls.dm similarity index 100% rename from code/datums/scents/scent_decls.dm rename to code/modules/scent/scent_decls.dm diff --git a/code/datums/extensions/scent/scent_misc.dm b/code/modules/scent/scent_misc.dm similarity index 76% rename from code/datums/extensions/scent/scent_misc.dm rename to code/modules/scent/scent_misc.dm index 5e79b5552e8..ecad58d68fc 100644 --- a/code/datums/extensions/scent/scent_misc.dm +++ b/code/modules/scent/scent_misc.dm @@ -1,5 +1,5 @@ /datum/extension/scent/ashtray scent = "an ashtray" intensity = /decl/scent_intensity - descriptor = SCENT_DESC_ODOR + descriptor = "odour" range = 2 \ No newline at end of file diff --git a/nebula.dme b/nebula.dme index faac78c29d5..3831d4c6f39 100644 --- a/nebula.dme +++ b/nebula.dme @@ -486,9 +486,6 @@ #include "code\datums\extensions\multitool\items\stock_parts_radio.dm" #include "code\datums\extensions\on_click\turf_hand.dm" #include "code\datums\extensions\resistable\resistable.dm" -#include "code\datums\extensions\scent\_scent.dm" -#include "code\datums\extensions\scent\scent_candle.dm" -#include "code\datums\extensions\scent\scent_misc.dm" #include "code\datums\extensions\shearable\shearable.dm" #include "code\datums\genetics\genetic_conditions.dm" #include "code\datums\graph\graph.dm" @@ -638,7 +635,6 @@ #include "code\datums\repositories\crew\tracking.dm" #include "code\datums\repositories\crew\vital.dm" #include "code\datums\repositories\crew\~defines.dm" -#include "code\datums\scents\scent_decls.dm" #include "code\datums\state_machine\paper_fortune_fsm.dm" #include "code\datums\state_machine\state.dm" #include "code\datums\state_machine\transition.dm" @@ -1070,13 +1066,6 @@ #include "code\game\objects\effects\decals\Cleanable\misc.dm" #include "code\game\objects\effects\decals\Cleanable\robots.dm" #include "code\game\objects\effects\decals\Cleanable\tracks.dm" -#include "code\game\objects\effects\decals\posters\_poster.dm" -#include "code\game\objects\effects\decals\posters\_poster_design.dm" -#include "code\game\objects\effects\decals\posters\bs12.dm" -#include "code\game\objects\effects\projectile\projectile_effects.dm" -#include "code\game\objects\effects\projectile\projectile_impact.dm" -#include "code\game\objects\effects\projectile\projectile_muzzle.dm" -#include "code\game\objects\effects\projectile\projectile_tracer.dm" #include "code\game\objects\effects\spawners\bombspawner.dm" #include "code\game\objects\effects\spawners\gibspawner.dm" #include "code\game\objects\items\__item.dm" @@ -1120,6 +1109,7 @@ #include "code\game\objects\items\saddle.dm" #include "code\game\objects\items\silencer.dm" #include "code\game\objects\items\spirit_board.dm" +#include "code\game\objects\items\stools.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\training_dummy.dm" #include "code\game\objects\items\trash.dm" @@ -1155,6 +1145,41 @@ #include "code\game\objects\items\books\skill\research.dm" #include "code\game\objects\items\books\skill\security.dm" #include "code\game\objects\items\books\skill\service.dm" +#include "code\game\objects\items\circuitboards\broken.dm" +#include "code\game\objects\items\circuitboards\circuitboard.dm" +#include "code\game\objects\items\circuitboards\other.dm" +#include "code\game\objects\items\circuitboards\wall.dm" +#include "code\game\objects\items\circuitboards\computer\air_management.dm" +#include "code\game\objects\items\circuitboards\computer\computer.dm" +#include "code\game\objects\items\circuitboards\computer\holodeckcontrol.dm" +#include "code\game\objects\items\circuitboards\computer\modular.dm" +#include "code\game\objects\items\circuitboards\computer\shuttle.dm" +#include "code\game\objects\items\circuitboards\computer\station_alert.dm" +#include "code\game\objects\items\circuitboards\machinery\biogenerator.dm" +#include "code\game\objects\items\circuitboards\machinery\chemistry.dm" +#include "code\game\objects\items\circuitboards\machinery\cloning.dm" +#include "code\game\objects\items\circuitboards\machinery\commsantenna.dm" +#include "code\game\objects\items\circuitboards\machinery\docking_beacon.dm" +#include "code\game\objects\items\circuitboards\machinery\engineering_circuits.dm" +#include "code\game\objects\items\circuitboards\machinery\forensic.dm" +#include "code\game\objects\items\circuitboards\machinery\holomap.dm" +#include "code\game\objects\items\circuitboards\machinery\household.dm" +#include "code\game\objects\items\circuitboards\machinery\mech_recharger.dm" +#include "code\game\objects\items\circuitboards\machinery\medical.dm" +#include "code\game\objects\items\circuitboards\machinery\mining.dm" +#include "code\game\objects\items\circuitboards\machinery\mining_drill.dm" +#include "code\game\objects\items\circuitboards\machinery\network.dm" +#include "code\game\objects\items\circuitboards\machinery\oxyregenerator.dm" +#include "code\game\objects\items\circuitboards\machinery\pacman.dm" +#include "code\game\objects\items\circuitboards\machinery\portable_atmospherics.dm" +#include "code\game\objects\items\circuitboards\machinery\power.dm" +#include "code\game\objects\items\circuitboards\machinery\recharge_station.dm" +#include "code\game\objects\items\circuitboards\machinery\research.dm" +#include "code\game\objects\items\circuitboards\machinery\self_destruct_storage.dm" +#include "code\game\objects\items\circuitboards\machinery\shieldgen.dm" +#include "code\game\objects\items\circuitboards\machinery\shipsensors.dm" +#include "code\game\objects\items\circuitboards\machinery\telecomms.dm" +#include "code\game\objects\items\circuitboards\machinery\unary_atmos.dm" #include "code\game\objects\items\devices\aicard.dm" #include "code\game\objects\items\devices\auto_cpr.dm" #include "code\game\objects\items\devices\binoculars.dm" @@ -1166,6 +1191,7 @@ #include "code\game\objects\items\devices\geiger.dm" #include "code\game\objects\items\devices\gps.dm" #include "code\game\objects\items\devices\hacktool.dm" +#include "code\game\objects\items\devices\hailer.dm" #include "code\game\objects\items\devices\holowarrant.dm" #include "code\game\objects\items\devices\inducer.dm" #include "code\game\objects\items\devices\lightreplacer.dm" @@ -1188,7 +1214,6 @@ #include "code\game\objects\items\devices\tvcamera.dm" #include "code\game\objects\items\devices\uplink.dm" #include "code\game\objects\items\devices\uplink_random_lists.dm" -#include "code\game\objects\items\devices\whistle.dm" #include "code\game\objects\items\devices\radio\beacon.dm" #include "code\game\objects\items\devices\radio\encryptionkey.dm" #include "code\game\objects\items\devices\radio\headset.dm" @@ -1200,17 +1225,6 @@ #include "code\game\objects\items\devices\radio\radio_borg.dm" #include "code\game\objects\items\devices\radio\radio_exosuit.dm" #include "code\game\objects\items\devices\radio\radio_misc.dm" -#include "code\game\objects\items\devices\scanners\_scanner.dm" -#include "code\game\objects\items\devices\scanners\breath.dm" -#include "code\game\objects\items\devices\scanners\gas.dm" -#include "code\game\objects\items\devices\scanners\health.dm" -#include "code\game\objects\items\devices\scanners\mass_spectrometer.dm" -#include "code\game\objects\items\devices\scanners\mining.dm" -#include "code\game\objects\items\devices\scanners\network.dm" -#include "code\game\objects\items\devices\scanners\plant.dm" -#include "code\game\objects\items\devices\scanners\price.dm" -#include "code\game\objects\items\devices\scanners\reagents.dm" -#include "code\game\objects\items\devices\scanners\xenobio.dm" #include "code\game\objects\items\flame\_flame.dm" #include "code\game\objects\items\flame\flame_candle.dm" #include "code\game\objects\items\flame\flame_fuelled.dm" @@ -1245,6 +1259,11 @@ #include "code\game\objects\items\stacks\medical\medical_splint.dm" #include "code\game\objects\items\stacks\tiles\tile_types.dm" #include "code\game\objects\items\stacks\tiles\tile_types_wooden.dm" +#include "code\game\objects\items\tools\crowbar.dm" +#include "code\game\objects\items\tools\screwdriver.dm" +#include "code\game\objects\items\tools\shears.dm" +#include "code\game\objects\items\tools\wirecutter.dm" +#include "code\game\objects\items\tools\wrench.dm" #include "code\game\objects\items\weapons\AI_modules.dm" #include "code\game\objects\items\weapons\autopsy.dm" #include "code\game\objects\items\weapons\balls.dm" @@ -1258,7 +1277,6 @@ #include "code\game\objects\items\weapons\defib.dm" #include "code\game\objects\items\weapons\dice.dm" #include "code\game\objects\items\weapons\ecigs.dm" -#include "code\game\objects\items\weapons\electric_welder.dm" #include "code\game\objects\items\weapons\explosives.dm" #include "code\game\objects\items\weapons\extinguisher.dm" #include "code\game\objects\items\weapons\flamethrower.dm" @@ -1266,10 +1284,10 @@ #include "code\game\objects\items\weapons\handcuffs.dm" #include "code\game\objects\items\weapons\ironing_iron.dm" #include "code\game\objects\items\weapons\janitor_sign.dm" +#include "code\game\objects\items\weapons\locator.dm" #include "code\game\objects\items\weapons\mop.dm" #include "code\game\objects\items\weapons\nuclear_cylinder.dm" #include "code\game\objects\items\weapons\paint.dm" -#include "code\game\objects\items\weapons\policetape.dm" #include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RPD.dm" #include "code\game\objects\items\weapons\RSF.dm" @@ -1282,46 +1300,9 @@ #include "code\game\objects\items\weapons\swords_axes_etc.dm" #include "code\game\objects\items\weapons\tape.dm" #include "code\game\objects\items\weapons\tech_disks.dm" -#include "code\game\objects\items\weapons\teleportation.dm" #include "code\game\objects\items\weapons\towels.dm" #include "code\game\objects\items\weapons\traps.dm" #include "code\game\objects\items\weapons\weaponry.dm" -#include "code\game\objects\items\weapons\weldbackpack.dm" -#include "code\game\objects\items\weapons\circuitboards\broken.dm" -#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" -#include "code\game\objects\items\weapons\circuitboards\other.dm" -#include "code\game\objects\items\weapons\circuitboards\wall.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\air_management.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\computer.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\holodeckcontrol.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\modular.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\shuttle.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\station_alert.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\chemistry.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\commsantenna.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\docking_beacon.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\engineering_circuits.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\forensic.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\holomap.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\household.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\medical.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\mining.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\network.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\oxyregenerator.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\portable_atmospherics.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\self_destruct_storage.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\shipsensors.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" #include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" #include "code\game\objects\items\weapons\grenades\chem_grenade.dm" #include "code\game\objects\items\weapons\grenades\decompiler.dm" @@ -1333,22 +1314,6 @@ #include "code\game\objects\items\weapons\grenades\prank_grenades.dm" #include "code\game\objects\items\weapons\grenades\smokebomb.dm" #include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" -#include "code\game\objects\items\weapons\implants\implant.dm" -#include "code\game\objects\items\weapons\implants\implantcase.dm" -#include "code\game\objects\items\weapons\implants\implantchair.dm" -#include "code\game\objects\items\weapons\implants\implanter.dm" -#include "code\game\objects\items\weapons\implants\implantpad.dm" -#include "code\game\objects\items\weapons\implants\implants\adrenaline.dm" -#include "code\game\objects\items\weapons\implants\implants\chem.dm" -#include "code\game\objects\items\weapons\implants\implants\compressed.dm" -#include "code\game\objects\items\weapons\implants\implants\death_alarm.dm" -#include "code\game\objects\items\weapons\implants\implants\explosive.dm" -#include "code\game\objects\items\weapons\implants\implants\freedom.dm" -#include "code\game\objects\items\weapons\implants\implants\imprinting.dm" -#include "code\game\objects\items\weapons\implants\implants\loyalty.dm" -#include "code\game\objects\items\weapons\implants\implants\tracking.dm" -#include "code\game\objects\items\weapons\implants\implants\translator.dm" -#include "code\game\objects\items\weapons\implants\implants\uplink.dm" #include "code\game\objects\items\weapons\material\ashtray.dm" #include "code\game\objects\items\weapons\material\bell.dm" #include "code\game\objects\items\weapons\material\coins.dm" @@ -1412,12 +1377,10 @@ #include "code\game\objects\items\weapons\tanks\jetpack.dm" #include "code\game\objects\items\weapons\tanks\tank_types.dm" #include "code\game\objects\items\weapons\tanks\tanks.dm" -#include "code\game\objects\items\weapons\tools\crowbar.dm" -#include "code\game\objects\items\weapons\tools\screwdriver.dm" -#include "code\game\objects\items\weapons\tools\shears.dm" -#include "code\game\objects\items\weapons\tools\weldingtool.dm" -#include "code\game\objects\items\weapons\tools\wirecutter.dm" -#include "code\game\objects\items\weapons\tools\wrench.dm" +#include "code\game\objects\items\welding\electric_welder.dm" +#include "code\game\objects\items\welding\weldbackpack.dm" +#include "code\game\objects\items\welding\weldingtool.dm" +#include "code\game\objects\items\welding\weldingtool_tank.dm" #include "code\game\objects\random\_random.dm" #include "code\game\objects\random\date_based.dm" #include "code\game\objects\random\random.dm" @@ -1468,7 +1431,6 @@ #include "code\game\objects\structures\emergency_dispenser.dm" #include "code\game\objects\structures\extinguisher.dm" #include "code\game\objects\structures\fences.dm" -#include "code\game\objects\structures\filter_stand.dm" #include "code\game\objects\structures\fireaxe_cabinet.dm" #include "code\game\objects\structures\fires.dm" #include "code\game\objects\structures\fishtanks.dm" @@ -1507,6 +1469,7 @@ #include "code\game\objects\structures\signs.dm" #include "code\game\objects\structures\skele_stand.dm" #include "code\game\objects\structures\snowman.dm" +#include "code\game\objects\structures\sofa.dm" #include "code\game\objects\structures\stasis_cage.dm" #include "code\game\objects\structures\tables.dm" #include "code\game\objects\structures\tank_dispenser.dm" @@ -1525,7 +1488,20 @@ #include "code\game\objects\structures\barrels\barrel.dm" #include "code\game\objects\structures\barrels\cask.dm" #include "code\game\objects\structures\barrels\cask_rack.dm" -#include "code\game\objects\structures\chemistry\_chemistry.dm" +#include "code\game\objects\structures\beds\bed.dm" +#include "code\game\objects\structures\beds\bedroll.dm" +#include "code\game\objects\structures\beds\mattress.dm" +#include "code\game\objects\structures\beds\rollerbed.dm" +#include "code\game\objects\structures\beds\simple_bed.dm" +#include "code\game\objects\structures\beds\travois.dm" +#include "code\game\objects\structures\benches\bench.dm" +#include "code\game\objects\structures\benches\lounge.dm" +#include "code\game\objects\structures\benches\pew.dm" +#include "code\game\objects\structures\chairs\chairs.dm" +#include "code\game\objects\structures\chairs\rustic_chairs.dm" +#include "code\game\objects\structures\chairs\wheelchair.dm" +#include "code\game\objects\structures\chemistry\filter_stand.dm" +#include "code\game\objects\structures\chemistry\heater.dm" #include "code\game\objects\structures\crates_lockers\crates.dm" #include "code\game\objects\structures\crates_lockers\largecrate.dm" #include "code\game\objects\structures\crates_lockers\med_crate.dm" @@ -1574,15 +1550,6 @@ #include "code\game\objects\structures\signs\paintings.dm" #include "code\game\objects\structures\signs\plaques.dm" #include "code\game\objects\structures\signs\warning_signs.dm" -#include "code\game\objects\structures\stool_bed_chair_nest_sofa\bed.dm" -#include "code\game\objects\structures\stool_bed_chair_nest_sofa\bedroll.dm" -#include "code\game\objects\structures\stool_bed_chair_nest_sofa\chairs.dm" -#include "code\game\objects\structures\stool_bed_chair_nest_sofa\pew.dm" -#include "code\game\objects\structures\stool_bed_chair_nest_sofa\rustic_chairs.dm" -#include "code\game\objects\structures\stool_bed_chair_nest_sofa\simple_bed.dm" -#include "code\game\objects\structures\stool_bed_chair_nest_sofa\sofa.dm" -#include "code\game\objects\structures\stool_bed_chair_nest_sofa\stools.dm" -#include "code\game\objects\structures\stool_bed_chair_nest_sofa\wheelchair.dm" #include "code\game\turfs\turf.dm" #include "code\game\turfs\turf_ao.dm" #include "code\game\turfs\turf_buildmode.dm" @@ -1862,6 +1829,10 @@ #include "code\modules\banners\banner_frame_definitions.dm" #include "code\modules\banners\sign.dm" #include "code\modules\banners\sign_post.dm" +#include "code\modules\barricade_tape\barricade_tape.dm" +#include "code\modules\barricade_tape\barricade_tape_roll.dm" +#include "code\modules\barricade_tape\barricade_tape_subtypes.dm" +#include "code\modules\barricade_tape\barricade_tape_template.dm" #include "code\modules\blob\blob.dm" #include "code\modules\blood\blood.dm" #include "code\modules\blood\blood_types.dm" @@ -2628,6 +2599,22 @@ #include "code\modules\hydroponics\trays\tray_soil.dm" #include "code\modules\hydroponics\trays\tray_tools.dm" #include "code\modules\hydroponics\trays\tray_update_icons.dm" +#include "code\modules\implants\implant.dm" +#include "code\modules\implants\implantcase.dm" +#include "code\modules\implants\implantchair.dm" +#include "code\modules\implants\implanter.dm" +#include "code\modules\implants\implantpad.dm" +#include "code\modules\implants\implant_types\adrenaline.dm" +#include "code\modules\implants\implant_types\chem.dm" +#include "code\modules\implants\implant_types\compressed.dm" +#include "code\modules\implants\implant_types\death_alarm.dm" +#include "code\modules\implants\implant_types\explosive.dm" +#include "code\modules\implants\implant_types\freedom.dm" +#include "code\modules\implants\implant_types\imprinting.dm" +#include "code\modules\implants\implant_types\loyalty.dm" +#include "code\modules\implants\implant_types\tracking.dm" +#include "code\modules\implants\implant_types\translator.dm" +#include "code\modules\implants\implant_types\uplink.dm" #include "code\modules\integrated_electronics\_defines.dm" #include "code\modules\integrated_electronics\core\_electronics.dm" #include "code\modules\integrated_electronics\core\analyzer.dm" @@ -3446,6 +3433,9 @@ #include "code\modules\persistence\persistence_datum_paper.dm" #include "code\modules\persistence\persistence_datum_paper_sticky.dm" #include "code\modules\pointdefense\pointdefense.dm" +#include "code\modules\posters\_poster.dm" +#include "code\modules\posters\_poster_design.dm" +#include "code\modules\posters\bs12.dm" #include "code\modules\posture\_posture.dm" #include "code\modules\posture\posture_bodytype.dm" #include "code\modules\posture\posture_mob.dm" @@ -3572,6 +3562,10 @@ #include "code\modules\projectiles\projectile\pellets.dm" #include "code\modules\projectiles\projectile\special.dm" #include "code\modules\projectiles\projectile\trace.dm" +#include "code\modules\projectiles\projectile\effects\projectile_effects.dm" +#include "code\modules\projectiles\projectile\effects\projectile_impact.dm" +#include "code\modules\projectiles\projectile\effects\projectile_muzzle.dm" +#include "code\modules\projectiles\projectile\effects\projectile_tracer.dm" #include "code\modules\projectiles\targeting\targeting_gun.dm" #include "code\modules\projectiles\targeting\targeting_mob.dm" #include "code\modules\projectiles\targeting\targeting_overlay.dm" @@ -3764,6 +3758,21 @@ #include "code\modules\research\design_database.dm" #include "code\modules\research\design_database_analyzer.dm" #include "code\modules\research\research_fields.dm" +#include "code\modules\scanners\_scanner.dm" +#include "code\modules\scanners\breath.dm" +#include "code\modules\scanners\gas.dm" +#include "code\modules\scanners\health.dm" +#include "code\modules\scanners\mass_spectrometer.dm" +#include "code\modules\scanners\mining.dm" +#include "code\modules\scanners\network.dm" +#include "code\modules\scanners\plant.dm" +#include "code\modules\scanners\price.dm" +#include "code\modules\scanners\reagents.dm" +#include "code\modules\scanners\xenobio.dm" +#include "code\modules\scent\_scent.dm" +#include "code\modules\scent\scent_candle.dm" +#include "code\modules\scent\scent_decls.dm" +#include "code\modules\scent\scent_misc.dm" #include "code\modules\sealant_gun\sealant.dm" #include "code\modules\sealant_gun\sealant_gun.dm" #include "code\modules\sealant_gun\sealant_injector.dm"