diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 3e2742de11..46e509cb8f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -125,6 +125,9 @@ var/path_type = /obj/item/baseball_bat var/path_type = "/obj/item/baseball_bat" ``` +### Use var/name format when declaring variables +While DM allows other ways of declaring variables, this one should be used for consistency. + ### Tabs, not spaces You must use tabs to indent your code, NOT SPACES. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index f1e726c515..3b1daafc62 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,3 +1,3 @@ -[Note]: # (Please enter the `Round ID` from the `Status` panel if you can! If you believe the issue to be caused by a testmerge, please report it in its relative PR thread. State what the issue is from a "whats wrong" prospective. Issue reports should clearly allow maintainers to understand whats wrong and how to test/reproduce if that is not obvious. Avoid ambiguity. Start your issue report below both of these lines (or remove them)) +[Directions]: # (Include the Round ID from the Status panel or retrieve it from https://atlantaned.space/newSS13tools/round.php ! If you believe the issue to be caused by a testmerge [OOC tab -> Show Server Revision], report it in the pull request's comment section instead. Explain your issue in detail, including the steps to reproduce it.) -[Admins]: # (If you are reporting a bug that occured AFTER you used varedit/admin buttons to alter an object out of normal operating conditions, please verify that you can re-create the bug without the varedit usage/admin buttons before reporting the issue.) +[For Admins]: # (Oddities induced by var-edits and other admin tools are not necessarily bugs. Verify that your issues occur under regular circumstances before reporting them.) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f67f095a4f..1332358e04 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,4 @@ -[Changelogs]: # (Please make a changelog if you're adding, removing or changing content that'll affect players. This includes, but is not limited to, new features, sprites, sounds; balance changes; map edits and important fixes) -[]: # (See here for how to easily make a changelog: https://github.com/tgstation/tgstation/wiki/Changelogs. An example changelog has been provided below. Please edit or remove) +[Changelogs]: # (Please make a changelog if you're adding, removing or changing content that'll affect players. This includes, but is not limited to, new features, sprites, sounds; balance changes; map edits and important fixes. An example changelog has been provided below for you to edit or remove. If you need help, read https://github.com/tgstation/tgstation/wiki/Changelogs) :cl: optional name here @@ -18,4 +17,4 @@ spellcheck: fixed a few typos experiment: added an experimental thingy /:cl: -[why]: # (Please add a short description [on the next line] of why you think these changes would benefit the game. If you can't justify it in words, it might not be worth adding:) +[why]: # (Please add a short description [two lines down] of why you think these changes would benefit the game. If you can't justify it in words, it might not be worth adding.) diff --git a/.travis.yml b/.travis.yml index ba11b40c97..b353761b2d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,5 @@ language: generic sudo: false -dist: precise - env: global: - BYOND_MAJOR="511" @@ -23,12 +21,15 @@ cache: addons: apt: + sources: + - sourceline: 'ppa:ondrej/php' packages: - libc6-i386 - libgcc1:i386 - libstdc++6:i386 - python - python-pip + - php5.6 install: - tools/travis/install_build_tools.sh diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm index d02d4ced34..214ff213c8 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm @@ -1,4 +1,4 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( /turf/template_noop, /area/template_noop) @@ -47,7 +47,7 @@ /area/ruin/powered/animal_hospital) "al" = ( /obj/structure/table/wood, -/obj/item/toy/carpplushie, +/obj/item/toy/plush/carpplushie, /turf/open/floor/plasteel/cmo, /area/ruin/powered/animal_hospital) "am" = ( @@ -166,7 +166,7 @@ /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "aF" = ( -/obj/machinery/door/unpowered/shuttle{ +/obj/machinery/door/airlock/shuttle{ name = "Restroom" }, /turf/open/floor/plasteel/bar, @@ -263,6 +263,9 @@ /area/ruin/powered/animal_hospital) "aX" = ( /obj/item/stack/cable_coil/random, +/obj/item/stack/sheet/mineral/titanium{ + amount = 30 + }, /turf/open/floor/plating, /area/ruin/powered/animal_hospital) "aY" = ( @@ -335,6 +338,9 @@ /area/ruin/powered/animal_hospital) "bk" = ( /obj/structure/reagent_dispensers/fueltank, +/obj/item/device/flashlight/glowstick/blue, +/obj/item/device/flashlight/glowstick/blue, +/obj/item/device/flashlight/glowstick/blue, /turf/open/floor/plating, /area/ruin/powered/animal_hospital) "bl" = ( @@ -373,16 +379,15 @@ }, /area/ruin/powered/animal_hospital) "bn" = ( -/obj/structure/bed/dogbed, -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/sleeper{ + dir = 4 }, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "bo" = ( -/obj/item/reagent_containers/glass/bowl, -/obj/item/reagent_containers/food/snacks/cheesewedge, -/obj/item/reagent_containers/food/snacks/cheesewedge, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "bp" = ( @@ -420,10 +425,8 @@ }, /area/ruin/powered/animal_hospital) "bv" = ( -/obj/effect/mob_spawn/mouse{ - dir = 4; - flavour_text = "You're a mousey! You're getting pretty old as mice go, and you haven't been feeling well as of late. Your master loves you a lot so he took you to this place so you can get better! You can't wait to see him again!"; - mob_name = "Stallman Jr." +/obj/effect/mob_spawn/human/doctor/alive/lavaland{ + dir = 4 }, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) @@ -433,8 +436,7 @@ /area/ruin/powered/animal_hospital) "bx" = ( /obj/machinery/door/airlock/medical{ - name = "Patient Room"; - req_access_txt = "0" + name = "Rejuvenation Pods" }, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) @@ -468,12 +470,11 @@ /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "bD" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/glass/bottle/cyanide{ - desc = "A cocktail of chemotherapy drugs intended to treat bladder cancer."; - name = "MVAC regimen" +/mob/living/simple_animal/bot/medbot{ + desc = "A little medical robot. It's programmed to only act in emergencies."; + heal_threshold = 40; + name = "emergency Medibot" }, -/obj/item/reagent_containers/syringe, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "bE" = ( @@ -553,16 +554,12 @@ }, /area/lavaland/surface/outdoors) "bP" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, +/obj/structure/table/glass, +/obj/item/storage/firstaid/fire, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "bQ" = ( -/obj/structure/table/glass, -/obj/item/clothing/neck/petcollar, -/obj/item/pen/blue, +/obj/machinery/light/small, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "bR" = ( @@ -582,6 +579,8 @@ /obj/item/defibrillator/loaded, /obj/item/storage/belt/medical, /obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, /turf/open/floor/plasteel/blue/side{ dir = 6 }, @@ -664,46 +663,46 @@ /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "cg" = ( -/obj/machinery/door/unpowered/shuttle{ +/obj/machinery/door/airlock/shuttle{ name = "Break Room" }, /turf/open/floor/plasteel/cmo, /area/ruin/powered/animal_hospital) "ch" = ( -/obj/machinery/door/unpowered/shuttle{ - name = "Emergency Care" +/obj/machinery/door/airlock/shuttle{ + name = "Operating Theatre" }, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "ci" = ( -/obj/machinery/door/unpowered/shuttle{ - desc = "There's a note wedged in the seam saying something about directing pizza here."; +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock/shuttle{ + desc = "There's a smudged note wedged into it that says something about pizza dropoffs."; name = "Staff Entrance" }, -/obj/structure/fans/tiny/invisible, /turf/open/floor/plating, /area/ruin/powered/animal_hospital) "cj" = ( -/obj/machinery/door/unpowered/shuttle{ +/obj/machinery/door/airlock/shuttle{ name = "Morgue" }, /turf/open/floor/plating, /area/ruin/powered/animal_hospital) "ck" = ( -/obj/machinery/door/unpowered/shuttle{ +/obj/machinery/door/airlock/shuttle{ name = "Medical Supplies" }, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "cl" = ( -/obj/machinery/door/unpowered/shuttle{ +/obj/machinery/door/airlock/shuttle{ name = "Safety Supplies" }, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "cm" = ( -/obj/machinery/door/unpowered/shuttle{ - name = "Tool Storage" +/obj/machinery/door/airlock/shuttle{ + name = "Storage" }, /turf/open/floor/plating, /area/ruin/powered/animal_hospital) @@ -811,6 +810,33 @@ /obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/titanium/nodiagonal, /area/ruin/powered/animal_hospital) +"cG" = ( +/obj/machinery/door/airlock/shuttle{ + desc = "There's a smudged note wedged into it that says something about pizza dropoffs."; + name = "Staff Entrance" + }, +/turf/open/floor/plasteel/cmo, +/area/ruin/powered/animal_hospital) +"cH" = ( +/mob/living/simple_animal/bot/cleanbot, +/turf/open/floor/plasteel/blue/side{ + dir = 0 + }, +/area/ruin/powered/animal_hospital) +"cI" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/toxin, +/turf/open/floor/plasteel/white, +/area/ruin/powered/animal_hospital) +"cJ" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/powered/animal_hospital) (1,1,1) = {" aa @@ -1037,7 +1063,7 @@ cw ae aV ba -bh +cI aG aL br @@ -1092,7 +1118,7 @@ aj at as ae -ct +aL aK ck ao @@ -1122,7 +1148,7 @@ ak as az ae -aM +cv aP ae ae @@ -1152,7 +1178,7 @@ al au as ae -ct +aL aK cl ao @@ -1181,9 +1207,9 @@ ae am cs as -cg +cG aK -aP +cH ae aW ao @@ -1249,12 +1275,12 @@ ae ae ae ae +bh +bv +bv +cJ bn bv -bC -ae -bn -bN bP ae cE @@ -1280,10 +1306,10 @@ be bk ae bo -bw +ao bD -ae -bK +ao +ao ao bQ ae @@ -1311,11 +1337,11 @@ ae ae af bx -ae +af ae af bx -ae +af ae aa aa diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 3c7cb364c6..5d192d2a7c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -76,8 +76,7 @@ /area/ruin/powered/syndicate_lava_base) "al" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/vault, /area/ruin/powered/syndicate_lava_base) @@ -320,8 +319,7 @@ /area/ruin/powered/syndicate_lava_base) "aS" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -413,8 +411,7 @@ /area/ruin/powered/syndicate_lava_base) "bd" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/light/small, /turf/open/floor/plasteel/black, @@ -702,8 +699,7 @@ /area/ruin/powered/syndicate_lava_base) "bK" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -969,8 +965,7 @@ /area/ruin/powered/syndicate_lava_base) "cq" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/podhatch{ dir = 5 diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm index 588000378b..14ef2b80cd 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm @@ -48,7 +48,7 @@ /area/ruin/unpowered) "j" = ( /obj/machinery/abductor/experiment{ - team = 100 + team_number = 100 }, /turf/open/floor/plating/abductor{ initial_gas_mix = "o2=16;n2=23;TEMP=300" @@ -61,7 +61,7 @@ /area/ruin/unpowered) "l" = ( /obj/machinery/abductor/pad{ - team = 100 + team_number = 100 }, /turf/open/floor/plating/abductor{ initial_gas_mix = "o2=16;n2=23;TEMP=300" diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index f9144cd3ef..a083ac48f6 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -252,7 +252,9 @@ /turf/open/floor/plating/airless, /area/template_noop) "aF" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /obj/structure/window/reinforced, /turf/open/floor/plating, /area/ruin/space/derelict/solar_control) @@ -416,7 +418,9 @@ /turf/open/floor/plasteel, /area/ruin/space/derelict/solar_control) "bc" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, /area/ruin/space/derelict/solar_control) "bd" = ( @@ -985,7 +989,9 @@ /turf/open/floor/plating, /area/ruin/space/derelict/bridge/access) "cU" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/ruin/space/derelict/bridge/access) "cV" = ( @@ -1018,11 +1024,15 @@ /turf/open/floor/plasteel, /area/ruin/space/derelict/bridge/access) "cY" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/southwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 10 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/gravity_generator) "cZ" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/gravity_generator) "da" = ( @@ -1033,11 +1043,15 @@ /turf/open/floor/plasteel, /area/ruin/space/derelict/gravity_generator) "db" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/north, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/gravity_generator) "dc" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northeast, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 5 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/gravity_generator) "dd" = ( @@ -1488,15 +1502,19 @@ /turf/open/floor/plating/airless, /area/ruin/unpowered/no_grav) "ev" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side, +/obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "ew" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 6 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "ex" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/east, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 4 + }, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 8 @@ -1663,7 +1681,9 @@ /turf/template_noop, /area/template_noop) "eW" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 9 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "eX" = ( @@ -1697,11 +1717,15 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "fc" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/north, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "fd" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northeast, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 5 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "fe" = ( @@ -1783,7 +1807,9 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/bridge) "fq" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/west, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 8 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "fr" = ( @@ -1807,7 +1833,9 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "ft" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/east, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "fu" = ( @@ -1890,7 +1918,9 @@ }, /area/ruin/space/derelict/singularity_engine) "fI" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/southwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 10 + }, /turf/open/floor/plasteel/airless{ icon_state = "damaged2" }, @@ -2128,7 +2158,9 @@ }, /area/ruin/space/derelict/singularity_engine) "gt" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 9 + }, /obj/item/shard{ icon_state = "medium" }, @@ -2146,7 +2178,9 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "gw" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "gx" = ( @@ -2194,7 +2228,9 @@ }, /area/ruin/unpowered/no_grav) "gE" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "gF" = ( @@ -2292,7 +2328,9 @@ /turf/closed/wall, /area/ruin/space/derelict/singularity_engine) "gZ" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/southwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 10 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "ha" = ( @@ -2408,7 +2446,9 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/medical) "hx" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/north, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/medical) "hy" = ( @@ -2691,7 +2731,9 @@ /turf/template_noop, /area/template_noop) "iu" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 6 + }, /turf/template_noop, /area/template_noop) "iv" = ( @@ -3129,7 +3171,9 @@ /turf/open/floor/plating, /area/ruin/space/derelict/arrival) "jK" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/ruin/space/derelict/arrival) "jL" = ( @@ -3548,11 +3592,15 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/hallway/primary) "kP" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/hallway/primary) "kQ" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/hallway/primary) "kR" = ( @@ -3772,7 +3820,9 @@ /turf/open/floor/plasteel/airless, /area/ruin/unpowered/no_grav) "lD" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/ruin/unpowered/no_grav) "lE" = ( @@ -3850,7 +3900,9 @@ /turf/open/floor/plasteel/airless, /area/ruin/unpowered/no_grav) "lR" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/ruin/unpowered/no_grav) "lS" = ( @@ -4062,7 +4114,9 @@ /turf/open/floor/plasteel/airless, /area/ruin/space/derelict/hallway/secondary) "mD" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/hallway/secondary) "mE" = ( @@ -4174,7 +4228,9 @@ /turf/open/floor/plasteel/airless, /area/ruin/space/derelict/hallway/secondary) "mY" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/hallway/secondary) "mZ" = ( @@ -4366,7 +4422,7 @@ /turf/template_noop, /area/ruin/space/derelict/hallway/secondary) "ny" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side, +/obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/open/floor/plating/airless, /area/ruin/space/derelict/hallway/secondary) "nz" = ( @@ -4417,7 +4473,9 @@ /turf/open/floor/plasteel/airless, /area/ruin/space/derelict/hallway/secondary) "nH" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/north, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/hallway/secondary) "nI" = ( diff --git a/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm b/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm index 11dcb8561f..c08a68b6c7 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm @@ -36,11 +36,15 @@ /turf/open/floor/plating/airless, /area/ruin/space/abandoned_tele) "j" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating/airless, /area/ruin/space/abandoned_tele) "k" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/ruin/space/abandoned_tele) "l" = ( @@ -78,7 +82,9 @@ /turf/open/floor/plating/airless, /area/ruin/space/abandoned_tele) "t" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/ruin/space/abandoned_tele) "u" = ( diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm index 819e11bb0e..66c738fb77 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -743,10 +743,7 @@ /turf/open/floor/plasteel/darkgreen, /area/ruin/space/has_grav/abandonedzoo) "bN" = ( -/obj/structure/grille{ - density = 0; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /obj/item/shard{ icon_state = "small" }, @@ -799,10 +796,7 @@ /turf/open/floor/plating/airless, /area/ruin/space/has_grav/abandonedzoo) "bU" = ( -/obj/structure/grille{ - density = 0; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/abandonedzoo) "bV" = ( diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index d2a416bba2..2f395e4f1c 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -590,9 +590,9 @@ "bW" = ( /obj/structure/closet/crate/secure/gear, /obj/item/ammo_box/c10mm, -/obj/item/ammo_casing/shotgun/meteorshot, -/obj/item/ammo_casing/shotgun/meteorshot, -/obj/item/ammo_casing/shotgun/meteorshot, +/obj/item/ammo_casing/shotgun/meteorslug, +/obj/item/ammo_casing/shotgun/meteorslug, +/obj/item/ammo_casing/shotgun/meteorslug, /turf/open/floor/mineral/titanium/yellow/airless, /area/ruin/unpowered) "bX" = ( diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index f577ec5143..5016189876 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -17,7 +17,9 @@ /turf/closed/wall/mineral/titanium/overspace, /area/awaymission/BMPship/Aft) "af" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/engine, /area/awaymission/BMPship/Aft) "ag" = ( @@ -38,7 +40,9 @@ /turf/open/floor/plating, /area/awaymission/BMPship/Aft) "aj" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/engine, /area/awaymission/BMPship/Aft) "ak" = ( @@ -54,7 +58,9 @@ /area/template_noop) "an" = ( /obj/structure/window/reinforced, -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/engine, /area/awaymission/BMPship/Aft) "ao" = ( @@ -224,7 +230,9 @@ /turf/open/floor/plating, /area/awaymission/BMPship/Aft) "aQ" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Fore) "aR" = ( @@ -350,7 +358,9 @@ /turf/open/floor/plating, /area/awaymission/BMPship/Aft) "bl" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Fore) "bm" = ( @@ -394,7 +404,9 @@ /area/awaymission/BMPship/Aft) "bt" = ( /obj/structure/window/reinforced, -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Fore) "bu" = ( @@ -1165,7 +1177,9 @@ /turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) "dG" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/awaymission/BMPship/Fore) "dH" = ( @@ -1372,7 +1386,9 @@ /turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) "ed" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/BMPship/Fore) "ee" = ( @@ -1592,7 +1608,9 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/spawner/structure/window/hollow/reinforced/corner, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 6 + }, /turf/open/floor/plating, /area/awaymission/BMPship/Fore) "eI" = ( @@ -2115,7 +2133,9 @@ /turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) "gk" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Fore) "gl" = ( @@ -2247,7 +2267,9 @@ /turf/open/floor/plating/asteroid/airless, /area/awaymission/BMPship) "gF" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/east, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 4 + }, /obj/item/shard{ icon_state = "small" }, @@ -2308,7 +2330,9 @@ /turf/open/floor/plating/asteroid/airless, /area/awaymission/BMPship) "gR" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 6 + }, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Fore) "gS" = ( @@ -2448,7 +2472,9 @@ /turf/open/floor/plating/asteroid/airless, /area/awaymission/BMPship) "ho" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/engine, /area/awaymission/BMPship/Aft) "hp" = ( diff --git a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm index 193242e689..dab408a8b1 100644 --- a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm @@ -451,11 +451,15 @@ /turf/open/floor/plasteel/airless/black, /area/tcommsat/chamber) "bA" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating/airless, /area/tcommsat/chamber) "bB" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/north, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, /turf/open/floor/plating/airless, /area/tcommsat/chamber) "bC" = ( @@ -463,7 +467,9 @@ /turf/open/floor/plating/airless, /area/tcommsat/chamber) "bD" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/tcommsat/chamber) "bE" = ( @@ -512,7 +518,9 @@ /turf/open/floor/plasteel/airless/black, /area/tcommsat/chamber) "bK" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 9 + }, /turf/open/floor/plating, /area/tcommsat/chamber) "bL" = ( @@ -520,7 +528,9 @@ /turf/open/floor/plating, /area/tcommsat/chamber) "bM" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/tcommsat/chamber) "bN" = ( @@ -540,7 +550,9 @@ /turf/open/floor/plasteel/airless/black, /area/tcommsat/chamber) "bP" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, /area/tcommsat/chamber) "bQ" = ( @@ -553,7 +565,9 @@ /turf/open/floor/plasteel/airless/black, /area/tcommsat/chamber) "bS" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /obj/structure/window/reinforced, /turf/open/floor/plating, /area/tcommsat/chamber) @@ -609,7 +623,9 @@ /turf/open/floor/plasteel/airless/black, /area/tcommsat/chamber) "cc" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/tcommsat/chamber) "cd" = ( @@ -632,7 +648,9 @@ /turf/open/floor/plasteel/airless/black, /area/tcommsat/chamber) "ch" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/southwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 10 + }, /turf/open/floor/plating, /area/tcommsat/chamber) "ci" = ( diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 32ed7321e7..8e636c03f9 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -53,7 +53,9 @@ /turf/closed/wall/rust, /area/ruin/space/has_grav/ancientstation/comm) "al" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /obj/machinery/door/poddoor{ id = "ancient" }, @@ -67,7 +69,9 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/comm) "an" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /obj/machinery/door/poddoor{ id = "ancient" }, @@ -483,11 +487,15 @@ /turf/closed/wall/rust, /area/ruin/space/has_grav/ancientstation/comm) "bz" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/comm) "bA" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/comm) "bB" = ( @@ -900,7 +908,9 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/deltacorridor) "cK" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/template_noop) "cL" = ( @@ -946,7 +956,9 @@ /turf/closed/wall/rust, /area/ruin/space/has_grav/ancientstation/hydroponics) "cR" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/hydroponics) "cS" = ( @@ -954,7 +966,9 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/hydroponics) "cT" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/hydroponics) "cU" = ( @@ -1794,7 +1808,9 @@ /turf/open/floor/plating/airless, /area/template_noop) "fb" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/engi) "fc" = ( @@ -1978,7 +1994,9 @@ /turf/open/floor/plating/airless, /area/template_noop) "fB" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/engi) "fC" = ( @@ -1986,7 +2004,9 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/engi) "fD" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 6 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/engi) "fE" = ( @@ -2805,7 +2825,9 @@ /turf/open/floor/plasteel/airless/floorgrime, /area/template_noop) "gV" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northeast, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 5 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/engi) "gW" = ( @@ -2869,7 +2891,9 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/deltacorridor) "hf" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/rnd) @@ -2879,7 +2903,9 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/rnd) "hh" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/rnd) @@ -3736,7 +3762,9 @@ /turf/closed/wall/rust, /area/ruin/space/has_grav/ancientstation/engi) "iY" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/kitchen) "iZ" = ( @@ -3744,7 +3772,9 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/kitchen) "ja" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/kitchen) "jb" = ( @@ -4069,11 +4099,15 @@ /turf/open/floor/plating/airless, /area/template_noop) "jS" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation) "jT" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation) "jU" = ( @@ -4227,7 +4261,9 @@ /turf/open/floor/engine/airless, /area/ruin/space/has_grav/ancientstation/atmo) "ko" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating/airless, /area/template_noop) "kp" = ( @@ -4238,7 +4274,7 @@ dir = 6 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/showcase/oldpod, +/obj/structure/showcase/machinery/oldpod, /turf/open/floor/plasteel/floorgrime, /area/ruin/space/has_grav/ancientstation) "kq" = ( @@ -4250,7 +4286,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/showcase/oldpod, +/obj/structure/showcase/machinery/oldpod, /turf/open/floor/plasteel/floorgrime, /area/ruin/space/has_grav/ancientstation) "kr" = ( @@ -4329,7 +4365,9 @@ /turf/open/floor/engine/airless, /area/ruin/space/has_grav/ancientstation/atmo) "kB" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/template_noop) "kC" = ( @@ -4583,11 +4621,15 @@ /turf/closed/mineral/plasma, /area/ruin/unpowered) "li" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/proto) "lj" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/proto) "lk" = ( diff --git a/_maps/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/RandomRuins/SpaceRuins/onehalf.dmm index 16d0d80887..dd653c3947 100644 --- a/_maps/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/RandomRuins/SpaceRuins/onehalf.dmm @@ -1225,10 +1225,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/onehalf/bridge) "dc" = ( -/obj/structure/grille{ - density = 0; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /obj/structure/cable{ d1 = 1; d2 = 2; diff --git a/_maps/RandomZLevels/centcomAway.dmm b/_maps/RandomZLevels/centcomAway.dmm index f62787babf..e652a73e95 100644 --- a/_maps/RandomZLevels/centcomAway.dmm +++ b/_maps/RandomZLevels/centcomAway.dmm @@ -9,7 +9,9 @@ /turf/closed/wall/r_wall, /area/awaymission/centcomAway/cafe) "ad" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/cafe) "ae" = ( @@ -17,7 +19,9 @@ /turf/open/floor/plating, /area/awaymission/centcomAway/cafe) "af" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/cafe) "ag" = ( @@ -101,7 +105,9 @@ }, /area/awaymission/centcomAway/cafe) "at" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/cafe) "au" = ( @@ -136,7 +142,9 @@ }, /area/awaymission/centcomAway/cafe) "aB" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/cafe) "aC" = ( @@ -223,7 +231,9 @@ }, /area/awaymission/centcomAway/maint) "aS" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/closed/wall/r_wall, /area/awaymission/centcomAway/maint) "aT" = ( @@ -231,7 +241,9 @@ /turf/closed/wall/r_wall, /area/awaymission/centcomAway/maint) "aU" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/closed/wall/r_wall, /area/awaymission/centcomAway/maint) "aV" = ( @@ -582,7 +594,9 @@ /turf/open/floor/plasteel/hydrofloor, /area/awaymission/centcomAway/cafe) "ci" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/maint) "cj" = ( @@ -632,7 +646,9 @@ /turf/open/floor/plasteel/hydrofloor, /area/awaymission/centcomAway/cafe) "cu" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/maint) "cv" = ( @@ -1016,11 +1032,15 @@ /turf/closed/wall/mineral/titanium, /area/awaymission/centcomAway/hangar) "dS" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/cafe) "dT" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/cafe) "dU" = ( @@ -1178,7 +1198,9 @@ /turf/open/floor/plating, /area/awaymission/centcomAway/maint) "ey" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/east, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/maint) "ez" = ( @@ -1387,7 +1409,9 @@ /turf/open/floor/plasteel/black, /area/awaymission/centcomAway/courtroom) "fn" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/hangar) "fo" = ( @@ -1395,7 +1419,9 @@ /turf/open/floor/plating, /area/awaymission/centcomAway/hangar) "fp" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/hangar) "fq" = ( @@ -1415,7 +1441,9 @@ /turf/closed/wall/r_wall, /area/awaymission/centcomAway/general) "fu" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "fv" = ( @@ -1423,11 +1451,15 @@ /turf/open/floor/plating, /area/awaymission/centcomAway/general) "fw" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "fx" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "fy" = ( @@ -1618,11 +1650,15 @@ }, /area/awaymission/centcomAway/general) "gd" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 9 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "ge" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "gf" = ( @@ -1637,7 +1673,9 @@ /turf/open/floor/plating, /area/awaymission/centcomAway/general) "gh" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northeast, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 5 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "gi" = ( @@ -1808,7 +1846,9 @@ /turf/open/floor/plasteel/black, /area/awaymission/centcomAway/general) "gM" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "gN" = ( @@ -1868,7 +1908,9 @@ }, /area/awaymission/centcomAway/general) "gX" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "gY" = ( @@ -1973,11 +2015,15 @@ }, /area/awaymission/centcomAway/general) "hq" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/closed/wall/r_wall, /area/awaymission/centcomAway/courtroom) "hr" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/courtroom) "hs" = ( @@ -1985,7 +2031,9 @@ /turf/open/floor/carpet, /area/awaymission/centcomAway/courtroom) "ht" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/courtroom) "hu" = ( @@ -2049,7 +2097,9 @@ /turf/open/floor/plasteel/black, /area/awaymission/centcomAway/courtroom) "hF" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/courtroom) "hG" = ( @@ -2279,7 +2329,9 @@ /turf/closed/wall/r_wall, /area/awaymission/centcomAway/courtroom) "ix" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/closed/wall/r_wall, /area/awaymission/centcomAway/courtroom) "iy" = ( @@ -2309,7 +2361,9 @@ }, /area/awaymission/centcomAway/hangar) "iC" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "iD" = ( @@ -2658,7 +2712,9 @@ }, /area/awaymission/centcomAway/general) "jH" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plasteel{ name = "plating" }, @@ -2670,13 +2726,17 @@ }, /area/awaymission/centcomAway/general) "jJ" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plasteel{ name = "plating" }, /area/awaymission/centcomAway/general) "jK" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /obj/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/centcomAway/general) @@ -2736,7 +2796,9 @@ /turf/open/floor/plasteel, /area/awaymission/centcomAway/general) "jT" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "jU" = ( @@ -2785,7 +2847,9 @@ /turf/open/floor/plating, /area/awaymission/centcomAway/hangar) "kb" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "kc" = ( @@ -2846,12 +2910,16 @@ /turf/open/floor/plating, /area/awaymission/centcomAway/general) "kl" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /obj/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "km" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "kn" = ( @@ -2904,7 +2972,9 @@ }, /area/awaymission/centcomAway/general) "kv" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/southwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 10 + }, /obj/structure/window/reinforced{ dir = 4 }, @@ -3015,7 +3085,9 @@ }, /area/awaymission/centcomAway/general) "kM" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/general) "kN" = ( @@ -3218,7 +3290,9 @@ /turf/open/floor/plasteel/black, /area/awaymission/centcomAway/thunderdome) "lw" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/thunderdome) "lx" = ( @@ -3226,7 +3300,9 @@ /turf/open/floor/plating, /area/awaymission/centcomAway/thunderdome) "ly" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/centcomAway/thunderdome) "lz" = ( diff --git a/_maps/RandomZLevels/challenge.dmm b/_maps/RandomZLevels/challenge.dmm index a50ac00aab..f22805b750 100644 --- a/_maps/RandomZLevels/challenge.dmm +++ b/_maps/RandomZLevels/challenge.dmm @@ -248,11 +248,15 @@ /turf/open/floor/plating/airless, /area/awaymission/challenge/main) "aY" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/west, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, /turf/open/floor/plating/airless, /area/awaymission/challenge/main) "aZ" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/awaymission/challenge/main) "ba" = ( @@ -874,7 +878,9 @@ /turf/open/space, /area/space) "cM" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 9 + }, /turf/open/floor/plating, /area/awaymission/challenge/end) "cN" = ( @@ -882,11 +888,15 @@ /turf/open/floor/plating, /area/awaymission/challenge/end) "cO" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northeast, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 5 + }, /turf/open/floor/plating, /area/awaymission/challenge/end) "cP" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/challenge/end) "cQ" = ( @@ -1044,7 +1054,9 @@ /turf/open/floor/plasteel/black, /area/awaymission/challenge/end) "dl" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/awaymission/challenge/end) "dm" = ( diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 44c5d01da5..4c9a995864 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -1922,11 +1922,7 @@ name = "Syndicate Outpost" }) "cG" = ( -/obj/structure/grille{ - density = 0; - broken = 1; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /obj/item/stack/rods, /obj/item/stack/rods, /obj/item/shard, @@ -4885,11 +4881,7 @@ name = "MO19 Research" }) "gE" = ( -/obj/structure/grille{ - density = 0; - broken = 1; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /obj/item/stack/rods, /obj/item/stack/rods, /obj/item/shard, @@ -5523,11 +5515,7 @@ name = "MO19 Research" }) "hx" = ( -/obj/structure/grille{ - density = 0; - broken = 1; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /obj/item/stack/rods, /obj/item/stack/rods, /obj/item/shard{ @@ -6778,7 +6766,6 @@ "jq" = ( /obj/item/twohanded/required/kirbyplants{ desc = "A plastic potted plant."; - layer = 4.1; pixel_y = 3 }, /turf/open/floor/plasteel{ @@ -7787,11 +7774,7 @@ }) "kP" = ( /obj/item/stack/rods, -/obj/structure/grille{ - density = 0; - broken = 1; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /obj/item/stack/rods, /obj/item/shard{ icon_state = "medium" @@ -7805,11 +7788,7 @@ name = "MO19 Arrivals" }) "kQ" = ( -/obj/structure/grille{ - density = 0; - broken = 1; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /obj/item/stack/rods, /turf/open/floor/plating{ broken = 1; @@ -9320,11 +9299,7 @@ name = "MO19 Arrivals" }) "ns" = ( -/obj/structure/grille{ - density = 0; - broken = 1; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /obj/item/stack/rods, /turf/open/floor/plating{ heat_capacity = 1e+006 @@ -9470,11 +9445,7 @@ poweralm = 0 }) "nD" = ( -/obj/structure/grille{ - density = 0; - broken = 1; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /obj/item/stack/rods, /obj/item/shard, /obj/effect/decal/cleanable/blood/tracks{ @@ -9809,7 +9780,6 @@ "ob" = ( /obj/item/twohanded/required/kirbyplants{ desc = "A plastic potted plant."; - layer = 4.1; pixel_y = 3 }, /turf/open/floor/plasteel/neutral/side{ @@ -9933,11 +9903,7 @@ poweralm = 0 }) "oj" = ( -/obj/structure/grille{ - density = 0; - broken = 1; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /turf/open/floor/mineral/titanium, /area/awaycontent/a3{ always_unpowered = 1; diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index 0841c32e24..9a85544ca9 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -119,7 +119,6 @@ "ax" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-20"; - layer = 4.1; pixel_y = 3 }, /turf/open/floor/plasteel/whiteyellow/corner{ @@ -1317,8 +1316,7 @@ /area/awaymission/research/interior/secure) "dN" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-16"; - layer = 4.1 + icon_state = "plant-16" }, /turf/open/floor/plasteel/darkpurple, /area/awaymission/research/interior/genetics) @@ -2824,8 +2822,7 @@ /area/awaymission/research/interior/genetics) "hV" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel/darkpurple, /area/awaymission/research/interior/genetics) @@ -3306,8 +3303,7 @@ /area/awaymission/research/interior/dorm) "jm" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-14"; - layer = 4.1 + icon_state = "plant-14" }, /turf/open/floor/plasteel/yellowsiding{ dir = 9 @@ -4053,8 +4049,7 @@ /area/awaymission/research/interior/medbay) "ly" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-16"; - layer = 4.1 + icon_state = "plant-16" }, /turf/open/floor/plasteel/yellowsiding{ dir = 10 @@ -4459,9 +4454,7 @@ }, /area/awaymission/research/interior/escapepods) "mJ" = ( -/obj/item/twohanded/required/kirbyplants{ - layer = 4.1 - }, +/obj/item/twohanded/required/kirbyplants, /turf/open/floor/plasteel/whitegreen/side{ dir = 8 }, @@ -4495,8 +4488,7 @@ /area/awaymission/research/interior/escapepods) "mN" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "applebush"; - layer = 4.1 + icon_state = "applebush" }, /turf/open/floor/plasteel/whitegreen/side{ dir = 4 diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index a18c9f18c8..e77a80ec67 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -633,12 +633,7 @@ }, /area/awaymission/snowdin/base) "bC" = ( -/obj/structure/showcase{ - desc = "A strange machine thats supposedly used to help pick up and decrypt wave signals. "; - icon = 'icons/obj/machines/telecomms.dmi'; - icon_state = "processor"; - name = "subsystem signal decrypter" - }, +/obj/structure/showcase/machinery/signal_decrypter, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/snow }, @@ -2498,12 +2493,7 @@ /area/awaymission/snowdin/post) "gL" = ( /obj/machinery/light/small, -/obj/structure/showcase{ - desc = "A strange machine thats supposedly used to help pick up and decrypt wave signals. "; - icon = 'icons/obj/machines/telecomms.dmi'; - icon_state = "processor"; - name = "subsystem signal decrypter" - }, +/obj/structure/showcase/machinery/signal_decrypter, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/snow }, @@ -3909,10 +3899,7 @@ }, /area/awaymission/snowdin) "kA" = ( -/obj/structure/grille{ - density = 0; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/snow; icon = 'icons/turf/snow.dmi'; diff --git a/_maps/RandomZLevels/spacebattle.dmm b/_maps/RandomZLevels/spacebattle.dmm index 1b803966d3..4339d91cfa 100644 --- a/_maps/RandomZLevels/spacebattle.dmm +++ b/_maps/RandomZLevels/spacebattle.dmm @@ -842,7 +842,9 @@ /turf/open/floor/plasteel, /area/awaymission/spacebattle/cruiser) "cY" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/awaymission/spacebattle/cruiser) "cZ" = ( @@ -865,7 +867,9 @@ /turf/open/floor/mineral/plastitanium, /area/awaymission/spacebattle/cruiser) "dd" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /obj/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/spacebattle/cruiser) @@ -1002,7 +1006,9 @@ /turf/open/floor/plating/airless, /area/awaymission/spacebattle/cruiser) "dE" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 9 + }, /turf/open/floor/engine, /area/awaymission/spacebattle/cruiser) "dF" = ( @@ -1010,11 +1016,15 @@ /turf/open/floor/engine, /area/awaymission/spacebattle/cruiser) "dG" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/north, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, /turf/open/floor/engine, /area/awaymission/spacebattle/cruiser) "dH" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northeast, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 5 + }, /turf/open/floor/engine, /area/awaymission/spacebattle/cruiser) "dI" = ( @@ -1109,7 +1119,9 @@ /turf/open/floor/plating/airless, /area/awaymission/spacebattle/cruiser) "dY" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/engine, /area/awaymission/spacebattle/cruiser) "dZ" = ( @@ -1130,7 +1142,9 @@ }, /area/awaymission/spacebattle/cruiser) "eb" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/spacebattle/cruiser) "ec" = ( @@ -1296,7 +1310,9 @@ /turf/open/floor/plasteel/blue, /area/awaymission/spacebattle/cruiser) "eF" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/awaymission/spacebattle/cruiser) "eG" = ( @@ -1345,7 +1361,9 @@ /turf/open/floor/plasteel/blue, /area/awaymission/spacebattle/cruiser) "eQ" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/spacebattle/cruiser) "eR" = ( @@ -2063,7 +2081,9 @@ /turf/open/floor/plating/airless, /area/awaymission/spacebattle/cruiser) "hi" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/plating, /area/awaymission/spacebattle/syndicate7) "hj" = ( @@ -2122,7 +2142,9 @@ /turf/closed/wall/r_wall, /area/awaymission/spacebattle/cruiser) "hu" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, /area/awaymission/spacebattle/syndicate7) "hv" = ( @@ -2912,7 +2934,9 @@ /turf/open/floor/plasteel/white, /area/awaymission/spacebattle/cruiser) "ki" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/engine/vacuum, /area/awaymission/spacebattle/cruiser) "kj" = ( @@ -2941,7 +2965,9 @@ /turf/open/floor/plating, /area/awaymission/spacebattle/cruiser) "ko" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /turf/open/floor/engine/vacuum, /area/awaymission/spacebattle/cruiser) "kp" = ( @@ -2958,7 +2984,9 @@ /turf/open/floor/engine/vacuum, /area/awaymission/spacebattle/cruiser) "kr" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/engine/vacuum, /area/awaymission/spacebattle/cruiser) "ks" = ( @@ -2983,11 +3011,13 @@ /turf/open/floor/engine/vacuum, /area/awaymission/spacebattle/cruiser) "kw" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner/southwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 10 + }, /turf/open/floor/engine/vacuum, /area/awaymission/spacebattle/cruiser) "kx" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/one_side, +/obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/open/floor/engine/vacuum, /area/awaymission/spacebattle/cruiser) "ky" = ( @@ -2995,7 +3025,9 @@ /turf/open/floor/engine/vacuum, /area/awaymission/spacebattle/cruiser) "kz" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/corner, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 6 + }, /turf/open/floor/engine/vacuum, /area/awaymission/spacebattle/cruiser) "kA" = ( diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index a1ddd715b1..bdf5091d25 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -14188,8 +14188,7 @@ /obj/machinery/atmospherics/components/trinary/filter{ dir = 4; filter_type = "n2"; - on = 1; - req_access = null + on = 1 }, /turf/open/floor/plasteel/red/side{ dir = 10; @@ -14238,8 +14237,7 @@ /obj/machinery/atmospherics/components/trinary/filter{ dir = 4; filter_type = "o2"; - on = 1; - req_access = null + on = 1 }, /turf/open/floor/plasteel/blue/side{ dir = 10; @@ -17520,11 +17518,7 @@ poweralm = 0 }) "yN" = ( -/obj/structure/grille{ - density = 0; - broken = 1; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /turf/open/floor/mineral/titanium/blue, /area/awaycontent/a7{ always_unpowered = 1; diff --git a/_maps/RandomZLevels/wildwest.dmm b/_maps/RandomZLevels/wildwest.dmm index 237fa11a45..139f974861 100644 --- a/_maps/RandomZLevels/wildwest.dmm +++ b/_maps/RandomZLevels/wildwest.dmm @@ -447,7 +447,9 @@ /obj/structure/window/reinforced{ icon_state = "fwindow" }, -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/west, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 8 + }, /turf/open/floor/plating/ironsand{ icon_state = "ironsand1" }, @@ -549,7 +551,9 @@ icon_state = "fwindow"; dir = 8 }, -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/north, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, /turf/open/floor/plating/ironsand{ icon_state = "ironsand1" }, @@ -870,7 +874,9 @@ icon_state = "fwindow"; dir = 4 }, -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/north, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, /turf/open/floor/plating/ironsand{ icon_state = "ironsand1" }, @@ -1696,7 +1702,7 @@ icon_state = "fwindow"; dir = 4 }, -/obj/effect/spawner/structure/window/hollow/reinforced/one_side, +/obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/open/floor/plasteel, /area/awaymission/wwrefine) "fB" = ( @@ -2141,7 +2147,9 @@ /turf/open/floor/mineral/titanium/yellow, /area/awaymission/wwrefine) "gX" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /obj/structure/window/reinforced{ icon_state = "fwindow" }, diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 90dbdd9a27..656507316d 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -2422,8 +2422,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_y = 32 }, /turf/open/floor/mineral/titanium/blue, @@ -3244,9 +3242,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /obj/item/reagent_containers/blood/empty, /turf/open/floor/plasteel/whitered/side{ dir = 5 @@ -8057,8 +8053,6 @@ /area/lawoffice) "asa" = ( /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = 32 }, /turf/open/floor/plasteel/red/corner{ @@ -13340,6 +13334,7 @@ id = "chapelgun"; name = "Chapel Launcher Door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/chapel/main) "aEo" = ( @@ -14799,8 +14794,6 @@ /area/shuttle/arrival) "aHu" = ( /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = 32 }, /turf/open/floor/plasteel/white/corner{ @@ -17310,8 +17303,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = 32 }, /turf/open/floor/plasteel/bar, @@ -18091,10 +18082,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "aPE" = ( -/obj/machinery/status_display{ - density = 0; - layer = 4 - }, +/obj/machinery/status_display, /turf/closed/wall, /area/crew_quarters/locker) "aPF" = ( @@ -18206,10 +18194,7 @@ d2 = 8; icon_state = "0-8" }, -/obj/machinery/status_display{ - density = 0; - layer = 4 - }, +/obj/machinery/status_display, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ id = "bridge blast"; @@ -18248,10 +18233,7 @@ icon_state = "0-4"; d2 = 4 }, -/obj/machinery/status_display{ - density = 0; - layer = 4 - }, +/obj/machinery/status_display, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ id = "bridge blast"; @@ -19445,8 +19427,6 @@ "aTr" = ( /obj/machinery/door/firedoor, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = 32 }, /turf/open/floor/plasteel, @@ -23450,8 +23430,6 @@ }, /obj/structure/disposalpipe/segment, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = -32 }, /turf/open/floor/plasteel/blue/corner{ @@ -24399,10 +24377,7 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload) "bfw" = ( -/obj/machinery/status_display{ - density = 0; - layer = 4 - }, +/obj/machinery/status_display, /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload) "bfx" = ( @@ -26461,8 +26436,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = 32 }, /obj/machinery/aug_manipulator, @@ -26546,7 +26519,6 @@ /area/quartermaster/office) "bkx" = ( /obj/machinery/status_display{ - density = 0; pixel_y = 2; supply_display = 1 }, @@ -27431,8 +27403,6 @@ }, /obj/machinery/door/firedoor, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = -32 }, /turf/open/floor/plasteel/brown/corner{ @@ -27933,6 +27903,7 @@ id = "trash"; name = "disposal bay door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/maintenance/disposal) "bnw" = ( @@ -30353,8 +30324,6 @@ /area/medical/medbay/central) "bsz" = ( /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = -32 }, /turf/open/floor/plasteel/white/side{ @@ -31908,7 +31877,6 @@ }, /obj/machinery/light, /obj/machinery/status_display{ - density = 0; pixel_y = -30; supply_display = 1 }, @@ -34176,7 +34144,6 @@ pixel_y = -35 }, /obj/machinery/status_display{ - density = 0; pixel_x = -32; supply_display = 1 }, @@ -37437,8 +37404,6 @@ "bIe" = ( /obj/structure/disposalpipe/segment, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = -32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -39079,6 +39044,7 @@ id = "toxinsdriver"; name = "toxins launcher bay door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/science/mixing) "bLm" = ( @@ -40580,7 +40546,6 @@ "bOP" = ( /obj/structure/table/glass, /obj/structure/reagent_dispensers/virusfood{ - density = 0; pixel_x = -30 }, /obj/item/book/manual/wiki/infections{ @@ -41444,8 +41409,7 @@ /area/science/misc_lab) "bQV" = ( /obj/machinery/atmospherics/components/trinary/filter{ - dir = 4; - req_access = null + dir = 4 }, /turf/open/floor/engine, /area/science/misc_lab) @@ -52694,8 +52658,6 @@ dir = 8 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_y = 32 }, /turf/open/floor/mineral/titanium/blue, @@ -54591,13 +54553,8 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/atmos) "cup" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 8; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2 }, @@ -54622,13 +54579,8 @@ }, /area/ai_monitored/turret_protected/aisat/atmos) "cur" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 4; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2 }, @@ -54637,13 +54589,8 @@ }, /area/ai_monitored/turret_protected/aisat_interior) "cus" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 8; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2 }, @@ -54680,13 +54627,8 @@ /turf/open/floor/plasteel/black, /area/ai_monitored/turret_protected/aisat_interior) "cuv" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 4; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2 }, @@ -56052,8 +55994,6 @@ dir = 8 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_y = 32 }, /turf/open/floor/mineral/titanium/blue, @@ -56982,8 +56922,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_y = 32 }, /turf/open/floor/mineral/titanium/blue, @@ -57581,13 +57519,8 @@ d2 = 2; icon_state = "1-2" }, -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 8; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2 }, @@ -57597,13 +57530,8 @@ /turf/open/floor/plasteel/black, /area/ai_monitored/turret_protected/ai) "cAW" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 4; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2 }, @@ -83901,7 +83829,7 @@ bHE bYu bZk bCq -cTG +cTF bCq bCq bCq @@ -85197,7 +85125,7 @@ bCq bCq bCq bCq -cTH +cTF bCq bLv bLv diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index b5a0bf5dd4..5809176275 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -186,8 +186,6 @@ dir = 1 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = 32 }, /obj/machinery/computer/shuttle/pod{ @@ -208,8 +206,6 @@ dir = 1 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = 32 }, /obj/machinery/computer/shuttle/pod{ @@ -3514,6 +3510,8 @@ "ahP" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -5120,7 +5118,7 @@ /area/maintenance/starboard/fore) "alA" = ( /obj/structure/table/wood, -/obj/item/toy/carpplushie, +/obj/item/toy/plush/carpplushie, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plasteel/vault{ dir = 8 @@ -6351,6 +6349,8 @@ req_access_txt = "12" }, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -9542,7 +9542,6 @@ /area/quartermaster/storage) "aut" = ( /obj/machinery/status_display{ - density = 0; name = "cargo display"; supply_display = 1 }, @@ -18930,7 +18929,6 @@ /area/quartermaster/storage) "aNe" = ( /obj/machinery/status_display{ - density = 0; name = "cargo display"; supply_display = 1 }, @@ -19935,12 +19933,9 @@ }, /area/security/prison) "aOV" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "permacell3"; - name = "Cell Shutters"; - opacity = 0 + name = "Cell Shutters" }, /obj/machinery/door/airlock/glass{ id_tag = "permabolt3"; @@ -19956,12 +19951,9 @@ /turf/open/floor/plasteel, /area/security/prison) "aOW" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "permacell2"; - name = "Cell Shutters"; - opacity = 0 + name = "Cell Shutters" }, /obj/machinery/door/airlock/glass{ id_tag = "permabolt2"; @@ -19981,12 +19973,9 @@ /turf/open/floor/plasteel, /area/security/prison) "aOX" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "permacell1"; - name = "Cell Shutters"; - opacity = 0 + name = "Cell Shutters" }, /obj/machinery/door/airlock/glass{ id_tag = "permabolt1"; @@ -24309,8 +24298,7 @@ /area/quartermaster/office) "aWW" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-18"; - layer = 4.1 + icon_state = "plant-18" }, /turf/open/floor/plasteel/brown, /area/quartermaster/office) @@ -24726,8 +24714,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_y = 32 }, /obj/machinery/computer/shuttle/pod{ @@ -24804,8 +24790,7 @@ icon_state = "pipe-c" }, /obj/structure/fireaxecabinet{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /turf/open/floor/plasteel/caution{ dir = 8 @@ -30338,8 +30323,8 @@ /obj/item/stack/sheet/metal{ amount = 50 }, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /obj/machinery/newscaster{ pixel_y = -32 }, @@ -46594,8 +46579,7 @@ /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bMJ" = ( -/obj/structure/sign/goldenplaque{ - name = "The Most Robust Captain Award for Robustness"; +/obj/structure/sign/goldenplaque/captain{ pixel_x = 32 }, /turf/open/floor/wood, @@ -46749,9 +46733,6 @@ /turf/open/floor/carpet, /area/security/detectives_office) "bMX" = ( -/obj/machinery/computer/security/wooden_tv{ - density = 0 - }, /obj/structure/table/wood, /obj/machinery/button/door{ id = "detectivewindows"; @@ -46765,15 +46746,16 @@ pixel_y = -26 }, /obj/structure/disposalpipe/segment, +/obj/item/device/flashlight/lamp, +/obj/item/reagent_containers/food/drinks/flask/det, /turf/open/floor/carpet, /area/security/detectives_office) "bMY" = ( /obj/structure/table/wood, -/obj/item/device/flashlight/lamp, /obj/item/storage/secure/safe{ pixel_x = 32 }, -/obj/item/reagent_containers/food/drinks/flask/det, +/obj/machinery/computer/security/wooden_tv, /turf/open/floor/carpet, /area/security/detectives_office) "bMZ" = ( @@ -47907,13 +47889,8 @@ }, /area/aisat) "bPb" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 4; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2 }, @@ -47968,13 +47945,8 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) "bPg" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 4; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2 }, @@ -48018,13 +47990,8 @@ /turf/open/floor/plasteel/grimy, /area/ai_monitored/turret_protected/aisat_interior) "bPm" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 8; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2 }, @@ -48078,13 +48045,8 @@ /turf/open/floor/plasteel/vault, /area/ai_monitored/turret_protected/aisat_interior) "bPr" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 8; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2 }, @@ -50681,13 +50643,8 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/aisat_interior) "bTA" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 4; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2 }, @@ -50737,13 +50694,8 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/aisat_interior) "bTF" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 4; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2 }, @@ -50792,13 +50744,8 @@ /turf/open/floor/plasteel/grimy, /area/ai_monitored/turret_protected/aisat_interior) "bTL" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 8; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2 }, @@ -54955,9 +54902,7 @@ dir = 8 }, /obj/item/twohanded/required/kirbyplants/random, -/obj/structure/sign/kiddieplaque{ - desc = "A long list of rules to be followed when in the library, extolling the virtues of being quiet at all times and threatening those who would dare eat hot food inside."; - name = "Library Rules Sign"; +/obj/structure/sign/kiddieplaque/library{ pixel_x = -32 }, /turf/open/floor/wood, @@ -54995,9 +54940,7 @@ }, /area/library) "cbD" = ( -/obj/structure/sign/kiddieplaque{ - desc = "A long list of rules to be followed when in the library, extolling the virtues of being quiet at all times and threatening those who would dare eat hot food inside."; - name = "Library Rules Sign"; +/obj/structure/sign/kiddieplaque/library{ pixel_x = -32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -58758,9 +58701,7 @@ icon_state = "1-2" }, /obj/structure/table/reinforced, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-07"; - name = "Photosynthetic Potted plant"; +/obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 }, /turf/open/floor/plasteel/vault{ @@ -64260,8 +64201,6 @@ dir = 1 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/effect/decal/cleanable/dirt, @@ -64745,9 +64684,7 @@ dir = 8 }, /obj/machinery/disposal/bin, -/obj/structure/sign/kiddieplaque{ - desc = "A long list of rules to be followed when in the library, extolling the virtues of being quiet at all times and threatening those who would dare eat hot food inside."; - name = "Library Rules Sign"; +/obj/structure/sign/kiddieplaque/library{ pixel_x = -32 }, /obj/structure/disposalpipe/trunk{ @@ -65551,12 +65488,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/showcase{ - desc = "A stand with an empty old Nanotrasen Corporation combat mech bolted to it. It is described as the premier unit used to defend corporate interests and employees."; - icon = 'icons/mecha/mecha.dmi'; - icon_state = "marauder"; - name = "combat mech exhibit" - }, +/obj/structure/showcase/mecha/marauder, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/grimy, /area/bridge/showroom/corporate) @@ -65623,12 +65555,8 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/structure/showcase{ - desc = "A flimsy model of a standard Nanotrasen automated loyalty implant machine. With secure positioning harnesses and a robotic surgical injector, brain damage and other serious medical anomalies are now up to 60% less likely!"; - icon = 'icons/obj/machines/implantchair.dmi'; - icon_state = "implantchair"; +/obj/structure/showcase/machinery/implanter{ layer = 2.7; - name = "Nanotrasen automated loyalty implanter exhibit"; pixel_y = 4 }, /turf/open/floor/plasteel/grimy, @@ -67328,7 +67256,7 @@ pixel_x = -26 }, /obj/structure/table/reinforced, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /turf/open/floor/plasteel/vault{ dir = 8 }, @@ -68491,8 +68419,7 @@ /area/crew_quarters/locker) "cCc" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-18"; - layer = 4.1 + icon_state = "plant-18" }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -70025,6 +69952,8 @@ /area/maintenance/port) "cEW" = ( /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -71405,9 +71334,7 @@ "cHm" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/blue/corner{ dir = 4 }, @@ -78510,9 +78437,7 @@ }, /area/medical/chemistry) "cVO" = ( -/obj/machinery/chem_master{ - density = 0 - }, +/obj/machinery/chem_master, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -78904,6 +78829,8 @@ dir = 8 }, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /turf/open/floor/plating, @@ -79637,9 +79564,7 @@ /area/medical/abandoned) "cYb" = ( /obj/structure/bed/roller, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/medical/abandoned) @@ -79660,9 +79585,7 @@ /area/medical/abandoned) "cYd" = ( /obj/structure/bed/roller, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/whiteblue/corner{ dir = 4 @@ -81004,6 +80927,8 @@ /area/maintenance/port) "daZ" = ( /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -81027,6 +80952,8 @@ "dbb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -81048,6 +80975,8 @@ "dbd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -81611,9 +81540,7 @@ /turf/open/floor/plating, /area/medical/abandoned) "dcm" = ( -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/medical/abandoned) @@ -83187,7 +83114,9 @@ d2 = 2; icon_state = "0-2" }, -/obj/effect/spawner/structure/window/hollow/reinforced/end/north, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, /obj/structure/cable/white{ d2 = 4; icon_state = "0-4" @@ -83216,7 +83145,9 @@ d2 = 4; icon_state = "0-4" }, -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 9 + }, /obj/structure/cable/white{ d1 = 4; d2 = 8; @@ -83233,7 +83164,9 @@ d2 = 8; icon_state = "0-8" }, -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/north, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) "dfJ" = ( @@ -83246,7 +83179,9 @@ icon_state = "0-8" }, /obj/structure/cable/white, -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northeast, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 5 + }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) "dfK" = ( @@ -83369,9 +83304,7 @@ /area/science/explab) "dfZ" = ( /obj/machinery/atmospherics/components/trinary/filter{ - density = 0; - dir = 8; - req_access = "0" + dir = 8 }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 1 @@ -83758,7 +83691,9 @@ d2 = 2; icon_state = "0-2" }, -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/west, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 8 + }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) "dgT" = ( @@ -83779,7 +83714,9 @@ d2 = 2; icon_state = "0-2" }, -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/east, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 4 + }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) "dgW" = ( @@ -86356,7 +86293,9 @@ d2 = 2; icon_state = "0-2" }, -/obj/effect/spawner/structure/window/hollow/reinforced/corner, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 6 + }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) "dma" = ( @@ -87555,7 +87494,9 @@ d2 = 4; icon_state = "0-4" }, -/obj/effect/spawner/structure/window/hollow/reinforced/corner/southwest, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 10 + }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) "doH" = ( @@ -87567,7 +87508,7 @@ d2 = 8; icon_state = "0-8" }, -/obj/effect/spawner/structure/window/hollow/reinforced/one_side, +/obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) "doI" = ( @@ -87576,7 +87517,9 @@ d2 = 8; icon_state = "0-8" }, -/obj/effect/spawner/structure/window/hollow/reinforced/end/east, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) "doJ" = ( @@ -94047,9 +93990,7 @@ /area/science/mixing) "dBf" = ( /obj/machinery/atmospherics/components/trinary/filter{ - density = 0; - dir = 8; - req_access = "0" + dir = 8 }, /turf/open/floor/plasteel/neutral/side{ dir = 1 @@ -98141,6 +98082,7 @@ /area/security/checkpoint/customs) "dJd" = ( /obj/structure/cable/white{ + d2 = 2; icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, @@ -98725,6 +98667,7 @@ /area/medical/virology) "dKq" = ( /obj/structure/cable/white{ + d2 = 2; icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, @@ -98807,9 +98750,7 @@ /area/maintenance/port/aft) "dKD" = ( /obj/machinery/atmospherics/components/trinary/filter{ - density = 0; - dir = 8; - req_access = "0" + dir = 8 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/neutral, @@ -100724,10 +100665,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/structure/sign/atmosplaque{ - desc = "A plaque commemorating the fallen, may they rest in peace, forever asleep amongst the stars. Someone has drawn a picture of a crying badger at the bottom."; - icon_state = "kiddieplaque"; - name = "Remembrance Plaque"; +/obj/structure/sign/kiddieplaque/badger{ pixel_y = 32 }, /turf/open/floor/plasteel/vault{ @@ -105600,10 +105538,7 @@ /area/shuttle/escape) "dYc" = ( /obj/structure/lattice, -/obj/structure/grille{ - density = 0; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /turf/open/space, /area/space) "dYd" = ( @@ -105932,6 +105867,7 @@ /area/security/checkpoint/checkpoint2) "dYE" = ( /obj/structure/cable/white{ + d2 = 2; icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, @@ -108434,8 +108370,8 @@ amount = 50 }, /obj/item/crowbar, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /obj/effect/turf_decal/bot, /obj/structure/sign/poster/official/report_crimes{ pixel_y = 32 @@ -109672,24 +109608,32 @@ /area/hallway/primary/aft) "eiL" = ( /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel/neutral, /area/hallway/primary/aft) "eiM" = ( /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel/neutral, /area/hallway/primary/aft) "eiN" = ( /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel/neutral, /area/hallway/primary/aft) "eiO" = ( /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel/neutral, @@ -109795,6 +109739,8 @@ /area/crew_quarters/dorms) "ejb" = ( /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, @@ -109818,6 +109764,8 @@ /area/crew_quarters/dorms) "ejd" = ( /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -136748,7 +136696,7 @@ aae aae aae aaf -dYc +aBW aae aae aaa @@ -136999,7 +136947,7 @@ aaa aaa aae aaf -dYc +aBW aae aae aaa @@ -137525,7 +137473,7 @@ dZB eab ear aaa -dYc +aBW aaa aaa aaa @@ -139581,7 +139529,7 @@ dZB eaf ear aaa -dYc +aBW aae aae aae @@ -140595,7 +140543,7 @@ dVy dUl aaf aaf -dYc +aBW aaa dZB eag @@ -140609,7 +140557,7 @@ dZB eag ear aaa -dYc +aBW aaa aaa aaa @@ -141112,14 +141060,14 @@ aaf aae aae aae -dYc +aBW aae aaa aaa aaf aaa aaa -dYc +aBW aae aae aaf @@ -141376,7 +141324,7 @@ aae aaf aae aae -dYc +aBW aaa aaa aaa diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index fec17f558a..67107bf501 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -216,8 +216,7 @@ icon_state = "1-2" }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-03"; - layer = 4.1 + icon_state = "plant-03" }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) @@ -237,9 +236,7 @@ d2 = 2; icon_state = "1-2" }, -/obj/item/twohanded/required/kirbyplants{ - layer = 4.1 - }, +/obj/item/twohanded/required/kirbyplants, /turf/open/floor/plasteel/floorgrime, /area/security/prison) "aaE" = ( @@ -583,8 +580,6 @@ /area/security/prison) "abr" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/barber{ @@ -1488,12 +1483,9 @@ /turf/closed/wall/r_wall, /area/security/prison) "adb" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "permacell3"; - name = "Cell Shutters"; - opacity = 0 + name = "Cell Shutters" }, /obj/machinery/door/airlock/glass{ id_tag = "permabolt3"; @@ -1506,12 +1498,9 @@ /turf/closed/wall, /area/security/prison) "add" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "permacell2"; - name = "Cell Shutters"; - opacity = 0 + name = "Cell Shutters" }, /obj/machinery/door/airlock/glass{ id_tag = "permabolt2"; @@ -1526,12 +1515,9 @@ /turf/open/floor/plasteel/floorgrime, /area/security/prison) "ade" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "permacell1"; - name = "Cell Shutters"; - opacity = 0 + name = "Cell Shutters" }, /obj/machinery/door/airlock/glass{ id_tag = "permabolt1"; @@ -1787,8 +1773,6 @@ dir = 1 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = 32 }, /obj/machinery/computer/shuttle/pod{ @@ -1953,13 +1937,9 @@ "adX" = ( /obj/structure/bed/roller, /obj/structure/bed/roller, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/whitered/side{ dir = 2 }, @@ -2667,8 +2647,7 @@ dir = 9 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-16"; - layer = 4.1 + icon_state = "plant-16" }, /obj/structure/sign/securearea{ desc = "A warning sign which reads 'WARNING: Criminally Insane Inmates', describing the possible hazards of those contained within."; @@ -2744,8 +2723,6 @@ /area/crew_quarters/heads/hos) "afj" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_x = -32; pixel_y = 32 }, @@ -2777,8 +2754,6 @@ /area/crew_quarters/heads/hos) "afn" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_x = 32; pixel_y = 32 }, @@ -2922,8 +2897,7 @@ /area/maintenance/solars/port/fore) "afF" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "applebush"; - layer = 4.1 + icon_state = "applebush" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -3614,6 +3588,7 @@ pixel_y = 3 }, /obj/item/gun/ballistic/shotgun/riot, +/obj/item/gun/ballistic/shotgun/riot, /turf/open/floor/plasteel/vault{ dir = 1 }, @@ -3847,35 +3822,26 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "Prison Gate"; - name = "Security Blast Door"; - opacity = 0 + name = "Security Blast Door" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/security/brig) "ahz" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "Prison Gate"; - name = "Security Blast Door"; - opacity = 0 + name = "Security Blast Door" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/security/brig) "ahA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "Prison Gate"; - name = "Security Blast Door"; - opacity = 0 + name = "Security Blast Door" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -4216,6 +4182,7 @@ id = "trash"; name = "disposal bay door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/maintenance/disposal) "aig" = ( @@ -7359,9 +7326,7 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/whitered/side, /area/security/brig) "aoq" = ( @@ -8054,9 +8019,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/sign/kiddieplaque{ - desc = "A long list of rules to be followed when in the library, extolling the virtues of being quiet at all times and threatening those who would dare eat hot food inside."; - name = "Library Rules Sign"; +/obj/structure/sign/kiddieplaque/library{ pixel_y = -32 }, /turf/open/floor/plasteel/neutral/corner{ @@ -13187,7 +13150,6 @@ "azl" = ( /obj/structure/closet/emcloset, /obj/machinery/status_display{ - density = 0; pixel_y = 32; supply_display = 1 }, @@ -13580,11 +13542,6 @@ /turf/open/floor/carpet, /area/security/detectives_office) "azU" = ( -/obj/machinery/computer/security/wooden_tv{ - density = 0; - pixel_x = 3; - pixel_y = 2 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, @@ -13595,6 +13552,11 @@ network = list("Prison"); pixel_y = 30 }, +/obj/item/device/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/restraints/handcuffs, /turf/open/floor/carpet, /area/security/detectives_office) "azV" = ( @@ -13602,17 +13564,16 @@ /obj/item/storage/secure/safe{ pixel_x = 32 }, -/obj/item/device/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/restraints/handcuffs, /obj/machinery/button/door{ id = "detective_shutters"; name = "detective's office shutters control"; pixel_y = 26; req_access_txt = "4" }, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 3; + pixel_y = 2 + }, /turf/open/floor/carpet, /area/security/detectives_office) "azW" = ( @@ -14518,7 +14479,6 @@ /obj/effect/decal/cleanable/cobweb, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-20"; - layer = 4.1; pixel_y = 3 }, /obj/effect/turf_decal/bot{ @@ -15474,8 +15434,6 @@ dir = 1 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/red/corner{ @@ -17432,8 +17390,8 @@ amount = 50 }, /obj/item/crowbar, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /obj/effect/turf_decal/bot{ dir = 1 }, @@ -18051,7 +18009,6 @@ pixel_y = 23 }, /obj/machinery/status_display{ - density = 0; pixel_y = 32; supply_display = 1 }, @@ -18550,8 +18507,6 @@ name = "Judge" }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/light{ @@ -18642,8 +18597,7 @@ pixel_y = 24 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/wood, /area/lawoffice) @@ -19662,9 +19616,7 @@ c_tag = "AI Upload Chamber - Fore"; network = list("SS13","RD","AIUpload") }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-07"; - name = "Photosynthetic Potted plant"; +/obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 }, /turf/open/floor/plasteel/black, @@ -19811,8 +19763,6 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/portable_atmospherics/scrubber, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 30 }, /obj/effect/turf_decal/delivery, @@ -21847,8 +21797,6 @@ icon_state = "0-4" }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/camera{ @@ -21917,8 +21865,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_y = 32 }, /obj/machinery/computer/shuttle/pod{ @@ -22042,7 +21988,6 @@ /obj/item/clipboard, /obj/item/stamp/qm, /obj/machinery/status_display{ - density = 0; pixel_x = 32; supply_display = 1 }, @@ -22174,8 +22119,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_x = 32 }, /obj/machinery/flasher{ @@ -22240,8 +22183,7 @@ pixel_x = -27 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-03"; - layer = 4.1 + icon_state = "plant-03" }, /turf/open/floor/plasteel/neutral/corner{ dir = 1 @@ -23358,7 +23300,6 @@ dir = 8 }, /obj/machinery/status_display{ - density = 0; pixel_x = 32; supply_display = 1 }, @@ -23496,6 +23437,7 @@ /turf/open/floor/plating, /area/storage/primary) "aTi" = ( +/obj/machinery/door/firedoor, /obj/machinery/door/airlock/highsecurity{ locked = 0; name = "AI Upload"; @@ -24564,21 +24506,14 @@ /area/ai_monitored/turret_protected/ai) "aVm" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/black, /area/ai_monitored/turret_protected/ai) "aVn" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 2; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_y = 20 }, /turf/open/floor/plasteel/black, @@ -24589,13 +24524,8 @@ dir = 2; network = list("RD") }, -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 2; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_y = 20 }, /obj/structure/cable{ @@ -24608,8 +24538,6 @@ /area/ai_monitored/turret_protected/ai) "aVq" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, @@ -24627,8 +24555,7 @@ /area/hallway/secondary/entry) "aVt" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-13"; - layer = 4.1 + icon_state = "plant-13" }, /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -24678,8 +24605,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/effect/turf_decal/stripes/line{ @@ -24783,7 +24708,6 @@ /area/hallway/secondary/entry) "aVG" = ( /obj/machinery/status_display{ - density = 0; supply_display = 1 }, /turf/closed/wall, @@ -24934,6 +24858,7 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload_foyer) "aVY" = ( +/obj/machinery/door/firedoor, /obj/machinery/door/airlock/highsecurity{ name = "Secure Network Access"; req_access_txt = "19" @@ -24954,8 +24879,7 @@ pixel_y = 23 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "applebush"; - layer = 4.1 + icon_state = "applebush" }, /turf/open/floor/plasteel/neutral/side{ dir = 9 @@ -24976,8 +24900,6 @@ dir = 1 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/neutral/side{ @@ -25047,8 +24969,7 @@ pixel_x = 27 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-16"; - layer = 4.1 + icon_state = "plant-16" }, /obj/item/device/radio/intercom{ freerange = 0; @@ -25169,8 +25090,6 @@ pixel_y = 25 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/structure/extinguisher_cabinet{ @@ -26249,13 +26168,8 @@ dir = 4; network = list("RD") }, -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 4; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2 }, @@ -26281,13 +26195,8 @@ /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) "aYB" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 8; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2 }, @@ -26313,8 +26222,7 @@ /area/hallway/secondary/entry) "aYF" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-05"; - layer = 4.1 + icon_state = "plant-05" }, /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -27457,7 +27365,6 @@ "baA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/machinery/status_display{ - density = 0; pixel_y = 32; supply_display = 1 }, @@ -28117,13 +28024,8 @@ }, /area/security/checkpoint/engineering) "bbF" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 4; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2 }, @@ -28152,13 +28054,8 @@ dir = 8; network = list("RD") }, -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 8; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2 }, @@ -28256,7 +28153,6 @@ "bbS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/machinery/status_display{ - density = 0; pixel_y = 32; supply_display = 1 }, @@ -28335,8 +28231,6 @@ pixel_x = -29 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_x = -32 }, /turf/open/floor/plasteel/neutral/corner{ @@ -29091,8 +28985,6 @@ /area/crew_quarters/heads/captain/private) "bdI" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -30282,12 +30174,9 @@ /turf/open/floor/plasteel/black, /area/aisat) "bfT" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "Engineering"; - name = "Engineering Security Doors"; - opacity = 0 + name = "Engineering Security Doors" }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -30681,7 +30570,6 @@ /area/quartermaster/sorting) "bgL" = ( /obj/machinery/status_display{ - density = 0; pixel_y = 32; supply_display = 1 }, @@ -30994,8 +30882,6 @@ /area/bridge) "bhk" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/item/folder/yellow{ @@ -31613,8 +31499,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = -32 }, /turf/open/floor/plasteel/black, @@ -33342,8 +33226,6 @@ "blC" = ( /obj/machinery/teleport/station, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/vault{ @@ -33363,13 +33245,8 @@ /turf/open/floor/plasteel/black, /area/ai_monitored/turret_protected/ai) "blF" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 2; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_y = 20 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -33384,13 +33261,8 @@ /turf/open/floor/plasteel/black, /area/ai_monitored/turret_protected/aisat_interior) "blH" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 2; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_y = 20 }, /turf/open/floor/plasteel/darkblue/corner{ @@ -33437,8 +33309,6 @@ "blK" = ( /obj/machinery/recharge_station, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/structure/cable/yellow{ @@ -34000,8 +33870,6 @@ "bmJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_x = -32 }, /obj/structure/disposalpipe/segment, @@ -34372,13 +34240,8 @@ dir = 1; pixel_y = 1 }, -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 8; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2 }, @@ -34394,13 +34257,8 @@ /turf/closed/wall/r_wall, /area/aisat) "bnw" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 4; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2 }, @@ -34565,13 +34423,8 @@ /turf/open/floor/plasteel/black, /area/ai_monitored/storage/satellite) "bnI" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 8; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2 }, @@ -35015,8 +34868,6 @@ pixel_y = 5 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/wood, @@ -35339,12 +35190,9 @@ /turf/open/floor/plasteel, /area/engine/break_room) "bpm" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "transittube"; - name = "Transit Tube Blast Door"; - opacity = 0 + name = "Transit Tube Blast Door" }, /obj/structure/cable{ d1 = 4; @@ -36157,8 +36005,6 @@ /area/crew_quarters/heads/hop) "bqF" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/darkblue/corner{ @@ -36417,6 +36263,7 @@ d2 = 4; icon_state = "0-4" }, +/obj/item/paper_bin, /obj/item/stack/cable_coil/random, /obj/item/stack/cable_coil/random, /obj/item/stack/cable_coil/random, @@ -36437,6 +36284,7 @@ /area/storage/art) "brf" = ( /obj/structure/table, +/obj/item/paper_bin/construction, /obj/item/airlock_painter, /obj/machinery/airalarm{ dir = 8; @@ -36941,13 +36789,8 @@ /area/aisat) "brU" = ( /obj/structure/window/reinforced, -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 8; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2 }, @@ -37066,8 +36909,6 @@ /area/ai_monitored/turret_protected/aisat_interior) "bse" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/porta_turret/ai{ @@ -37338,8 +37179,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = -32 }, /turf/open/floor/plasteel/neutral/corner{ @@ -37456,8 +37295,6 @@ /area/crew_quarters/heads/hop) "bsP" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/structure/bed/dogbed/ian, @@ -38002,8 +37839,7 @@ /area/hallway/secondary/entry) "btR" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-18"; - layer = 4.1 + icon_state = "plant-18" }, /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -38032,8 +37868,7 @@ /area/hallway/secondary/entry) "btU" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-08"; - layer = 4.1 + icon_state = "plant-08" }, /turf/open/floor/plasteel/grimy, /area/hallway/primary/port) @@ -38045,8 +37880,7 @@ /area/hallway/primary/port) "btW" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-03"; - layer = 4.1 + icon_state = "plant-03" }, /turf/open/floor/plasteel/grimy, /area/hallway/primary/port) @@ -38663,23 +38497,17 @@ /turf/open/floor/plating, /area/engine/break_room) "bvj" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmos Blast Door"; - opacity = 0 + name = "Atmos Blast Door" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/break_room) "bvk" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmos Blast Door"; - opacity = 0 + name = "Atmos Blast Door" }, /obj/structure/cable/yellow{ d1 = 1; @@ -38693,12 +38521,9 @@ /turf/open/floor/plasteel, /area/engine/break_room) "bvl" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmos Blast Door"; - opacity = 0 + name = "Atmos Blast Door" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -38800,13 +38625,8 @@ /area/engine/break_room) "bvw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 2; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_y = 20 }, /turf/open/floor/plasteel/grimy, @@ -38824,13 +38644,8 @@ /obj/machinery/light_switch{ pixel_y = 28 }, -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 2; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_y = 20 }, /turf/open/floor/plasteel/grimy, @@ -38866,8 +38681,7 @@ /area/tcommsat/computer) "bvB" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-20"; - layer = 4.1 + icon_state = "plant-20" }, /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -39276,8 +39090,6 @@ "bwu" = ( /obj/machinery/holopad, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/light{ @@ -39820,8 +39632,6 @@ network = list("SS13") }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = -32 }, /obj/effect/turf_decal/stripes/line, @@ -39974,8 +39784,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = -32 }, /turf/open/floor/plasteel/neutral/side, @@ -40195,13 +40003,10 @@ name = "Reception Window"; req_access_txt = "0" }, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "hop"; layer = 3.1; - name = "privacy shutters"; - opacity = 0 + name = "privacy shutters" }, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) @@ -40468,12 +40273,9 @@ /turf/open/floor/carpet, /area/crew_quarters/theatre) "byK" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "Engineering"; - name = "Engineering Security Doors"; - opacity = 0 + name = "Engineering Security Doors" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -40567,8 +40369,6 @@ /area/engine/atmos) "byS" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/light{ @@ -41067,8 +40867,6 @@ /area/hallway/secondary/command) "bzN" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/effect/turf_decal/bot, @@ -41409,12 +41207,9 @@ /area/hallway/primary/starboard) "bAA" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmos Blast Door"; - opacity = 0 + name = "Atmos Blast Door" }, /obj/structure/cable/yellow{ d2 = 2; @@ -41476,8 +41271,8 @@ /obj/item/stack/sheet/metal{ amount = 50 }, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /turf/open/floor/plasteel/caution{ dir = 8 }, @@ -41592,8 +41387,6 @@ /obj/structure/table/wood, /obj/item/folder/blue, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 31 }, /obj/item/folder/blue, @@ -41937,13 +41730,10 @@ /area/hallway/primary/port) "bBH" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "council blast"; layer = 2.9; - name = "Council Blast Doors"; - opacity = 0 + name = "Council Blast Doors" }, /obj/structure/cable/yellow{ d2 = 4; @@ -41953,13 +41743,10 @@ /area/bridge) "bBI" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "council blast"; layer = 2.9; - name = "Council Blast Doors"; - opacity = 0 + name = "Council Blast Doors" }, /obj/structure/cable/yellow{ d2 = 4; @@ -41973,13 +41760,10 @@ /area/bridge) "bBJ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "council blast"; layer = 2.9; - name = "Council Blast Doors"; - opacity = 0 + name = "Council Blast Doors" }, /obj/structure/cable/yellow{ d2 = 2; @@ -41997,13 +41781,10 @@ /area/bridge) "bBK" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "council blast"; layer = 2.9; - name = "Council Blast Doors"; - opacity = 0 + name = "Council Blast Doors" }, /obj/structure/cable/yellow{ d2 = 8; @@ -42017,13 +41798,10 @@ /area/bridge) "bBL" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "council blast"; layer = 2.9; - name = "Council Blast Doors"; - opacity = 0 + name = "Council Blast Doors" }, /obj/structure/cable/yellow{ d2 = 8; @@ -42205,8 +41983,7 @@ density = 0; icon_state = "pdoor0"; id = "atmos"; - name = "Atmos Blast Door"; - opacity = 0 + name = "Atmos Blast Door" }, /obj/machinery/door/window/northleft{ dir = 4; @@ -42218,12 +41995,9 @@ /obj/item/folder/yellow, /obj/item/pen, /obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmos Blast Door"; - opacity = 0 + name = "Atmos Blast Door" }, /obj/effect/turf_decal/delivery, /obj/structure/cable/yellow{ @@ -42703,8 +42477,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, @@ -42846,8 +42618,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, @@ -43162,13 +42932,8 @@ /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) "bEg" = ( -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 2; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_y = 20 }, /turf/open/floor/plasteel/black/telecomms/mainframe, @@ -43218,8 +42983,6 @@ icon_state = "1-2" }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_x = 32 }, /turf/open/floor/plasteel/arrival{ @@ -44195,12 +43958,9 @@ freq = 1400; location = "Atmospherics" }, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmos Blast Door"; - opacity = 0 + name = "Atmos Blast Door" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -45799,8 +45559,7 @@ /area/tcommsat/server) "bJh" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) @@ -46265,8 +46024,6 @@ dir = 1 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/vault{ @@ -46631,8 +46388,7 @@ /area/aisat) "bKS" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-06"; - level = 4.1 + icon_state = "plant-06" }, /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -47047,8 +46803,6 @@ "bLH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_x = -32 }, /obj/machinery/camera{ @@ -47512,8 +47266,7 @@ pixel_y = -32 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-03"; - layer = 4.1 + icon_state = "plant-03" }, /turf/open/floor/plasteel/arrival{ dir = 6 @@ -47751,12 +47504,7 @@ /area/teleporter) "bNa" = ( /obj/structure/window/reinforced, -/obj/structure/showcase{ - desc = "A stand with an retired construction mech bolted to it. The clamps are rated at 9300PSI. It seems to be falling apart."; - icon = 'icons/mecha/mecha.dmi'; - icon_state = "firefighter"; - name = "construction mech exhibit" - }, +/obj/structure/showcase/mecha/ripley, /obj/structure/cable/yellow{ d1 = 1; d2 = 2; @@ -47766,10 +47514,7 @@ /turf/open/floor/carpet, /area/bridge/showroom/corporate) "bNb" = ( -/obj/structure/sign/atmosplaque{ - desc = "A guide to the exhibit, detailing the constructive and destructive applications of modern repair drones, as well as the development of the incorruptible cyborg servants of tomorrow, available today."; - icon_state = "kiddieplaque"; - name = "\improper 'Perfect Drone' sign"; +/obj/structure/sign/kiddieplaque/perfect_drone{ pixel_y = 32 }, /obj/machinery/droneDispenser, @@ -47777,12 +47522,7 @@ /turf/open/floor/carpet, /area/bridge/showroom/corporate) "bNc" = ( -/obj/structure/showcase{ - desc = "A stand with an empty old Nanotrasen Corporation combat mech bolted to it. It is described as the premier unit used to defend corporate interests and employees."; - icon = 'icons/mecha/mecha.dmi'; - icon_state = "marauder"; - name = "combat mech exhibit" - }, +/obj/structure/showcase/mecha/marauder, /obj/structure/window/reinforced{ dir = 4 }, @@ -47872,26 +47612,16 @@ icon_state = "1-2" }, /obj/structure/window/reinforced, -/obj/structure/showcase{ - desc = "Signs describe how cloning pods like these ensure that every Nanotrasen employee can carry out their contracts in full, even in the unlikely event of their catastrophic death. Hopefully they aren't all made of cardboard, like this one."; - icon = 'icons/obj/cloning.dmi'; - icon_state = "pod_0"; +/obj/structure/showcase/machinery/cloning_pod{ layer = 4; - name = "cloning pod exhibit"; pixel_x = 2; pixel_y = 5 }, /turf/open/floor/carpet, /area/bridge/showroom/corporate) "bNj" = ( -/obj/structure/showcase{ - desc = "A stand with a model of the perfect Nanotrasen Employee bolted to it. Signs indicate it is robustly genetically engineered, as well as being ruthlessly loyal."; - name = "'Perfect Man' employee exhibit" - }, -/obj/structure/sign/atmosplaque{ - desc = "A guide to the exhibit, explaining how recent developments in loyalty implant and cloning technologies by Nanotrasen Corporation have led to the development and the effective immortality of the 'perfect man', the loyal Nanotrasen Employee."; - icon_state = "kiddieplaque"; - name = "\improper 'Perfect Man' sign"; +/obj/structure/showcase/perfect_employee, +/obj/structure/sign/kiddieplaque/perfect_man{ pixel_y = 32 }, /obj/structure/window/reinforced, @@ -47905,12 +47635,8 @@ }, /obj/structure/window/reinforced, /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/showcase{ - desc = "A flimsy model of a standard Nanotrasen automated loyalty implant machine. With secure positioning harnesses and a robotic surgical injector, brain damage and other serious medical anomalies are now up to 60% less likely!"; - icon = 'icons/obj/machines/implantchair.dmi'; - icon_state = "implantchair"; +/obj/structure/showcase/machinery/implanter{ layer = 2.7; - name = "Nanotrasen automated loyalty implanter exhibit"; pixel_y = 4 }, /turf/open/floor/carpet, @@ -48922,9 +48648,7 @@ /turf/open/floor/plating, /area/maintenance/starboard) "bPn" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - req_access = "0" - }, +/obj/machinery/atmospherics/components/trinary/filter, /turf/open/floor/plating, /area/maintenance/starboard) "bPo" = ( @@ -49349,7 +49073,7 @@ /area/bridge/showroom/corporate) "bQl" = ( /obj/structure/table/wood, -/obj/item/toy/carpplushie{ +/obj/item/toy/plush/carpplushie{ color = "red"; name = "Nanotrasen wildlife department space carp plushie" }, @@ -49915,12 +49639,8 @@ /turf/open/floor/wood, /area/bridge/showroom/corporate) "bRz" = ( -/obj/structure/showcase{ - desc = "The famous Nanotrasen-brand microwave, the multi-purpose cooking appliance every station needs! This one appears to be drawn onto a cardboard box."; +/obj/structure/showcase/machinery/microwave{ dir = 1; - icon = 'icons/obj/kitchen.dmi'; - icon_state = "mw"; - name = "Nanotrasen-brand microwave"; pixel_y = 2 }, /obj/structure/table/wood, @@ -49998,12 +49718,8 @@ d2 = 8; icon_state = "4-8" }, -/obj/structure/showcase{ - desc = "A slightly battered looking TV. Various Nanotrasen infomercials play on a loop, accompanied by a jaunty tune."; +/obj/structure/showcase/machinery/tv{ dir = 1; - icon = 'icons/obj/computer.dmi'; - icon_state = "television"; - name = "Nanotrasen corporate newsfeed"; pixel_x = 2; pixel_y = 3 }, @@ -51278,8 +50994,6 @@ dir = 1 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/neutral/corner{ @@ -51335,8 +51049,6 @@ dir = 1 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/neutral/corner{ @@ -53348,8 +53060,7 @@ pixel_x = -27 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "applebush"; - layer = 4.1 + icon_state = "applebush" }, /turf/open/floor/plasteel/blue/corner{ dir = 8 @@ -53450,8 +53161,7 @@ pixel_x = 24 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel/purple/corner{ dir = 2 @@ -54702,8 +54412,6 @@ }, /obj/item/pen, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/light/small{ @@ -57059,8 +56767,7 @@ pixel_y = -30 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-08"; - layer = 4.1 + icon_state = "plant-08" }, /turf/open/floor/plasteel/whitepurple/side{ dir = 2 @@ -58989,10 +58696,7 @@ }, /area/medical/chemistry) "ciA" = ( -/obj/machinery/chem_master{ - layer = 2.7; - pixel_x = -2 - }, +/obj/machinery/chem_master, /obj/machinery/light{ dir = 4 }, @@ -60261,9 +59965,7 @@ /area/medical/medbay/central) "clo" = ( /obj/structure/bed/roller, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/whiteblue/side{ dir = 2 }, @@ -61404,8 +61106,6 @@ /area/medical/medbay/central) "cnC" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/structure/table/glass, @@ -61763,8 +61463,7 @@ /area/science/research) "coj" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 2 @@ -61960,9 +61659,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/white, /area/medical/surgery) "coE" = ( @@ -63060,10 +62757,7 @@ }, /area/medical/chemistry) "cqu" = ( -/obj/machinery/chem_master{ - layer = 2.7; - pixel_x = -2 - }, +/obj/machinery/chem_master, /obj/structure/noticeboard{ desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; dir = 1; @@ -63512,9 +63206,7 @@ /area/medical/surgery) "cro" = ( /obj/structure/bed/roller, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/white, /area/medical/surgery) "crp" = ( @@ -63929,9 +63621,7 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "csc" = ( -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /obj/item/roller, /turf/open/floor/plating, /area/maintenance/starboard/aft) @@ -64051,9 +63741,7 @@ /obj/structure/sign/nosmoking_2{ pixel_x = -28 }, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/whiteblue/side{ dir = 2 }, @@ -64558,8 +64246,6 @@ /area/crew_quarters/heads/hor) "ctc" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/effect/landmark/xmastree/rdrod, @@ -67534,8 +67220,6 @@ /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/white/side{ @@ -67906,9 +67590,7 @@ /area/science/mixing) "czz" = ( /obj/machinery/atmospherics/components/trinary/filter{ - density = 0; - dir = 8; - req_access = "0" + dir = 8 }, /turf/open/floor/plasteel/white, /area/science/mixing) @@ -69926,6 +69608,7 @@ id = "toxinsdriver"; name = "Toxins Launcher Bay Door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/science/mixing) "cDu" = ( @@ -70083,7 +69766,6 @@ /obj/item/device/healthanalyzer, /obj/item/clothing/glasses/hud/health, /obj/structure/reagent_dispensers/virusfood{ - density = 0; pixel_y = 30 }, /obj/structure/table/glass, @@ -71273,9 +70955,7 @@ dir = 2; pixel_y = 24 }, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/whitegreen/side{ dir = 8 }, @@ -71304,7 +70984,6 @@ "cFQ" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -72929,12 +72608,8 @@ "cIA" = ( /obj/structure/bed/roller, /obj/structure/bed/roller, -/obj/machinery/iv_drip{ - density = 0 - }, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/floorgrime, /area/maintenance/aft) "cIB" = ( @@ -73610,8 +73285,7 @@ /area/science/research) "cJQ" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 8 @@ -74902,8 +74576,7 @@ pixel_x = 27 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-14"; - layer = 4.1 + icon_state = "plant-14" }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -75265,7 +74938,6 @@ /area/hallway/secondary/exit/departure_lounge) "cMU" = ( /obj/machinery/status_display{ - density = 0; layer = 4 }, /turf/closed/wall, @@ -76547,10 +76219,7 @@ /turf/open/floor/carpet, /area/chapel/main) "cPE" = ( -/obj/structure/sign/atmosplaque{ - desc = "A plaque commemorating the fallen, may they rest in peace, forever asleep amongst the stars. Someone has drawn a picture of a crying badger at the bottom."; - icon_state = "kiddieplaque"; - name = "Remembrance Plaque"; +/obj/structure/sign/kiddieplaque/badger{ pixel_y = 32 }, /obj/item/reagent_containers/food/snacks/grown/poppy{ @@ -76665,8 +76334,7 @@ pixel_x = -27 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-04"; - layer = 4.1 + icon_state = "plant-04" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -76735,8 +76403,7 @@ pixel_x = 29 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-16"; - layer = 4.1 + icon_state = "plant-16" }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -77579,6 +77246,7 @@ id = "chapelgun"; name = "Chapel Launcher Door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/chapel/main) "cRQ" = ( @@ -78180,8 +77848,6 @@ dir = 1 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = 32 }, /obj/machinery/computer/shuttle/pod{ @@ -78370,8 +78036,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_y = 32 }, /obj/machinery/computer/shuttle/pod{ @@ -80931,9 +80595,7 @@ req_access_txt = "0"; use_power = 0 }, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /obj/effect/decal/cleanable/dirt{ desc = "A thin layer of dust coating the floor."; name = "dust" @@ -83140,10 +82802,7 @@ /turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "dcM" = ( -/obj/machinery/chem_master{ - pixel_x = -2; - pixel_y = 1 - }, +/obj/machinery/chem_master, /obj/item/device/radio/intercom{ name = "Station Intercom (General)"; pixel_y = -29 @@ -85580,8 +85239,6 @@ "diD" = ( /obj/machinery/vending/cigarette, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/structure/sign/poster/official/random{ @@ -85806,8 +85463,7 @@ network = list("SS13") }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-24"; - layer = 4.1 + icon_state = "plant-24" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -89933,12 +89589,9 @@ /area/engine/atmos) "dBK" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmos Blast Door"; - opacity = 0 + name = "Atmos Blast Door" }, /obj/structure/cable/yellow, /turf/open/floor/plating, @@ -100175,7 +99828,7 @@ aVs aVs aVs cVF -cVW +cVF cWn cVF cVF @@ -122587,7 +122240,7 @@ cRu cRi cRi cRi -bpu +cRi aaf aaa aaf @@ -128889,7 +128542,7 @@ aaa aaa aaf aaa -aaX +blx adl aQf adl @@ -129937,7 +129590,7 @@ arI atd bai ate -dDM +dDL axP dnS axY diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 3e53168c2e..90e8ab96bf 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -358,8 +358,6 @@ /area/mine/laborcamp) "bj" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel, diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 1d961d66bc..12d1d8abe7 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -27,10 +27,7 @@ /area/space) "aag" = ( /obj/structure/lattice, -/obj/structure/grille{ - density = 0; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /turf/open/space, /area/space) "aah" = ( @@ -235,6 +232,8 @@ "aaz" = ( /obj/machinery/computer/card, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel/darkred/side{ @@ -374,6 +373,8 @@ "aaL" = ( /obj/machinery/computer/monitor, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel/darkyellow/side{ @@ -398,6 +399,8 @@ name = "command camera" }, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel/vault{ @@ -436,7 +439,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -493,6 +495,8 @@ name = "command camera" }, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel/vault{ @@ -524,6 +528,8 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel/vault{ @@ -581,6 +587,8 @@ /area/bridge) "abb" = ( /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -698,6 +706,8 @@ dir = 10 }, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel/vault{ @@ -823,9 +833,7 @@ /area/crew_quarters/heads/hop) "abt" = ( /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "abu" = ( /turf/open/floor/plating/astplate, /area/ruin/unpowered{ @@ -1018,24 +1026,18 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/starboard/fore) "abM" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/starboard/fore) "abN" = ( /obj/structure/sign/vacuum, /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "abO" = ( /obj/structure/closet/emcloset/anchored, /obj/effect/decal/cleanable/dirt, @@ -1044,9 +1046,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "abP" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/astplate, @@ -1105,9 +1105,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/fore) "abX" = ( /obj/structure/window/reinforced{ dir = 8 @@ -1381,9 +1379,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/starboard/fore) "acv" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -1391,9 +1387,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "acw" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -1407,9 +1401,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "acx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -1420,9 +1412,7 @@ /obj/effect/landmark/xeno_spawn, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "acy" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -1433,9 +1423,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "acz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -1554,9 +1542,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/fore) "acO" = ( /obj/structure/mirror{ pixel_x = -26 @@ -1911,13 +1897,21 @@ "adm" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + dir = 4; + name = "Starboard Bow Maintenace APC"; + areastring = "/area/maintenance/starboard/fore"; + pixel_x = 26 + }, /turf/open/floor/plasteel/neutral/corner{ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/starboard/fore) "adn" = ( /turf/closed/wall, /area/quartermaster/storage) @@ -1927,7 +1921,6 @@ /area/quartermaster/storage) "adp" = ( /obj/machinery/status_display{ - density = 0; name = "cargo display"; supply_display = 1 }, @@ -2047,9 +2040,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/landmark/xeno_spawn, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/fore) "adG" = ( /obj/structure/toilet{ dir = 4 @@ -2145,8 +2136,7 @@ d2 = 8; icon_state = "2-8" }, -/obj/structure/sign/goldenplaque{ - name = "The Most Robust Captain Award for Robustness"; +/obj/structure/sign/goldenplaque/captain{ pixel_x = 32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -2253,7 +2243,6 @@ req_access = null; req_access_txt = "57" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ dir = 2 }, @@ -2270,10 +2259,13 @@ "adY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/starboard/fore) "adZ" = ( /obj/machinery/conveyor{ dir = 8; @@ -2496,10 +2488,19 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/power/apc{ + dir = 8; + name = "Fore Maintenace APC"; + areastring = "/area/maintenance/fore"; + pixel_x = -26; + pixel_y = 3 + }, +/obj/structure/cable/white{ + d2 = 2; + icon_state = "0-2" + }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/fore) "aeu" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall, @@ -2814,7 +2815,6 @@ /area/crew_quarters/heads/hop) "aeP" = ( /obj/machinery/status_display{ - density = 0; name = "cargo display"; pixel_x = -32; supply_display = 1 @@ -2988,15 +2988,18 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/security/detectives_office) +/area/maintenance/fore) "afj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/delivery, +/obj/structure/cable/white{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/fore) "afk" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -26 @@ -3033,8 +3036,7 @@ /area/crew_quarters/heads/captain/private) "afo" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/item/device/radio/intercom{ dir = 8; @@ -3279,10 +3281,13 @@ "afB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/landmark/blobstart, +/obj/structure/cable/white{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/starboard/fore) "afC" = ( /obj/machinery/airalarm{ dir = 4; @@ -3463,10 +3468,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/delivery, /obj/effect/landmark/event_spawn, +/obj/structure/cable/white{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/fore) "afW" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -3483,7 +3491,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/crew_quarters/heads/captain/private) +/area/maintenance/fore) "afX" = ( /obj/structure/cable/white{ d1 = 4; @@ -3761,13 +3769,16 @@ "agu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/starboard/fore) "agv" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -26 @@ -3941,9 +3952,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/fore) "agO" = ( /obj/machinery/light{ dir = 8 @@ -4247,10 +4256,13 @@ "ahj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/starboard/fore) "ahk" = ( /obj/machinery/firealarm{ dir = 8; @@ -4521,9 +4533,7 @@ /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "ahE" = ( -/obj/machinery/computer/security/wooden_tv{ - density = 0 - }, +/obj/machinery/computer/security/wooden_tv, /obj/structure/table/wood, /obj/machinery/button/door{ id = "detectivewindows"; @@ -4549,7 +4559,6 @@ /obj/item/storage/secure/safe{ pixel_x = 32 }, -/obj/item/reagent_containers/food/drinks/flask/det, /obj/structure/extinguisher_cabinet{ pixel_x = 24; pixel_y = -26 @@ -4566,9 +4575,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/fore) "ahH" = ( /obj/structure/sign/securearea{ pixel_x = -32 @@ -4598,9 +4605,7 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/captain/private) "ahK" = ( -/obj/machinery/computer/security/wooden_tv{ - density = 0 - }, +/obj/machinery/computer/security/wooden_tv, /obj/structure/table/wood, /obj/machinery/button/door{ id = "captainhall"; @@ -4725,30 +4730,22 @@ /area/bridge) "ahY" = ( /turf/closed/wall/r_wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ahZ" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aia" = ( /obj/machinery/light{ dir = 1 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aib" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aic" = ( /obj/structure/table, /obj/item/paper_bin, @@ -4759,9 +4756,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aid" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining{ @@ -5012,9 +5007,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/fore) "aiy" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass_command{ @@ -5098,9 +5091,7 @@ /turf/open/floor/plasteel/loadingarea{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aiE" = ( /obj/structure/cable/white{ d2 = 2; @@ -5108,24 +5099,18 @@ }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aiF" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "hopline"; name = "Queue Shutters" }, /turf/open/floor/plasteel/loadingarea, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aiG" = ( /obj/structure/sign/electricshock, /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aiH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance_hatch{ @@ -5135,10 +5120,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, +/obj/structure/cable/white{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/starboard/fore) "aiI" = ( /obj/structure/filingcabinet/filingcabinet, /obj/machinery/airalarm{ @@ -5308,9 +5296,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -5380,9 +5365,7 @@ /turf/open/floor/plasteel/red/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aje" = ( /obj/structure/cable/white{ d1 = 1; @@ -5396,17 +5379,13 @@ /turf/open/floor/plasteel/red/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajf" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/red/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5415,9 +5394,7 @@ /turf/open/floor/plasteel/red/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5425,9 +5402,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aji" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -5435,9 +5410,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajj" = ( /obj/structure/cable/white{ d1 = 1; @@ -5451,9 +5424,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajk" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5465,9 +5436,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajl" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5479,9 +5448,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5495,9 +5462,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajn" = ( /obj/structure/sign/nanotrasen{ pixel_y = 32 @@ -5510,9 +5475,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajo" = ( /obj/structure/cable/white{ d1 = 1; @@ -5526,17 +5489,13 @@ /turf/open/floor/plasteel/blue/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajp" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/blue/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajq" = ( /obj/structure/sign/securearea{ pixel_y = 32 @@ -5547,9 +5506,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5560,9 +5517,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajs" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/machinery/camera{ @@ -5573,9 +5528,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajt" = ( /obj/structure/cable/white{ d1 = 1; @@ -5589,9 +5542,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aju" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5601,9 +5552,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5615,9 +5564,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5629,9 +5576,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajx" = ( /obj/structure/sign/securearea{ pixel_y = 32 @@ -5645,9 +5590,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5656,9 +5599,7 @@ /turf/open/floor/plasteel/blue/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajz" = ( /obj/structure/cable/white{ d1 = 1; @@ -5669,9 +5610,7 @@ /turf/open/floor/plasteel/blue/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajA" = ( /obj/structure/sign/directions/engineering{ desc = "A sign that shows there are doors here. There are doors everywhere!"; @@ -5687,9 +5626,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5697,9 +5634,7 @@ /turf/open/floor/plasteel/blue/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajC" = ( /obj/structure/cable/white{ d1 = 1; @@ -5712,9 +5647,7 @@ /turf/open/floor/plasteel/blue/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajD" = ( /obj/structure/cable/white{ d1 = 1; @@ -5727,9 +5660,7 @@ /turf/open/floor/plasteel/blue/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -5737,16 +5668,13 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/camera{ c_tag = "Central Hallway North-East"; @@ -5755,17 +5683,13 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/brown/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ajH" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/plasticflaps{ @@ -6032,9 +5956,7 @@ /turf/open/floor/plasteel/red/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akd" = ( /obj/effect/landmark/lightsout, /obj/structure/cable/white{ @@ -6051,9 +5973,7 @@ dir = 8 }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ake" = ( /obj/structure/cable/white{ d1 = 4; @@ -6067,9 +5987,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akf" = ( /obj/structure/cable/white{ d1 = 4; @@ -6082,9 +6000,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akg" = ( /obj/structure/cable/white{ d1 = 4; @@ -6098,9 +6014,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akh" = ( /obj/structure/cable/white{ d1 = 4; @@ -6115,9 +6029,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aki" = ( /obj/structure/cable/white{ d1 = 1; @@ -6134,9 +6046,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akj" = ( /obj/structure/cable/white{ d1 = 4; @@ -6154,9 +6064,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akk" = ( /obj/structure/sign/electricshock{ pixel_y = -32 @@ -6173,9 +6081,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akl" = ( /obj/structure/cable/white{ d1 = 4; @@ -6192,9 +6098,7 @@ }, /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akm" = ( /obj/structure/cable/white{ d1 = 4; @@ -6207,9 +6111,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akn" = ( /obj/structure/cable/white{ d1 = 4; @@ -6226,9 +6128,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ako" = ( /obj/structure/cable/white{ d1 = 4; @@ -6245,9 +6145,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akp" = ( /obj/structure/cable/white{ d1 = 4; @@ -6266,9 +6164,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akq" = ( /obj/structure/cable/white{ d1 = 4; @@ -6283,9 +6179,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akr" = ( /obj/structure/cable/white{ d1 = 2; @@ -6312,9 +6206,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aks" = ( /obj/structure/cable/white{ d1 = 2; @@ -6333,9 +6225,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akt" = ( /obj/structure/cable/white{ d1 = 4; @@ -6353,9 +6243,7 @@ /turf/open/floor/plasteel{ icon_state = "L1" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aku" = ( /obj/structure/cable/white{ d1 = 4; @@ -6369,9 +6257,7 @@ /turf/open/floor/plasteel{ icon_state = "L3" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akv" = ( /obj/structure/cable/white{ d1 = 4; @@ -6390,9 +6276,7 @@ /turf/open/floor/plasteel{ icon_state = "L5" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akw" = ( /obj/structure/cable/white{ d1 = 4; @@ -6416,9 +6300,7 @@ /turf/open/floor/plasteel{ icon_state = "L7" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akx" = ( /obj/structure/cable/white{ d1 = 4; @@ -6429,9 +6311,7 @@ /turf/open/floor/plasteel{ icon_state = "L9" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aky" = ( /obj/structure/cable/white{ d1 = 4; @@ -6444,9 +6324,7 @@ /turf/open/floor/plasteel{ icon_state = "L11" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akz" = ( /obj/structure/cable/white{ d1 = 4; @@ -6464,9 +6342,7 @@ /turf/open/floor/plasteel{ icon_state = "L13" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akA" = ( /obj/structure/cable/white{ d1 = 4; @@ -6477,9 +6353,7 @@ dir = 4 }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akB" = ( /obj/structure/cable/white{ d1 = 2; @@ -6493,9 +6367,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akC" = ( /obj/structure/cable/white{ d1 = 2; @@ -6521,9 +6393,7 @@ icon_state = "1-4" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akD" = ( /obj/structure/cable/white{ d1 = 2; @@ -6540,9 +6410,7 @@ }, /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akE" = ( /obj/structure/cable/white{ d1 = 2; @@ -6564,9 +6432,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akF" = ( /obj/structure/cable/white{ d1 = 2; @@ -6588,9 +6454,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akG" = ( /obj/structure/cable/white{ d1 = 4; @@ -6608,9 +6472,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akH" = ( /obj/structure/cable/white{ d1 = 2; @@ -6629,9 +6491,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akI" = ( /obj/structure/sign/electricshock{ pixel_y = -32 @@ -6645,9 +6505,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -6662,9 +6520,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akK" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -6675,10 +6531,13 @@ icon_state = "2-8" }, /obj/effect/turf_decal/delivery, +/obj/structure/cable/white{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "akL" = ( /obj/structure/closet/wardrobe/cargotech, /turf/open/floor/plasteel/brown{ @@ -6845,9 +6704,7 @@ /turf/open/floor/plasteel/red/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alc" = ( /obj/structure/cable/white{ d1 = 1; @@ -6858,15 +6715,11 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ald" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ale" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -6877,15 +6730,11 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alg" = ( /turf/closed/wall/r_wall, /area/teleporter) @@ -6926,9 +6775,7 @@ /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "all" = ( /obj/structure/sign/directions/engineering{ dir = 8; @@ -6941,13 +6788,10 @@ pixel_y = -8 }, /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alm" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/light{ dir = 8 @@ -6960,9 +6804,7 @@ /turf/open/floor/plasteel{ icon_state = "L2" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aln" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -6970,9 +6812,7 @@ /turf/open/floor/plasteel{ icon_state = "L4" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ @@ -6983,24 +6823,18 @@ /turf/open/floor/plasteel{ icon_state = "L6" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alp" = ( /turf/open/floor/plasteel{ icon_state = "L8" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel{ icon_state = "L10" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -7008,9 +6842,7 @@ /turf/open/floor/plasteel{ icon_state = "L12" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "als" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-22" @@ -7026,9 +6858,7 @@ /turf/open/floor/plasteel{ icon_state = "L14" }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alt" = ( /obj/structure/sign/directions/engineering{ desc = "A direction sign, pointing out which way the Supply department is."; @@ -7047,21 +6877,15 @@ pixel_y = -8 }, /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alu" = ( /turf/closed/wall/r_wall, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "alv" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "alw" = ( /obj/structure/cable/white{ d1 = 1; @@ -7079,9 +6903,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "alx" = ( /obj/machinery/door/poddoor/shutters{ id = "evashutters"; @@ -7093,17 +6915,13 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "aly" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -7114,9 +6932,7 @@ /turf/open/floor/plasteel/brown/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alA" = ( /obj/structure/table/reinforced, /obj/structure/noticeboard{ @@ -7341,9 +7157,7 @@ /turf/open/floor/plasteel/red/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alS" = ( /obj/structure/cable/white{ d1 = 1; @@ -7360,9 +7174,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -7375,18 +7187,14 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alV" = ( /obj/structure/urinal{ pixel_y = 28 @@ -7396,18 +7204,14 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alW" = ( /obj/structure/urinal{ pixel_y = 28 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/bin, @@ -7415,9 +7219,7 @@ pixel_y = 24 }, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "alY" = ( /obj/machinery/shieldwallgen, /obj/effect/decal/cleanable/dirt, @@ -7491,9 +7293,7 @@ }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amf" = ( /obj/structure/closet/crate/bin, /obj/structure/cable/white{ @@ -7508,17 +7308,13 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amg" = ( /turf/open/floor/plasteel/neutral/corner{ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ @@ -7528,27 +7324,19 @@ }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ami" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amk" = ( /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aml" = ( /obj/structure/closet/emcloset, /obj/structure/cable/white{ @@ -7563,9 +7351,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amm" = ( /obj/structure/cable/white{ d2 = 8; @@ -7573,9 +7359,7 @@ }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amn" = ( /obj/structure/cable/white{ d2 = 4; @@ -7583,9 +7367,7 @@ }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "amo" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/metal{ @@ -7607,9 +7389,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "amp" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -7627,26 +7407,20 @@ dir = 9 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "amq" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "amr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ dir = 5 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "ams" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/electrical{ @@ -7666,9 +7440,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "amt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -7681,9 +7453,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amu" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -7696,9 +7466,7 @@ /turf/open/floor/plasteel/brown/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amv" = ( /obj/machinery/computer/stockexchange, /obj/structure/table/reinforced, @@ -7722,8 +7490,7 @@ }, /obj/machinery/light, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/brown, /area/quartermaster/storage) @@ -7897,9 +7664,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amP" = ( /obj/machinery/firealarm{ dir = 1; @@ -7910,15 +7675,11 @@ dir = 1 }, /turf/open/floor/plasteel/neutral/side, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amQ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/neutral/side, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amR" = ( /obj/machinery/airalarm{ dir = 1; @@ -7926,9 +7687,7 @@ }, /obj/machinery/light/small, /turf/open/floor/plasteel/neutral/side, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera{ @@ -7937,9 +7696,7 @@ network = list("SS13") }, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "amT" = ( /obj/structure/table/reinforced, /obj/item/stack/cable_coil/white, @@ -8008,9 +7765,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ana" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ @@ -8022,20 +7777,14 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anb" = ( /turf/open/floor/plasteel/neutral/side, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "and" = ( /obj/structure/closet/firecloset, /obj/structure/sign/nanotrasen{ @@ -8048,24 +7797,18 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ane" = ( /obj/structure/sign/electricshock, /turf/closed/wall/r_wall, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "anf" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/turf_decal/stripes/end{ dir = 8 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "ang" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -8080,9 +7823,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "anh" = ( /obj/structure/table/reinforced, /obj/item/storage/belt/utility, @@ -8092,18 +7833,14 @@ /obj/item/device/flashlight/flare, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "ani" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "anj" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/decal/cleanable/dirt, @@ -8116,9 +7853,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "ank" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/firedoor, @@ -8126,9 +7861,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor, @@ -8141,9 +7874,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anm" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -8372,8 +8103,7 @@ /area/security/brig) "anF" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/door_timer{ id = "brig2"; @@ -8406,9 +8136,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anI" = ( /obj/machinery/door/firedoor, /obj/structure/cable/white{ @@ -8421,9 +8149,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anJ" = ( /obj/machinery/door/airlock{ name = "Toilet Unit" @@ -8432,9 +8158,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anK" = ( /obj/machinery/door/airlock{ name = "Toilet Unit" @@ -8444,9 +8168,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anL" = ( /obj/machinery/door/window/northleft{ dir = 4; @@ -8504,9 +8226,7 @@ "anQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/firedoor, @@ -8522,9 +8242,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anS" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass{ @@ -8534,9 +8252,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor, @@ -8547,9 +8263,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "anU" = ( /obj/structure/closet/crate/rcd{ pixel_y = 4 @@ -8574,9 +8288,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "anV" = ( /obj/structure/cable/white{ d1 = 1; @@ -8587,16 +8299,12 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "anW" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "anX" = ( /obj/machinery/requests_console{ department = "E.V.A. Storage"; @@ -8615,14 +8323,10 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "anY" = ( /turf/closed/wall, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "anZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/firealarm{ @@ -8632,9 +8336,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aoa" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -8647,9 +8349,7 @@ /turf/open/floor/plasteel/brown/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aob" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -8659,9 +8359,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aoc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -8669,9 +8367,7 @@ /turf/open/floor/plasteel/brown/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aod" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -8680,9 +8376,7 @@ /turf/open/floor/plasteel/brown/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aoe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -8694,9 +8388,7 @@ /turf/open/floor/plasteel/brown{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aof" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -8705,9 +8397,7 @@ /turf/open/floor/plasteel/brown/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aog" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/structure/cable/white{ @@ -8718,9 +8408,7 @@ /turf/open/floor/plasteel/brown/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aoh" = ( /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, @@ -8944,9 +8632,7 @@ /turf/open/floor/plasteel/red/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aoC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/vomit/old, @@ -8959,9 +8645,7 @@ /obj/machinery/light/small, /obj/effect/landmark/revenantspawn, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aoD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/toilet{ @@ -8974,9 +8658,7 @@ /obj/effect/landmark/blobstart, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aoE" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/toilet{ @@ -8989,9 +8671,7 @@ /obj/effect/landmark/start/assistant, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aoF" = ( /obj/structure/table/reinforced, /obj/item/stock_parts/cell/high, @@ -9085,9 +8765,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aoO" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/structure/cable/white{ @@ -9108,9 +8786,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aoP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -9121,9 +8797,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/neutral, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aoQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -9137,9 +8811,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aoR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -9152,9 +8824,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aoS" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -9220,16 +8890,12 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "aoX" = ( /obj/structure/tank_dispenser/oxygen, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "aoY" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/newscaster{ @@ -9239,9 +8905,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "aoZ" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -9253,9 +8917,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "apa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -9278,9 +8940,7 @@ icon_state = "2-4" }, /turf/open/floor/plasteel/brown/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "apb" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -9295,9 +8955,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "apc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -9310,9 +8968,7 @@ /turf/open/floor/plasteel/brown/corner{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "apd" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/structure/cable/white{ @@ -9323,9 +8979,7 @@ /turf/open/floor/plasteel/brown/corner{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ape" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -9337,9 +8991,7 @@ }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/brown, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "apf" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/structure/cable/white{ @@ -9348,9 +9000,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/brown/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "apg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -9369,9 +9019,7 @@ icon_state = "1-8" }, /turf/open/floor/plasteel/brown/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aph" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -9384,9 +9032,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "api" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining{ @@ -9706,9 +9352,7 @@ /turf/open/floor/plasteel/red/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "apH" = ( /obj/structure/cable/white{ d1 = 1; @@ -9730,9 +9374,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "apI" = ( /turf/closed/wall, /area/storage/primary) @@ -9874,9 +9516,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "apU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -9901,30 +9541,22 @@ dir = 8; heat_capacity = 1e+006 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "apV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/neutral, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "apW" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /turf/open/floor/plasteel/neutral/corner, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "apX" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "apY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -9982,9 +9614,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "aqd" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/status_display{ @@ -9999,9 +9629,7 @@ dir = 10 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "aqe" = ( /obj/machinery/power/apc{ dir = 2; @@ -10015,9 +9643,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "aqf" = ( /obj/machinery/status_display{ pixel_y = -32 @@ -10029,9 +9655,7 @@ dir = 6 }, /turf/open/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "aqg" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/plasteel{ @@ -10056,18 +9680,14 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/ai_monitored/storage/eva) "aqh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/neutral/corner{ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aqi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -10076,16 +9696,12 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/brown/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aqj" = ( /obj/machinery/computer/cargo/request, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aqk" = ( /obj/structure/chair{ dir = 1 @@ -10093,9 +9709,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aql" = ( /obj/structure/chair{ dir = 1 @@ -10103,9 +9717,7 @@ /obj/effect/landmark/start/assistant, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aqm" = ( /obj/structure/table, /obj/machinery/light, @@ -10116,9 +9728,7 @@ /obj/item/pen, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aqn" = ( /obj/structure/chair{ dir = 1 @@ -10129,9 +9739,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aqo" = ( /obj/structure/chair{ dir = 1 @@ -10140,9 +9748,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aqp" = ( /obj/machinery/autolathe, /obj/structure/extinguisher_cabinet{ @@ -10155,9 +9761,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aqq" = ( /obj/structure/rack, /obj/item/storage/toolbox/emergency{ @@ -10302,9 +9906,7 @@ dir = 4 }, /turf/open/floor/plating/astplate, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "aqH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -10387,8 +9989,7 @@ /area/security/brig) "aqP" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/firealarm{ dir = 4; @@ -10435,9 +10036,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aqT" = ( /obj/structure/table/reinforced, /obj/item/storage/belt/utility, @@ -10523,15 +10122,11 @@ /area/maintenance/port/central) "ara" = ( /turf/closed/wall, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "arb" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "arc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/firedoor, @@ -10547,9 +10142,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "ard" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass{ @@ -10559,9 +10152,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "are" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor, @@ -10572,9 +10163,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "arf" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -10584,9 +10173,7 @@ pixel_x = 32 }, /turf/open/floor/plating, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "arg" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -10614,9 +10201,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "arj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -10625,9 +10210,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ark" = ( /obj/structure/table/reinforced, /obj/machinery/airalarm{ @@ -10904,9 +10487,7 @@ /area/engine/atmos) "arB" = ( /turf/open/floor/plating/astplate, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "arC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -10921,6 +10502,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, +/obj/structure/closet/l3closet/security, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -11327,18 +10909,13 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "ase" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "asf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ @@ -11347,28 +10924,20 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "asg" = ( /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "ash" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "asi" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "asj" = ( /obj/machinery/vending/cola, /obj/machinery/newscaster{ @@ -11377,9 +10946,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "ask" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ @@ -11465,9 +11032,7 @@ /turf/open/floor/plasteel/loadingarea{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ass" = ( /obj/machinery/mineral/mint, /obj/effect/decal/cleanable/dirt, @@ -11477,15 +11042,11 @@ pixel_y = 32 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ast" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/loadingarea, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "asu" = ( /obj/structure/shuttle/engine/propulsion/burst, /obj/structure/window/reinforced{ @@ -11615,9 +11176,7 @@ pixel_x = -32 }, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "asJ" = ( /obj/structure/closet/wardrobe/red, /obj/item/clothing/under/rank/security/grey, @@ -11804,9 +11363,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "asU" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass_engineering{ @@ -11991,9 +11548,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "atj" = ( /obj/machinery/vending/coffee, /obj/machinery/firealarm{ @@ -12007,30 +11562,28 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "atk" = ( /turf/closed/wall, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "atl" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, /turf/closed/wall, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "atm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "atn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, /turf/closed/wall, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "ato" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -12052,9 +11605,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "atq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -12068,18 +11619,14 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "atr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ats" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -12087,9 +11634,7 @@ /obj/effect/turf_decal/bot, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "att" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -12098,9 +11643,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "atu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -12117,9 +11660,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "atv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -12130,9 +11671,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "atw" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/machinery/light/small{ @@ -12265,9 +11804,7 @@ /turf/open/floor/plasteel/caution/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "atL" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Security Maintenance"; @@ -12295,9 +11832,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "atN" = ( /obj/structure/cable/white{ d1 = 1; @@ -12311,9 +11846,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "atO" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass_engineering{ @@ -12515,7 +12048,6 @@ }, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -12530,9 +12062,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "auc" = ( /obj/item/reagent_containers/food/condiment/saltshaker{ pixel_x = -8; @@ -12544,22 +12074,16 @@ /obj/structure/table/wood, /obj/item/kitchen/fork, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aud" = ( /obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aue" = ( /obj/structure/chair/stool/bar, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "auf" = ( /obj/structure/table/reinforced, /obj/item/lighter{ @@ -12570,14 +12094,14 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "aug" = ( /obj/structure/sign/barsign{ pixel_y = 32 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/black, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "auh" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks, @@ -12594,11 +12118,11 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "aui" = ( /obj/machinery/status_display, /turf/closed/wall, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "auj" = ( /obj/structure/table/wood, /obj/structure/reagent_dispensers/beerkeg, @@ -12611,7 +12135,7 @@ network = list("MINE") }, /turf/open/floor/plasteel/vault, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "auk" = ( /obj/structure/sink/kitchen{ desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; @@ -12620,7 +12144,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/vault, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "aul" = ( /obj/structure/closet/gmcloset, /obj/item/wrench, @@ -12637,11 +12161,11 @@ pixel_x = 26 }, /turf/open/floor/plasteel/vault, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "aum" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "aun" = ( /obj/effect/landmark/blobstart, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -12661,9 +12185,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aup" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/airalarm{ @@ -12676,9 +12198,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "auq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ dir = 4; @@ -12799,9 +12319,7 @@ "auD" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "auE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/space_heater, @@ -12814,18 +12332,14 @@ dir = 10 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "auF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/structure/sign/poster/contraband/random, /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "auG" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, @@ -12833,9 +12347,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "auH" = ( /obj/structure/cable/white{ d1 = 2; @@ -12848,9 +12360,7 @@ }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/red/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "auI" = ( /obj/structure/cable/white{ d1 = 4; @@ -12863,9 +12373,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "auJ" = ( /obj/structure/cable/white{ d1 = 1; @@ -12881,9 +12389,7 @@ /obj/effect/landmark/revenantspawn, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "auK" = ( /obj/structure/cable/white{ d1 = 4; @@ -12898,9 +12404,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "auL" = ( /obj/effect/landmark/blobstart, /obj/structure/cable/white{ @@ -12917,9 +12421,7 @@ icon_state = "2-4" }, /turf/open/floor/plasteel/red/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "auM" = ( /obj/structure/cable/white{ d1 = 4; @@ -12938,9 +12440,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "auN" = ( /obj/structure/cable/white{ d1 = 4; @@ -12953,9 +12453,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "auO" = ( /obj/structure/cable/white{ d1 = 4; @@ -12982,9 +12480,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "auP" = ( /obj/structure/cable/white{ d1 = 4; @@ -12997,9 +12493,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "auQ" = ( /obj/structure/cable/white{ d1 = 4; @@ -13012,9 +12506,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "auR" = ( /obj/structure/cable/white{ d1 = 4; @@ -13028,9 +12520,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "auS" = ( /obj/structure/cable/white{ d1 = 1; @@ -13043,9 +12533,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "auT" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/yellow/side{ @@ -13130,9 +12618,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "avf" = ( /obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -13144,9 +12630,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "avg" = ( /obj/structure/table/wood, /obj/item/device/paicard, @@ -13154,9 +12638,7 @@ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "avh" = ( /obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -13164,26 +12646,20 @@ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "avi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "avj" = ( /obj/structure/chair/stool/bar, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "avk" = ( /obj/structure/table/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -13192,7 +12668,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "avl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -13201,7 +12677,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "avm" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/beer, @@ -13211,14 +12687,14 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "avn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/sign/poster/random, /turf/closed/wall, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "avo" = ( /obj/structure/table/wood, /obj/item/storage/box/beanbag, @@ -13227,7 +12703,7 @@ dir = 4 }, /turf/open/floor/plasteel/black, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "avp" = ( /obj/effect/landmark/start/bartender, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -13237,7 +12713,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "avq" = ( /obj/machinery/chem_master/condimaster{ name = "HoochMaster 2000" @@ -13252,13 +12728,13 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "avr" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/closed/wall, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "avs" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -13277,9 +12753,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "avu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -13291,16 +12765,12 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "avv" = ( /obj/machinery/shieldgen, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "avw" = ( /obj/machinery/shieldgen, /obj/effect/decal/cleanable/dirt, @@ -13308,9 +12778,7 @@ dir = 5 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "avx" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/cyan/visible, @@ -13423,9 +12891,7 @@ dir = 6 }, /turf/open/floor/plasteel/caution, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "avJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ @@ -13437,9 +12903,7 @@ dir = 4 }, /turf/open/floor/plasteel/caution, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "avK" = ( /obj/structure/cable/white{ d1 = 4; @@ -13458,9 +12922,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "avL" = ( /obj/structure/cable/white{ d1 = 4; @@ -13471,10 +12933,18 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/power/apc{ + dir = 2; + name = "Port Bow Maintenance APC"; + areastring = "/area/maintenance/port/fore"; + pixel_y = -26 + }, +/obj/structure/cable/white{ + d2 = 4; + icon_state = "0-4" + }, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "avM" = ( /obj/structure/cable/white{ d1 = 1; @@ -13489,18 +12959,14 @@ dir = 1 }, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "avN" = ( /obj/structure/girder, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "avO" = ( /obj/structure/rack, /obj/item/clothing/gloves/color/black, @@ -13516,9 +12982,7 @@ dir = 9 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "avP" = ( /obj/structure/closet/crate{ icon_state = "crateopen"; @@ -13538,9 +13002,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "avQ" = ( /obj/structure/table, /obj/item/clothing/under/rank/security, @@ -13555,17 +13017,13 @@ dir = 5 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "avR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/port/fore) "avS" = ( /obj/machinery/vending/cigarette, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -13577,9 +13035,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "avT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -13593,9 +13049,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "avU" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -13604,17 +13058,13 @@ dir = 1 }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "avV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "avW" = ( /obj/machinery/airalarm{ dir = 1; @@ -13624,22 +13074,17 @@ dir = 9 }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "avX" = ( /obj/machinery/firealarm{ dir = 4; pixel_x = 24 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "avY" = ( /obj/structure/table/reinforced, /obj/item/stock_parts/cell/high, @@ -13752,9 +13197,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "awk" = ( /obj/structure/chair/stool, /obj/effect/landmark/start/assistant, @@ -13765,42 +13208,32 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "awl" = ( /obj/structure/table/wood, /obj/item/storage/bag/tray, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "awm" = ( /obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "awn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "awo" = ( /obj/structure/chair/stool/bar, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "awp" = ( /obj/structure/table/reinforced, /obj/item/storage/box/matches{ @@ -13813,7 +13246,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "awq" = ( /obj/effect/landmark/start/bartender, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, @@ -13823,7 +13256,7 @@ icon_state = "2-4" }, /turf/open/floor/plasteel/black, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "awr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -13837,7 +13270,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "aws" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -13856,7 +13289,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "awt" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -13869,7 +13302,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "awu" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable/white{ @@ -13880,7 +13313,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "awv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -13896,7 +13329,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "aww" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -13949,9 +13382,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "awz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -13960,9 +13391,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "awA" = ( /turf/open/floor/engine/o2, /area/engine/atmos) @@ -14091,7 +13520,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/engine/atmos) +/area/maintenance/port/fore) "awN" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/plasticflaps{ @@ -14117,9 +13546,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "awP" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall, @@ -14149,9 +13576,7 @@ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "awU" = ( /obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -14164,9 +13589,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "awV" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, @@ -14174,23 +13597,19 @@ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "awW" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "awX" = ( /obj/structure/table/reinforced, /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "awY" = ( /obj/structure/cable/white{ d1 = 1; @@ -14201,7 +13620,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "awZ" = ( /obj/structure/table/wood, /obj/item/book/manual/barman_recipes, @@ -14211,11 +13630,11 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "axa" = ( /obj/machinery/vending/boozeomat, /turf/closed/wall, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "axb" = ( /obj/structure/table/wood, /obj/machinery/reagentgrinder{ @@ -14229,7 +13648,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "axc" = ( /obj/structure/closet/gmcloset, /obj/item/wrench, @@ -14243,7 +13662,7 @@ /obj/item/stack/cable_coil/random, /obj/machinery/light, /turf/open/floor/plasteel/black, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "axd" = ( /obj/structure/closet/secure_closet/bar, /obj/machinery/light_switch{ @@ -14255,7 +13674,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "axe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -14271,9 +13690,7 @@ dir = 10 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "axg" = ( /obj/structure/rack, /obj/item/crowbar/red, @@ -14282,9 +13699,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "axh" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/light/small{ @@ -14375,8 +13790,7 @@ pixel_y = 32 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -14486,8 +13900,8 @@ /obj/item/stack/sheet/metal{ amount = 50 }, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /obj/machinery/newscaster{ pixel_y = 32 }, @@ -14517,17 +13931,13 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "axC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "axD" = ( /obj/structure/table, /obj/item/paper_bin, @@ -14660,9 +14070,7 @@ icon_state = "1-4" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "axP" = ( /obj/structure/cable/white{ d1 = 4; @@ -14670,9 +14078,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "axQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -14681,9 +14087,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "axR" = ( /obj/structure/cable/white{ d1 = 4; @@ -14698,7 +14102,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "axS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -14709,7 +14113,7 @@ icon_state = "1-8" }, /turf/open/floor/plasteel/black, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "axT" = ( /obj/structure/table/wood, /obj/item/clipboard, @@ -14730,7 +14134,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "axU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -14750,14 +14154,10 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "axW" = ( /turf/closed/wall, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "axX" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) @@ -14979,9 +14379,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ayu" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -15095,9 +14493,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "ayJ" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/structure/cable/white{ @@ -15106,32 +14502,24 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "ayK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "ayL" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "ayM" = ( /obj/machinery/holopad, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "ayN" = ( /obj/item/storage/fancy/cigarettes/cigars{ pixel_y = 6 @@ -15144,7 +14532,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "ayO" = ( /obj/structure/table/reinforced, /obj/machinery/newscaster{ @@ -15154,7 +14542,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar) +/area/crew_quarters/bar/atrium) "ayP" = ( /turf/closed/wall, /area/maintenance/starboard/central) @@ -15210,16 +14598,12 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ayV" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "ayW" = ( /obj/structure/table/reinforced, /obj/structure/cable/white{ @@ -15246,9 +14630,7 @@ /turf/open/floor/plasteel/red/side{ dir = 9 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "ayX" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs, @@ -15264,9 +14646,7 @@ /turf/open/floor/plasteel/red/side{ dir = 1 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "ayY" = ( /obj/structure/chair, /obj/machinery/light{ @@ -15284,9 +14664,7 @@ /turf/open/floor/plasteel/red/side{ dir = 1 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "ayZ" = ( /obj/structure/chair, /obj/machinery/ai_status_display{ @@ -15300,9 +14678,7 @@ /turf/open/floor/plasteel/red/side{ dir = 1 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aza" = ( /obj/structure/chair, /obj/machinery/firealarm{ @@ -15311,15 +14687,11 @@ /turf/open/floor/plasteel/red/side{ dir = 5 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "azb" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "azc" = ( /obj/structure/chair{ dir = 4 @@ -15627,9 +14999,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "azJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -15641,9 +15011,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "azK" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/britcup, @@ -15651,9 +15019,7 @@ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "azL" = ( /obj/structure/closet/crate/bin, /obj/structure/extinguisher_cabinet{ @@ -15663,9 +15029,7 @@ dir = 5 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "azM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -15733,9 +15097,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "azT" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -15744,33 +15106,25 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "azU" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "azV" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, /turf/open/floor/plasteel/red/side{ dir = 8 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "azW" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "azX" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -15778,9 +15132,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "azY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable/white{ @@ -15789,9 +15141,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "azZ" = ( /obj/structure/chair{ dir = 8 @@ -15799,9 +15149,7 @@ /turf/open/floor/plasteel/red/side{ dir = 4 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aAa" = ( /obj/structure/chair{ dir = 4 @@ -16078,9 +15426,7 @@ /turf/open/floor/plasteel/neutral, /area/engine/atmos) "aAB" = ( -/obj/machinery/computer/station_alert{ - density = 0 - }, +/obj/machinery/computer/station_alert, /obj/structure/cable/white{ d1 = 1; d2 = 4; @@ -16097,9 +15443,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aAD" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass{ @@ -16188,7 +15532,7 @@ /obj/machinery/power/apc{ dir = 8; name = "Atrium APC"; - areastring = "/area/crew_quarters/bar"; + areastring = "/area/crew_quarters/bar/atrium"; pixel_x = -26; pixel_y = 3 }, @@ -16197,9 +15541,7 @@ icon_state = "0-4" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aAO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ @@ -16228,9 +15570,7 @@ icon_state = "1-4" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aAP" = ( /obj/item/reagent_containers/food/condiment/saltshaker{ pixel_x = -8; @@ -16248,9 +15588,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aAQ" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -16261,9 +15599,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aAR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -16274,9 +15610,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aAS" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -16287,9 +15621,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aAT" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -16380,9 +15712,7 @@ dir = 4 }, /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aAZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -16392,9 +15722,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aBa" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -16405,17 +15733,13 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aBb" = ( /obj/machinery/vending/cola, /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aBc" = ( /obj/machinery/computer/security, /obj/machinery/newscaster/security_unit{ @@ -16424,22 +15748,16 @@ /turf/open/floor/plasteel/red/side{ dir = 10 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aBd" = ( /obj/structure/chair/office/dark, /turf/open/floor/plasteel/red/side, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aBe" = ( /obj/machinery/computer/secure_data, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/red/side, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aBf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -16448,9 +15766,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/red/side, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aBg" = ( /obj/machinery/camera{ c_tag = "Security - Departures Starboard"; @@ -16460,9 +15776,7 @@ /turf/open/floor/plasteel/red/side{ dir = 6 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aBh" = ( /obj/machinery/door/airlock/external{ name = "External Docking Port"; @@ -16472,16 +15786,12 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aBi" = ( /obj/structure/fans/tiny, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aBj" = ( /obj/machinery/door/airlock/shuttle{ name = "Emergency Shuttle Airlock"; @@ -16500,7 +15810,6 @@ "aBl" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -16748,9 +16057,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aBL" = ( /obj/effect/landmark/lightsout, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -16763,9 +16070,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aBM" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass{ @@ -16917,16 +16222,12 @@ dir = 8 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aBZ" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/cheesiehonkers, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aCa" = ( /obj/machinery/light{ dir = 4 @@ -16935,9 +16236,7 @@ icon_state = "plant-22" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aCb" = ( /obj/machinery/status_display, /turf/closed/wall, @@ -16974,9 +16273,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aCh" = ( /obj/machinery/vending/snack, /obj/machinery/firealarm{ @@ -16987,9 +16284,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aCi" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/white{ @@ -16997,9 +16292,7 @@ icon_state = "0-4" }, /turf/open/floor/plating, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aCj" = ( /obj/machinery/door/firedoor, /obj/structure/cable/white{ @@ -17029,9 +16322,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aCk" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/white{ @@ -17044,9 +16335,7 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aCl" = ( /obj/machinery/door/firedoor, /obj/structure/cable/white{ @@ -17073,9 +16362,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aCm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/white{ @@ -17083,16 +16370,12 @@ icon_state = "0-8" }, /turf/open/floor/plating, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aCn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/vacuum, /turf/open/floor/plating, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aCo" = ( /obj/machinery/door/airlock/glass_security{ name = "Holding Area"; @@ -17388,15 +16671,11 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aCM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aCN" = ( /obj/structure/table, /obj/item/storage/firstaid/regular, @@ -17471,9 +16750,7 @@ dir = 10 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aCV" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -17550,9 +16827,7 @@ "aDc" = ( /obj/machinery/status_display, /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aDd" = ( /obj/structure/table, /obj/item/paper_bin, @@ -17566,9 +16841,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aDe" = ( /obj/structure/cable/white{ d1 = 1; @@ -17578,9 +16851,7 @@ /turf/open/floor/plasteel/escape{ dir = 1 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aDg" = ( /obj/structure/cable/white{ d1 = 1; @@ -17591,15 +16862,11 @@ /turf/open/floor/plasteel/escape{ dir = 1 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aDh" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aDi" = ( /obj/machinery/door/airlock/external{ name = "External Docking Port" @@ -17608,9 +16875,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aDj" = ( /obj/machinery/door/airlock/shuttle{ name = "Emergency Shuttle Airlock" @@ -17647,7 +16912,6 @@ "aDm" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -17712,9 +16976,7 @@ "aDv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aDw" = ( /obj/machinery/firealarm{ dir = 8; @@ -17728,9 +16990,7 @@ /turf/open/floor/plasteel/escape{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aDx" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -17743,17 +17003,13 @@ /turf/open/floor/plasteel/caution{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aDy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/caution{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aDz" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -17761,9 +17017,7 @@ /turf/open/floor/plasteel/caution{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aDA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -17771,28 +17025,21 @@ /turf/open/floor/plasteel/caution{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aDB" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/caution{ dir = 5 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aDC" = ( /obj/structure/table/reinforced, /obj/item/airlock_painter, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aDD" = ( /turf/open/floor/plasteel/neutral/corner{ dir = 8; @@ -17927,27 +17174,21 @@ icon_state = "1-8" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aDP" = ( /obj/effect/landmark/xmastree, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aDQ" = ( /obj/structure/chair/stool/bar, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aDR" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -18028,32 +17269,24 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aEa" = ( /obj/structure/table, /obj/item/storage/firstaid/regular, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aEb" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aEc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aEd" = ( /obj/structure/chair{ dir = 4 @@ -18061,24 +17294,18 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aEe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aEf" = ( /obj/structure/chair{ dir = 8 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aEg" = ( /obj/structure/chair{ dir = 4 @@ -18352,9 +17579,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/sign/nosmoking_2, /turf/closed/wall/r_wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aEB" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -18363,9 +17588,7 @@ /turf/open/floor/plasteel/escape{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aEC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -18376,34 +17599,26 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aED" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aEE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aEF" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aEG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -18411,9 +17626,7 @@ /turf/open/floor/plasteel/yellow/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aEH" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -18426,9 +17639,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aEI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -18442,9 +17653,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aEJ" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -18453,9 +17662,7 @@ pixel_x = 24 }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aEK" = ( /obj/machinery/vending/clothing, /obj/machinery/firealarm{ @@ -18468,8 +17675,7 @@ /area/crew_quarters/dorms) "aEL" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/status_display{ pixel_y = -32 @@ -18605,16 +17811,12 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aEX" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/chips, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aEY" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -18752,17 +17954,13 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFj" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass{ @@ -18775,32 +17973,24 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aFk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aFl" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aFn" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aFo" = ( /obj/structure/extinguisher_cabinet, /turf/closed/wall/mineral/titanium/nodiagonal, @@ -18983,9 +18173,7 @@ /turf/open/floor/plasteel/arrival{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -19006,9 +18194,7 @@ icon_state = "2-4" }, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ @@ -19017,9 +18203,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFF" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -19031,9 +18215,7 @@ }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -19045,9 +18227,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -19058,9 +18238,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/yellow/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFI" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -19078,9 +18256,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -19094,9 +18270,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFK" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -19115,9 +18289,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFL" = ( /obj/machinery/firealarm{ dir = 4; @@ -19129,9 +18301,7 @@ dir = 8 }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -19155,9 +18325,7 @@ network = list("MINE") }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aFO" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/soda_cans/cola, @@ -19165,18 +18333,14 @@ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aFP" = ( /obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aFQ" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -19233,9 +18397,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFY" = ( /obj/machinery/holopad, /obj/effect/landmark/lightsout, @@ -19247,9 +18409,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aFZ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass{ @@ -19259,23 +18419,17 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aGa" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aGb" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aGc" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -19284,9 +18438,7 @@ name = "WARNING: EXTERNAL AIRLOCK" }, /turf/open/floor/plating, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aGd" = ( /obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/lavendergrass, @@ -19423,9 +18575,7 @@ /turf/open/floor/plasteel/arrival{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aGq" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -19438,9 +18588,7 @@ /turf/open/floor/plasteel/yellow/corner{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aGr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/light, @@ -19451,33 +18599,25 @@ /turf/open/floor/plasteel/yellow/corner{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aGs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/yellow/corner{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aGt" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, /turf/open/floor/plasteel/yellow/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aGu" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel/yellow/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aGv" = ( /obj/structure/table/reinforced, /obj/item/stock_parts/cell/high, @@ -19485,9 +18625,7 @@ /obj/machinery/cell_charger, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aGw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -19502,17 +18640,13 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aGx" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aGy" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall, @@ -19717,9 +18851,7 @@ icon_state = "2-8" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aGO" = ( /obj/item/reagent_containers/food/condiment/saltshaker{ pixel_x = -8; @@ -19734,9 +18866,7 @@ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aGP" = ( /obj/structure/chair/stool, /obj/effect/landmark/start/assistant, @@ -19744,9 +18874,7 @@ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aGQ" = ( /obj/machinery/holopad, /obj/item/device/radio/intercom{ @@ -19754,9 +18882,7 @@ pixel_x = 28 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aGR" = ( /obj/machinery/vending/dinnerware, /obj/machinery/button/door{ @@ -19846,23 +18972,21 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aGY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aHe" = ( /turf/open/floor/plasteel/vault{ dir = 1 @@ -19901,8 +19025,7 @@ req_access_txt = "10" }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -20259,9 +19382,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aHD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -20273,9 +19394,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aHE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -20288,9 +19407,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aHF" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -20461,9 +19578,7 @@ dir = 4 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aHS" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -20474,28 +19589,21 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aHT" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/coffee, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aHU" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/structure/sign/poster/random{ pixel_x = 32 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aHV" = ( /obj/machinery/status_display, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -20533,27 +19641,20 @@ /obj/item/pen, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aHZ" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aIa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aIb" = ( /obj/structure/sign/radiation{ pixel_x = -32 @@ -20871,9 +19972,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aIA" = ( /obj/machinery/airalarm{ dir = 8; @@ -20884,9 +19983,7 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aIB" = ( /turf/closed/wall, /area/janitor) @@ -21053,9 +20150,7 @@ }, /obj/structure/closet/crate/bin, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aIR" = ( /obj/structure/closet/secure_closet/freezer/meat, /obj/effect/turf_decal/bot, @@ -21143,9 +20238,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aIY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -21159,15 +20252,11 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aIZ" = ( /obj/machinery/ai_status_display, /turf/closed/wall, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aJa" = ( /obj/structure/table, /obj/item/storage/pill_bottle/dice, @@ -21180,20 +20269,14 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aJb" = ( /turf/open/floor/plasteel/escape, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aJc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/escape, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aJe" = ( /obj/machinery/door/airlock/shuttle{ name = "Emergency Shuttle Airlock"; @@ -21210,7 +20293,6 @@ "aJg" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -21457,8 +20539,8 @@ amount = 50 }, /obj/item/crowbar, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -21689,17 +20771,13 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aJX" = ( /obj/machinery/vending/cola, /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aJY" = ( /obj/structure/sign/nosmoking_2, /turf/closed/wall, @@ -21803,15 +20881,11 @@ /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aKh" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aKi" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -21824,9 +20898,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aKj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/plasticflaps{ @@ -21836,9 +20908,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aKl" = ( /obj/structure/cable/white{ d2 = 8; @@ -21847,9 +20917,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/vacuum, /turf/open/floor/plating, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aKm" = ( /obj/machinery/door/airlock/shuttle{ name = "Emergency Shuttle Cargo" @@ -22410,9 +21478,7 @@ pixel_y = -32 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aLg" = ( /obj/machinery/vending/snack, /obj/machinery/firealarm{ @@ -22426,9 +21492,7 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aLh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -22478,33 +21542,25 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aLn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aLt" = ( /turf/open/floor/plasteel/brown{ dir = 5 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aLu" = ( /obj/structure/fans/tiny, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aLv" = ( /obj/machinery/door/airlock/external{ name = "External Docking Port" @@ -22514,9 +21570,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aLw" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -22835,8 +21889,7 @@ icon_state = "1-4" }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/yellow/side{ dir = 4 @@ -23007,9 +22060,7 @@ dir = 8 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aMu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ @@ -23023,9 +22074,7 @@ icon_state = "2-4" }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aMv" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -23076,44 +22125,33 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aMz" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/brown{ dir = 8 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aMA" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aMB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, /obj/effect/landmark/lightsout, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aMC" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/brown{ dir = 4 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aMD" = ( /obj/machinery/recharge_station, /obj/machinery/status_display{ @@ -23478,18 +22516,14 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aNi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/newscaster{ pixel_x = 32 }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aNj" = ( /obj/structure/reagent_dispensers/watertank, /obj/item/reagent_containers/glass/bucket, @@ -23650,9 +22684,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aNz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass{ @@ -23663,9 +22695,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "aNA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -23741,9 +22771,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aNG" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -23761,9 +22789,7 @@ /turf/open/floor/plasteel/brown{ dir = 8 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aNH" = ( /obj/structure/closet/crate, /obj/effect/decal/cleanable/dirt, @@ -23772,9 +22798,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aNI" = ( /obj/structure/closet/crate, /obj/item/device/radio/intercom{ @@ -23784,9 +22808,7 @@ /obj/machinery/light, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aNJ" = ( /obj/structure/closet/crate, /obj/effect/decal/cleanable/dirt, @@ -23795,9 +22817,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aNK" = ( /obj/structure/closet/crate, /obj/machinery/firealarm{ @@ -23806,9 +22826,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "aNL" = ( /obj/structure/table, /obj/item/clipboard, @@ -24113,8 +23131,7 @@ /area/hallway/primary/central) "aOm" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/redyellow/side{ dir = 9 @@ -24433,9 +23450,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aOP" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable/white{ @@ -24452,9 +23467,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aOQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -24468,9 +23481,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aOR" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -24488,9 +23499,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aOS" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -24503,9 +23512,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aOT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -24524,9 +23531,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aOU" = ( /obj/machinery/door/firedoor, /obj/effect/landmark/lightsout, @@ -24540,9 +23545,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aOV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -24562,9 +23565,7 @@ /turf/open/floor/plasteel/green/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aOW" = ( /obj/machinery/light{ dir = 1 @@ -24589,9 +23590,7 @@ /turf/open/floor/plasteel/purple/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aOX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -24615,9 +23614,7 @@ /turf/open/floor/plasteel/green/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aOY" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable/white{ @@ -24633,9 +23630,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aOZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -24651,9 +23646,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -24670,9 +23663,7 @@ /turf/open/floor/plasteel/green/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -24685,9 +23676,7 @@ /turf/open/floor/plasteel/blue/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -24704,9 +23693,7 @@ /turf/open/floor/plasteel/green/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPd" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -24975,9 +23962,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPv" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -24990,9 +23975,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -25006,9 +23989,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPx" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -25024,17 +24005,13 @@ icon_state = "2-8" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPy" = ( /obj/structure/table, /obj/item/storage/briefcase, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPz" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -25276,13 +24253,10 @@ /turf/open/floor/plasteel/vault{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPX" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -25295,18 +24269,14 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPY" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /turf/open/floor/plasteel/neutral/corner{ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aPZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -25321,9 +24291,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -25335,18 +24303,14 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQb" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/neutral/corner{ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQc" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -25356,9 +24320,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -25367,9 +24329,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQe" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -25378,9 +24338,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQf" = ( /obj/machinery/firealarm{ dir = 1; @@ -25393,9 +24351,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -25403,9 +24359,7 @@ /turf/open/floor/plasteel/yellow/corner{ dir = 8 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQh" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -25540,9 +24494,7 @@ "aQw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/purple/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQx" = ( /obj/machinery/firealarm{ dir = 1; @@ -25553,9 +24505,7 @@ }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -25567,9 +24517,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQz" = ( /obj/structure/sign/securearea{ pixel_y = -32 @@ -25579,13 +24527,10 @@ dir = 9 }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQA" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/newscaster{ pixel_y = -32 @@ -25596,9 +24541,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "aQB" = ( /obj/structure/table/wood, /obj/item/crowbar/red, @@ -25836,10 +24779,7 @@ /turf/open/floor/plasteel, /area/library) "aRa" = ( -/obj/structure/sign/kiddieplaque{ - desc = "A long list of rules to be followed when in the library, extolling the virtues of being quiet at all times and threatening those who would dare eat hot food inside."; - name = "Library Rules Sign" - }, +/obj/structure/sign/kiddieplaque/library, /turf/closed/wall, /area/library) "aRb" = ( @@ -26414,8 +25354,7 @@ icon_state = "0-2" }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/camera{ c_tag = "Chemistry"; @@ -26427,9 +25366,6 @@ }, /area/medical/chemistry) "aSl" = ( -/obj/machinery/chem_master{ - density = 0 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -26978,6 +25914,7 @@ /area/medical/chemistry) "aTt" = ( /obj/effect/turf_decal/stripes/line, +/obj/machinery/chem_master, /turf/open/floor/plasteel, /area/medical/chemistry) "aTu" = ( @@ -28214,6 +27151,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, +/obj/structure/closet/l3closet, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -28650,7 +27588,6 @@ "aWR" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -28921,8 +27858,7 @@ /area/medical/medbay/zone3) "aXu" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/button/door{ desc = "A remote control switch for the medbay foyer."; @@ -29445,8 +28381,7 @@ /area/science/research) "aYp" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/structure/extinguisher_cabinet{ pixel_x = 24 @@ -30759,7 +29694,7 @@ /turf/open/floor/plasteel/red/side{ dir = 9 }, -/area/hallway/primary/central) +/area/security/checkpoint) "baJ" = ( /obj/structure/cable/white{ d1 = 1; @@ -30772,7 +29707,7 @@ /turf/open/floor/plasteel/red/side{ dir = 1 }, -/area/hallway/primary/central) +/area/security/checkpoint) "baK" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law, @@ -30783,7 +29718,7 @@ /turf/open/floor/plasteel/red/side{ dir = 5 }, -/area/hallway/primary/central) +/area/security/checkpoint) "baL" = ( /obj/machinery/light{ dir = 8 @@ -31154,8 +30089,7 @@ /area/medical/medbay/zone3) "bbs" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/whiteblue/corner, /area/medical/medbay/zone3) @@ -31209,7 +30143,7 @@ }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/security/checkpoint) "bby" = ( /obj/machinery/light_switch{ pixel_x = -26; @@ -31221,7 +30155,7 @@ /turf/open/floor/plasteel/red/side{ dir = 8 }, -/area/hallway/primary/central) +/area/security/checkpoint) "bbz" = ( /obj/structure/cable/white{ d1 = 1; @@ -31239,16 +30173,16 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/security/checkpoint) "bbA" = ( /obj/structure/cable/white{ d2 = 8; icon_state = "0-8" }, /obj/machinery/power/apc{ + areastring = "/area/security/checkpoint"; dir = 4; name = "Security Checkpoint APC"; - areastring = "/area/hallway/primary/central"; pixel_x = 26 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -31257,7 +30191,7 @@ /turf/open/floor/plasteel/red/side{ dir = 4 }, -/area/hallway/primary/central) +/area/security/checkpoint) "bbB" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -31636,7 +30570,7 @@ icon_state = "0-2" }, /turf/open/floor/plating, -/area/hallway/primary/central) +/area/security/checkpoint) "bcn" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -31644,7 +30578,7 @@ /turf/open/floor/plasteel/red/side{ dir = 8 }, -/area/hallway/primary/central) +/area/security/checkpoint) "bco" = ( /obj/structure/cable/white{ d1 = 1; @@ -31652,7 +30586,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central) +/area/security/checkpoint) "bcp" = ( /obj/machinery/status_display{ pixel_x = 32 @@ -31661,7 +30595,7 @@ /turf/open/floor/plasteel/red/side{ dir = 6 }, -/area/hallway/primary/central) +/area/security/checkpoint) "bcq" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -32001,7 +30935,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/security/checkpoint) "bde" = ( /obj/structure/cable/white{ d1 = 4; @@ -32020,7 +30954,7 @@ /turf/open/floor/plasteel/red/side{ dir = 8 }, -/area/hallway/primary/central) +/area/security/checkpoint) "bdf" = ( /obj/structure/cable/white{ d1 = 1; @@ -32041,7 +30975,7 @@ icon_state = "1-4" }, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central) +/area/security/checkpoint) "bdg" = ( /obj/machinery/computer/security, /obj/machinery/light{ @@ -32053,7 +30987,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/red, -/area/hallway/primary/central) +/area/security/checkpoint) "bdh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/white{ @@ -32061,7 +30995,7 @@ icon_state = "0-8" }, /turf/open/floor/plating, -/area/hallway/primary/central) +/area/security/checkpoint) "bdi" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -32549,14 +31483,14 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/white, /turf/open/floor/plating, -/area/hallway/primary/central) +/area/security/checkpoint) "bec" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, /turf/open/floor/plasteel/red/side{ dir = 8 }, -/area/hallway/primary/central) +/area/security/checkpoint) "bed" = ( /obj/structure/cable/white{ d1 = 1; @@ -32565,7 +31499,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/neutral, -/area/hallway/primary/central) +/area/security/checkpoint) "bee" = ( /obj/machinery/computer/secure_data, /obj/machinery/ai_status_display{ @@ -32574,7 +31508,7 @@ /turf/open/floor/plasteel/red/side{ dir = 5 }, -/area/hallway/primary/central) +/area/security/checkpoint) "bef" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -32883,7 +31817,7 @@ /turf/open/floor/plasteel/red/side{ dir = 10 }, -/area/hallway/primary/central) +/area/security/checkpoint) "beI" = ( /obj/structure/cable/white{ d1 = 1; @@ -32892,7 +31826,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/red/side, -/area/hallway/primary/central) +/area/security/checkpoint) "beJ" = ( /obj/structure/closet/secure_closet/security, /obj/machinery/airalarm{ @@ -32906,7 +31840,7 @@ /turf/open/floor/plasteel/red/side{ dir = 6 }, -/area/hallway/primary/central) +/area/security/checkpoint) "beK" = ( /obj/machinery/firealarm{ dir = 4; @@ -33087,6 +32021,8 @@ /area/maintenance/port) "beX" = ( /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -33200,7 +32136,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/security/checkpoint) "bfg" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -33831,10 +32767,7 @@ /area/chapel/main) "bgb" = ( /obj/structure/bookcase, -/obj/structure/sign/atmosplaque{ - desc = "A plaque commemorating the fallen, may they rest in peace, forever asleep amongst the stars. Someone has drawn a picture of a crying badger at the bottom."; - icon_state = "kiddieplaque"; - name = "Remembrance Plaque"; +/obj/structure/sign/kiddieplaque/badger{ pixel_y = 32 }, /obj/machinery/light/small{ @@ -34033,7 +32966,6 @@ "bgy" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -34700,7 +33632,6 @@ "bhL" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -34788,7 +33719,6 @@ "bhU" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -34865,10 +33795,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/structure/sign/atmosplaque{ - desc = "A plaque commemorating the fallen, may they rest in peace, forever asleep amongst the stars. Someone has drawn a picture of a crying badger at the bottom."; - icon_state = "kiddieplaque"; - name = "Remembrance Plaque"; +/obj/structure/sign/kiddieplaque/badger{ pixel_y = 32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -35707,6 +34634,7 @@ /turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "bjG" = ( +/obj/structure/closet/l3closet/scientist, /turf/open/floor/plasteel/whitepurple/side{ dir = 6 }, @@ -36036,15 +34964,12 @@ /area/shuttle/arrival) "bkd" = ( /obj/effect/turf_decal/delivery, +/obj/structure/closet/wardrobe/mixed, /turf/open/floor/plasteel, /area/shuttle/arrival) "bke" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/emergency, -/obj/machinery/camera{ - c_tag = "Arrivals Suttle 1"; - network = list("Labor") - }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/shuttle/arrival) @@ -36119,6 +35044,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/shuttle/arrival) "bkn" = ( @@ -36138,7 +35066,6 @@ "bkq" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -36159,7 +35086,6 @@ "bks" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -36249,7 +35175,6 @@ "bkE" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -36271,7 +35196,6 @@ "bkH" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -36297,7 +35221,6 @@ "bkK" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -36319,19 +35242,18 @@ /turf/open/floor/plasteel, /area/shuttle/arrival) "bkN" = ( +/obj/structure/closet/wardrobe/black, /turf/open/floor/plasteel/neutral/side, /area/shuttle/arrival) "bkO" = ( +/obj/structure/closet/wardrobe/grey, /turf/open/floor/plasteel/blue/corner, /area/shuttle/arrival) "bkP" = ( /turf/open/floor/plasteel/blue/side, /area/shuttle/arrival) "bkQ" = ( -/obj/machinery/camera{ - c_tag = "Arrivals Shuttle 2"; - dir = 1 - }, +/obj/structure/closet/wardrobe/yellow, /turf/open/floor/plasteel/blue/corner{ dir = 8 }, @@ -36360,10 +35282,16 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/arrival) "bkU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, /obj/machinery/door/airlock/shuttle{ name = "Arrival Shuttle Airlock"; req_access_txt = "0" }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/shuttle/arrival) "bkV" = ( @@ -36445,9 +35373,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "blg" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -36460,9 +35386,7 @@ dir = 2 }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "blh" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -36476,9 +35400,7 @@ network = list("SS13") }, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "bli" = ( /obj/structure/closet/firecloset, /obj/machinery/camera{ @@ -36488,9 +35410,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "blj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -36505,9 +35425,7 @@ dir = 1 }, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "blk" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank 3"; @@ -36534,9 +35452,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "blm" = ( /obj/structure/closet/emcloset, /obj/machinery/camera{ @@ -36546,9 +35462,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "bln" = ( /obj/structure/cable/white{ d1 = 1; @@ -36580,14 +35494,14 @@ network = list("SS13") }, /obj/structure/cable/white{ + d1 = 2; + d2 = 8; icon_state = "2-8" }, /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "blp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ @@ -36767,6 +35681,7 @@ id = "chapelmassdoor"; name = "Chapel Launcher Door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/chapel/main) "blJ" = ( @@ -36795,17 +35710,13 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "blM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "blN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -36814,9 +35725,7 @@ icon_state = "plant-22" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "blO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -36825,26 +35734,19 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "blU" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "blX" = ( /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "blY" = ( /obj/machinery/door/airlock/glass{ name = "Departure Lounge" @@ -36853,37 +35755,26 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "blZ" = ( /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bmb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bmh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bmw" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bmx" = ( /turf/closed/wall, /area/space) @@ -36901,9 +35792,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bmD" = ( /turf/open/floor/plasteel, /area/space) @@ -36915,9 +35804,7 @@ icon_state = "plant-22" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bmH" = ( /turf/open/floor/plasteel, /area/space) @@ -38423,9 +37310,7 @@ /turf/open/floor/plasteel/escape{ dir = 1 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsw" = ( /obj/structure/chair{ dir = 4 @@ -38438,9 +37323,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsx" = ( /obj/structure/chair{ dir = 4 @@ -38457,9 +37340,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsy" = ( /obj/structure/chair{ dir = 4 @@ -38467,12 +37348,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/bot, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -38491,9 +37372,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 4 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "bsA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -38504,9 +37383,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "bsB" = ( /obj/machinery/door/airlock/glass{ name = "Departure Lounge" @@ -38523,9 +37400,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -38536,16 +37411,13 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/structure/cable/white{ d1 = 4; @@ -38553,9 +37425,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsE" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/machinery/light, @@ -38565,53 +37435,51 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -38626,31 +37494,29 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsL" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -38666,9 +37532,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsN" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass{ @@ -38686,9 +37550,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -38700,9 +37562,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsP" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -38713,9 +37573,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsQ" = ( /obj/structure/chair{ dir = 4 @@ -38735,9 +37593,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -38746,9 +37602,7 @@ icon_state = "2-8" }, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsS" = ( /obj/structure/cable/white{ d1 = 1; @@ -38756,9 +37610,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -38767,11 +37619,11 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/neutral, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsU" = ( /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel, @@ -38784,11 +37636,11 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/escape, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsW" = ( /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/plasteel, @@ -38809,9 +37661,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsY" = ( /obj/structure/cable/white{ d1 = 1; @@ -38819,9 +37669,7 @@ icon_state = "1-4" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bsZ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass_mining{ @@ -38834,9 +37682,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bta" = ( /obj/structure/cable/white{ d1 = 4; @@ -38846,9 +37692,7 @@ /turf/open/floor/plasteel/brown{ dir = 9 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "btb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -38861,9 +37705,7 @@ /turf/open/floor/plasteel/brown{ dir = 1 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "btc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -38875,9 +37717,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "btd" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -38888,9 +37728,7 @@ /turf/open/floor/plasteel/brown{ dir = 1 }, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bte" = ( /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/grille, @@ -38921,7 +37759,7 @@ dir = 2; dwidth = 4; height = 17; - name = "delta arrivals shuttle"; + name = "omega arrivals shuttle"; width = 9 }, /obj/docking_port/stationary{ @@ -38929,7 +37767,7 @@ dwidth = 4; height = 17; id = "arrivals_stationary"; - name = "delta arrivals"; + name = "omega arrivals"; width = 9 }, /turf/closed/wall/mineral/plastitanium, @@ -38965,9 +37803,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/entry{ - name = "Arrivals" - }) +/area/hallway/secondary/entry) "btn" = ( /obj/machinery/door/airlock/external{ cyclelinkeddir = 8; @@ -38977,9 +37813,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/entry{ - name = "Arrivals" - }) +/area/hallway/secondary/entry) "bto" = ( /obj/machinery/computer/secure_data/syndie, /turf/open/floor/plasteel/vault{ @@ -40207,10 +39041,13 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/landmark/event_spawn, +/obj/structure/cable/white{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/open/floor/plating, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/maintenance/starboard/fore) "bxx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -40243,9 +39080,7 @@ /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "bxA" = ( /obj/structure/cable/white{ d1 = 1; @@ -40287,9 +39122,7 @@ /turf/open/floor/plasteel/red/corner{ dir = 1 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "bxE" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -40311,9 +39144,7 @@ }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "bxH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, @@ -40344,15 +39175,11 @@ "bxL" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "bxM" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, -/area/hallway/secondary/exit{ - name = "\improper Departure Lounge" - }) +/area/hallway/secondary/exit) "bxN" = ( /obj/structure/cable/white{ d1 = 4; @@ -40368,16 +39195,12 @@ "bxO" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/redyellow, -/area/crew_quarters/bar{ - name = "Atrium" - }) +/area/crew_quarters/bar/atrium) "bxP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/neutral/corner, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "bxQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -40387,9 +39210,7 @@ dir = 8; heat_capacity = 1e+006 }, -/area/hallway/primary/central{ - name = "Primary Hallway" - }) +/area/hallway/primary/central) "bxR" = ( /obj/structure/cable/white{ d1 = 1; @@ -40458,6 +39279,157 @@ heat_capacity = 1e+006 }, /area/hallway/secondary/entry) +"bxZ" = ( +/turf/closed/wall, +/area/maintenance/starboard/fore) +"bya" = ( +/turf/closed/wall, +/area/maintenance/starboard/fore) +"byb" = ( +/turf/closed/wall, +/area/maintenance/starboard/fore) +"byc" = ( +/turf/closed/wall, +/area/maintenance/starboard/fore) +"byd" = ( +/turf/closed/wall, +/area/maintenance/starboard/fore) +"bye" = ( +/turf/closed/wall, +/area/maintenance/fore) +"byf" = ( +/obj/structure/sign/vacuum, +/turf/closed/wall, +/area/maintenance/starboard/fore) +"byg" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) +"byh" = ( +/obj/structure/sign/vacuum, +/turf/closed/wall, +/area/maintenance/starboard/fore) +"byi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) +"byj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) +"byk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/landmark/xeno_spawn, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) +"byl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) +"bym" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/open/floor/plasteel/neutral/corner{ + dir = 8; + heat_capacity = 1e+006 + }, +/area/maintenance/starboard/fore) +"byn" = ( +/obj/structure/closet/wardrobe/grey, +/turf/open/floor/plasteel/neutral, +/area/shuttle/arrival) +"byo" = ( +/turf/closed/wall, +/area/security/checkpoint) +"byp" = ( +/turf/closed/wall, +/area/security/checkpoint) +"byq" = ( +/obj/structure/cable/white{ + d2 = 2; + icon_state = "0-2" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/checkpoint) +"byr" = ( +/turf/closed/wall, +/area/security/checkpoint) +"bys" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall, +/area/security/checkpoint) +"byt" = ( +/turf/closed/wall, +/area/security/checkpoint) +"byu" = ( +/turf/closed/wall, +/area/security/checkpoint) +"byv" = ( +/turf/closed/wall, +/area/security/checkpoint) +"byw" = ( +/turf/closed/wall, +/area/security/checkpoint) +"byx" = ( +/turf/closed/wall, +/area/security/checkpoint) +"byy" = ( +/turf/closed/wall, +/area/security/checkpoint) +"byz" = ( +/turf/closed/wall, +/area/security/checkpoint) +"byA" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall, +/area/security/checkpoint) +"byB" = ( +/turf/closed/wall, +/area/security/checkpoint) +"byC" = ( +/turf/closed/wall, +/area/security/checkpoint) +"byD" = ( +/turf/closed/wall, +/area/security/checkpoint) (1,1,1) = {" aaa @@ -78317,7 +77289,7 @@ aad aad aad aad -abt +bye abW acN adF @@ -79902,7 +78874,7 @@ aMo aNs aHM aPd -aQh +aQc aRf aSk aTr @@ -80159,7 +79131,7 @@ aMp aNt aOi aPe -aQi +aQg aRh aSl aTs @@ -80672,8 +79644,8 @@ aLc aMr aNv aOh -aPg -aQi +aPb +aQg aRj aSn aTu @@ -81186,10 +80158,10 @@ aLe aHM aNx aOh -aPg +aPb aQl aRk -aSo +anH aTw aTw aTw @@ -81442,11 +80414,11 @@ asg ase ara ara -aOl +all aPi aQm -aRl -aSp +aIz +awO aTx aTx aVo @@ -81702,26 +80674,26 @@ arb aOm aPj aQn -aRm -aSq +amg +aIZ aTy aUx aVp aUx aWP -aSs +aDc aYc aYW -aXv -aXv +byo +byo bbx bcm bdd beb -aXv -aZT +byo +bys bfK -bgg +aQd bgT bhG bxY @@ -81959,26 +80931,26 @@ aNy aOn aPk aQo -aRm -aSr +amg +anQ aTz aUy aUy aUy aWQ -aXv +abt aYc aYW -aXv +byo baI bby bcn bde bec beH -aXv +byo bfK -bgg +aQd bgU bhH bix @@ -82216,17 +81188,17 @@ ard aOo aPl aQp -aRn -aSr +ami +anQ aTA aUy aVq aUy aWR -aXv +abt aYd bls -aZS +byq baJ bbz bco @@ -82473,26 +81445,26 @@ aNz aOp aPm aQq -aRo -aSr +amk +anQ aTB aUy aUy aUy aWS -aXv +abt aYe aYW -aXv +byo baK bbA bcp bdg bee beJ -aXv +byo bfK -bgi +avV bgU bhH bix @@ -82514,7 +81486,7 @@ bko bkQ bkV bla -blz +bld bkb aaa aaa @@ -82730,26 +81702,26 @@ arf aOq aPn aQr -aRo -aSs +amk +aDc aTC aUz aVr aUz aWT -aSq +aIZ aYc aYW -aZT -aXv -aXv -aXv +bys +byo +byo +byo bdh -aXv -aXv -aXv +byo +byo +byo bfM -bgi +avV bgV bhG biw @@ -82768,7 +81740,7 @@ bko bko bko bko -bkN +byn bka bka bkb @@ -82987,8 +81959,8 @@ ara aOr aPo aQs -aRp -aSo +aCM +anH aTD aTD aVs @@ -83001,12 +81973,12 @@ aTD baL aTD bcq -bdi +aED aTD -bdi +aED aTD -bfN -bgj +aFG +aGx bgR bhJ biy @@ -83220,7 +82192,7 @@ aoT apZ ara ara -atk +ara auf avk awp @@ -83241,7 +82213,7 @@ aJY aLh aMv ayP -aOs +ayV aPp aQt blp @@ -83263,7 +82235,7 @@ bef beK bfg bfO -bgk +anc bgW bhK biz @@ -83274,14 +82246,14 @@ aaa bjO bjZ bka -bka +bkm bka bkb bkb bkb bkb bkG -bka +bkm bka bka aaa @@ -83518,8 +82490,8 @@ bcs bdk aZa beL -bfh -aOs +aHE +ayV bgl bgX bhL @@ -83996,7 +82968,7 @@ aui avn aws axa -atk +ara ayP azM aAT @@ -84253,7 +83225,7 @@ auj avo awt axb -atk +ara ayQ azN aAU @@ -84510,7 +83482,7 @@ auk avp awu axc -atk +ara ayR azO aAV @@ -84528,7 +83500,7 @@ aCe aNB ayP aPd -aQh +aQc aRr aSx aTJ @@ -84767,7 +83739,7 @@ aul avq awv axd -atk +ara ayS azP aso @@ -85555,7 +84527,7 @@ abt abt abt abt -aPv +aPp avU aRv aSB @@ -86026,18 +84998,18 @@ aad aad aad aad -abt +bxZ abL acu adm bxw -adm +bym afB agu ahj adY aiH -ajG +alz akK alz amu @@ -86283,9 +85255,9 @@ aad aad aad aad -abt +bxZ abM -acv +byi adn adn adn @@ -86540,9 +85512,9 @@ aad aad aad aad -abt -abN -acw +bxZ +byf +byj adn adZ aeP @@ -86797,9 +85769,9 @@ aac aad aad aad -abt -abO -acx +bxZ +byg +byk adn aea aeQ @@ -87054,9 +86026,9 @@ aad aad aad aad -abt -abN -acy +bxZ +byf +byl adn aeb aeR @@ -87332,7 +86304,7 @@ ape aqm abt abN -atu +acw abt aad aad diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index d11b0d9352..9ac324de33 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2168,9 +2168,7 @@ /turf/open/floor/plasteel/black, /area/ai_monitored/turret_protected/aisat_interior) "afe" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-09"; - name = "Photosynthetic Potted plant"; +/obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 }, /obj/structure/cable/yellow{ @@ -2198,9 +2196,7 @@ }, /area/ai_monitored/turret_protected/aisat_interior) "afg" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-09"; - name = "Photosynthetic Potted plant"; +/obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 }, /obj/structure/cable/yellow{ @@ -3033,13 +3029,8 @@ /area/security/main) "ahh" = ( /obj/structure/lattice/catwalk, -/obj/structure/showcase{ - density = 0; - desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; +/obj/structure/showcase/cyborg/old{ dir = 2; - icon = 'icons/mob/robots.dmi'; - icon_state = "robot_old"; - name = "Cyborg Statue"; pixel_y = 20 }, /turf/open/space, @@ -4074,8 +4065,6 @@ "ajo" = ( /obj/machinery/vending/coffee, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/red/side{ @@ -4413,8 +4402,6 @@ /obj/structure/table/wood, /obj/machinery/recharger, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/machinery/light{ @@ -4715,9 +4702,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/whitered/side{ dir = 5 }, @@ -6582,8 +6567,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = -32 }, /turf/open/floor/mineral/titanium/blue, @@ -6596,8 +6579,6 @@ dir = 8 }, /obj/machinery/status_display{ - density = 0; - layer = 3; pixel_x = 32 }, /turf/open/floor/mineral/titanium/blue, @@ -7483,12 +7464,9 @@ d2 = 8; icon_state = "0-8" }, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "bridgespace"; - name = "bridge external shutters"; - opacity = 0 + name = "bridge external shutters" }, /turf/open/floor/plating, /area/bridge) @@ -7947,8 +7925,6 @@ /area/bridge) "arK" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/item/folder/yellow{ @@ -9402,22 +9378,16 @@ /turf/open/floor/plating, /area/maintenance/fore) "auK" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "bridgespace"; - name = "bridge external shutters"; - opacity = 0 + name = "bridge external shutters" }, /turf/open/floor/plasteel/black, /area/bridge) "auL" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "bridgespace"; - name = "bridge external shutters"; - opacity = 0 + name = "bridge external shutters" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/black, @@ -10202,8 +10172,6 @@ dir = 4 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/arrival{ @@ -10237,8 +10205,7 @@ /area/crew_quarters/fitness/recreation) "awC" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-05"; - layer = 4.1 + icon_state = "plant-05" }, /obj/machinery/power/apc{ dir = 1; @@ -10560,12 +10527,9 @@ /area/bridge) "axf" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "bridgespace"; - name = "bridge external shutters"; - opacity = 0 + name = "bridge external shutters" }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -10725,8 +10689,7 @@ /area/security/brig) "axF" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel, /area/hallway/primary/fore) @@ -10921,12 +10884,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "bridgespace"; - name = "bridge external shutters"; - opacity = 0 + name = "bridge external shutters" }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -11951,8 +11911,7 @@ /area/hallway/primary/fore) "aAo" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-14"; - layer = 4.1 + icon_state = "plant-14" }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -12292,7 +12251,6 @@ }, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-20"; - layer = 4.1; pixel_y = 3 }, /turf/open/floor/plasteel/black, @@ -12484,8 +12442,6 @@ /area/crew_quarters/heads/hop) "aBF" = ( /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /obj/structure/bed/dogbed/ian, @@ -12632,8 +12588,7 @@ /area/crew_quarters/fitness/recreation) "aBY" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-05"; - layer = 4.1 + icon_state = "plant-05" }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) @@ -12744,7 +12699,6 @@ /obj/structure/table/wood, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-18"; - layer = 4.1; pixel_y = 12 }, /turf/open/floor/plasteel/grimy, @@ -13835,9 +13789,7 @@ pixel_x = -1; pixel_y = 9 }, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_y = 0 - }, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ pixel_x = 7; pixel_y = 2 @@ -14057,8 +14009,7 @@ /area/crew_quarters/heads/hop) "aEM" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-24"; - layer = 4.1 + icon_state = "plant-24" }, /obj/structure/cable{ d1 = 1; @@ -14382,13 +14333,10 @@ name = "Reception Window"; req_access_txt = "0" }, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "hop"; layer = 3.1; - name = "privacy shutters"; - opacity = 0 + name = "privacy shutters" }, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) @@ -14693,13 +14641,8 @@ }, /area/crew_quarters/heads/captain) "aGn" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-09"; - layer = 3.1; - light_color = "#2cb2e8"; - light_range = 3; - name = "Photosynthetic Potted plant"; - pixel_y = 0 +/obj/item/twohanded/required/kirbyplants/photosynthetic{ + layer = 3.1 }, /obj/structure/window/reinforced/fulltile, /turf/open/floor/plating, @@ -14979,7 +14922,6 @@ "aHa" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_y = 3 }, /turf/open/floor/plasteel/vault{ @@ -15715,8 +15657,6 @@ "aID" = ( /obj/structure/chair, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 30 }, /turf/open/floor/plasteel/red/side{ @@ -16589,8 +16529,7 @@ /area/hallway/primary/central) "aKg" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-04"; - layer = 4.1 + icon_state = "plant-04" }, /turf/open/floor/plasteel/white/corner{ tag = "icon-whitecorner (EAST)"; @@ -16963,6 +16902,7 @@ id = "trash"; name = "disposal bay door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/maintenance/disposal) "aLo" = ( @@ -17246,8 +17186,7 @@ pixel_y = 22 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-14"; - layer = 4.1 + icon_state = "plant-14" }, /turf/open/floor/plasteel, /area/teleporter) @@ -17382,8 +17321,6 @@ }, /obj/effect/spawner/lootdrop/maintenance, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 30; supply_display = 1 }, @@ -17426,9 +17363,7 @@ dir = 4; id = "packageSort2" }, -/obj/structure/plasticflaps{ - opacity = 0 - }, +/obj/structure/plasticflaps, /obj/machinery/light/small{ dir = 1 }, @@ -17647,8 +17582,7 @@ /area/shuttle/escape) "aMK" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel/escape{ dir = 9 @@ -17689,7 +17623,6 @@ "aMP" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_y = 3 }, /obj/structure/extinguisher_cabinet{ @@ -18368,8 +18301,7 @@ /area/hallway/secondary/exit/departure_lounge) "aOr" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-16"; - layer = 4.1 + icon_state = "plant-16" }, /obj/machinery/firealarm{ dir = 1; @@ -20657,8 +20589,6 @@ id = "QMLoad" }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 30; supply_display = 1 }, @@ -21659,7 +21589,6 @@ id = "barshutters"; name = "Bar Lockdown"; pixel_x = 28; - pixel_y = 0; req_access_txt = "28" }, /obj/item/device/radio/intercom{ @@ -22363,8 +22292,7 @@ /area/hallway/secondary/exit/departure_lounge) "aWL" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-14"; - layer = 4.1 + icon_state = "plant-14" }, /turf/open/floor/plasteel/escape{ dir = 6 @@ -22766,7 +22694,6 @@ "aXD" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_y = 3 }, /turf/open/floor/plasteel/escape{ @@ -22782,8 +22709,7 @@ /area/hallway/secondary/exit/departure_lounge) "aXF" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /obj/structure/extinguisher_cabinet{ pixel_x = 27 @@ -22814,13 +22740,10 @@ name = "Security Checkpoint"; req_access_txt = "1" }, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "papersplease"; layer = 3.1; - name = "privacy shutters"; - opacity = 0 + name = "privacy shutters" }, /obj/item/folder/red, /obj/item/pen, @@ -22986,7 +22909,6 @@ /obj/structure/table/reinforced, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-18"; - layer = 4.1; pixel_y = 10 }, /turf/open/floor/plasteel/darkred/side{ @@ -23020,7 +22942,6 @@ /obj/structure/disposalpipe/segment, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-18"; - layer = 4.1; pixel_y = 10 }, /turf/open/floor/plasteel/darkred/side{ @@ -23380,8 +23301,7 @@ /area/crew_quarters/kitchen) "aYY" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-05"; - layer = 4.1 + icon_state = "plant-05" }, /turf/open/floor/plasteel/black, /area/crew_quarters/bar) @@ -24369,8 +24289,7 @@ /area/hydroponics) "bbd" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel/green/corner, /area/hydroponics) @@ -24699,13 +24618,10 @@ req_access_txt = "1" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; +/obj/machinery/door/poddoor/preopen{ id = "papersplease"; layer = 3.1; - name = "privacy shutters"; - opacity = 0 + name = "privacy shutters" }, /obj/item/crowbar, /obj/effect/turf_decal/delivery, @@ -26186,8 +26102,7 @@ /area/hallway/primary/central) "bfp" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/button/door{ id = "kitchenwindowshutters"; @@ -26270,8 +26185,6 @@ d2 = 2 }, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 30 }, /turf/open/floor/plasteel/black, @@ -26688,8 +26601,7 @@ /area/crew_quarters/bar) "bgv" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-14"; - layer = 4.1 + icon_state = "plant-14" }, /turf/open/floor/plasteel/neutral/corner{ dir = 4 @@ -27873,8 +27785,7 @@ /area/hallway/primary/central) "biQ" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-05"; - layer = 4.1 + icon_state = "plant-05" }, /turf/open/floor/plasteel/blue/side, /area/hallway/primary/central) @@ -27885,8 +27796,7 @@ dir = 1 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-05"; - layer = 4.1 + icon_state = "plant-05" }, /turf/open/floor/plasteel/blue/corner{ dir = 8 @@ -27979,8 +27889,7 @@ /area/medical/medbay/central) "bji" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel/blue/side, /area/hallway/primary/central) @@ -28004,8 +27913,7 @@ /area/hallway/primary/central) "bjn" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel/purple/side, /area/hallway/primary/central) @@ -28994,7 +28902,6 @@ "blM" = ( /obj/machinery/r_n_d/server/core, /obj/structure/sign/poster/random{ - pixel_x = 0; pixel_y = 32 }, /turf/open/floor/circuit/telecomms/server, @@ -29005,7 +28912,6 @@ light_color = "#c1caff" }, /obj/structure/sign/poster/random{ - pixel_x = 0; pixel_y = 32 }, /turf/open/floor/plasteel/black/telecomms/server/walkway, @@ -29013,7 +28919,6 @@ "blO" = ( /obj/machinery/r_n_d/server/robotics, /obj/structure/sign/poster/random{ - pixel_x = 0; pixel_y = 32 }, /turf/open/floor/circuit/telecomms/server, @@ -29070,10 +28975,7 @@ /turf/open/floor/engine, /area/science/explab) "blV" = ( -/obj/structure/sign/atmosplaque{ - desc = "A guide to the drone shell dispenser, detailing the constructive and destructive applications of modern repair drones, as well as the development of the incorruptible cyborg servants of tomorrow, available today."; - icon_state = "kiddieplaque"; - name = "\improper 'Perfect Drone' sign"; +/obj/structure/sign/kiddieplaque/perfect_drone{ pixel_y = 32 }, /turf/open/floor/engine, @@ -29339,8 +29241,7 @@ /area/security/checkpoint/medical) "bmw" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-05"; - layer = 4.1 + icon_state = "plant-05" }, /turf/open/floor/plasteel/whiteblue/corner{ dir = 8 @@ -29739,8 +29640,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/firealarm{ dir = 8; - pixel_x = 28; - pixel_y = 0 + pixel_x = 28 }, /obj/structure/table, /obj/item/storage/box/gloves{ @@ -29992,8 +29892,7 @@ /obj/item/device/radio/intercom{ dir = 0; name = "Station Intercom (General)"; - pixel_x = -28; - pixel_y = 0 + pixel_x = -28 }, /turf/open/floor/plasteel/whitepurple/side{ dir = 1 @@ -30313,8 +30212,7 @@ }, /obj/machinery/light, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -30569,8 +30467,7 @@ frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; - pixel_x = -30; - pixel_y = 0 + pixel_x = -30 }, /turf/open/floor/plasteel/blue, /area/medical/genetics) @@ -30845,8 +30742,7 @@ "bqa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/sign/directions/engineering{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /turf/open/floor/plasteel/yellow/corner{ dir = 4 @@ -31515,10 +31411,7 @@ }, /area/medical/medbay/central) "brj" = ( -/obj/machinery/chem_master{ - layer = 2.7; - pixel_x = -2 - }, +/obj/machinery/chem_master, /turf/open/floor/plasteel/whiteyellow/side{ dir = 9 }, @@ -31544,10 +31437,7 @@ }, /area/medical/chemistry) "brm" = ( -/obj/machinery/chem_master{ - layer = 2.7; - pixel_x = -2 - }, +/obj/machinery/chem_master, /obj/machinery/button/door{ id = "chemistry_shutters"; name = "Shutters Control"; @@ -33080,9 +32970,7 @@ /area/science/robotics/lab) "buw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-07"; - name = "Photosynthetic Potted plant"; +/obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 }, /turf/open/floor/plasteel/darkpurple/side{ @@ -33099,9 +32987,7 @@ /turf/open/floor/plasteel/black, /area/science/server) "buy" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-07"; - name = "Photosynthetic Potted plant"; +/obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 }, /turf/open/floor/plasteel/darkpurple/side{ @@ -33144,8 +33030,7 @@ dir = 8 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-14"; - layer = 4.1 + icon_state = "plant-14" }, /turf/open/floor/plasteel/white, /area/science/xenobiology) @@ -33817,7 +33702,6 @@ dir = 1 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 0; pixel_y = 30 }, /turf/open/floor/plasteel/darkpurple/side{ @@ -33860,8 +33744,7 @@ /area/science/research) "bvU" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-18"; - layer = 4.1 + icon_state = "plant-18" }, /turf/open/floor/plasteel/darkpurple/side{ dir = 1 @@ -34303,9 +34186,7 @@ dir = 4 }, /obj/structure/bed/roller, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/whiteblue/corner, /area/medical/medbay/central) "bwQ" = ( @@ -35497,9 +35378,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-09"; - name = "Photosynthetic Potted plant"; +/obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -35875,8 +35754,7 @@ dir = 8; name = "Monastery Monitor"; network = list("Monastery"); - pixel_x = 28; - pixel_y = 0 + pixel_x = 28 }, /turf/open/floor/plasteel/black, /area/hallway/secondary/entry) @@ -35973,8 +35851,7 @@ dir = 5 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel/whitegreen/side, /area/medical/medbay/zone3) @@ -36120,8 +35997,7 @@ /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, /obj/machinery/keycard_auth{ - pixel_x = 26; - pixel_y = 0 + pixel_x = 26 }, /turf/open/floor/plasteel/cmo, /area/crew_quarters/heads/cmo) @@ -36774,7 +36650,6 @@ "bBB" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-20"; - layer = 4.1; pixel_y = 3 }, /turf/open/floor/plasteel/vault{ @@ -38209,8 +38084,7 @@ /area/crew_quarters/heads/cmo) "bEH" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-16"; - layer = 4.1 + icon_state = "plant-16" }, /turf/open/floor/plasteel/cmo, /area/crew_quarters/heads/cmo) @@ -38329,8 +38203,7 @@ /area/hallway/primary/aft) "bEQ" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-03"; - layer = 4.1 + icon_state = "plant-03" }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -38374,7 +38247,6 @@ /obj/item/pen, /obj/item/stamp/rd, /obj/machinery/status_display{ - density = 0; pixel_y = -30; supply_display = 0 }, @@ -39403,8 +39275,6 @@ "bHc" = ( /obj/machinery/computer/med_data, /obj/machinery/status_display{ - density = 0; - layer = 4; pixel_y = 32 }, /turf/open/floor/plasteel/freezer, @@ -39616,7 +39486,6 @@ /obj/machinery/button/door{ id = "toxvent"; name = "Aft Vent Control"; - pixel_x = 0; pixel_y = -24; req_access_txt = "0"; req_one_access_txt = "8;24" @@ -39814,7 +39683,6 @@ frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; - pixel_x = 0; pixel_y = 28 }, /turf/open/floor/plasteel/whitegreen/side{ @@ -40613,7 +40481,6 @@ }, /obj/machinery/space_heater, /obj/structure/sign/poster/random{ - pixel_x = 0; pixel_y = -32 }, /turf/open/floor/plasteel/green/side, @@ -40634,7 +40501,6 @@ pixel_x = 32 }, /obj/structure/sign/poster/random{ - pixel_x = 0; pixel_y = -32 }, /turf/open/floor/plasteel/green/side{ @@ -40984,9 +40850,7 @@ /area/medical/medbay/central) "bKB" = ( /obj/structure/bed/roller, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/freezer, /area/medical/surgery) "bKC" = ( @@ -41563,8 +41427,7 @@ /area/hallway/primary/aft) "bLT" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "applebush"; - layer = 4.1 + icon_state = "applebush" }, /obj/machinery/airalarm{ pixel_y = 22 @@ -41781,6 +41644,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/science/mineral_storeroom) "bMr" = ( @@ -41912,7 +41776,6 @@ }, /obj/item/storage/box/syringes, /obj/structure/reagent_dispensers/virusfood{ - density = 0; pixel_x = 32 }, /obj/item/reagent_containers/spray/cleaner, @@ -45906,7 +45769,7 @@ /area/storage/tech) "bVL" = ( /obj/structure/table, -/obj/item/storage/box/metalfoam{ +/obj/item/storage/box/smart_metal_foam{ pixel_x = 4; pixel_y = 7 }, @@ -46907,7 +46770,6 @@ dir = 1; name = "Auxillary Base Monitor"; network = list("AuxBase"); - pixel_x = 0; pixel_y = -28 }, /obj/machinery/computer/shuttle/mining, @@ -48297,8 +48159,7 @@ dir = 4; name = "turbine vent monitor"; network = list("Turbine"); - pixel_x = -29; - pixel_y = 0 + pixel_x = -29 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -48786,7 +48647,6 @@ /obj/structure/table/wood, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-18"; - layer = 4.1; pixel_y = 8 }, /obj/machinery/camera{ @@ -49475,7 +49335,6 @@ icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; - pixel_x = 0; pixel_y = 32 }, /turf/open/floor/plating, @@ -49582,8 +49441,7 @@ /area/chapel/main/monastery) "cdz" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-08"; - layer = 4.1 + icon_state = "plant-08" }, /turf/open/floor/plasteel/chapel{ dir = 4 @@ -50097,8 +49955,7 @@ /area/chapel/main/monastery) "ceK" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-08"; - layer = 4.1 + icon_state = "plant-08" }, /turf/open/floor/plasteel/black, /area/chapel/main/monastery) @@ -54128,7 +53985,6 @@ /obj/machinery/button/door{ id = "barshutters"; name = "Bar Lockdown"; - pixel_x = 0; pixel_y = 26; req_access_txt = "28" }, @@ -55121,7 +54977,6 @@ /obj/structure/table/wood, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-18"; - layer = 4.1; pixel_y = 8 }, /turf/open/floor/carpet, @@ -55696,8 +55551,7 @@ dir = 8 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /turf/open/floor/plasteel/black, /area/chapel/main/monastery) @@ -55762,8 +55616,7 @@ dir = 4 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/black, /area/chapel/main/monastery) @@ -56455,8 +56308,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/black, /area/chapel/main/monastery) @@ -56562,8 +56414,7 @@ /area/chapel/main/monastery) "cvM" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10"; - layer = 4.1 + icon_state = "plant-10" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -57889,7 +57740,6 @@ /obj/structure/table/wood, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-05"; - layer = 4.1; pixel_y = 10 }, /turf/open/floor/plasteel/vault{ @@ -57934,7 +57784,6 @@ /obj/structure/table/wood, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-05"; - layer = 4.1; pixel_y = 10 }, /turf/open/floor/plasteel/vault{ @@ -103988,8 +103837,8 @@ aaa aaa aaa aLn -aLn aNT +aQo aPg aQl aRu diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 3e78a685dc..05f0897465 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -66,7 +66,6 @@ }, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-05"; - layer = 4.1; pixel_y = 4 }, /turf/open/floor/holofloor{ @@ -292,7 +291,6 @@ /obj/structure/table/wood, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-05"; - layer = 4.1; pixel_y = 10 }, /turf/open/floor/holofloor{ @@ -415,14 +413,14 @@ /obj/structure/table/glass, /obj/item/surgicaldrill, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "br" = ( /obj/structure/table/glass, /obj/item/hemostat, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "bs" = ( @@ -432,14 +430,14 @@ }, /obj/item/circular_saw, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "bt" = ( /obj/structure/table/glass, /obj/item/retractor, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "bu" = ( @@ -447,7 +445,7 @@ /obj/item/stack/medical/gauze, /obj/item/cautery, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "bv" = ( @@ -528,7 +526,7 @@ /obj/item/surgical_drapes, /obj/item/razor, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "bJ" = ( @@ -538,7 +536,7 @@ /area/holodeck/rec_center/medical) "bK" = ( /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "bL" = ( @@ -604,19 +602,19 @@ /area/holodeck/rec_center/pet_lounge) "bX" = ( /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "bZ" = ( /obj/structure/table/optable, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "ca" = ( /obj/machinery/computer/operating, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cb" = ( @@ -625,7 +623,7 @@ /obj/item/clothing/suit/apron/surgical, /obj/item/clothing/mask/surgical, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cc" = ( @@ -668,7 +666,7 @@ dir = 1 }, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cj" = ( @@ -680,12 +678,12 @@ /obj/structure/table/glass, /obj/machinery/reagentgrinder, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cl" = ( /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cm" = ( @@ -696,13 +694,13 @@ }, /obj/item/storage/box/beakers, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cn" = ( /obj/machinery/washing_machine, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "co" = ( @@ -776,25 +774,25 @@ "cy" = ( /obj/machinery/chem_master, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cz" = ( /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cA" = ( /obj/structure/table/glass, /obj/item/device/healthanalyzer, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cB" = ( /obj/structure/closet/wardrobe/white, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cC" = ( @@ -910,7 +908,7 @@ dir = 1 }, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cW" = ( @@ -923,7 +921,7 @@ dir = 1 }, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cX" = ( @@ -932,7 +930,7 @@ }, /obj/machinery/computer/pandemic, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "cY" = ( @@ -964,7 +962,7 @@ /area/holodeck/rec_center/pet_lounge) "de" = ( /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "df" = ( @@ -976,12 +974,12 @@ "dg" = ( /obj/machinery/door/window/westleft, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "dh" = ( /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "di" = ( @@ -990,11 +988,9 @@ "dj" = ( /obj/structure/bed, /obj/item/bedsheet/medical, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "dk" = ( @@ -1003,11 +999,9 @@ }, /obj/structure/bed, /obj/item/bedsheet/medical, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "dl" = ( @@ -1018,15 +1012,13 @@ dir = 1 }, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "dm" = ( -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "dn" = ( @@ -1034,7 +1026,7 @@ dir = 1 }, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/medical) "do" = ( @@ -1228,7 +1220,7 @@ dir = 8 }, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/firingrange) "dR" = ( @@ -1236,7 +1228,7 @@ dir = 1 }, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/firingrange) "dS" = ( @@ -1247,7 +1239,7 @@ dir = 4 }, /turf/open/floor/holofloor{ - icon_state = "white"; + icon_state = "white" }, /area/holodeck/rec_center/firingrange) "dT" = ( @@ -2923,7 +2915,6 @@ /area/centcom/control) "iQ" = ( /obj/machinery/status_display{ - density = 0; name = "cargo display"; supply_display = 1 }, @@ -3508,8 +3499,7 @@ /area/centcom/control) "kh" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -3664,8 +3654,7 @@ dir = 4 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/grimy, /area/centcom/control) @@ -3716,8 +3705,7 @@ dir = 8 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/grimy, /area/centcom/control) @@ -4067,8 +4055,7 @@ /area/centcom/control) "ly" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/firealarm{ dir = 1; @@ -4208,7 +4195,6 @@ "lS" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -4877,7 +4863,6 @@ "nz" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -5121,8 +5106,7 @@ /area/centcom/ferry) "oe" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/light{ dir = 4 @@ -5440,8 +5424,7 @@ /area/centcom/ferry) "oM" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/wood, /area/centcom/ferry) @@ -5499,8 +5482,7 @@ /area/centcom/ferry) "oU" = ( /obj/structure/dresser, -/obj/structure/sign/goldenplaque{ - name = "The Most Robust Captain Award for Robustness"; +/obj/structure/sign/goldenplaque/captain{ pixel_x = 32 }, /turf/open/floor/plasteel/vault{ @@ -5883,8 +5865,7 @@ /area/centcom/ferry) "pQ" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/light{ dir = 1 @@ -5924,6 +5905,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ + d2 = 4; icon_state = "0-4" }, /obj/effect/turf_decal/stripes/line, @@ -5961,6 +5943,7 @@ icon_state = "0-2" }, /obj/structure/cable/white{ + d2 = 8; icon_state = "0-8" }, /obj/effect/turf_decal/stripes/line, @@ -6025,8 +6008,7 @@ /area/centcom/control) "qd" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/structure/extinguisher_cabinet{ pixel_x = -24 @@ -6229,6 +6211,8 @@ dir = 4 }, /obj/structure/cable/white{ + d1 = 2; + d2 = 4; icon_state = "2-4" }, /turf/open/floor/wood, @@ -6241,6 +6225,8 @@ dir = 4 }, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /turf/open/floor/plasteel/vault{ @@ -6253,6 +6239,8 @@ }, /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /turf/open/floor/plasteel/grimy, @@ -6262,6 +6250,8 @@ dir = 4 }, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /turf/open/floor/plasteel/grimy, @@ -6275,6 +6265,8 @@ dir = 4 }, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /obj/effect/turf_decal/stripes/line{ @@ -6288,9 +6280,13 @@ }, /obj/machinery/meter, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /obj/structure/cable/white{ + d1 = 2; + d2 = 8; icon_state = "2-8" }, /turf/open/floor/plasteel/vault{ @@ -6305,9 +6301,11 @@ dir = 1 }, /obj/structure/cable/white{ + d2 = 8; icon_state = "0-8" }, /obj/structure/cable/white{ + d2 = 4; icon_state = "0-4" }, /obj/structure/cable/white{ @@ -6324,12 +6322,18 @@ }, /obj/machinery/meter, /obj/structure/cable/white{ + d1 = 1; + d2 = 8; icon_state = "1-8" }, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /obj/structure/cable/white{ + d1 = 2; + d2 = 8; icon_state = "2-8" }, /turf/open/floor/plasteel/vault{ @@ -6419,7 +6423,7 @@ "qX" = ( /obj/structure/table, /obj/item/toy/katana, -/obj/item/toy/carpplushie, +/obj/item/toy/plush/carpplushie, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -6616,6 +6620,8 @@ dir = 4 }, /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/wood, @@ -6663,6 +6669,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister/air, /obj/structure/cable/white{ + d1 = 1; + d2 = 4; icon_state = "1-4" }, /obj/effect/turf_decal/stripes/line{ @@ -6677,9 +6685,13 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, /obj/structure/cable/white{ + d1 = 1; + d2 = 8; icon_state = "1-8" }, /obj/effect/turf_decal/stripes/line{ @@ -6697,6 +6709,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ + d1 = 1; + d2 = 8; icon_state = "1-8" }, /obj/effect/turf_decal/stripes/line{ @@ -6784,8 +6798,7 @@ /area/centcom/control) "rQ" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/green/corner{ dir = 4 @@ -6805,8 +6818,7 @@ /area/centcom/control) "rT" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -6970,6 +6982,8 @@ /area/centcom/ferry) "sn" = ( /obj/structure/cable/white{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /turf/open/floor/wood, @@ -7164,8 +7178,7 @@ /area/centcom/ferry) "sN" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/vault{ dir = 10 @@ -7895,8 +7908,7 @@ /area/centcom/ferry) "uG" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -7934,8 +7946,7 @@ /area/centcom/control) "uN" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/green/side{ dir = 8 @@ -7943,8 +7954,7 @@ /area/centcom/control) "uO" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/green/side{ dir = 4 @@ -8344,8 +8354,7 @@ /area/centcom/ferry) "vU" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -8590,7 +8599,7 @@ /area/wizard_station) "wA" = ( /obj/structure/destructible/cult/talisman{ - desc = "A altar dedicated to the Wizard's Federation" + desc = "An altar dedicated to the Wizards' Federation" }, /obj/item/kitchen/knife/ritual, /turf/open/floor/engine/cult, @@ -8696,8 +8705,7 @@ /area/centcom/ferry) "wP" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/red/corner{ dir = 8 @@ -8871,8 +8879,7 @@ /area/centcom/evac) "xt" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -9269,8 +9276,7 @@ /area/centcom/ferry) "ym" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/structure/extinguisher_cabinet{ pixel_y = -32 @@ -9517,8 +9523,7 @@ /area/centcom/evac) "yL" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/structure/extinguisher_cabinet{ pixel_x = -24 @@ -9778,8 +9783,7 @@ /area/centcom/control) "zq" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/green/corner{ dir = 8 @@ -10260,8 +10264,7 @@ /area/tdome/tdomeobserve) "AK" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/green/corner, /area/tdome/tdomeobserve) @@ -10338,8 +10341,7 @@ /area/tdome/tdomeobserve) "AW" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/red/corner, /area/tdome/tdomeobserve) @@ -10391,8 +10393,7 @@ /area/tdome/tdomeobserve) "Bg" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/green/corner{ dir = 8 @@ -10416,7 +10417,7 @@ /area/tdome/tdomeobserve) "Bj" = ( /obj/structure/destructible/cult/forge{ - desc = "A engine used in powering the wizards ship"; + desc = "An engine used in powering the wizard's ship"; name = "magma engine" }, /turf/open/floor/engine/cult, @@ -10503,8 +10504,7 @@ /area/tdome/tdomeobserve) "Bw" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/red/corner{ dir = 1 @@ -10512,8 +10512,7 @@ /area/tdome/tdomeobserve) "Bx" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/red/side{ dir = 10 @@ -10543,8 +10542,7 @@ /area/tdome/tdomeobserve) "BD" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/green/side{ dir = 6 @@ -10552,8 +10550,7 @@ /area/tdome/tdomeobserve) "BE" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/green/corner{ dir = 4 @@ -10987,9 +10984,7 @@ /area/tdome/tdomeobserve) "CE" = ( /obj/structure/table/wood, -/obj/structure/sign/atmosplaque{ - desc = "This plaque commemorates those who have fallen in glorious combat. For all the charred, dizzy, and beaten men who have died in its hands."; - name = "Thunderdome Plaque"; +/obj/structure/sign/atmosplaque/thunderdome{ pixel_y = -32 }, /obj/item/clothing/accessory/medal/gold{ @@ -11007,9 +11002,7 @@ /area/tdome/tdomeobserve) "CG" = ( /obj/structure/table/wood, -/obj/structure/sign/atmosplaque{ - desc = "This plaque commemorates those who have fallen in glorious combat. For all the charred, dizzy, and beaten men who have died in its hands."; - name = "Thunderdome Plaque"; +/obj/structure/sign/atmosplaque/thunderdome{ pixel_y = -32 }, /obj/item/clothing/accessory/medal{ @@ -11264,8 +11257,7 @@ /area/tdome/tdomeobserve) "Dl" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/neutral/corner, /area/tdome/tdomeobserve) @@ -11318,8 +11310,7 @@ /area/tdome/tdomeobserve) "Ds" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/neutral/corner{ dir = 8; @@ -11937,8 +11928,7 @@ /area/tdome/tdomeadmin) "Fd" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/firealarm{ dir = 8; @@ -11958,8 +11948,7 @@ /area/tdome/tdomeadmin) "Fg" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -12329,19 +12318,19 @@ /area/abductor_ship) "Gh" = ( /obj/machinery/abductor/experiment{ - team = 1 + team_number = 1 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Gi" = ( /obj/machinery/abductor/console{ - team = 1 + team_number = 1 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Gj" = ( /obj/machinery/abductor/pad{ - team = 1 + team_number = 1 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12357,19 +12346,19 @@ /area/abductor_ship) "Gm" = ( /obj/machinery/abductor/experiment{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Gn" = ( /obj/machinery/abductor/console{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Go" = ( /obj/machinery/abductor/pad{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12411,7 +12400,7 @@ /area/abductor_ship) "Gw" = ( /obj/machinery/computer/camera_advanced/abductor{ - team = 1 + team_number = 1 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12429,7 +12418,7 @@ /area/abductor_ship) "GA" = ( /obj/machinery/computer/camera_advanced/abductor{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12490,13 +12479,13 @@ /area/abductor_ship) "GM" = ( /obj/effect/landmark/abductor/scientist{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "GN" = ( /obj/effect/landmark/abductor/agent{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12640,49 +12629,49 @@ /area/space) "Hn" = ( /obj/machinery/abductor/experiment{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Ho" = ( /obj/machinery/abductor/console{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hp" = ( /obj/machinery/abductor/pad{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hq" = ( /obj/machinery/abductor/experiment{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hr" = ( /obj/machinery/abductor/console{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hs" = ( /obj/machinery/abductor/pad{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Ht" = ( /obj/machinery/computer/camera_advanced/abductor{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hu" = ( /obj/machinery/computer/camera_advanced/abductor{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12704,25 +12693,25 @@ /area/centcom/evac) "Hy" = ( /obj/effect/landmark/abductor/scientist{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hz" = ( /obj/effect/landmark/abductor/agent{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "HA" = ( /obj/effect/landmark/abductor/scientist{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "HB" = ( /obj/effect/landmark/abductor/agent{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 19b6a85ea9..ed55f33322 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -148,7 +148,6 @@ }, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -307,7 +306,6 @@ "bc" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -480,7 +478,6 @@ "bG" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index 0644e9dd70..054254f4db 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -144,8 +144,7 @@ /area/shuttle/escape) "aB" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index 887a43aa69..cdf3fd8561 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -680,8 +680,7 @@ /area/shuttle/escape) "ca" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel, /area/shuttle/escape) @@ -703,8 +702,7 @@ dir = 4 }, /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm index 0b535fe457..1e92952ae2 100644 --- a/_maps/shuttles/emergency_delta.dmm +++ b/_maps/shuttles/emergency_delta.dmm @@ -153,7 +153,6 @@ "an" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -168,7 +167,6 @@ "ap" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -689,8 +687,7 @@ /area/shuttle/escape) "bz" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /obj/machinery/button/flasher{ id = "shuttleflash"; @@ -703,8 +700,7 @@ /area/shuttle/escape) "bA" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - layer = 4.1 + icon_state = "plant-21" }, /turf/open/floor/plasteel/neutral/corner{ dir = 4 @@ -883,7 +879,6 @@ "cb" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -1050,7 +1045,6 @@ "cA" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -1083,7 +1077,6 @@ "cE" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index e6ab6ef49d..cffad6bf58 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -304,7 +304,6 @@ "bg" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -359,7 +358,6 @@ "bp" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, @@ -369,7 +367,6 @@ "bq" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; - layer = 4.1; pixel_x = -3; pixel_y = 3 }, diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency_wabbajack.dmm index 4b0b2a7f49..fe5618f48c 100644 --- a/_maps/shuttles/emergency_wabbajack.dmm +++ b/_maps/shuttles/emergency_wabbajack.dmm @@ -288,7 +288,7 @@ /area/shuttle/escape) "ba" = ( /obj/structure/destructible/cult/forge{ - desc = "A engine used in powering the shuttle."; + desc = "An engine used in powering the shuttle."; name = "magma engine" }, /turf/open/floor/plasteel/yellow, @@ -307,7 +307,7 @@ /area/shuttle/escape) "bd" = ( /obj/structure/destructible/cult/forge{ - desc = "A engine used in powering the shuttle."; + desc = "An engine used in powering the shuttle."; name = "magma engine" }, /turf/open/floor/plasteel/whitered, diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm index 87f3d30e0e..a170714543 100644 --- a/_maps/shuttles/ferry_lighthouse.dmm +++ b/_maps/shuttles/ferry_lighthouse.dmm @@ -46,10 +46,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "am" = ( -/obj/structure/grille{ - density = 0; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /turf/open/floor/plating/airless, /area/shuttle/transport) "an" = ( @@ -114,10 +111,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/transport) "aB" = ( -/obj/structure/grille{ - density = 0; - icon_state = "brokengrille" - }, +/obj/structure/grille/broken, /obj/structure/window/fulltile, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 7ac0a05c54..046f699911 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -1478,9 +1478,7 @@ req_access_txt = "0"; use_power = 0 }, -/obj/machinery/iv_drip{ - density = 0 - }, +/obj/machinery/iv_drip, /obj/effect/decal/cleanable/dirt{ desc = "A thin layer of dust coating the floor."; name = "dust" diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index d305bfa69c..dd5a25d8ff 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -132,5 +132,6 @@ #define NOLIVER 29 #define NOSTOMACH 30 //citadel code -#define NOAROUSAL 29//Stops all arousal effects -#define NOGENITALS 30//Cannot create, use, or otherwise have genitals +#define NOAROUSAL 29 //Stops all arousal effects +#define NOGENITALS 30 //Cannot create, use, or otherwise have genitals +#define NO_DNA_COPY 31 diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 98420bc429..8ac155f20b 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -18,3 +18,7 @@ #define ANTAG_DATUM_IAA_HUMAN_CUSTOM /datum/antagonist/traitor/human/internal_affairs/custom #define ANTAG_DATUM_IAA_AI_CUSTOM /datum/antagonist/traitor/AI/internal_affairs/custom #define ANTAG_DATUM_IAA_AI /datum/antagonist/traitor/AI/internal_affairs +#define ANTAG_DATUM_BROTHER /datum/antagonist/brother +#define ANTAG_DATUM_ABDUCTOR /datum/antagonist/abductor +#define ANTAG_DATUM_ABDUCTOR_SCIENTIST /datum/antagonist/abductor/scientist +#define ANTAG_DATUM_ABDUCTOR_AGENT /datum/antagonist/abductor/agent diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 8a107c23ee..d4b2dfb2db 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -41,6 +41,7 @@ #define ANTAG_HUD_SOULLESS 17 #define ANTAG_HUD_CLOCKWORK 18 #define ANTAG_HUD_BORER 19 +#define ANTAG_HUD_BROTHER 20 // Notification action types #define NOTIFY_JUMP "jump" diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 1943ba15cd..6f20117d36 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -11,14 +11,56 @@ // All signals. Format: // When the signal is called: (signal arguments) -#define COMSIG_COMPONENT_ADDED "component_added" //when a component is added to a datum: (datum/component) -#define COMSIG_COMPONENT_REMOVING "component_removing" //before a component is removed from a datum because of RemoveComponent: (datum/component) +// /datum signals +#define COMSIG_COMPONENT_ADDED "component_added" //when a component is added to a datum: (/datum/component) +#define COMSIG_COMPONENT_REMOVING "component_removing" //before a component is removed from a datum because of RemoveComponent: (/datum/component) #define COMSIG_PARENT_QDELETED "parent_qdeleted" //before a datum's Destroy() is called: () -#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable, atom) -#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (atom/movable) -#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from the base of atom/attackby: (obj/item, mob/living, params) -#define COMSIG_PARENT_EXAMINE "atom_examine" //from the base of atom/examine: (mob) -#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable, atom) + +// /atom signals +#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) +#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) +#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob) +#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (/atom/movable, /atom) #define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target) +#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity) +#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //from base of atom/fire_act(): (exposed_temperature, exposed_volume) +#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" //from base of atom/bullet_act(): (/obj/item/projectile, def_zone) +#define COMSIG_ATOM_BLOB_ACT "atom_blob_act" //from base of atom/blob_act(): (/obj/structure/blob) +#define COMSIG_ATOM_ACID_ACT "atom_acid_act" //from base of atom/acid_act(): (acidpwr, acid_volume) +#define COMSIG_ATOM_EMAG_ACT "atom_emag_act" //from base of atom/emag_act(): () +#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act" //from base of atom/narsie_act(): () +#define COMSIG_ATOM_RATVAR_ACT "atom_ratvar_act" //from base of atom/ratvar_act(): () +#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" //from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode) #define COMSIG_ATOM_SING_PULL "atom_sing_pull" //from base of atom/singularity_pull(): (S, current_size) -#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (atom/movable) + +#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params) +#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob) +#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) +#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) +#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) + +// /atom/movable signals +#define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) +#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable) +#define COMSIG_MOVABLE_COLLIDE "movable_collide" //from base of atom/movable/Collide(): (/atom) +#define COMSIG_MOVABLE_IMPACT "movable_impact" //from base of atom/movable/throw_impact(): (/atom, throwingdatum) + +// /obj/item signals +#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) +#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) +#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob) + +// /obj/item/clothing signals +#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () + +// /obj/item signals +#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (mob/living/target, mob/living/user) +#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (mob) +#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (obj, mob) + +// /obj/item/clothing signals +#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () + +// /obj/machinery signals +#define COMSIG_MACHINE_PROCESS "machine_process" //from machinery subsystem fire(): () +#define COMSIG_MACHINE_PROCESS_ATMOS "machine_process_atmos" //from air subsystem process_atmos_machinery(): () diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 3f85c93a00..c55b8216a3 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -162,3 +162,11 @@ GLOBAL_LIST_INIT(pointed_types, typecacheof(list( #define issignaler(O) (istype(O, /obj/item/device/assembly/signaler)) #define istimer(O) (istype(O, /obj/item/device/assembly/timer)) + +GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( + /obj/item/stack/sheet/glass, + /obj/item/stack/sheet/rglass, + /obj/item/stack/sheet/plasmaglass, + /obj/item/stack/sheet/plasmarglass))) + +#define is_glass_sheet(O) (is_type_in_typecache(O, GLOB.glass_sheet_types)) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 11b0396cbd..c5d917ece4 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -456,3 +456,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define SECURITY_SAFE 1 #define SECURITY_ULTRASAFE 2 #define SECURITY_TRUSTED 3 + +//Dummy mob reserve slots +#define DUMMY_HUMAN_SLOT_PREFERENCES "dummy_preference_preview" +#define DUMMY_HUMAN_SLOT_MANIFEST "dummy_manifest_generation" diff --git a/code/__DEFINES/pipe_construction.dm b/code/__DEFINES/pipe_construction.dm index b8a83ee3fa..2d15b8aed3 100644 --- a/code/__DEFINES/pipe_construction.dm +++ b/code/__DEFINES/pipe_construction.dm @@ -12,6 +12,7 @@ Construction breaks otherwise #define PIPE_HE_MANIFOLD /obj/machinery/atmospherics/pipe/heat_exchanging/manifold #define PIPE_HE_4WAYMANIFOLD /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w #define PIPE_JUNCTION /obj/machinery/atmospherics/pipe/heat_exchanging/junction +#define PIPE_BLUESPACE /obj/machinery/atmospherics/pipe/bluespace //Unary #define PIPE_CONNECTOR /obj/machinery/atmospherics/components/unary/portables_connector #define PIPE_UVENT /obj/machinery/atmospherics/components/unary/vent_pump @@ -56,4 +57,4 @@ Construction breaks otherwise #define STATION_TUBE_OPEN 0 #define STATION_TUBE_OPENING 1 #define STATION_TUBE_CLOSED 2 -#define STATION_TUBE_CLOSING 3 \ No newline at end of file +#define STATION_TUBE_CLOSING 3 diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index fbefab15bb..cea6bc5e36 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -23,12 +23,14 @@ #define ROLE_DEVIL "devil" #define ROLE_SERVANT_OF_RATVAR "servant of Ratvar" #define ROLE_BORER "borer" +#define ROLE_BROTHER "blood brother" //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough //(in game days played) to play that role GLOBAL_LIST_INIT(special_roles, list( ROLE_TRAITOR = /datum/game_mode/traitor, + ROLE_BROTHER = /datum/game_mode/traitor/bros, ROLE_OPERATIVE = /datum/game_mode/nuclear, ROLE_CHANGELING = /datum/game_mode/changeling, ROLE_WIZARD = /datum/game_mode/wizard, @@ -50,4 +52,4 @@ GLOBAL_LIST_INIT(special_roles, list( //Job defines for what happens when you fail to qualify for any job during job selection #define BEASSISTANT 1 #define BERANDOMJOB 2 -#define RETURNTOLOBBY 3 \ No newline at end of file +#define RETURNTOLOBBY 3 diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm index ea4c26d79e..edcf4f7fd2 100644 --- a/code/__DEFINES/voreconstants.dm +++ b/code/__DEFINES/voreconstants.dm @@ -3,6 +3,7 @@ #define DM_DIGEST "Digest" #define DM_HEAL "Heal" #define DM_NOISY "Noisy" +#define DM_DRAGON "Dragon" #define VORE_STRUGGLE_EMOTE_CHANCE 40 diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 4b5342031f..8f3a0163b9 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -85,7 +85,7 @@ /proc/log_pda(text) if (config.log_pda) - WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]PDA: [text]") + WRITE_FILE(GLOB.world_pda_log, "\[[time_stamp()]]PDA: [text]") /proc/log_comment(text) if (config.log_pda) diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index 5001a3541e..f515668dfb 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -43,7 +43,7 @@ /client/proc/file_spam_check() var/time_to_wait = GLOB.fileaccess_timer - world.time if(time_to_wait > 0) - to_chat(src, "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.") + to_chat(src, "Error: file_spam_check(): Spam. Please wait [DisplayTimeText(time_to_wait)].") return 1 GLOB.fileaccess_timer = world.time + FTPDELAY return 0 diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 5bcc66eeda..c040e264e6 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -421,7 +421,7 @@ SEND_SOUND(M, 'sound/misc/notice2.ogg') //Alerting them to their consideration if(flashwindow) window_flash(M.client) - switch(ignore_category ? askuser(M,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Never for this round", StealFocus=0, Timeout=poll_time) : askuser(M,Question,"Please answer in [poll_time/10] seconds!","Yes","No", StealFocus=0, Timeout=poll_time)) + switch(ignore_category ? askuser(M,Question,"Please answer in [DisplayTimeText(poll_time)]!","Yes","No","Never for this round", StealFocus=0, Timeout=poll_time) : askuser(M,Question,"Please answer in [DisplayTimeText(poll_time)]!","Yes","No", StealFocus=0, Timeout=poll_time)) if(1) to_chat(M, "Choice registered: Yes.") if(time_passed + poll_time <= world.time) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 9b16644b4c..91bf127ab8 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -926,10 +926,10 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) return 0 //For creating consistent icons for human looking simple animals -/proc/get_flat_human_icon(icon_id, datum/job/J, datum/preferences/prefs) +/proc/get_flat_human_icon(icon_id, datum/job/J, datum/preferences/prefs, dummy_key) var/static/list/humanoid_icon_cache = list() if(!icon_id || !humanoid_icon_cache[icon_id]) - var/mob/living/carbon/human/dummy/body = new() + var/mob/living/carbon/human/dummy/body = generate_or_wait_for_human_dummy(dummy_key) if(prefs) prefs.copy_to(body) @@ -956,14 +956,12 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) partial = getFlatIcon(body) out_icon.Insert(partial,dir=EAST) - qdel(body) - humanoid_icon_cache[icon_id] = out_icon + dummy_key? unset_busy_human_dummy(dummy_key) : qdel(body) return out_icon else return humanoid_icon_cache[icon_id] - //Hook, override to run code on- wait this is images //Images have dir without being an atom, so they get their own definition. //Lame. diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 41d2f721f5..61a6866fe2 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -155,7 +155,6 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, var/size_factor = ((-cos(inputToDegrees) +1) /2) //returns a value from 0 to 1 return size_factor + scaling_modifier //scale mod of 0 results in a number from 0 to 1. A scale modifier of +0.5 returns 0.5 to 1.5 - //to_chat(world, "Transform multiplier of [src] is [size_factor + scaling_modifer]") //converts a uniform distributed random number into a normal distributed one //since this method produces two random numbers, one is saved for subsequent calls @@ -220,3 +219,8 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, new_x = Clamp(new_x, 0, world.maxx) new_y = Clamp(new_y, 0, world.maxy) return locate(new_x, new_y, starting.z) + +/proc/round_down(num) + if(round(num) != num) + return round(num--) + else return num diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index cb64f3fb22..ed855c33b9 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -465,13 +465,17 @@ Proc for attack log creation, because really why not if(H.dna && istype(H.dna.species, species_datum)) . = TRUE -/proc/spawn_atom_to_turf(spawn_type, target, amount, admin_spawn=FALSE) +/proc/spawn_atom_to_turf(spawn_type, target, amount, admin_spawn=FALSE, list/extra_args) var/turf/T = get_turf(target) if(!T) CRASH("attempt to spawn atom type: [spawn_type] in nullspace") - for(var/j in 1 to amount) - var/atom/X = new spawn_type(T) + var/list/new_args = list(T) + if(extra_args) + new_args += extra_args + + for(var/j in 1 to amount) + var/atom/X = new spawn_type(arglist(new_args)) X.admin_spawned = admin_spawn /proc/spawn_and_random_walk(spawn_type, target, amount, walk_chance=100, max_walk=3, always_max_walk=FALSE, admin_spawn=FALSE) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 546935e697..e3ce12397e 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -1,52 +1,148 @@ -//Returns the world time in english -/proc/worldtime2text() - return gameTimestamp("hh:mm:ss", world.time) - -/proc/time_stamp(format = "hh:mm:ss", show_ds) - var/time_string = time2text(world.timeofday, format) - return show_ds ? "[time_string]:[world.timeofday % 10]" : time_string - -/proc/gameTimestamp(format = "hh:mm:ss", wtime=null) - if(!wtime) - wtime = world.time - return time2text(wtime - GLOB.timezoneOffset + SSticker.gametime_offset - SSticker.round_start_time, format) - -/* Returns 1 if it is the selected month and day */ -/proc/isDay(month, day) - if(isnum(month) && isnum(day)) - var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month - var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day - if(month == MM && day == DD) - return 1 - - // Uncomment this out when debugging! - //else - //return 1 - -//returns timestamp in a sql and ISO 8601 friendly format -/proc/SQLtime(timevar) - if(!timevar) - timevar = world.realtime - return time2text(timevar, "YYYY-MM-DD hh:mm:ss") - - -GLOBAL_VAR_INIT(midnight_rollovers, 0) -GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) -/proc/update_midnight_rollover() - if (world.timeofday < GLOB.rollovercheck_last_timeofday) //TIME IS GOING BACKWARDS! - return GLOB.midnight_rollovers++ - return GLOB.midnight_rollovers - -/proc/weekdayofthemonth() - var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day - switch(DD) - if(8 to 13) - return 2 - if(14 to 20) - return 3 - if(21 to 27) - return 4 - if(28 to INFINITY) - return 5 - else - return 1 +//Returns the world time in english +/proc/worldtime2text() + return gameTimestamp("hh:mm:ss", world.time) + +/proc/time_stamp(format = "hh:mm:ss", show_ds) + var/time_string = time2text(world.timeofday, format) + return show_ds ? "[time_string]:[world.timeofday % 10]" : time_string + +/proc/gameTimestamp(format = "hh:mm:ss", wtime=null) + if(!wtime) + wtime = world.time + return time2text(wtime - GLOB.timezoneOffset + SSticker.gametime_offset - SSticker.round_start_time, format) + +/* Returns 1 if it is the selected month and day */ +/proc/isDay(month, day) + if(isnum(month) && isnum(day)) + var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month + var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day + if(month == MM && day == DD) + return 1 + + // Uncomment this out when debugging! + //else + //return 1 + +//returns timestamp in a sql and ISO 8601 friendly format +/proc/SQLtime(timevar) + if(!timevar) + timevar = world.realtime + return time2text(timevar, "YYYY-MM-DD hh:mm:ss") + + +GLOBAL_VAR_INIT(midnight_rollovers, 0) +GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) +/proc/update_midnight_rollover() + if (world.timeofday < GLOB.rollovercheck_last_timeofday) //TIME IS GOING BACKWARDS! + return GLOB.midnight_rollovers++ + return GLOB.midnight_rollovers + +/proc/weekdayofthemonth() + var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day + switch(DD) + if(8 to 13) + return 2 + if(14 to 20) + return 3 + if(21 to 27) + return 4 + if(28 to INFINITY) + return 5 + else + return 1 + +//Takes a value of time in deciseconds. +//Returns a text value of that number in hours, minutes, or seconds. +/proc/DisplayTimeText(time_value) + var/second = time_value*0.1 + var/second_adjusted = null + var/second_rounded = FALSE + var/minute = null + var/hour = null + var/day = null + + if(!second) + return "0 seconds" + if(second >= 60) + minute = round_down(second/60) + second = round(second - (minute*60), 0.1) + second_rounded = TRUE + if(second) //check if we still have seconds remaining to format, or if everything went into minute. + second_adjusted = round(second) //used to prevent '1 seconds' being shown + if(day || hour || minute) + if(second_adjusted == 1 && second >= 1) + second = " and 1 second" + else if(second > 1) + second = " and [second_adjusted] seconds" + else //shows a fraction if seconds is < 1 + if(second_rounded) //no sense rounding again if it's already done + second = " and [second] seconds" + else + second = " and [round(second, 0.1)] seconds" + else + if(second_adjusted == 1 && second >= 1) + second = "1 second" + else if(second > 1) + second = "[second_adjusted] seconds" + else + if(second_rounded) + second = "[second] seconds" + else + second = "[round(second, 0.1)] seconds" + else + second = null + + if(!minute) + return "[second]" + if(minute >= 60) + hour = round_down(minute/60,1) + minute = (minute - (hour*60)) + if(minute) //alot simpler from here since you don't have to worry about fractions + if(minute != 1) + if((day || hour) && second) + minute = ", [minute] minutes" + else if((day || hour) && !second) + minute = " and [minute] minutes" + else + minute = "[minute] minutes" + else + if((day || hour) && second) + minute = ", 1 minute" + else if((day || hour) && !second) + minute = " and 1 minute" + else + minute = "1 minute" + else + minute = null + + if(!hour) + return "[minute][second]" + if(hour >= 24) + day = round_down(hour/24,1) + hour = (hour - (day*24)) + if(hour) + if(hour != 1) + if(day && (minute || second)) + hour = ", [hour] hours" + else if(day && (!minute || !second)) + hour = " and [hour] hours" + else + hour = "[hour] hours" + else + if(day && (minute || second)) + hour = ", 1 hour" + else if(day && (!minute || !second)) + hour = " and 1 hour" + else + hour = "1 hour" + else + hour = null + + if(!day) + return "[hour][minute][second]" + if(day > 1) + day = "[day] days" + else + day = "1 day" + + return "[day][hour][minute][second]" diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a05d52087f..a20cad1cf2 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -812,7 +812,7 @@ GLOBAL_LIST_INIT(can_embed_types, typecacheof(list( /* -Checks if that loc and dir has a item on the wall +Checks if that loc and dir has an item on the wall */ GLOBAL_LIST_INIT(WALLITEMS, typecacheof(list( /obj/machinery/power/apc, /obj/machinery/airalarm, /obj/item/device/radio/intercom, diff --git a/code/_compile_options.dm.rej b/code/_compile_options.dm.rej deleted file mode 100644 index 842c24b746..0000000000 --- a/code/_compile_options.dm.rej +++ /dev/null @@ -1,11 +0,0 @@ -diff a/code/_compile_options.dm b/code/_compile_options.dm (rejected hunks) -@@ -69,7 +69,7 @@ - #error You need version 511 or higher - #endif - --//Update this whenever the db schema changes -+//Update this whenever the db schema changes - //make sure you add an update to the schema_version stable in the db changelog - #define DB_MAJOR_VERSION 3 --#define DB_MINOR_VERSION 2 -+#define DB_MINOR_VERSION 3 diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 4c8a2654fa..62a5b8c80e 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_EMPTY(ai_list) GLOBAL_LIST_EMPTY(pai_list) GLOBAL_LIST_EMPTY(available_ai_shells) GLOBAL_LIST_EMPTY(simple_animals) +GLOBAL_LIST_EMPTY(spidermobs) //all sentient spider mobs GLOBAL_LIST_EMPTY(language_datum_instances) GLOBAL_LIST_EMPTY(all_languages) diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index e600619d45..3f96b33b34 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -16,6 +16,8 @@ GLOBAL_VAR(config_error_log) GLOBAL_PROTECT(config_error_log) GLOBAL_VAR(sql_error_log) GLOBAL_PROTECT(sql_error_log) +GLOBAL_VAR(world_pda_log) +GLOBAL_PROTECT(world_pda_log) GLOBAL_LIST_EMPTY(bombers) GLOBAL_PROTECT(bombers) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 6b4d9aad1c..b65890f4c6 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -14,7 +14,8 @@ if(call(client.click_intercept, "InterceptClickOn")(src, params, A)) return - if(control_disabled || stat) return + if(control_disabled || incapacitated()) + return if(ismob(A)) ai_actual_track(A) @@ -31,7 +32,7 @@ if(call(client.click_intercept, "InterceptClickOn")(src, params, A)) return - if(control_disabled || stat) + if(control_disabled || incapacitated()) return var/turf/pixel_turf = get_turf_pixel(A) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 0eeca2eaf7..2bc6e144dd 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -32,6 +32,7 @@ */ /atom/Click(location,control,params) if(initialized) + SendSignal(COMSIG_CLICK, location, control, params) usr.ClickOn(src, params) /atom/DblClick(location,control,params) @@ -305,6 +306,7 @@ A.ShiftClick(src) return /atom/proc/ShiftClick(mob/user) + SendSignal(COMSIG_CLICK_SHIFT, user) if(user.client && user.client.eye == user || user.client.eye == user.loc) user.examinate(src) return @@ -319,6 +321,7 @@ return /atom/proc/CtrlClick(mob/user) + SendSignal(COMSIG_CLICK_CTRL, user) var/mob/living/ML = user if(istype(ML)) ML.pulled(src) @@ -348,6 +351,7 @@ ..() /atom/proc/AltClick(mob/user) + SendSignal(COMSIG_CLICK_ALT, user) var/turf/T = get_turf(src) if(T && user.TurfAdjacent(T)) if(user.listed_turf == T) @@ -373,6 +377,7 @@ return /atom/proc/CtrlShiftClick(mob/user) + SendSignal(COMSIG_CLICK_CTRL_SHIFT) return /* diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 85ecd036de..d4d2c2d8a5 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -78,7 +78,7 @@ /obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(datum/hud/owner_hud) - var settings = owner_hud.get_action_buttons_icons() + var/settings = owner_hud.get_action_buttons_icons() icon = settings["bg_icon"] icon_state = settings["bg_state"] hide_icon = settings["toggle_icon"] diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index a5bc86dabe..87a33afc13 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -2,8 +2,8 @@ icon = 'icons/mob/screen_ai.dmi' /obj/screen/ai/Click() - if(isobserver(usr)) - return 1 + if(isobserver(usr) || usr.incapacitated()) + return TRUE /obj/screen/ai/aicore name = "AI core" @@ -20,6 +20,8 @@ icon_state = "camera" /obj/screen/ai/camera_list/Click() + if(..()) + return var/mob/living/silicon/ai/AI = usr var/camera = input(AI, "Choose which camera you want to view", "Cameras") as null|anything in AI.get_camera_list() AI.ai_camera_list(camera) @@ -130,6 +132,8 @@ icon_state = "take_picture" /obj/screen/ai/image_take/Click() + if(..()) + return if(isAI(usr)) var/mob/living/silicon/ai/AI = usr AI.aicamera.toggle_camera_mode() @@ -142,6 +146,8 @@ icon_state = "view_images" /obj/screen/ai/image_view/Click() + if(..()) + return if(isAI(usr)) var/mob/living/silicon/ai/AI = usr AI.aicamera.viewpictures() diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 638b4a31cf..b361ef1a78 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -242,9 +242,12 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." icon_state = "fire" /obj/screen/alert/fire/Click() - if(isliving(usr)) - var/mob/living/L = usr - return L.resist() + var/mob/living/L = usr + if(!L.can_resist()) + return + L.changeNext_move(CLICK_CD_RESIST) + if(L.canmove) + return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt. //ALIENS @@ -644,9 +647,20 @@ so as to remain in compliance with the most up-to-date laws." desc = "You're legcuffed, which slows you down considerably. Click the alert to free yourself." /obj/screen/alert/restrained/Click() - if(isliving(usr)) - var/mob/living/L = usr - return L.resist() + var/mob/living/L = usr + if(!L.can_resist()) + return + L.changeNext_move(CLICK_CD_RESIST) + if((L.canmove) && (L.last_special <= world.time)) + return L.resist_restraints() + +/obj/screen/alert/restrained/buckled/Click() + var/mob/living/L = usr + if(!L.can_resist()) + return + L.changeNext_move(CLICK_CD_RESIST) + if(L.last_special <= world.time) + return L.resist_buckle() // PRIVATE = only edit, use, or override these if you're editing the system as a whole diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm index 92a98e14c6..b3a2546335 100644 --- a/code/_onclick/hud/swarmer.dm +++ b/code/_onclick/hud/swarmer.dm @@ -26,7 +26,7 @@ /obj/screen/swarmer/Replicate icon_state = "ui_replicate" name = "Replicate (Costs 50 Resources)" - desc = "Creates a another of our kind." + desc = "Creates another of our kind." /obj/screen/swarmer/Replicate/Click() if(isswarmer(usr)) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 5265a8e8ea..987818924f 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -9,17 +9,18 @@ // Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user) - return + SendSignal(COMSIG_ITEM_ATTACK_SELF, user) + interact(user) /obj/item/proc/pre_attackby(atom/A, mob/living/user, params) //do stuff before attackby! return TRUE //return FALSE to avoid calling attackby after this proc does stuff // No comment /atom/proc/attackby(obj/item/W, mob/user, params) - return + return SendSignal(COMSIG_PARENT_ATTACKBY, W, user, params) /obj/attackby(obj/item/I, mob/living/user, params) - return I.attack_obj(src, user) + return ..() || I.attack_obj(src, user) /mob/living/attackby(obj/item/I, mob/living/user, params) user.changeNext_move(CLICK_CD_MELEE) @@ -35,6 +36,7 @@ /obj/item/proc/attack(mob/living/M, mob/living/user) + SendSignal(COMSIG_ITEM_ATTACK, M, user) if(flags_1 & NOBLUDGEON_1) return if(!force) @@ -54,6 +56,7 @@ //the equivalent of the standard version of attack() but for object targets. /obj/item/proc/attack_obj(obj/O, mob/living/user) + SendSignal(COMSIG_ITEM_ATTACK_OBJ, O, user) if(flags_1 & NOBLUDGEON_1) return user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/citadel/cit_guns.dm b/code/citadel/cit_guns.dm index ae78d1d172..efab785d12 100644 --- a/code/citadel/cit_guns.dm +++ b/code/citadel/cit_guns.dm @@ -26,4 +26,316 @@ build_type = PROTOLATHE materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000) build_path = /obj/item/gun/energy/laser/carbine/nopin - category = list("Weapons") \ No newline at end of file + category = list("Weapons") + +////////////Anti Tank Pistol//////////// + +/obj/item/gun/ballistic/automatic/pistol/antitank + name = "Anti Tank Pistol" + desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate your wrist." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "atp" + item_state = "pistol" + recoil = 6 + mag_type = /obj/item/ammo_box/magazine/sniper_rounds + fire_delay = 50 + burst_size = 1 + origin_tech = "combat=7" + can_suppress = 0 + w_class = WEIGHT_CLASS_NORMAL + actions_types = list() + fire_sound = 'sound/weapons/blastcannon.ogg' + spread = 30 //damn thing has no rifling. + +/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("atp-mag") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate + name = "Syndicate Anti Tank Pistol" + desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing." + pin = /obj/item/device/firing_pin/implant/pindicate + origin_tech = "combat=7;syndicate=6" + +/////////////spinfusor stuff//////////////// + +/obj/item/projectile/bullet/spinfusor + name ="spinfusor disk" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state= "spinner" + damage = 30 + dismemberment = 25 + +/obj/item/projectile/bullet/spinfusor/on_hit(atom/target, blocked = FALSE) //explosion to emulate the spinfusor's AOE + ..() + explosion(target, -1, -1, 2, 0, -1) + return 1 + +/obj/item/ammo_casing/caseless/spinfusor + name = "spinfusor disk" + desc = "A magnetic disk designed specifically for the Stormhammer magnetic cannon. Warning: extremely volatile!" + projectile_type = /obj/item/projectile/bullet/spinfusor + caliber = "spinfusor" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "disk" + throwforce = 15 //still deadly when thrown + throw_speed = 3 + +/obj/item/ammo_casing/caseless/spinfusor/throw_impact(atom/target) //disks detonate when thrown + if(!..()) // not caught in mid-air + visible_message("[src] detonates!") + playsound(src.loc, "sparks", 50, 1) + explosion(target, -1, -1, 1, 1, -1) + qdel(src) + return 1 + +/obj/item/ammo_box/magazine/internal/spinfusor + name = "spinfusor internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/spinfusor + caliber = "spinfusor" + max_ammo = 1 + +/obj/item/gun/ballistic/automatic/spinfusor + name = "Stormhammer Magnetic Cannon" + desc = "An innovative weapon utilizing mag-lev technology to spin up a magnetic fusor and launch it at extreme velocities." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "spinfusor" + item_state = "spinfusor" + mag_type = /obj/item/ammo_box/magazine/internal/spinfusor + fire_sound = 'sound/weapons/rocketlaunch.ogg' + w_class = WEIGHT_CLASS_BULKY + can_suppress = 0 + burst_size = 1 + fire_delay = 20 + select = 0 + actions_types = list() + casing_ejector = 0 + origin_tech = "combat=6;magnets=6" + +/obj/item/gun/ballistic/automatic/spinfusor/attackby(obj/item/A, mob/user, params) + var/num_loaded = magazine.attackby(A, user, params, 1) + if(num_loaded) + to_chat(user, "You load [num_loaded] disk\s into \the [src].") + update_icon() + chamber_round() + +/obj/item/gun/ballistic/automatic/spinfusor/attack_self(mob/living/user) + return //caseless rounds are too glitchy to unload properly. Best to make it so that you cannot remove disks from the spinfusor + +/obj/item/gun/ballistic/automatic/spinfusor/update_icon() + ..() + icon_state = "spinfusor[magazine ? "-[get_ammo(1)]" : ""]" + +/obj/item/ammo_box/aspinfusor + name = "ammo box (spinfusor disks)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "spinfusorbox" + ammo_type = /obj/item/ammo_casing/caseless/spinfusor + max_ammo = 8 + +/datum/supply_pack/security/armory/spinfusor + name = "Stormhammer Spinfusor Crate" + cost = 7000 + contains = list(/obj/item/gun/ballistic/automatic/spinfusor, + /obj/item/gun/ballistic/automatic/spinfusor) + crate_name = "spinfusor crate" + +/datum/supply_pack/security/armory/spinfusorammo + name = "Spinfusor Disk Crate" + cost = 4000 + contains = list(/obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor) + crate_name = "spinfusor disk crate" + +///////XCOM X9 AR/////// + +/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them + name = "\improper X9 Assault Rifle" + desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "x9" + item_state = "arg" + slot_flags = 0 + origin_tech = "combat=7;engineering=7" + mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = 0 + burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine. + fire_delay = 1 + spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable + recoil = 1 + +////////XCOM2 Magpistol///////// + +//////projectiles////// + +/obj/item/projectile/bullet/mags + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile" + damage = 25 + armour_penetration = 10 + light_range = 2 + light_color = LIGHT_COLOR_RED + +/obj/item/projectile/bullet/nlmags //non-lethal boolets + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-nl" + damage = 2 + knockdown = 15 + stamina = 50 + armour_penetration = -10 + light_range = 2 + light_color = LIGHT_COLOR_BLUE + + +/////actual ammo///// + +/obj/item/ammo_casing/caseless/amags + desc = "A ferromagnetic slug intended to be launched out of a compatible weapon." + caliber = "mags" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/mags + +/obj/item/ammo_casing/caseless/anlmags + desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload." + caliber = "mags" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/nlmags + +//////magazines///// + +/obj/item/ammo_box/magazine/mmags + name = "magpistol magazine (non-lethal disabler)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "nlmagmag" + origin_tech = "magnets=5" + ammo_type = /obj/item/ammo_casing/caseless/anlmags + caliber = "mags" + max_ammo = 7 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/mmags/lethal + name = "magpistol magazine (lethal)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "smallmagmag" + origin_tech = "combat=5" + ammo_type = /obj/item/ammo_casing/caseless/amags + +//////the gun itself////// + +/obj/item/gun/ballistic/automatic/pistol/mag + name = "magpistol" + desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magpistol" + force = 10 + fire_sound = 'sound/weapons/magpistol.ogg' + mag_type = /obj/item/ammo_box/magazine/mmags + can_suppress = 0 + casing_ejector = 0 + fire_delay = 5 + origin_tech = "combat=4;magnets=4" + +/obj/item/gun/ballistic/automatic/pistol/mag/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("magpistol-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +///research memes/// + +/obj/item/gun/ballistic/automatic/pistol/mag/nopin + pin = null + +/datum/design/magpistol + name = "Magpistol" + desc = "A weapon which fires ferromagnetic slugs." + id = "magpisol" + req_tech = list("combat" = 5, "magnets" = 6, "powerstorage" = 5) + build_type = PROTOLATHE + materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000) + build_path = /obj/item/gun/ballistic/automatic/pistol/mag/nopin + category = list("Weapons") + +/datum/design/mag_magpistol + name = "Magpistol Magazine" + desc = "A 7 round magazine for the Magpistol." + id = "mag_magpistol" + req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5, "syndicate" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 4000, MAT_SILVER = 500) + build_path = /obj/item/ammo_box/magazine/mmags/lethal + category = list("Ammo") + +/datum/design/mag_magpistol/nl + name = "Magpistol Magazine (Non-Lethal)" + desc = "A 7 round non-lethal magazine for the Magpistol." + id = "mag_magpistol_nl" + req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5) + materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250) + build_path = /obj/item/ammo_box/magazine/mmags + +//////toy memes///// + +/obj/item/projectile/bullet/reusable/foam_dart/mag + name = "magfoam dart" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-toy" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + light_range = 2 + light_color = LIGHT_COLOR_YELLOW + +/obj/item/ammo_casing/caseless/foam_dart/mag + name = "magfoam dart" + desc = "A foam dart with fun light-up projectiles powered by magnets!" + projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag + +/obj/item/ammo_box/magazine/internal/shot/toy/mag + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + max_ammo = 7 + +/obj/item/gun/ballistic/shotgun/toy/mag + name = "foam force magpistol" + desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toymag" + item_state = "gun" + mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag + fire_sound = 'sound/weapons/magpistol.ogg' + slot_flags = SLOT_BELT + w_class = WEIGHT_CLASS_SMALL + +/obj/item/ammo_box/foambox/mag + name = "ammo box (Magnetic Foam Darts)" + icon = 'icons/obj/guns/toy.dmi' + icon_state = "foambox" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + max_ammo = 42 + +/datum/design/magfoam_dart + name = "Box of MagFoam Darts" + id = "magfoam_dart" + build_type = AUTOLATHE + materials = list(MAT_METAL = 300, MAT_GLASS = 200) + build_path = /obj/item/ammo_box/foambox/mag + category = list("initial", "Misc") + +/datum/design/foam_magpistol + name = "Foam Force Magpistol" + id = "magfoam_launcher" + build_type = AUTOLATHE + materials = list(MAT_METAL = 7500, MAT_GLASS = 1000) + build_path = /obj/item/gun/ballistic/shotgun/toy/mag + category = list("hacked", "Misc") diff --git a/code/citadel/custom_loadout/custom_items.dm b/code/citadel/custom_loadout/custom_items.dm index 5ee9f3f508..c100f0013c 100644 --- a/code/citadel/custom_loadout/custom_items.dm +++ b/code/citadel/custom_loadout/custom_items.dm @@ -67,4 +67,54 @@ w_class = WEIGHT_CLASS_SMALL attack_verb = list("slapped") resistance_flags = FLAMMABLE - var/bitesound = 'sound/items/bikehorn.ogg' + squeak_override = list('sound/items/bikehorn.ogg'= 1) + +/obj/item/clothing/neck/cloak/carrot + name = "carrot cloak" + desc = "A cloak in the shape and color of a carrot!" + icon = 'icons/obj/clothing/cloaks.dmi' + icon_override = 'icons/mob/citadel/suit.dmi' + icon_state = "carrotcloak" + item_state = "carrotcloak" + w_class = WEIGHT_CLASS_SMALL + body_parts_covered = CHEST|GROIN|LEGS|ARMS + + +/*Zigfie*/ + +/obj/item/clothing/mask/luchador/zigfie + name = "Alboroto Rosa mask" + icon = 'icons/mob/mask.dmi' + icon_state = "lucharzigfie" + item_state = "lucharzigfie" + + +/*PLACEHOLDER*/ + +/obj/item/clothing/head/hardhat/reindeer/fluff + name = "novelty reindeer hat" + desc = "Some fake antlers and a very fake red nose - Sponsored by PWR Game(tm)" + icon_state = "hardhat0_reindeer" + item_state = "hardhat0_reindeer" + item_color = "reindeer" + flags_inv = 0 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) + brightness_on = 0 //luminosity when on + dynamic_hair_suffix = "" + +/obj/item/clothing/head/santa/fluff + name = "santa's hat" + desc = "On the first day of christmas my employer gave to me! - From Vlad with Salad" + icon_state = "santahatnorm" + item_state = "that" + dog_fashion = /datum/dog_fashion/head/santa + + +/*Brian*/ + +/obj/item/clothing/suit/trenchcoat/green + name = "Reece's Great Coat" + desc = "You would swear this was in your nightmares after eating too many veggies." + icon_state = "hos-g" + item_state = "hos-g" + body_parts_covered = CHEST|GROIN|ARMS|LEGS \ No newline at end of file diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 43b7a2f258..729ed7f379 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -136,7 +136,7 @@ GLOBAL_PROTECT(config_dir) var/list/probabilities = list() // relative probability of each mode var/list/min_pop = list() // overrides for acceptible player counts in a mode var/list/max_pop = list() - + var/list/repeated_mode_adjust = list() // weight adjustments for recent modes var/humans_need_surnames = 0 var/allow_ai = 0 // allow ai job var/forbid_secborg = 0 // disallow secborg module to be chosen. @@ -147,11 +147,13 @@ GLOBAL_PROTECT(config_dir) var/irc_first_connection_alert = 0 // do we notify the irc channel when somebody is connecting for the first time? var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors + var/brother_scaling_coeff = 25 //how many players per brother team var/changeling_scaling_coeff = 6 //how much does the amount of players get divided by to determine changelings var/security_scaling_coeff = 8 //how much does the amount of players get divided by to determine open security officer positions var/abductor_scaling_coeff = 15 //how many players per abductor team var/traitor_objectives_amount = 2 + var/brother_objectives_amount = 2 var/protect_roles_from_antagonist = 0 //If security and such can be traitor/cult/other var/protect_assistant_from_antagonist = 0 //If assistants can be traitor/cult/other var/enforce_human_authority = 0 //If non-human species are barred from joining as a head of staff @@ -276,6 +278,7 @@ GLOBAL_PROTECT(config_dir) var/error_msg_delay = 50 // How long to wait between messaging admins about occurrences of a unique error var/arrivals_shuttle_dock_window = 55 //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station + var/arrivals_shuttle_require_undocked = FALSE //Require the arrivals shuttle to be undocked before latejoiners can join var/arrivals_shuttle_require_safe_latejoin = FALSE //Require the arrivals shuttle to be operational in order for latejoiners to join var/mice_roundstart = 10 // how many wire chewing rodents spawn at roundstart. @@ -698,6 +701,8 @@ GLOBAL_PROTECT(config_dir) ghost_interaction = 1 if("traitor_scaling_coeff") traitor_scaling_coeff = text2num(value) + if("brother_scaling_coeff") + brother_scaling_coeff = text2num(value) if("changeling_scaling_coeff") changeling_scaling_coeff = text2num(value) if("security_scaling_coeff") @@ -706,6 +711,8 @@ GLOBAL_PROTECT(config_dir) abductor_scaling_coeff = text2num(value) if("traitor_objectives_amount") traitor_objectives_amount = text2num(value) + if("brother_objectives_amount") + brother_objectives_amount = text2num(value) if("probability") var/prob_pos = findtext(value, " ") var/prob_name = null @@ -720,7 +727,14 @@ GLOBAL_PROTECT(config_dir) WRITE_FILE(GLOB.config_error_log, "Unknown game mode probability configuration definition: [prob_name].") else WRITE_FILE(GLOB.config_error_log, "Incorrect probability configuration definition: [prob_name] [prob_value].") - + if("repeated_mode_adjust") + if(value) + repeated_mode_adjust.Cut() + var/values = splittext(value," ") + for(var/v in values) + repeated_mode_adjust += text2num(v) + else + WRITE_FILE(GLOB.config_error_log, "Incorrect round weight adjustment configuration definition for [value].") if("protect_roles_from_antagonist") protect_roles_from_antagonist = 1 if("protect_assistant_from_antagonist") @@ -816,6 +830,8 @@ GLOBAL_PROTECT(config_dir) GLOB.MAX_EX_FLAME_RANGE = BombCap if("arrivals_shuttle_dock_window") arrivals_shuttle_dock_window = max(PARALLAX_LOOP_TIME, text2num(value)) + if("arrivals_shuttle_require_undocked") + arrivals_shuttle_require_undocked = TRUE if("arrivals_shuttle_require_safe_latejoin") arrivals_shuttle_require_safe_latejoin = TRUE if("mice_roundstart") @@ -954,18 +970,18 @@ GLOBAL_PROTECT(config_dir) /datum/configuration/proc/pick_mode(mode_name) // I wish I didn't have to instance the game modes in order to look up // their information, but it is the only way (at least that I know of). + // ^ This guy didn't try hard enough for(var/T in gamemode_cache) - var/datum/game_mode/M = new T() - if(M.config_tag && M.config_tag == mode_name) - return M - qdel(M) + var/datum/game_mode/M = T + var/ct = initial(M.config_tag) + if(ct && ct == mode_name) + return new T return new /datum/game_mode/extended() /datum/configuration/proc/get_runnable_modes() var/list/datum/game_mode/runnable_modes = new for(var/T in gamemode_cache) var/datum/game_mode/M = new T() - //to_chat(world, "DEBUG: [T], tag=[M.config_tag], prob=[probabilities[M.config_tag]]") if(!(M.config_tag in modes)) qdel(M) continue @@ -977,8 +993,15 @@ GLOBAL_PROTECT(config_dir) if(max_pop[M.config_tag]) M.maximum_players = max_pop[M.config_tag] if(M.can_start()) - runnable_modes[M] = probabilities[M.config_tag] - //to_chat(world, "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]") + var/final_weight = probabilities[M.config_tag] + if(SSpersistence.saved_modes.len == 3 && repeated_mode_adjust.len == 3) + var/recent_round = min(SSpersistence.saved_modes.Find(M.config_tag),3) + var/adjustment = 0 + while(recent_round) + adjustment += repeated_mode_adjust[recent_round] + recent_round = SSpersistence.saved_modes.Find(M.config_tag,recent_round+1,0) + final_weight *= ((100-adjustment)/100) + runnable_modes[M] = final_weight return runnable_modes /datum/configuration/proc/get_runnable_midround_modes(crew) diff --git a/code/controllers/configuration.dm.rej b/code/controllers/configuration.dm.rej deleted file mode 100644 index 5d5c2c5055..0000000000 --- a/code/controllers/configuration.dm.rej +++ /dev/null @@ -1,24 +0,0 @@ -diff a/code/controllers/configuration.dm b/code/controllers/configuration.dm (rejected hunks) -@@ -337,17 +337,17 @@ - if("use_account_age_for_jobs") - use_account_age_for_jobs = 1 - if("use_exp_tracking") -- use_exp_tracking = 1 -+ use_exp_tracking = TRUE - if("use_exp_restrictions_heads") -- use_exp_restrictions_heads = 1 -+ use_exp_restrictions_heads = TRUE - if("use_exp_restrictions_heads_hours") - use_exp_restrictions_heads_hours = text2num(value) - if("use_exp_restrictions_heads_department") -- use_exp_restrictions_heads_department = 1 -+ use_exp_restrictions_heads_department = TRUE - if("use_exp_restrictions_other") -- use_exp_restrictions_other = 1 -+ use_exp_restrictions_other = TRUE - if("use_exp_restrictions_admin_bypass") -- use_exp_restrictions_admin_bypass = 1 -+ use_exp_restrictions_admin_bypass = TRUE - if("lobby_countdown") - lobby_countdown = text2num(value) - if("round_end_countdown") diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 6981748198..11c460e326 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -422,7 +422,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new // in those cases, so we just let them run) if (queue_node_flags & SS_NO_TICK_CHECK) if (queue_node.tick_usage > TICK_LIMIT_RUNNING - TICK_USAGE && ran_non_ticker) - queue_node.queued_priority += queue_priority_count * 0.10 + queue_node.queued_priority += queue_priority_count * 0.1 queue_priority_count -= queue_node_priority queue_priority_count += queue_node.queued_priority current_tick_budget -= queue_node_priority diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 8eb7392db8..b5dbabb934 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -164,6 +164,7 @@ SUBSYSTEM_DEF(air) currentrun.len-- if(!M || (M.process_atmos(seconds) == PROCESS_KILL)) atmos_machinery.Remove(M) + M.SendSignal(COMSIG_MACHINE_PROCESS_ATMOS) if(MC_TICK_CHECK) return @@ -321,7 +322,7 @@ SUBSYSTEM_DEF(air) EG.dismantle() CHECK_TICK - var/msg = "HEY! LISTEN! [(world.timeofday - timer)/10] Seconds were wasted processing [starting_ats] turf(s) (connected to [ending_ats] other turfs) with atmos differences at round start." + var/msg = "HEY! LISTEN! [DisplayTimeText(world.timeofday - timer)] were wasted processing [starting_ats] turf(s) (connected to [ending_ats] other turfs) with atmos differences at round start." to_chat(world, "[msg]") warning(msg) @@ -382,4 +383,4 @@ SUBSYSTEM_DEF(air) #undef SSAIR_EXCITEDGROUPS #undef SSAIR_HIGHPRESSURE #undef SSAIR_HOTSPOT -#undef SSAIR_SUPERCONDUCTIVITY +#undef SSAIR_SUPERCONDUCTIVITY \ No newline at end of file diff --git a/code/controllers/subsystem/augury.dm b/code/controllers/subsystem/augury.dm index 32086f52ed..38e9724b5f 100644 --- a/code/controllers/subsystem/augury.dm +++ b/code/controllers/subsystem/augury.dm @@ -14,6 +14,9 @@ SUBSYSTEM_DEF(augury) /datum/controller/subsystem/augury/proc/register_doom(atom/A, severity) doombringers[A] = severity +/datum/controller/subsystem/augury/proc/unregister_doom(atom/A) + doombringers -= A + /datum/controller/subsystem/augury/fire() var/biggest_doom = null var/biggest_threat = null diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 301ceeac21..2870305c3e 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -185,8 +185,7 @@ SUBSYSTEM_DEF(blackbox) return if(!L || !L.key || !L.mind) return - var/turf/T = get_turf(L) - var/area/placeofdeath = get_area(T.loc) + var/area/placeofdeath = get_area(L) var/sqlname = sanitizeSQL(L.real_name) var/sqlkey = sanitizeSQL(L.ckey) var/sqljob = sanitizeSQL(L.mind.assigned_role) @@ -275,7 +274,7 @@ SUBSYSTEM_DEF(blackbox) details += "\"[deets]\"" /datum/feedback_variable/proc/get_details() - return details.Join(" | ") + return details ? details.Join(" | ") : null /datum/feedback_variable/proc/get_parsed() return list(variable,value,details.Join(" | ")) diff --git a/code/controllers/subsystem/blackbox.dm.rej b/code/controllers/subsystem/blackbox.dm.rej deleted file mode 100644 index 5bd713172b..0000000000 --- a/code/controllers/subsystem/blackbox.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm (rejected hunks) -@@ -40,7 +40,7 @@ SUBSYSTEM_DEF(blackbox) - - if(config.use_exp_tracking) - if((triggertime < 0) || (world.time > (triggertime +3000))) //subsystem fires once at roundstart then once every 10 minutes. a 5 min check skips the first fire. The <0 is midnight rollover check -- SSblackbox.update_exp(10,FALSE) -+ update_exp(10,FALSE) - - - /datum/controller/subsystem/blackbox/Recover() diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm index eab61d4ef9..db6af6d686 100644 --- a/code/controllers/subsystem/machines.dm +++ b/code/controllers/subsystem/machines.dm @@ -40,6 +40,7 @@ SUBSYSTEM_DEF(machines) var/obj/machinery/thing = currentrun[currentrun.len] currentrun.len-- if(!QDELETED(thing) && thing.process(seconds) != PROCESS_KILL) + thing.SendSignal(COMSIG_MACHINE_PROCESS) if(thing.use_power) thing.auto_use_power() //add back the power state else @@ -61,4 +62,4 @@ SUBSYSTEM_DEF(machines) if (istype(SSmachines.processing)) processing = SSmachines.processing if (istype(SSmachines.powernets)) - powernets = SSmachines.powernets + powernets = SSmachines.powernets \ No newline at end of file diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 13762b83f9..df7121455c 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -8,7 +8,7 @@ SUBSYSTEM_DEF(persistence) var/list/obj/structure/chisel_message/chisel_messages = list() var/list/saved_messages = list() - + var/list/saved_modes = list(1,2,3) var/list/saved_trophies = list() /datum/controller/subsystem/persistence/Initialize() @@ -16,6 +16,7 @@ SUBSYSTEM_DEF(persistence) LoadPoly() LoadChiselMessages() LoadTrophies() + LoadRecentModes() ..() /datum/controller/subsystem/persistence/proc/LoadSatchels() @@ -41,8 +42,7 @@ SUBSYSTEM_DEF(persistence) var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json") if(!fexists(json_file)) return - var/list/json = list() - json = json_decode(file2text(json_file)) + var/list/json = json_decode(file2text(json_file)) old_secret_satchels = json["data"] if(old_secret_satchels.len) if(old_secret_satchels.len >= 20) //guards against low drop pools assuring that one player cannot reliably find his own gear. @@ -84,8 +84,7 @@ SUBSYSTEM_DEF(persistence) var/json_file = file("data/npc_saves/ChiselMessages[SSmapping.config.map_name].json") if(!fexists(json_file)) return - var/list/json - json = json_decode(file2text(json_file)) + var/list/json = json_decode(file2text(json_file)) if(!json) return @@ -129,13 +128,22 @@ SUBSYSTEM_DEF(persistence) var/json_file = file("data/npc_saves/TrophyItems.json") if(!fexists(json_file)) return - var/list/json = list() - json = json_decode(file2text(json_file)) + var/list/json = json_decode(file2text(json_file)) if(!json) return saved_trophies = json["data"] SetUpTrophies(saved_trophies.Copy()) +/datum/controller/subsystem/persistence/proc/LoadRecentModes() + var/json_file = file("data/RecentModes.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_modes = json["data"] + + /datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items) for(var/A in GLOB.trophy_cases) var/obj/structure/displaycase/trophy/T = A @@ -165,6 +173,7 @@ SUBSYSTEM_DEF(persistence) CollectChiselMessages() CollectSecretSatchels() CollectTrophies() + CollectRoundtype() /datum/controller/subsystem/persistence/proc/CollectSecretSatchels() var/list/satchels = list() @@ -224,3 +233,13 @@ SUBSYSTEM_DEF(persistence) data["message"] = T.trophy_message data["placer_key"] = T.placer_key saved_trophies += list(data) + +/datum/controller/subsystem/persistence/proc/CollectRoundtype() + saved_modes[3] = saved_modes[2] + saved_modes[2] = saved_modes[1] + saved_modes[1] = SSticker.mode.config_tag + var/json_file = file("data/RecentModes.json") + var/list/file_data = list() + file_data["data"] = saved_modes + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) \ No newline at end of file diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index ec34cfb8ed..87b06cd587 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -29,7 +29,7 @@ SUBSYSTEM_DEF(server_maint) var/cmob = C.mob if(!(isobserver(cmob) || (isdead(cmob) && C.holder))) log_access("AFK: [key_name(C)]") - to_chat(C, "You have been inactive for more than [config.afk_period / 600] minutes and have been disconnected.") + to_chat(C, "You have been inactive for more than [DisplayTimeText(config.afk_period)] and have been disconnected.") qdel(C) if (!(!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1))) diff --git a/code/controllers/subsystem/server_maint.dm.rej b/code/controllers/subsystem/server_maint.dm.rej deleted file mode 100644 index 486375b505..0000000000 --- a/code/controllers/subsystem/server_maint.dm.rej +++ /dev/null @@ -1,30 +0,0 @@ -diff a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm (rejected hunks) -@@ -6,18 +6,16 @@ SUBSYSTEM_DEF(server_maint) - flags = SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY - priority = 10 - var/list/currentrun -- var/triggertime = null - - /datum/controller/subsystem/server_maint/Initialize(timeofday) - if (config.hub) - world.visibility = 1 -- triggertime = REALTIMEOFDAY - ..() - - /datum/controller/subsystem/server_maint/fire(resumed = FALSE) - if(!resumed) - src.currentrun = GLOB.clients.Copy() -- -+ - var/list/currentrun = src.currentrun - var/round_started = SSticker.HasRoundStarted() - -@@ -39,8 +37,3 @@ SUBSYSTEM_DEF(server_maint) - return - - #undef PING_BUFFER_TIME -- if(config.sql_enabled) -- sql_poll_population() -- if(config.use_exp_tracking) -- if(REALTIMEOFDAY > (triggertime +3000)) //server maint fires once at roundstart then once every 10 minutes. a 5 min check skips the first fire -- update_exp(10,0) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index de6445831d..2b1080049e 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -178,7 +178,7 @@ SUBSYSTEM_DEF(shuttle) emergency = backup_shuttle if(world.time - SSticker.round_start_time < config.shuttle_refuel_delay) - to_chat(user, "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - SSticker.round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again.") + to_chat(user, "The emergency shuttle is refueling. Please wait [DisplayTimeText((world.time - SSticker.round_start_time) - config.shuttle_refuel_delay)] before trying again.") return switch(emergency.mode) @@ -220,7 +220,7 @@ SUBSYSTEM_DEF(shuttle) if(call_reason) SSblackbox.add_details("shuttle_reason", call_reason) log_game("Shuttle call reason: [call_reason]") - message_admins("[key_name_admin(user)] has called the shuttle. (TRIGGER CENTCOM RECALL)") + message_admins("[key_name_admin(user)] has called the shuttle. (TRIGGER CENTCOM RECALL)") /datum/controller/subsystem/shuttle/proc/centcom_recall(old_timer, admiral_message) if(emergency.mode != SHUTTLE_CALL || emergency.timer != old_timer) @@ -430,17 +430,14 @@ SUBSYSTEM_DEF(shuttle) continue base if(!(T.flags_1 & UNUSED_TRANSIT_TURF_1)) continue base - //to_chat(world, "[COORD(topleft)] and [COORD(bottomright)]") break base if((!proposed_zone) || (!proposed_zone.len)) return FALSE var/turf/topleft = proposed_zone[1] - //to_chat(world, "[COORD(topleft)] is TOPLEFT") // Then create a transit docking port in the middle var/coords = M.return_coords(0, 0, dock_dir) - //to_chat(world, json_encode(coords)) /* 0------2 | | | | @@ -478,11 +475,9 @@ SUBSYSTEM_DEF(shuttle) if(WEST) transit_path = /turf/open/space/transit/west - //to_chat(world, "Docking port at [transit_x], [transit_y], [topleft.z]") var/turf/midpoint = locate(transit_x, transit_y, topleft.z) if(!midpoint) return FALSE - //to_chat(world, "Making transit dock at [COORD(midpoint)]") var/area/shuttle/transit/A = new() A.parallax_movedir = travel_dir A.contents = proposed_zone diff --git a/code/controllers/subsystem/squeak.dm b/code/controllers/subsystem/squeak.dm index d94efd0a4a..16b722c71b 100644 --- a/code/controllers/subsystem/squeak.dm +++ b/code/controllers/subsystem/squeak.dm @@ -1,6 +1,6 @@ // The Squeak // because this is about placement of mice mobs, and nothing to do with -// mice - the computer peripheral +// mice - the computer peripheral SUBSYSTEM_DEF(squeak) name = "Squeak" @@ -32,8 +32,9 @@ SUBSYSTEM_DEF(squeak) /datum/controller/subsystem/squeak/proc/find_exposed_wires() exposed_wires.Cut() - - var/list/all_turfs = block(locate(1,1,1), locate(world.maxx,world.maxy,1)) + var/list/all_turfs + for (var/z in GLOB.station_z_levels) + all_turfs += block(locate(1,1,z), locate(world.maxx,world.maxy,z)) for(var/turf/open/floor/plating/T in all_turfs) if(is_blocked_turf(T)) continue diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 94d4d90d23..82b91bfa67 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -139,7 +139,8 @@ SUBSYSTEM_DEF(ticker) if(!mode.explosion_in_progress && mode.check_finished(force_ending) || force_ending) current_state = GAME_STATE_FINISHED - toggle_ooc(1) // Turn it on + toggle_ooc(TRUE) // Turn it on + toggle_dooc(TRUE) declare_completion(force_ending) Master.SetRunLevel(RUNLEVEL_POSTGAME) @@ -166,6 +167,8 @@ SUBSYSTEM_DEF(ticker) to_chat(world, "Unable to choose playable game mode. Reverting to pre-game lobby.") return 0 mode = pickweight(runnable_modes) + if(!mode) //too few roundtypes all run too recently + mode = pick(runnable_modes) else mode = config.pick_mode(GLOB.master_mode) @@ -205,7 +208,7 @@ SUBSYSTEM_DEF(ticker) mode.announce() if(!config.ooc_during_round) - toggle_ooc(0) // Turn it off + toggle_ooc(FALSE) // Turn it off CHECK_TICK GLOB.start_landmarks_list = shuffle(GLOB.start_landmarks_list) //Shuffle the order of spawn points so they dont always predictably spawn bottom-up and right-to-left @@ -241,10 +244,10 @@ SUBSYSTEM_DEF(ticker) PostSetup() - return 1 + return TRUE /datum/controller/subsystem/ticker/proc/PostSetup() - set waitfor = 0 + set waitfor = FALSE mode.post_setup() GLOB.start_state = new /datum/station_state() GLOB.start_state.count(1) @@ -511,7 +514,7 @@ SUBSYSTEM_DEF(ticker) end_state.count() var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100) - to_chat(world, "
[GLOB.TAB]Shift Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]") + to_chat(world, "
[GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]") to_chat(world, "
[GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]") if(mode.station_was_nuked) SSticker.news_report = STATION_DESTROYED_NUKE diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 0dbc7c5d3a..0ea16b32d8 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -169,7 +169,7 @@ SUBSYSTEM_DEF(vote) admin = TRUE if(next_allowed_time > world.time && !admin) - to_chat(usr, "A vote was initiated recently, you must wait roughly [(next_allowed_time-world.time)/10] seconds before a new vote can be started!") + to_chat(usr, "A vote was initiated recently, you must wait [DisplayTimeText(next_allowed_time-world.time)] before a new vote can be started!") return 0 reset() @@ -198,7 +198,7 @@ SUBSYSTEM_DEF(vote) if(mode == "custom") text += "\n[question]" log_vote(text) - to_chat(world, "\n[text]\nType vote or click here to place your votes.\nYou have [config.vote_period/10] seconds to vote.") + to_chat(world, "\n[text]\nType vote or click here to place your votes.\nYou have [DisplayTimeText(config.vote_period)] to vote.") time_remaining = round(config.vote_period/10) for(var/c in GLOB.clients) var/client/C = c diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 88102e260c..e66fd4ffeb 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -14,8 +14,8 @@ SUBSYSTEM_DEF(weather) if(W.aesthetic) continue for(var/mob/living/L in GLOB.mob_list) - if(W.can_impact(L)) - W.impact(L) + if(W.can_weather_act(L)) + W.weather_act(L) for(var/Z in eligible_zlevels) var/list/possible_weather_for_this_z = list() for(var/V in existing_weather) @@ -30,8 +30,7 @@ SUBSYSTEM_DEF(weather) /datum/controller/subsystem/weather/Initialize(start_timeofday) ..() for(var/V in subtypesof(/datum/weather)) - var/datum/weather/W = V - new W //weather->New will handle adding itself to the list + new V //Weather's New() will handle adding stuff to the list /datum/controller/subsystem/weather/proc/run_weather(weather_name, Z) if(!weather_name) diff --git a/code/datums/action.dm b/code/datums/action.dm index 8e32e8968f..ca71a7cbec 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -421,7 +421,7 @@ /datum/action/item_action/ninjapulse name = "EM Burst (25E)" - desc = "Disable any nearby technology with a electro-magnetic pulse." + desc = "Disable any nearby technology with an electro-magnetic pulse." button_icon_state = "emp" icon_icon = 'icons/mob/actions/actions_spells.dmi' diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 24daad00f9..2222a959bc 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -310,7 +310,7 @@ replaceable_groups[LAW_INHERENT] = inherent.len if(supplied.len && (LAW_SUPPLIED in groups)) replaceable_groups[LAW_SUPPLIED] = supplied.len - var picked_group = pickweight(replaceable_groups) + var/picked_group = pickweight(replaceable_groups) switch(picked_group) if(LAW_ZEROTH) . = zeroth diff --git a/code/datums/antagonists/datum_abductor.dm b/code/datums/antagonists/datum_abductor.dm new file mode 100644 index 0000000000..6d08d61b8a --- /dev/null +++ b/code/datums/antagonists/datum_abductor.dm @@ -0,0 +1,60 @@ +/datum/antagonist/abductor + name = "Abductor" + var/datum/objective_team/abductor_team/team + var/sub_role + var/outfit + var/landmark_type + var/greet_text + +/datum/antagonist/abductor/agent + sub_role = "Agent" + outfit = /datum/outfit/abductor/agent + landmark_type = /obj/effect/landmark/abductor/agent + greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." + +/datum/antagonist/abductor/scientist + sub_role = "Scientist" + outfit = /datum/outfit/abductor/scientist + landmark_type = /obj/effect/landmark/abductor/scientist + greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." + +/datum/antagonist/abductor/New(datum/mind/new_owner, datum/objective_team/abductor_team/T) + team = T + return ..() + +/datum/antagonist/abductor/on_gain() + SSticker.mode.abductors += owner + owner.special_role = "[name] [sub_role]" + owner.objectives += team.objectives + finalize_abductor() + return ..() + +/datum/antagonist/abductor/on_removal() + SSticker.mode.abductors -= owner + team.members -= owner + owner.objectives -= team.objectives + if(owner.current) + to_chat(owner.current,"You are no longer the [owner.special_role]!") + owner.special_role = null + return ..() + +/datum/antagonist/abductor/greet() + to_chat(owner.current, "You are the [owner.special_role]!") + to_chat(owner.current, "With the help of your teammate, kidnap and experiment on station crew members!") + to_chat(owner.current, "[greet_text]") + owner.announce_objectives() + +/datum/antagonist/abductor/proc/finalize_abductor() + //Equip + var/mob/living/carbon/human/H = owner.current + H.set_species(/datum/species/abductor) + H.real_name = "[team.name] [sub_role]" + H.equipOutfit(outfit) + + //Teleport to ship + for(var/obj/effect/landmark/abductor/LM in GLOB.landmarks_list) + if(istype(LM, landmark_type) && LM.team_number == team.team_number) + H.forceMove(LM.loc) + break + + SSticker.mode.update_abductor_icons_added(owner) diff --git a/code/datums/antagonists/datum_brother.dm b/code/datums/antagonists/datum_brother.dm new file mode 100644 index 0000000000..1f799b1bf8 --- /dev/null +++ b/code/datums/antagonists/datum_brother.dm @@ -0,0 +1,48 @@ +/datum/antagonist/brother + name = "Brother" + var/special_role = "blood brother" + var/datum/objective_team/brother_team/team + +/datum/antagonist/brother/New(datum/mind/new_owner, datum/objective_team/brother_team/T) + team = T + return ..() + +/datum/antagonist/brother/on_gain() + SSticker.mode.brothers += owner + owner.special_role = special_role + owner.objectives += team.objectives + finalize_brother() + return ..() + +/datum/antagonist/brother/on_removal() + SSticker.mode.brothers -= owner + team.members -= owner + owner.objectives -= team.objectives + if(owner.current) + to_chat(owner.current,"You are no longer the [special_role]!") + owner.special_role = null + return ..() + +/datum/antagonist/brother/proc/give_meeting_area() + if(!owner.current || !team || !team.meeting_area) + return + to_chat(owner.current, "Your designated meeting area: [team.meeting_area]") + owner.store_memory("Meeting Area: [team.meeting_area]") + +/datum/antagonist/brother/greet() + var/brother_text = "" + var/list/brothers = team.members - owner + for(var/i = 1 to brothers.len) + var/datum/mind/M = brothers[i] + brother_text += M.name + if(i == brothers.len - 1) + brother_text += " and " + else if(i != brothers.len) + brother_text += ", " + to_chat(owner.current, "You are the [owner.special_role] of [brother_text].") + to_chat(owner.current, "The Syndicate only accepts those that have proven themself. Prove yourself and prove your [team.member_name]s by completing your objectives together!") + owner.announce_objectives() + give_meeting_area() + +/datum/antagonist/brother/proc/finalize_brother() + SSticker.mode.update_brother_icons_added(owner) diff --git a/code/datums/antagonists/datum_traitor.dm b/code/datums/antagonists/datum_traitor.dm index 245c620dd3..eeb803ca1e 100644 --- a/code/datums/antagonists/datum_traitor.dm +++ b/code/datums/antagonists/datum_traitor.dm @@ -186,9 +186,9 @@ kill_objective.find_target() add_objective(kill_objective) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = owner - add_objective(survive_objective) + var/datum/objective/survive/exist/exist_objective = new + exist_objective.owner = owner + add_objective(exist_objective) /datum/antagonist/traitor/proc/forge_single_objective() return 0 /datum/antagonist/traitor/human/forge_single_objective() //Returns how many objectives are added diff --git a/code/datums/browser.dm b/code/datums/browser.dm index c854d20f18..cae6e04e9b 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -256,7 +256,6 @@ winset(user, windowid, "on-close=\".windowclose [param]\"") - //to_chat(world, "OnClose [user]: [windowid] : ["on-close=\".windowclose [param]\""]") // the on-close client verb @@ -268,12 +267,10 @@ set hidden = 1 // hide this verb from the user's panel set name = ".windowclose" // no autocomplete on cmd line - //to_chat(world, "windowclose: [atomref]") if(atomref!="null") // if passed a real atomref var/hsrc = locate(atomref) // find the reffed atom var/href = "close=1" if(hsrc) - //to_chat(world, "[src] Topic [href] [hsrc]") usr = src.mob src.Topic(href, params2list(href), hsrc) // this will direct to the atom's return // Topic() proc via client.Topic() @@ -281,6 +278,5 @@ // no atomref specified (or not found) // so just reset the user mob's machine var if(src && src.mob) - //to_chat(world, "[src] was [src.mob.machine], setting to null") src.mob.unset_machine() return diff --git a/code/datums/callback.dm b/code/datums/callback.dm index 624fed58a6..0fc500e467 100644 --- a/code/datums/callback.dm +++ b/code/datums/callback.dm @@ -131,7 +131,7 @@ //runs a list of callbacks asynchronously, returning once all of them return. //callbacks can be repeated. -//callbacks-args is a optional list of argument lists, in the same order as the callbacks, +//callbacks-args is an optional list of argument lists, in the same order as the callbacks, // the inner lists will be sent to the callbacks when invoked() as additional args. //can optionly save and return a list of return values, in the same order as the original list of callbacks //resolution is the number of byond ticks between checks. diff --git a/code/datums/components/README.md b/code/datums/components/README.md index 93a846035f..04dc21f33e 100644 --- a/code/datums/components/README.md +++ b/code/datums/components/README.md @@ -62,7 +62,7 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo * Returns the component that was created. Or the old component in a dupe situation where `COMPONENT_DUPE_UNIQUE` was set 1. `/datum/proc/LoadComponent(component_type(type), ...) -> datum/component` (public, final) * Equivalent to calling `GetComponent(component_type)` where, if the result would be `null`, returns `AddComponent(component_type, ...)` instead -1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract) +1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract, async) * Called on a component's `parent` after a signal recieved causes it to activate. `src` is the parameter * Will only be called if a component's callback returns `TRUE` 1. `/datum/proc/TakeComponent(datum/component/C)` (public, final) @@ -87,7 +87,7 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo * Called on a component when a component of the same type was added to the same parent * See `/datum/component/var/dupe_mode` * `C`'s type will always be the same of the called component -1. `/datum/component/proc/AfterComponentActivated()` (abstract) +1. `/datum/component/proc/AfterComponentActivated()` (abstract, async) * Called on a component that was activated after it's `parent`'s `ComponentActivated()` is called 1. `/datum/component/proc/OnTransfer(datum/new_parent)` (abstract, no-sleep) * Called before the new `parent` is assigned in `TakeComponent()`, after the remove signal, before the added signal @@ -101,8 +101,5 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo * If a previous registration is overwritten by the call, a runtime occurs. Setting `override` to TRUE prevents this * These callbacks run asyncronously * Returning `TRUE` from these callbacks will trigger a `TRUE` return from the `SendSignal()` that initiated it -1. `/datum/component/proc/ReceiveSignal(signal, ...)` (virtual) - * Called when a component recieves any signal and is enabled - * Default implementation looks if the signal is registered and runs the appropriate proc ### See/Define signals and their arguments in __DEFINES\components.dm diff --git a/code/datums/components/component.dm b/code/datums/components/_component.dm similarity index 88% rename from code/datums/components/component.dm rename to code/datums/components/_component.dm index 6b902a6ac6..667ffa7b82 100644 --- a/code/datums/components/component.dm +++ b/code/datums/components/_component.dm @@ -110,15 +110,6 @@ procs[sig_type] = CALLBACK(src, proc_on_self) -/datum/component/proc/ReceiveSignal(sigtype, ...) - var/list/sps = signal_procs - var/datum/callback/CB = LAZYACCESS(sps, sigtype) - if(!CB) - return FALSE - var/list/arguments = args.Copy() - arguments.Cut(1, 2) - return CB.InvokeAsync(arglist(arguments)) - /datum/component/proc/InheritComponent(datum/component/C, i_am_original) return @@ -126,6 +117,7 @@ return /datum/component/proc/AfterComponentActivated() + set waitfor = FALSE return /datum/component/proc/_GetInverseTypeList(current_type) @@ -136,26 +128,40 @@ /datum/proc/SendSignal(sigtype, ...) var/list/comps = datum_components - . = FALSE if(!comps) - return + return FALSE + var/list/arguments = args.Copy() + arguments.Cut(1, 2) var/target = comps[/datum/component] if(!islist(target)) var/datum/component/C = target - if(C.enabled && C.ReceiveSignal(arglist(args))) + if(!C.enabled) + return FALSE + var/list/sps = C.signal_procs + var/datum/callback/CB = LAZYACCESS(sps, sigtype) + if(!CB) + return FALSE + . = CB.InvokeAsync(arglist(arguments)) + if(.) ComponentActivated(C) C.AfterComponentActivated() - return TRUE else + . = FALSE for(var/I in target) var/datum/component/C = I if(!C.enabled) + continue + var/list/sps = C.signal_procs + var/datum/callback/CB = LAZYACCESS(sps, sigtype) + if(!CB) continue - if(C.ReceiveSignal(arglist(args))) + if(CB.InvokeAsync(arglist(arguments))) ComponentActivated(C) + C.AfterComponentActivated() . = TRUE /datum/proc/ComponentActivated(datum/component/C) + set waitfor = FALSE return /datum/proc/GetComponent(c_type) diff --git a/code/datums/material_container.dm b/code/datums/components/material_container.dm similarity index 61% rename from code/datums/material_container.dm rename to code/datums/components/material_container.dm index a8863c70bc..55504d47d5 100644 --- a/code/datums/material_container.dm +++ b/code/datums/components/material_container.dm @@ -5,22 +5,34 @@ amount - raw amount of the mineral this container is holding, calculated by the defined value MINERAL_MATERIAL_AMOUNT=2000. max_amount - max raw amount of mineral this container can hold. sheet_type - type of the mineral sheet the container handles, used for output. - owner - object that this container is being used by, used for output. + parent - object that this container is being used by, used for output. MAX_STACK_SIZE - size of a stack of mineral sheets. Constant. */ -/datum/material_container +/datum/component/material_container var/total_amount = 0 var/max_amount var/sheet_type - var/obj/owner - var/list/materials = list() + var/list/materials + var/show_on_examine + var/list/allowed_typecache + var/last_inserted_type + var/last_amount_inserted + var/last_insert_success + var/datum/callback/precondition //MAX_STACK_SIZE = 50 //MINERAL_MATERIAL_AMOUNT = 2000 -/datum/material_container/New(obj/O, list/mat_list, max_amt = 0) - owner = O +/datum/component/material_container/Initialize(list/mat_list, max_amt = 0, _show_on_examine = FALSE, list/allowed_types, datum/callback/_precondition) + materials = list() max_amount = max(0, max_amt) + show_on_examine = _show_on_examine + if(allowed_types) + allowed_typecache = typecacheof(allowed_types) + precondition = _precondition + + RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy) + RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/OnExamine) var/list/possible_mats = list() for(var/mat_type in subtypesof(/datum/material)) @@ -31,12 +43,47 @@ var/mat_path = possible_mats[id] materials[id] = new mat_path() -/datum/material_container/Destroy() - owner = null - return ..() +/datum/component/material_container/proc/OnExamine(mob/user) + for(var/I in materials) + var/datum/material/M = materials[I] + var/amt = amount(M.id) + if(amt) + to_chat(user, "It has [amt] units of [lowertext(M.name)] stored.") + +/datum/component/material_container/proc/OnAttackBy(obj/item/I, mob/living/user) + var/list/tc = allowed_typecache + if(user.a_intent == INTENT_HARM || (I.flags_2 & HOLOGRAM_2) || (tc && !is_type_in_typecache(I, tc))) + return FALSE + . = TRUE + last_insert_success = FALSE + var/datum/callback/pc = precondition + if(pc && !pc.Invoke()) + return + var/material_amount = get_item_material_amount(I) + if(!material_amount) + to_chat(user, "[I] does not contain sufficient amounts of metal or glass to be accepted by [parent].") + return + if(!has_space(material_amount)) + to_chat(user, "[parent] is full. Please remove metal or glass from [parent] in order to insert more.") + return + if(!user.temporarilyRemoveItemFromInventory(I)) + to_chat(user, "[I] is stuck to you and cannot be placed into [parent].") + return + var/inserted = insert_item(I) + if(inserted) + last_insert_success = TRUE + if(istype(I, /obj/item/stack)) + to_chat(user, "You insert [inserted] sheet[inserted>1 ? "s" : ""] into [parent].") + if(!QDELETED(I)) + user.put_in_active_hand(I) + else + to_chat(user, "You insert a material total of [inserted] into [parent].") + qdel(I) + else + user.put_in_active_hand(I) //For inserting an amount of material -/datum/material_container/proc/insert_amount(amt, id = null) +/datum/component/material_container/proc/insert_amount(amt, id = null) if(amt > 0 && has_space(amt)) var/total_amount_saved = total_amount if(id) @@ -52,7 +99,7 @@ return (total_amount - total_amount_saved) return 0 -/datum/material_container/proc/insert_stack(obj/item/stack/S, amt = 0) +/datum/component/material_container/proc/insert_stack(obj/item/stack/S, amt = 0) if(amt <= 0) return 0 if(amt > S.amount) @@ -67,10 +114,12 @@ return 0 insert_materials(S,amt) + last_inserted_type = S.type S.use(amt) + last_amount_inserted = amt return amt -/datum/material_container/proc/insert_item(obj/item/I, multiplier = 1) +/datum/component/material_container/proc/insert_item(obj/item/I, multiplier = 1) if(!I) return 0 if(istype(I, /obj/item/stack)) @@ -82,9 +131,11 @@ return 0 insert_materials(I, multiplier) + last_inserted_type = I.type + last_amount_inserted = material_amount return material_amount -/datum/material_container/proc/insert_materials(obj/item/I, multiplier = 1) //for internal usage only +/datum/component/material_container/proc/insert_materials(obj/item/I, multiplier = 1) //for internal usage only var/datum/material/M for(var/MAT in materials) M = materials[MAT] @@ -93,7 +144,7 @@ //For consuming material //mats is a list of types of material to use and the corresponding amounts, example: list(MAT_METAL=100, MAT_GLASS=200) -/datum/material_container/proc/use_amount(list/mats, multiplier=1) +/datum/component/material_container/proc/use_amount(list/mats, multiplier=1) if(!mats || !mats.len) return 0 @@ -112,7 +163,7 @@ return total_amount_save - total_amount -/datum/material_container/proc/use_amount_type(amt, id) +/datum/component/material_container/proc/use_amount_type(amt, id) var/datum/material/M = materials[id] if(M) if(M.amount >= amt) @@ -121,7 +172,7 @@ return amt return 0 -/datum/material_container/proc/can_use_amount(amt, id, list/mats) +/datum/component/material_container/proc/can_use_amount(amt, id, list/mats) if(amt && id) var/datum/material/M = materials[id] if(M && M.amount >= amt) @@ -136,7 +187,7 @@ return FALSE //For spawning mineral sheets; internal use only -/datum/material_container/proc/retrieve(sheet_amt, datum/material/M, target = null) +/datum/component/material_container/proc/retrieve(sheet_amt, datum/material/M, target = null) if(!M.sheet_type) return 0 if(sheet_amt > 0) @@ -144,12 +195,12 @@ sheet_amt = round(M.amount / MINERAL_MATERIAL_AMOUNT) var/count = 0 while(sheet_amt > MAX_STACK_SIZE) - new M.sheet_type(get_turf(owner), MAX_STACK_SIZE) + new M.sheet_type(get_turf(parent), MAX_STACK_SIZE) count += MAX_STACK_SIZE use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.id) sheet_amt -= MAX_STACK_SIZE if(round((sheet_amt * MINERAL_MATERIAL_AMOUNT) / MINERAL_MATERIAL_AMOUNT)) - var/obj/item/stack/sheet/s = new M.sheet_type(get_turf(owner), sheet_amt) + var/obj/item/stack/sheet/s = new M.sheet_type(get_turf(parent), sheet_amt) if(target) s.forceMove(target) count += sheet_amt @@ -157,15 +208,15 @@ return count return 0 -/datum/material_container/proc/retrieve_sheets(sheet_amt, id, target = null) +/datum/component/material_container/proc/retrieve_sheets(sheet_amt, id, target = null) if(materials[id]) return retrieve(sheet_amt, materials[id], target) return 0 -/datum/material_container/proc/retrieve_amount(amt, id, target) +/datum/component/material_container/proc/retrieve_amount(amt, id, target) return retrieve_sheets(amount2sheet(amt), id, target) -/datum/material_container/proc/retrieve_all(target = null) +/datum/component/material_container/proc/retrieve_all(target = null) var/result = 0 var/datum/material/M for(var/MAT in materials) @@ -173,10 +224,10 @@ result += retrieve_sheets(amount2sheet(M.amount), MAT, target) return result -/datum/material_container/proc/has_space(amt = 0) +/datum/component/material_container/proc/has_space(amt = 0) return (total_amount + amt) <= max_amount -/datum/material_container/proc/has_materials(list/mats, multiplier=1) +/datum/component/material_container/proc/has_materials(list/mats, multiplier=1) if(!mats || !mats.len) return 0 @@ -187,23 +238,23 @@ return 0 return 1 -/datum/material_container/proc/amount2sheet(amt) +/datum/component/material_container/proc/amount2sheet(amt) if(amt >= MINERAL_MATERIAL_AMOUNT) return round(amt / MINERAL_MATERIAL_AMOUNT) return 0 -/datum/material_container/proc/sheet2amount(sheet_amt) +/datum/component/material_container/proc/sheet2amount(sheet_amt) if(sheet_amt > 0) return sheet_amt * MINERAL_MATERIAL_AMOUNT return 0 -/datum/material_container/proc/amount(id) +/datum/component/material_container/proc/amount(id) var/datum/material/M = materials[id] return M ? M.amount : 0 //returns the amount of material relevant to this container; //if this container does not support glass, any glass in 'I' will not be taken into account -/datum/material_container/proc/get_item_material_amount(obj/item/I) +/datum/component/material_container/proc/get_item_material_amount(obj/item/I) if(!istype(I)) return 0 var/material_amount = 0 diff --git a/code/datums/components/squeek.dm b/code/datums/components/squeek.dm new file mode 100644 index 0000000000..40fd0af598 --- /dev/null +++ b/code/datums/components/squeek.dm @@ -0,0 +1,61 @@ +/datum/component/squeak + var/static/list/default_squeak_sounds = list('sound/items/toysqueak1.ogg'=1, 'sound/items/toysqueak2.ogg'=1, 'sound/items/toysqueak3.ogg'=1) + var/list/override_squeak_sounds + var/squeak_chance = 100 + var/volume = 30 + + // This is so shoes don't squeak every step + var/steps = 0 + var/step_delay = 1 + + // This is to stop squeak spam from inhand usage + var/last_use = 0 + var/use_delay = 20 + +/datum/component/squeak/Initialize(custom_sounds, volume_override, chance_override, step_delay_override, use_delay_override) + if(custom_sounds) + override_squeak_sounds = custom_sounds + if(chance_override) + squeak_chance = chance_override + if(volume_override) + volume = volume_override + if(step_delay_override) + step_delay = step_delay_override + if(use_delay_override) + use_delay = use_delay_override + + if(istype(parent, /atom)) + RegisterSignal(COMSIG_ATOM_BLOB_ACT, .proc/play_squeak) + RegisterSignal(COMSIG_ATOM_HULK_ATTACK, .proc/play_squeak) + RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/play_squeak) + if(istype(parent, /atom/movable)) + RegisterSignal(COMSIG_MOVABLE_CROSSED, .proc/play_squeak) + RegisterSignal(COMSIG_MOVABLE_COLLIDE, .proc/play_squeak) + RegisterSignal(COMSIG_MOVABLE_IMPACT, .proc/play_squeak) + if(istype(parent, /obj/item)) + RegisterSignal(COMSIG_ITEM_ATTACK, .proc/play_squeak) + RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/use_squeak) + RegisterSignal(COMSIG_ITEM_ATTACK_OBJ, .proc/play_squeak) + if(istype(parent, /obj/item/clothing/shoes)) + RegisterSignal(COMSIG_SHOES_STEP_ACTION, .proc/step_squeak) + else + RegisterSignal(COMSIG_ATOM_ENTERED, .proc/play_squeak) + +/datum/component/squeak/proc/play_squeak() + if(prob(squeak_chance)) + if(!override_squeak_sounds) + playsound(parent, pickweight(default_squeak_sounds), volume, 1, -1) + else + playsound(parent, pickweight(override_squeak_sounds), volume, 1, -1) + +/datum/component/squeak/proc/step_squeak() + if(steps > step_delay) + play_squeak() + steps = 0 + else + steps++ + +/datum/component/squeak/proc/use_squeak() + if(last_use + use_delay < world.time) + last_use = world.time + play_squeak() \ No newline at end of file diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 005c02c355..b20381ca85 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -1,287 +1,287 @@ - -/datum/datacore - var/medical[] = list() - var/medicalPrintCount = 0 - var/general[] = list() - var/security[] = list() - var/securityPrintCount = 0 - var/securityCrimeCounter = 0 - //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character(). - var/locked[] = list() - -/datum/data - var/name = "data" - -/datum/data/record - name = "record" - var/list/fields = list() - -/datum/data/record/Destroy() - if(src in GLOB.data_core.medical) - GLOB.data_core.medical -= src - if(src in GLOB.data_core.security) - GLOB.data_core.security -= src - if(src in GLOB.data_core.general) - GLOB.data_core.general -= src - if(src in GLOB.data_core.locked) - GLOB.data_core.locked -= src - . = ..() - -/datum/data/crime - name = "crime" - var/crimeName = "" - var/crimeDetails = "" - var/author = "" - var/time = "" - var/dataId = 0 - -/datum/datacore/proc/createCrimeEntry(cname = "", cdetails = "", author = "", time = "") - var/datum/data/crime/c = new /datum/data/crime - c.crimeName = cname - c.crimeDetails = cdetails - c.author = author - c.time = time - c.dataId = ++securityCrimeCounter - return c - -/datum/datacore/proc/addMinorCrime(id = "", datum/data/crime/crime) - for(var/datum/data/record/R in security) - if(R.fields["id"] == id) - var/list/crimes = R.fields["mi_crim"] - crimes |= crime - return - -/datum/datacore/proc/removeMinorCrime(id, cDataId) - for(var/datum/data/record/R in security) - if(R.fields["id"] == id) - var/list/crimes = R.fields["mi_crim"] - for(var/datum/data/crime/crime in crimes) - if(crime.dataId == text2num(cDataId)) - crimes -= crime - return - -/datum/datacore/proc/removeMajorCrime(id, cDataId) - for(var/datum/data/record/R in security) - if(R.fields["id"] == id) - var/list/crimes = R.fields["ma_crim"] - for(var/datum/data/crime/crime in crimes) - if(crime.dataId == text2num(cDataId)) - crimes -= crime - return - -/datum/datacore/proc/addMajorCrime(id = "", datum/data/crime/crime) - for(var/datum/data/record/R in security) - if(R.fields["id"] == id) - var/list/crimes = R.fields["ma_crim"] - crimes |= crime - return - -/datum/datacore/proc/manifest() - for(var/mob/dead/new_player/N in GLOB.player_list) - if(ishuman(N.new_character)) - manifest_inject(N.new_character, N.client) - CHECK_TICK - -/datum/datacore/proc/manifest_modify(name, assignment) - var/datum/data/record/foundrecord = find_record("name", name, GLOB.data_core.general) - if(foundrecord) - foundrecord.fields["rank"] = assignment - -/datum/datacore/proc/get_manifest(monochrome, OOC) - var/list/heads = list() - var/list/sec = list() - var/list/eng = list() - var/list/med = list() - var/list/sci = list() - var/list/sup = list() - var/list/civ = list() - var/list/bot = list() - var/list/misc = list() - var/dat = {" - - - - "} - var/even = 0 - // sort mobs - for(var/datum/data/record/t in GLOB.data_core.general) - var/name = t.fields["name"] - var/rank = t.fields["rank"] - var/department = 0 - if(rank in GLOB.command_positions) - heads[name] = rank - department = 1 - if(rank in GLOB.security_positions) - sec[name] = rank - department = 1 - if(rank in GLOB.engineering_positions) - eng[name] = rank - department = 1 - if(rank in GLOB.medical_positions) - med[name] = rank - department = 1 - if(rank in GLOB.science_positions) - sci[name] = rank - department = 1 - if(rank in GLOB.supply_positions) - sup[name] = rank - department = 1 - if(rank in GLOB.civilian_positions) - civ[name] = rank - department = 1 - if(rank in GLOB.nonhuman_positions) - bot[name] = rank - department = 1 - if(!department && !(name in heads)) - misc[name] = rank - if(heads.len > 0) - dat += "" - for(var/name in heads) - dat += "" - even = !even - if(sec.len > 0) - dat += "" - for(var/name in sec) - dat += "" - even = !even - if(eng.len > 0) - dat += "" - for(var/name in eng) - dat += "" - even = !even - if(med.len > 0) - dat += "" - for(var/name in med) - dat += "" - even = !even - if(sci.len > 0) - dat += "" - for(var/name in sci) - dat += "" - even = !even - if(sup.len > 0) - dat += "" - for(var/name in sup) - dat += "" - even = !even - if(civ.len > 0) - dat += "" - for(var/name in civ) - dat += "" - even = !even - // in case somebody is insane and added them to the manifest, why not - if(bot.len > 0) - dat += "" - for(var/name in bot) - dat += "" - even = !even - // misc guys - if(misc.len > 0) - dat += "" - for(var/name in misc) - dat += "" - even = !even - - dat += "
NameRank
Heads
[name][heads[name]]
Security
[name][sec[name]]
Engineering
[name][eng[name]]
Medical
[name][med[name]]
Science
[name][sci[name]]
Supply
[name][sup[name]]
Civilian
[name][civ[name]]
Silicon
[name][bot[name]]
Miscellaneous
[name][misc[name]]
" - dat = replacetext(dat, "\n", "") - dat = replacetext(dat, "\t", "") - return dat - - -/datum/datacore/proc/manifest_inject(mob/living/carbon/human/H, client/C) - if(H.mind && (H.mind.assigned_role != H.mind.special_role)) - var/assignment - if(H.mind.assigned_role) - assignment = H.mind.assigned_role - else if(H.job) - assignment = H.job - else - assignment = "Unassigned" - - var/static/record_id_num = 1001 - var/id = num2hex(record_id_num++,6) - if(!C) - C = H.client - var/image = get_id_photo(H, C) - var/obj/item/photo/photo_front = new() - var/obj/item/photo/photo_side = new() - photo_front.photocreate(null, icon(image, dir = SOUTH)) - photo_side.photocreate(null, icon(image, dir = WEST)) - - //These records should ~really~ be merged or something - //General Record - var/datum/data/record/G = new() - G.fields["id"] = id - G.fields["name"] = H.real_name - G.fields["rank"] = assignment - G.fields["age"] = H.age - if(config.mutant_races) - G.fields["species"] = H.dna.species.name - G.fields["fingerprint"] = md5(H.dna.uni_identity) - G.fields["p_stat"] = "Active" - G.fields["m_stat"] = "Stable" - G.fields["sex"] = H.gender - G.fields["photo_front"] = photo_front - G.fields["photo_side"] = photo_side - general += G - - //Medical Record - var/datum/data/record/M = new() - M.fields["id"] = id - M.fields["name"] = H.real_name - M.fields["blood_type"] = H.dna.blood_type - M.fields["b_dna"] = H.dna.unique_enzymes - M.fields["mi_dis"] = "None" - M.fields["mi_dis_d"] = "No minor disabilities have been declared." - M.fields["ma_dis"] = "None" - M.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - M.fields["alg"] = "None" - M.fields["alg_d"] = "No allergies have been detected in this patient." - M.fields["cdi"] = "None" - M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - M.fields["notes"] = "No notes." - medical += M - - //Security Record - var/datum/data/record/S = new() - S.fields["id"] = id - S.fields["name"] = H.real_name - S.fields["criminal"] = "None" - S.fields["mi_crim"] = list() - S.fields["ma_crim"] = list() - S.fields["notes"] = "No notes." - security += S - - //Locked Record - var/datum/data/record/L = new() - L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]") //surely this should just be id, like the others? - L.fields["name"] = H.real_name - L.fields["rank"] = H.mind.assigned_role - L.fields["age"] = H.age - L.fields["sex"] = H.gender - L.fields["blood_type"] = H.dna.blood_type - L.fields["b_dna"] = H.dna.unique_enzymes - L.fields["enzymes"] = H.dna.struc_enzymes - L.fields["identity"] = H.dna.uni_identity - L.fields["species"] = H.dna.species.type - L.fields["features"] = H.dna.features - L.fields["image"] = image - L.fields["reference"] = H - locked += L - return - -/datum/datacore/proc/get_id_photo(mob/living/carbon/human/H, client/C) - var/datum/job/J = SSjob.GetJob(H.mind.assigned_role) - var/datum/preferences/P - if(!C) - C = H.client - if(C) - P = C.prefs - return get_flat_human_icon(null, J, P) +/datum/datacore + var/medical[] = list() + var/medicalPrintCount = 0 + var/general[] = list() + var/security[] = list() + var/securityPrintCount = 0 + var/securityCrimeCounter = 0 + //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character(). + var/locked[] = list() + +/datum/data + var/name = "data" + +/datum/data/record + name = "record" + var/list/fields = list() + +/datum/data/record/Destroy() + if(src in GLOB.data_core.medical) + GLOB.data_core.medical -= src + if(src in GLOB.data_core.security) + GLOB.data_core.security -= src + if(src in GLOB.data_core.general) + GLOB.data_core.general -= src + if(src in GLOB.data_core.locked) + GLOB.data_core.locked -= src + . = ..() + +/datum/data/crime + name = "crime" + var/crimeName = "" + var/crimeDetails = "" + var/author = "" + var/time = "" + var/dataId = 0 + +/datum/datacore/proc/createCrimeEntry(cname = "", cdetails = "", author = "", time = "") + var/datum/data/crime/c = new /datum/data/crime + c.crimeName = cname + c.crimeDetails = cdetails + c.author = author + c.time = time + c.dataId = ++securityCrimeCounter + return c + +/datum/datacore/proc/addMinorCrime(id = "", datum/data/crime/crime) + for(var/datum/data/record/R in security) + if(R.fields["id"] == id) + var/list/crimes = R.fields["mi_crim"] + crimes |= crime + return + +/datum/datacore/proc/removeMinorCrime(id, cDataId) + for(var/datum/data/record/R in security) + if(R.fields["id"] == id) + var/list/crimes = R.fields["mi_crim"] + for(var/datum/data/crime/crime in crimes) + if(crime.dataId == text2num(cDataId)) + crimes -= crime + return + +/datum/datacore/proc/removeMajorCrime(id, cDataId) + for(var/datum/data/record/R in security) + if(R.fields["id"] == id) + var/list/crimes = R.fields["ma_crim"] + for(var/datum/data/crime/crime in crimes) + if(crime.dataId == text2num(cDataId)) + crimes -= crime + return + +/datum/datacore/proc/addMajorCrime(id = "", datum/data/crime/crime) + for(var/datum/data/record/R in security) + if(R.fields["id"] == id) + var/list/crimes = R.fields["ma_crim"] + crimes |= crime + return + +/datum/datacore/proc/manifest() + for(var/mob/dead/new_player/N in GLOB.player_list) + if(ishuman(N.new_character)) + manifest_inject(N.new_character, N.client) + CHECK_TICK + +/datum/datacore/proc/manifest_modify(name, assignment) + var/datum/data/record/foundrecord = find_record("name", name, GLOB.data_core.general) + if(foundrecord) + foundrecord.fields["rank"] = assignment + +/datum/datacore/proc/get_manifest(monochrome, OOC) + var/list/heads = list() + var/list/sec = list() + var/list/eng = list() + var/list/med = list() + var/list/sci = list() + var/list/sup = list() + var/list/civ = list() + var/list/bot = list() + var/list/misc = list() + var/dat = {" + + + + "} + var/even = 0 + // sort mobs + for(var/datum/data/record/t in GLOB.data_core.general) + var/name = t.fields["name"] + var/rank = t.fields["rank"] + var/department = 0 + if(rank in GLOB.command_positions) + heads[name] = rank + department = 1 + if(rank in GLOB.security_positions) + sec[name] = rank + department = 1 + if(rank in GLOB.engineering_positions) + eng[name] = rank + department = 1 + if(rank in GLOB.medical_positions) + med[name] = rank + department = 1 + if(rank in GLOB.science_positions) + sci[name] = rank + department = 1 + if(rank in GLOB.supply_positions) + sup[name] = rank + department = 1 + if(rank in GLOB.civilian_positions) + civ[name] = rank + department = 1 + if(rank in GLOB.nonhuman_positions) + bot[name] = rank + department = 1 + if(!department && !(name in heads)) + misc[name] = rank + if(heads.len > 0) + dat += "" + for(var/name in heads) + dat += "" + even = !even + if(sec.len > 0) + dat += "" + for(var/name in sec) + dat += "" + even = !even + if(eng.len > 0) + dat += "" + for(var/name in eng) + dat += "" + even = !even + if(med.len > 0) + dat += "" + for(var/name in med) + dat += "" + even = !even + if(sci.len > 0) + dat += "" + for(var/name in sci) + dat += "" + even = !even + if(sup.len > 0) + dat += "" + for(var/name in sup) + dat += "" + even = !even + if(civ.len > 0) + dat += "" + for(var/name in civ) + dat += "" + even = !even + // in case somebody is insane and added them to the manifest, why not + if(bot.len > 0) + dat += "" + for(var/name in bot) + dat += "" + even = !even + // misc guys + if(misc.len > 0) + dat += "" + for(var/name in misc) + dat += "" + even = !even + + dat += "
NameRank
Heads
[name][heads[name]]
Security
[name][sec[name]]
Engineering
[name][eng[name]]
Medical
[name][med[name]]
Science
[name][sci[name]]
Supply
[name][sup[name]]
Civilian
[name][civ[name]]
Silicon
[name][bot[name]]
Miscellaneous
[name][misc[name]]
" + dat = replacetext(dat, "\n", "") + dat = replacetext(dat, "\t", "") + return dat + + +/datum/datacore/proc/manifest_inject(mob/living/carbon/human/H, client/C) + set waitfor = FALSE + if(H.mind && (H.mind.assigned_role != H.mind.special_role)) + var/assignment + if(H.mind.assigned_role) + assignment = H.mind.assigned_role + else if(H.job) + assignment = H.job + else + assignment = "Unassigned" + + var/static/record_id_num = 1001 + var/id = num2hex(record_id_num++,6) + if(!C) + C = H.client + var/image = get_id_photo(H, C) + var/obj/item/photo/photo_front = new() + var/obj/item/photo/photo_side = new() + photo_front.photocreate(null, icon(image, dir = SOUTH)) + photo_side.photocreate(null, icon(image, dir = WEST)) + + //These records should ~really~ be merged or something + //General Record + var/datum/data/record/G = new() + G.fields["id"] = id + G.fields["name"] = H.real_name + G.fields["rank"] = assignment + G.fields["age"] = H.age + if(config.mutant_races) + G.fields["species"] = H.dna.species.name + G.fields["fingerprint"] = md5(H.dna.uni_identity) + G.fields["p_stat"] = "Active" + G.fields["m_stat"] = "Stable" + G.fields["sex"] = H.gender + G.fields["photo_front"] = photo_front + G.fields["photo_side"] = photo_side + general += G + + //Medical Record + var/datum/data/record/M = new() + M.fields["id"] = id + M.fields["name"] = H.real_name + M.fields["blood_type"] = H.dna.blood_type + M.fields["b_dna"] = H.dna.unique_enzymes + M.fields["mi_dis"] = "None" + M.fields["mi_dis_d"] = "No minor disabilities have been declared." + M.fields["ma_dis"] = "None" + M.fields["ma_dis_d"] = "No major disabilities have been diagnosed." + M.fields["alg"] = "None" + M.fields["alg_d"] = "No allergies have been detected in this patient." + M.fields["cdi"] = "None" + M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." + M.fields["notes"] = "No notes." + medical += M + + //Security Record + var/datum/data/record/S = new() + S.fields["id"] = id + S.fields["name"] = H.real_name + S.fields["criminal"] = "None" + S.fields["mi_crim"] = list() + S.fields["ma_crim"] = list() + S.fields["notes"] = "No notes." + security += S + + //Locked Record + var/datum/data/record/L = new() + L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]") //surely this should just be id, like the others? + L.fields["name"] = H.real_name + L.fields["rank"] = H.mind.assigned_role + L.fields["age"] = H.age + L.fields["sex"] = H.gender + L.fields["blood_type"] = H.dna.blood_type + L.fields["b_dna"] = H.dna.unique_enzymes + L.fields["enzymes"] = H.dna.struc_enzymes + L.fields["identity"] = H.dna.uni_identity + L.fields["species"] = H.dna.species.type + L.fields["features"] = H.dna.features + L.fields["image"] = image + L.fields["mindref"] = H.mind + locked += L + return + +/datum/datacore/proc/get_id_photo(mob/living/carbon/human/H, client/C) + var/datum/job/J = SSjob.GetJob(H.mind.assigned_role) + var/datum/preferences/P + if(!C) + C = H.client + if(C) + P = C.prefs + return get_flat_human_icon(null, J, P, DUMMY_HUMAN_SLOT_MANIFEST) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index d55a32609a..b653e5c6ae 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -83,10 +83,10 @@ if(isliving(A)) atomsnowflake += "[D]" if(A.dir) - atomsnowflake += "
<< [dir2text(A.dir)] >>" + atomsnowflake += "
<< [dir2text(A.dir)] >>" var/mob/living/M = A atomsnowflake += {" -
[M.ckey ? M.ckey : "No ckey"] / [M.real_name ? M.real_name : "No real name"] +
[M.ckey ? M.ckey : "No ckey"] / [M.real_name ? M.real_name : "No real name"]
BRUTE:[M.getBruteLoss()] FIRE:[M.getFireLoss()] diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 9be242a391..26f42fa059 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -245,7 +245,6 @@ /datum/disease/advance/proc/GenerateCure() if(properties && properties.len) var/res = Clamp(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) - //to_chat(world, "Res = [res]") cures = list(advance_cures[res]) // Get the cure name from the cure_id @@ -333,9 +332,6 @@ // Mix a list of advance diseases and return the mixed result. /proc/Advance_Mix(var/list/D_list) - - //to_chat(world, "Mixing!!!!") - var/list/diseases = list() for(var/datum/disease/advance/A in D_list) @@ -359,7 +355,6 @@ D2.Mix(D1) // Should be only 1 entry left, but if not let's only return a single entry - //to_chat(world, "END MIXING!!!!!") var/datum/disease/advance/to_return = pick(diseases) to_return.Refresh(1) return to_return diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index 2b77885359..c96a22d472 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -1,74 +1,74 @@ -/datum/disease/dnaspread - name = "Space Retrovirus" - max_stages = 4 - spread_text = "On contact" - spread_flags = CONTACT_GENERAL - cure_text = "Mutadone" - cures = list("mutadone") - disease_flags = CAN_CARRY|CAN_RESIST|CURABLE - agent = "S4E1 retrovirus" - viable_mobtypes = list(/mob/living/carbon/human) - var/datum/dna/original_dna = null - var/transformed = 0 - desc = "This disease transplants the genetic code of the initial vector into new hosts." - severity = MEDIUM - - -/datum/disease/dnaspread/stage_act() - ..() - if(!affected_mob.dna) - cure() - if(NOTRANSSTING in affected_mob.dna.species.species_traits) //Only species that can be spread by transformation sting can be spread by the retrovirus - cure() - - if(!strain_data["dna"]) - //Absorbs the target DNA. - strain_data["dna"] = new affected_mob.dna.type - affected_mob.dna.copy_dna(strain_data["dna"]) +/datum/disease/dnaspread + name = "Space Retrovirus" + max_stages = 4 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Mutadone" + cures = list("mutadone") + disease_flags = CAN_CARRY|CAN_RESIST|CURABLE + agent = "S4E1 retrovirus" + viable_mobtypes = list(/mob/living/carbon/human) + var/datum/dna/original_dna = null + var/transformed = 0 + desc = "This disease transplants the genetic code of the initial vector into new hosts." + severity = MEDIUM + + +/datum/disease/dnaspread/stage_act() + ..() + if(!affected_mob.dna) + cure() + if((NOTRANSSTING in affected_mob.dna.species.species_traits) || (NO_DNA_COPY in affected_mob.dna.species.species_traits)) //Only species that can be spread by transformation sting can be spread by the retrovirus + cure() + + if(!strain_data["dna"]) + //Absorbs the target DNA. + strain_data["dna"] = new affected_mob.dna.type + affected_mob.dna.copy_dna(strain_data["dna"]) carrier = TRUE stage = 4 - return - - switch(stage) - if(2 || 3) //Pretend to be a cold and give time to spread. - if(prob(8)) - affected_mob.emote("sneeze") - if(prob(8)) - affected_mob.emote("cough") - if(prob(1)) - to_chat(affected_mob, "Your muscles ache.") - if(prob(20)) - affected_mob.take_bodypart_damage(1) - if(prob(1)) - to_chat(affected_mob, "Your stomach hurts.") - if(prob(20)) - affected_mob.adjustToxLoss(2) - affected_mob.updatehealth() - if(4) - if(!transformed && !carrier) - //Save original dna for when the disease is cured. - original_dna = new affected_mob.dna.type - affected_mob.dna.copy_dna(original_dna) - - to_chat(affected_mob, "You don't feel like yourself..") - var/datum/dna/transform_dna = strain_data["dna"] - - transform_dna.transfer_identity(affected_mob, transfer_SE = 1) - affected_mob.real_name = affected_mob.dna.real_name - affected_mob.updateappearance(mutcolor_update=1) - affected_mob.domutcheck() - - transformed = 1 - carrier = 1 //Just chill out at stage 4 - - return - -/datum/disease/dnaspread/Destroy() - if (original_dna && transformed && affected_mob) - original_dna.transfer_identity(affected_mob, transfer_SE = 1) - affected_mob.real_name = affected_mob.dna.real_name - affected_mob.updateappearance(mutcolor_update=1) - affected_mob.domutcheck() - - to_chat(affected_mob, "You feel more like yourself.") - return ..() \ No newline at end of file + return + + switch(stage) + if(2 || 3) //Pretend to be a cold and give time to spread. + if(prob(8)) + affected_mob.emote("sneeze") + if(prob(8)) + affected_mob.emote("cough") + if(prob(1)) + to_chat(affected_mob, "Your muscles ache.") + if(prob(20)) + affected_mob.take_bodypart_damage(1) + if(prob(1)) + to_chat(affected_mob, "Your stomach hurts.") + if(prob(20)) + affected_mob.adjustToxLoss(2) + affected_mob.updatehealth() + if(4) + if(!transformed && !carrier) + //Save original dna for when the disease is cured. + original_dna = new affected_mob.dna.type + affected_mob.dna.copy_dna(original_dna) + + to_chat(affected_mob, "You don't feel like yourself..") + var/datum/dna/transform_dna = strain_data["dna"] + + transform_dna.transfer_identity(affected_mob, transfer_SE = 1) + affected_mob.real_name = affected_mob.dna.real_name + affected_mob.updateappearance(mutcolor_update=1) + affected_mob.domutcheck() + + transformed = 1 + carrier = 1 //Just chill out at stage 4 + + return + +/datum/disease/dnaspread/Destroy() + if (original_dna && transformed && affected_mob) + original_dna.transfer_identity(affected_mob, transfer_SE = 1) + affected_mob.real_name = affected_mob.dna.real_name + affected_mob.updateappearance(mutcolor_update=1) + affected_mob.domutcheck() + + to_chat(affected_mob, "You feel more like yourself.") + return ..() diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 4bacf2d9e8..27a9338191 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -235,7 +235,9 @@ flavor_text = dna.features["flavor_text"] //Update the flavor_text to use new dna text if(mrace) - set_species(mrace, icon_update=0) + var/datum/species/newrace = new mrace.type + newrace.copy_properties_from(mrace) + set_species(newrace, icon_update=0) if(newreal_name) real_name = newreal_name @@ -396,4 +398,4 @@ value = values return value -/////////////////////////// DNA HELPER-PROCS +/////////////////////////// DNA HELPER-PROCS \ No newline at end of file diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 0d4f7810c6..60a53967ae 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -21,6 +21,7 @@ GLOBAL_LIST_INIT(huds, list( ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(), ANTAG_HUD_CLOCKWORK = new/datum/atom_hud/antag(), ANTAG_HUD_BORER = new/datum/atom_hud/antag(), + ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(), )) /datum/atom_hud diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 6ce082bd2a..84f0f00e45 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -11,7 +11,7 @@ /datum/action/neck_chop/Trigger() if(owner.incapacitated()) - to_chat(owner, "You can't use Krav Maga while you're incapacitated.") + to_chat(owner, "You can't use [name] while you're incapacitated.") return var/mob/living/carbon/human/H = owner if (H.mind.martial_art.streak == "neck_chop") @@ -28,7 +28,7 @@ /datum/action/leg_sweep/Trigger() if(owner.incapacitated()) - to_chat(owner, "You can't use Krav Maga while you're incapacitated.") + to_chat(owner, "You can't use [name] while you're incapacitated.") return var/mob/living/carbon/human/H = owner if (H.mind.martial_art.streak == "leg_sweep") @@ -45,7 +45,7 @@ /datum/action/lung_punch/Trigger() if(owner.incapacitated()) - to_chat(owner, "You can't use Krav Maga while you're incapacitated.") + to_chat(owner, "You can't use [name] while you're incapacitated.") return var/mob/living/carbon/human/H = owner if (H.mind.martial_art.streak == "quick_choke") @@ -57,14 +57,14 @@ /datum/martial_art/krav_maga/teach(mob/living/carbon/human/H,make_temporary=0) if(..()) - to_chat(H, "You know the arts of Krav Maga!") + to_chat(H, "You know the arts of [name]!") to_chat(H, "Place your cursor over a move at the top of the screen to see what it does.") neckchop.Grant(H) legsweep.Grant(H) lungpunch.Grant(H) /datum/martial_art/krav_maga/on_remove(mob/living/carbon/human/H) - to_chat(H, "You suddenly forget the arts of Krav Maga...") + to_chat(H, "You suddenly forget the arts of [name]...") neckchop.Remove(H) legsweep.Remove(H) lungpunch.Remove(H) @@ -140,7 +140,7 @@ playsound(get_turf(D), 'sound/effects/hit_punch.ogg', 50, 1, -1) D.visible_message("[A] [picked_hit_type] [D]!", \ "[A] [picked_hit_type] you!") - add_logs(A, D, "[picked_hit_type] with Krav Maga") + add_logs(A, D, "[picked_hit_type] with [name]") return 1 /datum/martial_art/krav_maga/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 5ad9f4aa6d..147f442470 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -121,8 +121,9 @@ new_character.key = key //now transfer the key to link the client to our new body if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs. var/mob/living/L = new_character - L.canbearoused = L.client.prefs.arousable //Technically this should make taking over a character mean the body gain the new minds setting... - L.update_arousal_hud() //Removes the old icon + if(L.client && L.client.prefs) + L.canbearoused = L.client.prefs.arousable //Technically this should make taking over a character mean the body gain the new minds setting... + L.update_arousal_hud() //Removes the old icon /datum/mind/proc/store_memory(new_text) memory += "[new_text]
" @@ -131,10 +132,10 @@ memory = null // Datum antag mind procs -/datum/mind/proc/add_antag_datum(datum_type) +/datum/mind/proc/add_antag_datum(datum_type, team) if(!datum_type) return - var/datum/antagonist/A = new datum_type(src) + var/datum/antagonist/A = new datum_type(src, team) if(!A.can_be_owned(src)) qdel(A) return @@ -194,6 +195,11 @@ src.remove_antag_datum(ANTAG_DATUM_TRAITOR) SSticker.mode.update_traitor_icons_removed(src) +/datum/mind/proc/remove_brother() + if(src in SSticker.mode.brothers) + src.remove_antag_datum(ANTAG_DATUM_BROTHER) + SSticker.mode.update_brother_icons_removed(src) + /datum/mind/proc/remove_nukeop() if(src in SSticker.mode.syndicates) SSticker.mode.syndicates -= src @@ -348,6 +354,12 @@ var/obj_count = 1 for(var/datum/objective/objective in objectives) output += "
Objective #[obj_count++]: [objective.explanation_text]" + var/list/datum/mind/other_owners = objective.get_owners() - src + if(other_owners.len) + output += "
    " + for(var/datum/mind/M in other_owners) + output += "
  • Conspirator: [M.name]
  • " + output += "
" if(window) recipient << browse(output,"window=memory") @@ -384,7 +396,7 @@ /** TRAITOR ***/ text = "traitor" - if (SSticker.mode.config_tag=="traitor" || SSticker.mode.config_tag=="traitorchan") + if (SSticker.mode.config_tag=="traitor" || SSticker.mode.config_tag=="traitorchan" || SSticker.mode.config_tag=="traitorbro") text = uppertext(text) text = "[text]: " if (src in SSticker.mode.traitors) @@ -404,6 +416,21 @@ if(ishuman(current) || ismonkey(current)) + /** BROTHER **/ + text = "brother" + if(SSticker.mode.config_tag == "traitorbro") + text = uppertext(text) + text = "[text]: " + if(src in SSticker.mode.brothers) + text += "Brother | no" + + if(current && current.client && (ROLE_BROTHER in current.client.prefs.be_special)) + text += " | Enabled in Prefs" + else + text += " | Disabled in Prefs" + + sections["brother"] = text + /** CHANGELING ***/ text = "changeling" if (SSticker.mode.config_tag=="changeling" || SSticker.mode.config_tag=="traitorchan") @@ -563,8 +590,6 @@ if(src in SSticker.mode.abductors) text += "Abductor | human" text += " | undress | equip" - else - text += "abductor | human" if(current && current.client && (ROLE_ABDUCTOR in current.client.prefs.be_special)) text += " | Enabled in Prefs" @@ -1031,7 +1056,7 @@ log_admin("[key_name(usr)] has wizard'ed [current].") SSticker.mode.update_wiz_icons_added(src) if("lair") - current.loc = pick(GLOB.wizardstart) + current.forceMove(pick(GLOB.wizardstart)) if("dressup") SSticker.mode.equip_wizard(current) if("name") @@ -1093,7 +1118,7 @@ message_admins("[key_name_admin(usr)] has nuke op'ed [current].") log_admin("[key_name(usr)] has nuke op'ed [current].") if("lair") - current.loc = get_turf(locate("landmark*Syndicate-Spawn")) + current.forceMove(get_turf(locate("landmark*Syndicate-Spawn"))) if("dressup") var/mob/living/carbon/human/H = current qdel(H.belt) @@ -1217,13 +1242,6 @@ if("clear") to_chat(usr, "Not implemented yet. Sorry!") //SSticker.mode.update_abductor_icons_removed(src) - if("abductor") - if(!ishuman(current)) - to_chat(usr, "This only works on humans!") - return - make_Abductor() - log_admin("[key_name(usr)] turned [current] into abductor.") - SSticker.mode.update_abductor_icons_added(src) if("equip") if(!ishuman(current)) to_chat(usr, "This only works on humans!") @@ -1252,7 +1270,6 @@ src = null M = H.monkeyize() src = M.mind - //to_chat(world, "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!") else if (istype(M) && length(M.viruses)) for(var/thing in M.viruses) var/datum/disease/D = thing @@ -1284,6 +1301,13 @@ if(H) src = H.mind + else if (href_list["brother"]) + switch(href_list["brother"]) + if("clear") + remove_brother() + log_admin("[key_name(usr)] has de-brother'ed [current].") + SSticker.mode.update_brother_icons_removed(src) + else if (href_list["silicon"]) switch(href_list["silicon"]) if("unemag") @@ -1368,7 +1392,7 @@ current.faction |= "syndicate" if(spawnloc) - current.loc = spawnloc + current.forceMove(spawnloc) if(ishuman(current)) var/mob/living/carbon/human/H = current @@ -1418,7 +1442,7 @@ SSjob.SendToLateJoin(current) to_chat(current, "HOT INSERTION, GO GO GO") else - current.loc = pick(GLOB.wizardstart) + current.forceMove(pick(GLOB.wizardstart)) SSticker.mode.equip_wizard(current) SSticker.mode.name_wizard(current) @@ -1463,52 +1487,7 @@ take_uplink() var/fail = 0 fail |= !SSticker.mode.equip_revolutionary(current) - -/datum/mind/proc/make_Abductor() - var/role = alert("Abductor Role ?","Role","Agent","Scientist") - var/team = input("Abductor Team ?","Team ?") in list(1,2,3,4) - var/teleport = alert("Teleport to ship ?","Teleport","Yes","No") - - if(!role || !team || !teleport) - return - - if(!ishuman(current)) - return - - SSticker.mode.abductors |= src - - var/datum/objective/experiment/O = new - O.owner = src - objectives += O - - var/mob/living/carbon/human/H = current - - H.set_species(/datum/species/abductor) - var/datum/species/abductor/S = H.dna.species - - if(role == "Scientist") - S.scientist = TRUE - S.team = team - - var/list/obj/effect/landmark/abductor/agent_landmarks = new - var/list/obj/effect/landmark/abductor/scientist_landmarks = new - agent_landmarks.len = 4 - scientist_landmarks.len = 4 - for(var/obj/effect/landmark/abductor/A in GLOB.landmarks_list) - if(istype(A, /obj/effect/landmark/abductor/agent)) - agent_landmarks[text2num(A.team)] = A - else if(istype(A, /obj/effect/landmark/abductor/scientist)) - scientist_landmarks[text2num(A.team)] = A - - var/obj/effect/landmark/L - if(teleport=="Yes") - switch(role) - if("Agent") - L = agent_landmarks[team] - if("Scientist") - L = scientist_landmarks[team] - H.forceMove(L.loc) - + /datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) spell_list += S S.action.Grant(current) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index e2296dd39a..4e8ae4e73a 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -117,9 +117,10 @@ GLOBAL_LIST_EMPTY(mutations_list) name = "Hulk" quality = POSITIVE - dna_block = NON_SCANNABLE + get_chance = 15 + lowest_value = 256 * 12 text_gain_indication = "Your muscles hurt!" - species_allowed = list("human") //no skeleton/lizard hulk + species_allowed = list("fly") //no skeleton/lizard hulk health_req = 25 /datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner) diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index e3e8d0e366..f9883cfe50 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -29,7 +29,6 @@ bar.pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)) /datum/progressbar/proc/update(progress) - //to_chat(world, "Update [progress] - [goal] - [(progress / goal)] - [((progress / goal) * 100)] - [round(((progress / goal) * 100), 5)]") if (!user || !user.client) shown = 0 return diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index b3af867bb4..33498e046f 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -148,7 +148,7 @@ id = "spacehotel" suffix = "spacehotel.dmm" name = "The Twin-Nexus Hotel" - description = "A interstellar hotel, where the weary spaceman can rest their head and relax, assured that the residental staff will not murder them in their sleep. Probably." + description = "An interstellar hotel, where the weary spaceman can rest their head and relax, assured that the residental staff will not murder them in their sleep. Probably." /datum/map_template/ruin/space/turreted_outpost id = "turreted-outpost" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 9ca564cd2d..b8e51ac860 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -29,11 +29,20 @@ /datum/status_effect/incapacitating/knockdown id = "knockdown" +/datum/status_effect/incapacitating/knockdown/tick() + if(owner.staminaloss) + owner.adjustStaminaLoss(-0.3) //reduce stamina loss by 0.3 per tick, 6 per 2 seconds + + //UNCONSCIOUS /datum/status_effect/incapacitating/unconscious id = "unconscious" needs_update_stat = TRUE +/datum/status_effect/incapacitating/unconscious/tick() + if(owner.staminaloss) + owner.adjustStaminaLoss(-0.3) //reduce stamina loss by 0.3 per tick, 6 per 2 seconds + //SLEEPING /datum/status_effect/incapacitating/sleeping id = "sleeping" @@ -57,7 +66,7 @@ /datum/status_effect/incapacitating/sleeping/tick() if(owner.staminaloss) - owner.adjustStaminaLoss(-0.35) //reduce stamina loss by 0.35 per tick, 7 per 2 seconds + owner.adjustStaminaLoss(-0.5) //reduce stamina loss by 0.5 per tick, 10 per 2 seconds if(human_owner && human_owner.drunkenness) human_owner.drunkenness *= 0.997 //reduce drunkenness by 0.3% per tick, 6% per 2 seconds if(prob(20)) diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index a2abdf64a1..e3e7e83dcf 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -42,7 +42,7 @@ /datum/weather/New() ..() - SSweather.existing_weather |= src + SSweather.existing_weather += src /datum/weather/Destroy() SSweather.existing_weather -= src @@ -108,7 +108,7 @@ stage = END_STAGE update_areas() -/datum/weather/proc/can_impact(mob/living/L) //Can this weather impact a mob? +/datum/weather/proc/can_weather_act(mob/living/L) //Can this weather impact a mob? var/turf/mob_turf = get_turf(L) if(mob_turf && (mob_turf.z != target_z)) return @@ -118,7 +118,7 @@ return return 1 -/datum/weather/proc/impact(mob/living/L) //What effect does this weather have on the hapless mob? +/datum/weather/proc/weather_act(mob/living/L) //What effect does this weather have on the hapless mob? return /datum/weather/proc/update_areas() diff --git a/code/datums/weather/weather_types.dm b/code/datums/weather/weather_types.dm deleted file mode 100644 index 3368dcf1dd..0000000000 --- a/code/datums/weather/weather_types.dm +++ /dev/null @@ -1,225 +0,0 @@ -//Different types of weather. - -/datum/weather/floor_is_lava //The Floor is Lava: Makes all turfs damage anyone on them unless they're standing on a solid object. - name = "the floor is lava" - desc = "The ground turns into surprisingly cool lava, lightly damaging anything on the floor." - - telegraph_message = "Waves of heat emanate from the ground..." - telegraph_duration = 150 - - weather_message = "The floor is lava! Get on top of something!" - weather_duration_lower = 300 - weather_duration_upper = 600 - weather_overlay = "lava" - - end_message = "The ground cools and returns to its usual form." - end_duration = 0 - - area_type = /area - protected_areas = list(/area/space) - target_z = ZLEVEL_STATION_PRIMARY - - overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only - immunity_type = "lava" - -/datum/weather/floor_is_lava/impact(mob/living/L) - for(var/obj/structure/O in L.loc) - if(O.density) - return - if(L.loc.density) - return - if(!L.client) //Only sentient people are going along with it! - return - L.adjustFireLoss(3) - - -/datum/weather/advanced_darkness //Advanced Darkness: Restricts the vision of all affected mobs to a single tile in the cardinal directions. - name = "advanced darkness" - desc = "Everything in the area is effectively blinded, unable to see more than a foot or so around itself." - - telegraph_message = "The lights begin to dim... is the power going out?" - telegraph_duration = 150 - - weather_message = "This isn't your average everday darkness... this is advanced darkness!" - weather_duration_lower = 300 - weather_duration_upper = 300 - - end_message = "At last, the darkness recedes." - end_duration = 0 - - area_type = /area - target_z = ZLEVEL_STATION_PRIMARY - -/datum/weather/advanced_darkness/update_areas() - for(var/V in impacted_areas) - var/area/A = V - if(stage == MAIN_STAGE) - A.invisibility = 0 - A.set_opacity(TRUE) - A.layer = overlay_layer - A.icon = 'icons/effects/weather_effects.dmi' - A.icon_state = "darkness" - else - A.invisibility = INVISIBILITY_MAXIMUM - A.set_opacity(FALSE) - - -/datum/weather/ash_storm //Ash Storms: Common happenings on lavaland. Heavily obscures vision and deals heavy fire damage to anyone caught outside. - name = "ash storm" - desc = "An intense atmospheric storm lifts ash off of the planet's surface and billows it down across the area, dealing intense fire damage to the unprotected." - - telegraph_message = "An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter." - telegraph_duration = 300 - telegraph_sound = 'sound/lavaland/ash_storm_windup.ogg' - telegraph_overlay = "light_ash" - - weather_message = "Smoldering clouds of scorching ash billow down around you! Get inside!" - weather_duration_lower = 600 - weather_duration_upper = 1500 - weather_sound = 'sound/lavaland/ash_storm_start.ogg' - weather_overlay = "ash_storm" - - end_message = "The shrieking wind whips away the last of the ash and falls to its usual murmur. It should be safe to go outside now." - end_duration = 300 - end_sound = 'sound/lavaland/ash_storm_end.ogg' - end_overlay = "light_ash" - - area_type = /area/lavaland/surface/outdoors - target_z = ZLEVEL_LAVALAND - - immunity_type = "ash" - - probability = 90 - -/datum/weather/ash_storm/proc/is_ash_immune(mob/living/L) - if(istype(L.loc, /obj/mecha)) //Mechs are immune - return TRUE - if(ishuman(L)) //Are you immune? - var/mob/living/carbon/human/H = L - var/thermal_protection = H.get_thermal_protection() - if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) - return TRUE - if(istype(L.loc, /mob/living) && L.loc != L) //Matryoshka check - return is_ash_immune(L.loc) - return FALSE //RIP you - -/datum/weather/ash_storm/impact(mob/living/L) - if(is_ash_immune(L)) - return - L.adjustFireLoss(4) - -/datum/weather/ash_storm/emberfall //Emberfall: An ash storm passes by, resulting in harmless embers falling like snow. 10% to happen in place of an ash storm. - name = "emberfall" - desc = "A passing ash storm blankets the area in harmless embers." - - weather_message = "Gentle embers waft down around you like grotesque snow. The storm seems to have passed you by..." - weather_sound = 'sound/lavaland/ash_storm_windup.ogg' - weather_overlay = "light_ash" - - end_message = "The emberfall slows, stops. Another layer of hardened soot to the basalt beneath your feet." - - aesthetic = TRUE - - probability = 10 - -/datum/weather/rad_storm - name = "radiation storm" - desc = "A cloud of intense radiation passes through the area dealing rad damage to those who are unprotected." - - telegraph_duration = 400 - telegraph_message = "The air begins to grow warm." - - weather_message = "You feel waves of heat wash over you! Find shelter!" - weather_overlay = "ash_storm" - weather_duration_lower = 100 - weather_duration_upper = 600 - weather_color = "green" - weather_sound = 'sound/misc/bloblarm.ogg' - - end_duration = 100 - end_message = "The air seems to be cooling off again." - - area_type = /area - protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer, - /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle) - target_z = ZLEVEL_STATION_PRIMARY - - immunity_type = "rad" - -/datum/weather/rad_storm/telegraph() - ..() - status_alarm("alert") - - -/datum/weather/rad_storm/impact(mob/living/L) - var/resist = L.getarmor(null, "rad") - if(prob(40)) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.dna && H.dna.species) - if(!(RADIMMUNE in H.dna.species.species_traits)) - if(prob(max(0,100-resist))) - H.randmuti() - if(prob(50)) - if(prob(90)) - H.randmutb() - else - H.randmutg() - H.domutcheck() - L.rad_act(20,1) -/datum/weather/rad_storm/end() - if(..()) - return - priority_announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert") - status_alarm() - sleep(300) - revoke_maint_all_access() // Need to make this a timer at some point. - - -/datum/weather/rad_storm/proc/status_alarm(command) //Makes the status displays show the radiation warning for those who missed the announcement. - var/datum/radio_frequency/frequency = SSradio.return_frequency(1435) - - if(!frequency) - return - - var/datum/signal/status_signal = new - var/atom/movable/virtualspeaker/virt = new /atom/movable/virtualspeaker(null) - status_signal.source = virt - status_signal.transmission_method = 1 - status_signal.data["command"] = "shuttle" - - if(command == "alert") - status_signal.data["command"] = "alert" - status_signal.data["picture_state"] = "radiation" - - frequency.post_signal(src, status_signal) - - -/datum/weather/acid_rain - name = "acid rain" - desc = "Some stay dry and others feel the pain" - - telegraph_duration = 400 - telegraph_message = "Stinging droplets start to fall upon you.." - telegraph_sound = 'sound/ambience/acidrain_start.ogg' - - weather_message = "Your skin melts underneath the rain!" - weather_overlay = "acid_rain" - weather_duration_lower = 600 - weather_duration_upper = 1500 - weather_sound = 'sound/ambience/acidrain_mid.ogg' - - end_duration = 100 - end_message = "The rain starts to dissipate." - end_sound = 'sound/ambience/acidrain_end.ogg' - - area_type = /area/lavaland/surface/outdoors - target_z = ZLEVEL_LAVALAND - - immunity_type = "acid" // temp - - -/datum/weather/acid_rain/impact(mob/living/L) - var/resist = L.getarmor(null, "acid") - if(prob(max(0,100-resist))) - L.acid_act(20,20) diff --git a/code/datums/weather/weather_types/acid_rain.dm b/code/datums/weather/weather_types/acid_rain.dm new file mode 100644 index 0000000000..cb4ced8595 --- /dev/null +++ b/code/datums/weather/weather_types/acid_rain.dm @@ -0,0 +1,29 @@ +//Acid rain is part of the natural weather cycle in the humid forests of Planetstation, and cause acid damage to anyone unprotected. +/datum/weather/acid_rain + name = "acid rain" + desc = "The planet's thunderstorms are by nature acidic, and will incinerate anyone standing beneath them without protection." + + telegraph_duration = 400 + telegraph_message = "Thunder rumbles far above. You hear droplets drumming against the canopy. Seek shelter." + telegraph_sound = 'sound/ambience/acidrain_start.ogg' + + weather_message = "Acidic rain pours down around you! Get inside!" + weather_overlay = "acid_rain" + weather_duration_lower = 600 + weather_duration_upper = 1500 + weather_sound = 'sound/ambience/acidrain_mid.ogg' + + end_duration = 100 + end_message = "The downpour gradually slows to a light shower. It should be safe outside now." + end_sound = 'sound/ambience/acidrain_end.ogg' + + area_type = /area/lavaland/surface/outdoors + target_z = ZLEVEL_LAVALAND + + immunity_type = "acid" // temp + + +/datum/weather/acid_rain/weather_act(mob/living/L) + var/resist = L.getarmor(null, "acid") + if(prob(max(0,100-resist))) + L.acid_act(20,20) diff --git a/code/datums/weather/weather_types/advanced_darkness.dm b/code/datums/weather/weather_types/advanced_darkness.dm new file mode 100644 index 0000000000..75cc2b1a5f --- /dev/null +++ b/code/datums/weather/weather_types/advanced_darkness.dm @@ -0,0 +1,30 @@ +//Restricts the vision of affected mobs to a single tile in the cardinal directions. +/datum/weather/advanced_darkness + name = "advanced darkness" + desc = "Everything in the area is effectively blinded, unable to see more than a foot or so around itself." + + telegraph_message = "Your eyes hurt... a vignette settles in your vision and closes in." + telegraph_duration = 150 + + weather_message = "This isn't your average everday darkness... this is advanced darkness!" + weather_duration_lower = 300 + weather_duration_upper = 300 + + end_message = "At last, the darkness recedes." + end_duration = 0 + + area_type = /area + target_z = ZLEVEL_STATION_PRIMARY + +/datum/weather/advanced_darkness/update_areas() + for(var/V in impacted_areas) + var/area/A = V + if(stage == MAIN_STAGE) + A.invisibility = 0 + A.set_opacity(TRUE) + A.layer = overlay_layer + A.icon = 'icons/effects/weather_effects.dmi' + A.icon_state = "darkness" + else + A.invisibility = INVISIBILITY_MAXIMUM + A.set_opacity(FALSE) diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm new file mode 100644 index 0000000000..2c2212fde5 --- /dev/null +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -0,0 +1,61 @@ +//Ash storms happen frequently on lavaland. They heavily obscure vision, and cause high fire damage to anyone caught outside. +/datum/weather/ash_storm + name = "ash storm" + desc = "An intense atmospheric storm lifts ash off of the planet's surface and billows it down across the area, dealing intense fire damage to the unprotected." + + telegraph_message = "An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter." + telegraph_duration = 300 + telegraph_sound = 'sound/lavaland/ash_storm_windup.ogg' + telegraph_overlay = "light_ash" + + weather_message = "Smoldering clouds of scorching ash billow down around you! Get inside!" + weather_duration_lower = 600 + weather_duration_upper = 1200 + weather_sound = 'sound/lavaland/ash_storm_start.ogg' + weather_overlay = "ash_storm" + + end_message = "The shrieking wind whips away the last of the ash and falls to its usual murmur. It should be safe to go outside now." + end_duration = 300 + end_sound = 'sound/lavaland/ash_storm_end.ogg' + end_overlay = "light_ash" + + area_type = /area/lavaland/surface/outdoors + target_z = ZLEVEL_LAVALAND + + immunity_type = "ash" + + probability = 90 + +/datum/weather/ash_storm/proc/is_ash_immune(mob/living/L) + if(istype(L.loc, /obj/mecha)) //Mechs are immune + return TRUE + if(ishuman(L)) //Are you immune? + var/mob/living/carbon/human/H = L + var/thermal_protection = H.get_thermal_protection() + if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) + return TRUE + if(istype(L.loc, /mob/living) && L.loc != L) //Matryoshka check + return is_ash_immune(L.loc) + return FALSE //RIP you + +/datum/weather/ash_storm/weather_act(mob/living/L) + if(is_ash_immune(L)) + return + L.adjustFireLoss(4) + + +//Emberfalls are the result of an ash storm passing by close to the playable area of lavaland. They have a 10% chance to trigger in place of an ash storm. +/datum/weather/ash_storm/emberfall + name = "emberfall" + desc = "A passing ash storm blankets the area in harmless embers." + + weather_message = "Gentle embers waft down around you like grotesque snow. The storm seems to have passed you by..." + weather_sound = 'sound/lavaland/ash_storm_windup.ogg' + weather_overlay = "light_ash" + + end_message = "The emberfall slows, stops. Another layer of hardened soot to the basalt beneath your feet." + end_sound = null + + aesthetic = TRUE + + probability = 10 diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm new file mode 100644 index 0000000000..52f82abec9 --- /dev/null +++ b/code/datums/weather/weather_types/floor_is_lava.dm @@ -0,0 +1,32 @@ +//Causes fire damage to anyone not standing on a dense object. +/datum/weather/floor_is_lava + name = "the floor is lava" + desc = "The ground turns into surprisingly cool lava, lightly damaging anything on the floor." + + telegraph_message = "You feel the ground beneath you getting hot. Waves of heat distort the air." + telegraph_duration = 150 + + weather_message = "The floor is lava! Get on top of something!" + weather_duration_lower = 300 + weather_duration_upper = 600 + weather_overlay = "lava" + + end_message = "The ground cools and returns to its usual form." + end_duration = 0 + + area_type = /area + protected_areas = list(/area/space) + target_z = ZLEVEL_STATION_PRIMARY + + overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only + immunity_type = "lava" + +/datum/weather/floor_is_lava/weather_act(mob/living/L) + for(var/obj/structure/O in L.loc) + if(O.density) + return + if(L.loc.density) + return + if(!L.client) //Only sentient people are going along with it! + return + L.adjustFireLoss(3) diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm new file mode 100644 index 0000000000..3c11750dda --- /dev/null +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -0,0 +1,72 @@ +//Radiation storms occur when the station passes through an irradiated area, and irradiate anyone not standing in protected areas (maintenance, emergency storage, etc.) +/datum/weather/rad_storm + name = "radiation storm" + desc = "A cloud of intense radiation passes through the area dealing rad damage to those who are unprotected." + + telegraph_duration = 400 + telegraph_message = "The air begins to grow warm." + + weather_message = "You feel waves of heat wash over you! Find shelter!" + weather_overlay = "ash_storm" + weather_duration_lower = 600 + weather_duration_upper = 1500 + weather_color = "green" + weather_sound = 'sound/misc/bloblarm.ogg' + + end_duration = 100 + end_message = "The air seems to be cooling off again." + + area_type = /area + protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer, + /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle) + target_z = ZLEVEL_STATION_PRIMARY + + immunity_type = "rad" + +/datum/weather/rad_storm/telegraph() + ..() + status_alarm("alert") + + +/datum/weather/rad_storm/weather_act(mob/living/L) + var/resist = L.getarmor(null, "rad") + if(prob(40)) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.dna && H.dna.species) + if(!(RADIMMUNE in H.dna.species.species_traits)) + if(prob(max(0,100-resist))) + H.randmuti() + if(prob(50)) + if(prob(90)) + H.randmutb() + else + H.randmutg() + H.domutcheck() + L.rad_act(20,1) + +/datum/weather/rad_storm/end() + if(..()) + return + priority_announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert") + status_alarm() + sleep(300) + revoke_maint_all_access() // Need to make this a timer at some point. + +/datum/weather/rad_storm/proc/status_alarm(command) //Makes the status displays show the radiation warning for those who missed the announcement. + var/datum/radio_frequency/frequency = SSradio.return_frequency(1435) + + if(!frequency) + return + + var/datum/signal/status_signal = new + var/atom/movable/virtualspeaker/virt = new /atom/movable/virtualspeaker(null) + status_signal.source = virt + status_signal.transmission_method = 1 + status_signal.data["command"] = "shuttle" + + if(command == "alert") + status_signal.data["command"] = "alert" + status_signal.data["picture_state"] = "radiation" + + frequency.post_signal(src, status_signal) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c399f7c00d..508459188b 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -150,6 +150,7 @@ return 0 /atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) + SendSignal(COMSIG_ATOM_HULK_ATTACK, user) if(does_attack_animation) user.changeNext_move(CLICK_CD_MELEE) add_logs(user, src, "punched", "hulk powers") @@ -222,10 +223,12 @@ return /atom/proc/emp_act(severity) + SendSignal(COMSIG_ATOM_EMP_ACT, severity) if(istype(wires) && !(flags_2 & NO_EMP_WIRES_2)) wires.emp_pulse() /atom/proc/bullet_act(obj/item/projectile/P, def_zone) + SendSignal(COMSIG_ATOM_BULLET_ACT, P, def_zone) . = P.on_hit(src, 0, def_zone) /atom/proc/in_contents_of(container)//can take class or object instance as argument @@ -291,6 +294,7 @@ to_chat(user, "[total_volume] units of various reagents") else to_chat(user, "Nothing.") + SendSignal(COMSIG_PARENT_EXAMINE, user) /atom/proc/relaymove(mob/user) if(buckle_message_cooldown <= world.time) @@ -307,9 +311,11 @@ SendSignal(COMSIG_ATOM_EX_ACT, severity, target) /atom/proc/blob_act(obj/structure/blob/B) + SendSignal(COMSIG_ATOM_BLOB_ACT, B) return /atom/proc/fire_act(exposed_temperature, exposed_volume) + SendSignal(COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume) return /atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked) @@ -448,7 +454,6 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) cur_y = y_arr.Find(src.z) if(cur_y) break -// to_chat(world, "X = [cur_x]; Y = [cur_y]") if(cur_x && cur_y) return list("x"=cur_x,"y"=cur_y) else @@ -473,21 +478,26 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) SendSignal(COMSIG_ATOM_SING_PULL, S, current_size) /atom/proc/acid_act(acidpwr, acid_volume) + SendSignal(COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume) return /atom/proc/emag_act() + SendSignal(COMSIG_ATOM_EMAG_ACT) return /atom/proc/narsie_act() + SendSignal(COMSIG_ATOM_NARSIE_ACT) return /atom/proc/ratvar_act() + SendSignal(COMSIG_ATOM_RATVAR_ACT) return /atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) return FALSE /atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + SendSignal(COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode) return FALSE /atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user) @@ -627,3 +637,6 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) /atom/Entered(atom/movable/AM, atom/oldLoc) SendSignal(COMSIG_ATOM_ENTERED, AM, oldLoc) + +/atom/proc/return_temperature() + return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 05991cb213..6c544c4497 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,4 +1,3 @@ - /atom/movable layer = OBJ_LAYER var/last_move = null @@ -117,6 +116,7 @@ //Called after a successful Move(). By this point, we've already moved /atom/movable/proc/Moved(atom/OldLoc, Dir) + SendSignal(COMSIG_MOVABLE_MOVED, OldLoc, Dir) if (!inertia_moving) inertia_next_move = world.time + inertia_move_delay newtonian_move(Dir) @@ -215,6 +215,7 @@ //to differentiate it, naturally everyone forgot about this immediately and so some things //would bump twice, so now it's called Collide /atom/movable/proc/Collide(atom/A) + SendSignal(COMSIG_MOVABLE_COLLIDE, A) if(A) if(throwing) throwing.hit_atom(A) @@ -308,6 +309,7 @@ /atom/movable/proc/throw_impact(atom/hit_atom, throwingdatum) set waitfor = 0 + SendSignal(COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) return hit_atom.hitby(src) /atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked) @@ -315,7 +317,8 @@ step(src, AM.dir) ..() -/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) +/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) //If this returns FALSE then callback will not be called. + . = FALSE if (!target || (flags_1 & NODROP_1) || speed <= 0) return @@ -344,7 +347,9 @@ //then lets add it to speed speed += user_momentum if (speed <= 0) - return //no throw speed, the user was moving too fast. + return//no throw speed, the user was moving too fast. + + . = TRUE // No failure conditions past this point. var/datum/thrownthing/TT = new() TT.thrownthing = src @@ -692,4 +697,4 @@ return FALSE if(anchored || throwing) return FALSE - return TRUE + return TRUE \ No newline at end of file diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 9b585ea653..64b405bbd5 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -261,7 +261,7 @@ /obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "") - var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) + var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) var/mob/living/simple_animal/slaughter/S = new demon_type(holder) S.holder = holder S.key = C.key diff --git a/code/game/gamemodes/antag_spawner.dm.rej b/code/game/gamemodes/antag_spawner.dm.rej deleted file mode 100644 index ea9a00132a..0000000000 --- a/code/game/gamemodes/antag_spawner.dm.rej +++ /dev/null @@ -1,9 +0,0 @@ -diff a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm (rejected hunks) -@@ -108,6 +108,7 @@ - new_objective.explanation_text = "Protect [usr.real_name], the wizard." - M.mind.objectives += new_objective - SSticker.mode.apprentices += M.mind -+ M.mind.assigned_role = "Apprentice" - M.mind.special_role = "apprentice" - SSticker.mode.update_wiz_icons_added(M.mind) - M << sound('sound/effects/magic.ogg') diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 7ddc71eecc..61dee30c8e 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -229,13 +229,29 @@ /mob/living/simple_animal/hostile/blob/blobbernaut/Life() if(..()) + var/list/blobs_in_area = range(2, src) if(independent) return // strong independent blobbernaut that don't need no blob var/damagesources = 0 - if(!(locate(/obj/structure/blob) in range(2, src))) + if(!(locate(/obj/structure/blob) in blobs_in_area)) damagesources++ if(!factory) damagesources++ + else + if(locate(/obj/structure/blob/core) in blobs_in_area) + adjustHealth(-maxHealth*0.1) + var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed + if(overmind) + H.color = overmind.blob_reagent_datum.complementary_color + else + H.color = "#000000" + if(locate(/obj/structure/blob/node) in blobs_in_area) + adjustHealth(-maxHealth*0.05) + var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) + if(overmind) + H.color = overmind.blob_reagent_datum.complementary_color + else + H.color = "#000000" if(damagesources) for(var/i in 1 to damagesources) adjustHealth(maxHealth*0.025) //take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index e22b2747e0..9f8a44bed2 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -57,7 +57,7 @@ if(!placed) if(manualplace_min_time && world.time >= manualplace_min_time) to_chat(src, "You may now place your blob core.") - to_chat(src, "You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.") + to_chat(src, "You will automatically place your blob core in [DisplayTimeText(autoplace_max_time - world.time)].") manualplace_min_time = 0 if(autoplace_max_time && world.time >= autoplace_max_time) place_blob_core(base_point_rate, 1) diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 6baf8b4dbe..026183d951 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -365,5 +365,5 @@ to_chat(src, "Shortcuts: Click = Expand Blob | Middle Mouse Click = Rally Spores | Ctrl Click = Create Shield Blob | Alt Click = Remove Blob") to_chat(src, "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them.") if(!placed && autoplace_max_time <= world.time) - to_chat(src, "You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.") + to_chat(src, "You will automatically place your blob core in [DisplayTimeText(autoplace_max_time - world.time)].") to_chat(src, "You [manualplace_min_time ? "will be able to":"can"] manually place your blob core by pressing the Place Blob Core button in the bottom right corner of the screen.") diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm new file mode 100644 index 0000000000..4e8a0dc6b6 --- /dev/null +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -0,0 +1,140 @@ +/datum/objective_team/brother_team + name = "brotherhood" + member_name = "blood brother" + var/list/objectives = list() + var/meeting_area + +/datum/objective_team/brother_team/is_solo() + return FALSE + +/datum/objective_team/brother_team/proc/add_objective(datum/objective/O, needs_target = FALSE) + O.team = src + if(needs_target) + O.find_target() + O.update_explanation_text() + objectives += O + +/datum/objective_team/brother_team/proc/forge_brother_objectives() + objectives = list() + var/is_hijacker = prob(10) + for(var/i = 1 to max(1, config.brother_objectives_amount + (members.len > 2) - is_hijacker)) + forge_single_objective() + if(is_hijacker) + if(!locate(/datum/objective/hijack) in objectives) + add_objective(new/datum/objective/hijack) + else if(!locate(/datum/objective/escape) in objectives) + add_objective(new/datum/objective/escape) + +/datum/objective_team/brother_team/proc/forge_single_objective() + if(prob(50)) + if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len)) + add_objective(new/datum/objective/destroy, TRUE) + else if(prob(30)) + add_objective(new/datum/objective/maroon, TRUE) + else + add_objective(new/datum/objective/assassinate, TRUE) + else + add_objective(new/datum/objective/steal, TRUE) + +/datum/game_mode + var/list/datum/mind/brothers = list() + var/list/datum/objective_team/brother_team/brother_teams = list() + +/datum/game_mode/traitor/bros + name = "traitor+brothers" + config_tag = "traitorbro" + restricted_jobs = list("AI", "Cyborg") + + announce_span = "danger" + announce_text = "There are Syndicate agents and Blood Brothers on the station!\n\ + Traitors: Accomplish your objectives.\n\ + Blood Brothers: Accomplish your objectives.\n\ + Crew: Do not let the traitors or brothers succeed!" + + var/list/datum/objective_team/brother_team/pre_brother_teams = list() + var/const/team_amount = 2 //hard limit on brother teams if scaling is turned off + var/const/min_team_size = 2 + + var/meeting_areas = list("The Bar", "Dorms", "Escape Dock", "Arrivals", "Holodeck", "Primary Tool Storage", "Recreation Area", "Chapel", "Library") + +/datum/game_mode/traitor/bros/pre_setup() + if(config.protect_roles_from_antagonist) + restricted_jobs += protected_jobs + if(config.protect_assistant_from_antagonist) + restricted_jobs += "Assistant" + + var/list/datum/mind/possible_brothers = get_players_for_role(ROLE_BROTHER) + + var/num_teams = team_amount + if(config.brother_scaling_coeff) + num_teams = max(1, round(num_players()/config.brother_scaling_coeff)) + + for(var/j = 1 to num_teams) + if(possible_brothers.len < min_team_size || antag_candidates.len <= required_enemies) + break + var/datum/objective_team/brother_team/team = new + var/team_size = prob(10) ? min(3, possible_brothers.len) : 2 + for(var/k = 1 to team_size) + var/datum/mind/bro = pick(possible_brothers) + possible_brothers -= bro + antag_candidates -= bro + team.members += bro + bro.restricted_roles = restricted_jobs + log_game("[bro.key] (ckey) has been selected as a Brother") + pre_brother_teams += team + return ..() + +/datum/game_mode/traitor/bros/post_setup() + for(var/datum/objective_team/brother_team/team in pre_brother_teams) + team.meeting_area = pick(meeting_areas) + meeting_areas -= team.meeting_area + team.forge_brother_objectives() + for(var/datum/mind/M in team.members) + M.add_antag_datum(ANTAG_DATUM_BROTHER, team) + modePlayer += M + brother_teams += pre_brother_teams + return ..() + +/datum/game_mode/traitor/bros/generate_report() + return "It's Syndicate recruiting season. Be alert for potential Syndicate infiltrators, but also watch out for disgruntled employees trying to defect. Unlike Nanotrasen, the Syndicate prides itself in teamwork and will only recruit pairs that share a brotherly trust." + +/datum/game_mode/proc/auto_declare_completion_brother() + if(!LAZYLEN(brother_teams)) + return + var/text = "
The blood brothers were:" + var/teamnumber = 1 + for(var/datum/objective_team/brother_team/team in brother_teams) + if(!team.members.len) + continue + text += "
Team #[teamnumber++]" + for(var/datum/mind/M in team.members) + text += printplayer(M) + var/win = TRUE + var/objective_count = 1 + for(var/datum/objective/objective in team.objectives) + if(objective.check_completion()) + text += "
Objective #[objective_count]: [objective.explanation_text] Success!" + SSblackbox.add_details("traitor_objective","[objective.type]|SUCCESS") + else + text += "
Objective #[objective_count]: [objective.explanation_text] Fail." + SSblackbox.add_details("traitor_objective","[objective.type]|FAIL") + win = FALSE + objective_count++ + if(win) + text += "
The blood brothers were successful!" + SSblackbox.add_details("brother_success","SUCCESS") + else + text += "
The blood brothers have failed!" + SSblackbox.add_details("brother_success","FAIL") + text += "
" + to_chat(world, text) + +/datum/game_mode/proc/update_brother_icons_added(datum/mind/brother_mind) + var/datum/atom_hud/antag/brotherhud = GLOB.huds[ANTAG_HUD_BROTHER] + brotherhud.join_hud(brother_mind.current) + set_antag_hud(brother_mind.current, "brother") + +/datum/game_mode/proc/update_brother_icons_removed(datum/mind/brother_mind) + var/datum/atom_hud/antag/brotherhud = GLOB.huds[ANTAG_HUD_BROTHER] + brotherhud.leave_hud(brother_mind.current) + set_antag_hud(brother_mind.current, null) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 14126c69f3..e67ac26d3a 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -340,6 +340,10 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w return if(!target) return + if(NO_DNA_COPY in target.dna.species.species_traits) + if(verbose) + to_chat(user, "[target] is not compatible with our biology.") + return if((target.disabilities & NOCLONE) || (target.disabilities & HUSK)) if(verbose) to_chat(user, "DNA of [target] is ruined beyond usability!") diff --git a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm index a6eb5fb4e7..9b1ef66c9e 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm @@ -207,7 +207,7 @@ time_duration = round(time_duration * (2 * efficiency), 1) CO.active = TRUE //you'd be active in a second but you should update immediately invoker.visible_message("The air in front of [invoker] ripples before suddenly tearing open!", \ - "With a word, you rip open a [two_way ? "two-way":"one-way"] rift to [input_target_key]. It will last for [time_duration / 10] seconds and has [gateway_uses] use[gateway_uses > 1 ? "s" : ""].") + "With a word, you rip open a [two_way ? "two-way":"one-way"] rift to [input_target_key]. It will last for [DisplayTimeText(time_duration)] and has [gateway_uses] use[gateway_uses > 1 ? "s" : ""].") var/obj/effect/clockwork/spatial_gateway/S1 = new(issrcobelisk ? get_turf(src) : get_step(get_turf(invoker), invoker.dir)) var/obj/effect/clockwork/spatial_gateway/S2 = new(istargetobelisk ? get_turf(target) : get_step(get_turf(target), target.dir)) diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm index eecfec7780..bf76cdb2f7 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -318,23 +318,10 @@ if(servants > SCRIPT_SERVANT_REQ) servants -= SCRIPT_SERVANT_REQ production_time += min(SLAB_SERVANT_SLOWDOWN * servants, SLAB_SLOWDOWN_MAXIMUM) - var/production_text_addon = "" if(production_time != SLAB_PRODUCTION_TIME+SLAB_SLOWDOWN_MAXIMUM) - production_text_addon = ", which increases for each human or silicon Servant above [SCRIPT_SERVANT_REQ]" - production_time = production_time/600 - var/list/production_text - if(round(production_time)) - production_text = list("[round(production_time)] minute\s") - if(production_time != round(production_time)) - production_time -= round(production_time) - production_time *= 60 - if(!LAZYLEN(production_text)) - production_text = list("[round(production_time, 1)] second\s") - else - production_text += " and [round(production_time, 1)] second\s" - production_text += "" - production_text += production_text_addon - production_text = production_text.Join() + production_time = "[DisplayTimeText(production_time)], which increases for each human or silicon Servant above [SCRIPT_SERVANT_REQ]" + else + production_time = "[DisplayTimeText(production_time)]" textlist = list("
[text2ratvar("Purge all untruths and honor Engine.")]

\ \ @@ -439,23 +426,10 @@ if(servants > SCRIPT_SERVANT_REQ) servants -= SCRIPT_SERVANT_REQ production_time += min(SLAB_SERVANT_SLOWDOWN * servants, SLAB_SLOWDOWN_MAXIMUM) - var/production_text_addon = "" if(production_time != SLAB_PRODUCTION_TIME+SLAB_SLOWDOWN_MAXIMUM) - production_text_addon = ", which increases for each human or silicon Servant above [SCRIPT_SERVANT_REQ]" - production_time = production_time/600 - var/list/production_text - if(round(production_time)) - production_text = list("[round(production_time)] minute\s") - if(production_time != round(production_time)) - production_time -= round(production_time) - production_time *= 60 - if(!LAZYLEN(production_text)) - production_text = list("[round(production_time, 1)] second\s") - else - production_text += " and [round(production_time, 1)] second\s" - production_text += "" - production_text += production_text_addon - production_text = production_text.Join() + production_time = "[DisplayTimeText(production_time)], which increases for each human or silicon Servant above [SCRIPT_SERVANT_REQ]" + else + production_time = "[DisplayTimeText(production_time)]" dat += "Components & Their Uses

" dat += "Components are your primary resource as a Servant. There are five types of component, with each one being used in different roles:

" dat += "[get_component_icon(BELLIGERENT_EYE)]BE Belligerent Eyes are aggressive and judgemental, and are used in offensive scripture;
" @@ -466,7 +440,7 @@ dat += "Although this is a good rule of thumb, their effects become much more nuanced when used together. For instance, a turret might have both belligerent eyes and \ vanguard cogwheels as construction requirements, because it defends its allies by harming its enemies.

" dat += "Components' primary use is fueling scripture (covered in its own section), and they can be created through various ways. This clockwork slab, for instance, \ - will make a random component of every type - or a specific one, if you choose a target component from the interface - every [production_text]. This number will increase \ + will make a random component of every type - or a specific one, if you choose a target component from the interface - every [production_time]. This number will increase \ as the amount of Servants in the covenant increase; additionally, slabs can only produce components when held by a Servant, and holding more than one slab will cause both \ of them to halt progress until one of them is removed from their person.

" dat += "Your slab has an internal storage of components, but it isn't meant to be the main one. Instead, there's a global storage of components that can be \ diff --git a/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm b/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm index 0ee6d45f7d..ca80d6f082 100644 --- a/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm +++ b/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm @@ -23,6 +23,7 @@ autoping = FALSE resistance_flags = FIRE_PROOF | ACID_PROOF force_replace_ai_name = TRUE + overrides_aicore_laws = TRUE /obj/item/device/mmi/posibrain/soul_vessel/Initialize() . = ..() diff --git a/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm index 2174f04dcb..b684b854c1 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -101,7 +101,7 @@ glow.linked = src /obj/structure/destructible/clockwork/massive/celestial_gateway/ex_act(severity) - var/damage = max((obj_integrity * 0.70) / severity, 100) //requires multiple bombs to take down + var/damage = max((obj_integrity * 0.7) / severity, 100) //requires multiple bombs to take down take_damage(damage, BRUTE, "bomb", 0) /obj/structure/destructible/clockwork/massive/celestial_gateway/attackby(obj/item/I, mob/living/user, params) //add components directly to the ark diff --git a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_cache.dm b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_cache.dm index 326aa46c06..cd33cf7adc 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_cache.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_cache.dm @@ -105,7 +105,7 @@ ..() if(is_servant_of_ratvar(user) || isobserver(user)) if(linkedwall) - to_chat(user, "It is linked to a Clockwork Wall and will generate a component every [round(get_production_time() * 0.1, 0.1)] seconds!") + to_chat(user, "It is linked to a Clockwork Wall and will generate a component every [DisplayTimeText(get_production_time())]!") else to_chat(user, "It is unlinked! Construct a Clockwork Wall nearby to generate components!") to_chat(user, "Stored components:") diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 283376b055..b8cbed5051 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -96,7 +96,7 @@ /proc/pollCultists(var/mob/living/Nominee) //Cult Master Poll if(world.time < CULT_POLL_WAIT) - to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [round((CULT_POLL_WAIT-world.time)/10)] seconds.") + to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [DisplayTimeText(CULT_POLL_WAIT-world.time)].") return GLOB.cult_vote_called = TRUE //somebody's trying to be a master, make sure we don't let anyone else try for(var/datum/mind/B in SSticker.mode.cult) @@ -232,7 +232,7 @@ return FALSE if(cooldown > world.time) if(!CM.active) - to_chat(owner, "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can mark another target!") + to_chat(owner, "You need to wait [DisplayTimeText(cooldown - world.time)] before you can mark another target!") return FALSE return ..() @@ -324,7 +324,7 @@ return FALSE if(cooldown > world.time) if(!PM.active) - to_chat(owner, "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can pulse again!") + to_chat(owner, "You need to wait [DisplayTimeText(cooldown - world.time)] before you can pulse again!") return FALSE return ..() diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 0cba943287..c1ccf9a368 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -10,7 +10,7 @@ ..() to_chat(user, "\The [src] is [anchored ? "":"not "]secured to the floor.") if((iscultist(user) || isobserver(user)) && cooldowntime > world.time) - to_chat(user, "The magic in [src] is too weak, [p_they()] will be ready to use again in [getETA()].") + to_chat(user, "The magic in [src] is too weak, [p_they()] will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") /obj/structure/destructible/cult/examine_status(mob/user) if(iscultist(user) || isobserver(user)) @@ -50,13 +50,6 @@ animate(src, color = previouscolor, time = 8) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) -/obj/structure/destructible/cult/proc/getETA() - var/time = (cooldowntime - world.time)/600 - var/eta = "[round(time, 1)] minutes" - if(time <= 1) - time = (cooldowntime - world.time)*0.1 - eta = "[round(time, 1)] seconds" - return eta /obj/structure/destructible/cult/talisman name = "altar" @@ -72,7 +65,7 @@ to_chat(user, "You need to anchor [src] to the floor with a tome first.") return if(cooldowntime > world.time) - to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].") + to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") return var/choice = alert(user,"You study the schematics etched into the forge...",,"Eldritch Whetstone","Zealot's Blindfold","Flask of Unholy Water") var/pickedtype @@ -105,7 +98,7 @@ to_chat(user, "You need to anchor [src] to the floor with a tome first.") return if(cooldowntime > world.time) - to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].") + to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") return var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Nar-Sien Hardsuit") var/pickedtype @@ -212,7 +205,7 @@ to_chat(user, "You need to anchor [src] to the floor with a tome first.") return if(cooldowntime > world.time) - to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].") + to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") return var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Walker Set") var/list/pickedtype = list() diff --git a/code/game/gamemodes/factions.dm b/code/game/gamemodes/factions.dm deleted file mode 100644 index d8d7d92831..0000000000 --- a/code/game/gamemodes/factions.dm +++ /dev/null @@ -1 +0,0 @@ -//Todo diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 82350726d9..f65a64fb08 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -121,7 +121,7 @@ var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew.len) var/list/datum/game_mode/usable_modes = list() for(var/datum/game_mode/G in runnable_modes) - if(G.reroll_friendly && living_crew >= G.required_players) + if(G.reroll_friendly && living_crew.len >= G.required_players) usable_modes += G else qdel(G) @@ -160,7 +160,7 @@ if(config.protect_assistant_from_antagonist) replacementmode.restricted_jobs += "Assistant" - message_admins("The roundtype will be converted. If you have other plans for the station or feel the station is too messed up to inhabit stop the creation of antags or end the round now.") + message_admins("The roundtype will be converted. If you have other plans for the station or feel the station is too messed up to inhabit stop the creation of antags or end the round now.") . = 1 sleep(rand(600,1800)) diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index b7b20a7311..510883ada5 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -331,16 +331,3 @@ adjust_influence(bawss, amount/bosses.len) announce_to_mind(bawss, "[name] Gang: [amount/bosses.len] influence given from internal automatic restructuring.") -//Multiverse - -/datum/gang/multiverse - dom_attempts = 0 - fighting_style = "multiverse" - is_deconvertible = FALSE - -/datum/gang/multiverse/New(loc, multiverse_override) - name = multiverse_override - ganghud = new() - -/datum/gang/multiverse/income() - return diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm.rej b/code/game/gamemodes/malfunction/Malf_Modules.dm.rej deleted file mode 100644 index 97dbe2bbdb..0000000000 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm.rej +++ /dev/null @@ -1,11 +0,0 @@ -diff a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm (rejected hunks) -@@ -309,8 +309,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( - owner_AI.nuking = TRUE - owner_AI.doomsday_device = DOOM - owner_AI.doomsday_device.start() -- for(var/pinpointer in GLOB.pinpointer_list) -- var/obj/item/weapon/pinpointer/P = pinpointer -+ for(var/obj/item/weapon/pinpointer/nuke/P in GLOB.pinpointer_list) - P.switch_mode_to(TRACK_MALF_AI) //Pinpointers start tracking the AI wherever it goes - qdel(src) - diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 3bb3c8b43e..d0bb633f8c 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -119,6 +119,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event /obj/effect/meteor/Destroy() GLOB.meteor_list -= src + SSaugury.unregister_doom(src) walk(src,0) //this cancels the walk_towards() proc . = ..() @@ -309,6 +310,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event /obj/effect/meteor/meaty/xeno/New() meteordrop += subtypesof(/obj/item/organ/alien) + meteordrop -= /obj/item/organ/alien/eggsac ..() /obj/effect/meteor/meaty/xeno/ram_turf(turf/T) diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 7eacd9c666..ed5c2e9d76 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -1,5 +1,17 @@ +/datum/objective_team/abductor_team + member_name = "abductor" + var/list/objectives = list() + var/team_number + +/datum/objective_team/abductor_team/is_solo() + return FALSE + +/datum/objective_team/abductor_team/proc/add_objective(datum/objective/O) + O.team = src + O.update_explanation_text() + objectives += O + /datum/game_mode - var/abductor_teams = 0 var/list/datum/mind/abductors = list() var/list/datum/mind/abductees = list() @@ -12,12 +24,8 @@ required_players = 15 maximum_players = 50 var/max_teams = 4 - abductor_teams = 1 - var/list/datum/mind/scientists = list() - var/list/datum/mind/agents = list() - var/list/datum/objective/team_objectives = list() - var/list/team_names = list() - var/finished = 0 + var/list/datum/objective_team/abductor_team/abductor_teams = list() + var/finished = FALSE /datum/game_mode/abduction/announce() to_chat(world, "The current game mode is - Abduction!") @@ -26,163 +34,78 @@ to_chat(world, "Crew - don't get abducted and stop the abductors.") /datum/game_mode/abduction/pre_setup() - abductor_teams = max(1, min(max_teams,round(num_players()/config.abductor_scaling_coeff))) - var/possible_teams = max(1,round(antag_candidates.len / 2)) - abductor_teams = min(abductor_teams,possible_teams) + var/num_teams = max(1, min(max_teams, round(num_players() / config.abductor_scaling_coeff))) + var/possible_teams = max(1, round(antag_candidates.len / 2)) + num_teams = min(num_teams, possible_teams) - abductors.len = 2*abductor_teams - scientists.len = abductor_teams - agents.len = abductor_teams - team_objectives.len = abductor_teams - team_names.len = abductor_teams + for(var/i = 1 to num_teams) + if(!make_abductor_team()) + return FALSE + return TRUE - for(var/i=1,i<=abductor_teams,i++) - if(!make_abductor_team(i)) - return 0 +/datum/game_mode/abduction/proc/make_abductor_team(datum/mind/agent, datum/mind/scientist) + var/team_number = abductor_teams.len+1 - return 1 + var/datum/objective_team/abductor_team/team = new + team.team_number = team_number + team.name = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names + team.add_objective(new/datum/objective/experiment) -/datum/game_mode/abduction/proc/make_abductor_team(team_number,preset_agent=null,preset_scientist=null) - //Team Name - team_names[team_number] = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names - //Team Objective - var/datum/objective/experiment/team_objective = new - team_objective.team = team_number - team_objectives[team_number] = team_objective - //Team Members + if(antag_candidates.len < (!agent + !scientist)) + return - if(!preset_agent || !preset_scientist) - if(antag_candidates.len <=2) - return 0 - - var/datum/mind/scientist - var/datum/mind/agent - - if(!preset_scientist) + if(!scientist) scientist = pick(antag_candidates) - antag_candidates -= scientist - else - scientist = preset_scientist + antag_candidates -= scientist + team.members |= scientist + scientist.assigned_role = "Abductor Scientist" + log_game("[scientist.key] (ckey) has been selected as [team.name] abductor scientist.") - if(!preset_agent) + if(!agent) agent = pick(antag_candidates) - antag_candidates -= agent - else - agent = preset_agent + antag_candidates -= agent + team.members |= agent + agent.assigned_role = "Abductor Agent" + log_game("[agent.key] (ckey) has been selected as [team.name] abductor agent.") - - scientist.assigned_role = "abductor scientist" - scientist.special_role = "abductor scientist" - log_game("[scientist.key] (ckey) has been selected as an abductor team [team_number] scientist.") - - agent.assigned_role = "abductor agent" - agent.special_role = "abductor agent" - log_game("[agent.key] (ckey) has been selected as an abductor team [team_number] agent.") - - abductors |= agent - abductors |= scientist - scientists[team_number] = scientist - agents[team_number] = agent - return 1 + abductor_teams += team + return team /datum/game_mode/abduction/post_setup() - for(var/team_number=1,team_number<=abductor_teams,team_number++) - post_setup_team(team_number) + for(var/datum/objective_team/abductor_team/team in abductor_teams) + post_setup_team(team) return ..() //Used for create antag buttons -/datum/game_mode/abduction/proc/post_setup_team(team_number) - var/list/obj/effect/landmark/abductor/agent_landmarks = list() - var/list/obj/effect/landmark/abductor/scientist_landmarks = list() - agent_landmarks.len = max_teams - scientist_landmarks.len = max_teams - for(var/obj/effect/landmark/abductor/A in GLOB.landmarks_list) - if(istype(A, /obj/effect/landmark/abductor/agent)) - agent_landmarks[text2num(A.team)] = A - else if(istype(A, /obj/effect/landmark/abductor/scientist)) - scientist_landmarks[text2num(A.team)] = A - - var/team_name = team_names[team_number] - - var/datum/mind/agent - var/obj/effect/landmark/L - var/datum/mind/scientist - var/mob/living/carbon/human/H - var/datum/species/abductor/S - - agent = agents[team_number] - H = agent.current - L = agent_landmarks[team_number] - H.forceMove(L.loc) - H.set_species(/datum/species/abductor) - S = H.dna.species - S.team = team_number - H.real_name = team_name + " Agent" - H.equipOutfit(/datum/outfit/abductor/agent) - greet_agent(agent,team_number) - - - scientist = scientists[team_number] - H = scientist.current - L = scientist_landmarks[team_number] - H.forceMove(L.loc) - H.set_species(/datum/species/abductor) - S = H.dna.species - S.scientist = TRUE - S.team = team_number - H.real_name = team_name + " Scientist" - H.equipOutfit(/datum/outfit/abductor/scientist) - greet_scientist(scientist,team_number) - - - -/datum/game_mode/abduction/proc/greet_agent(datum/mind/abductor,team_number) - abductor.objectives += team_objectives[team_number] - var/team_name = team_names[team_number] - - to_chat(abductor.current, "You are an agent of [team_name]!") - to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!") - to_chat(abductor.current, "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve.") - - abductor.announce_objectives() - -/datum/game_mode/abduction/proc/greet_scientist(datum/mind/abductor,team_number) - abductor.objectives += team_objectives[team_number] - var/team_name = team_names[team_number] - - to_chat(abductor.current, "You are a scientist of [team_name]!") - to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!") - to_chat(abductor.current, "Use your tool and ship consoles to support the agent and retrieve human specimens.") - - abductor.announce_objectives() - -/datum/game_mode/abduction/proc/get_team_console(team_number) - for(var/obj/machinery/abductor/console/C in GLOB.machines) - if(C.team == team_number) - return C +/datum/game_mode/abduction/proc/post_setup_team(datum/objective_team/abductor_team/team) + for(var/datum/mind/M in team.members) + if(M.assigned_role == "Abductor Scientist") + M.add_antag_datum(ANTAG_DATUM_ABDUCTOR_SCIENTIST, team) + else + M.add_antag_datum(ANTAG_DATUM_ABDUCTOR_AGENT, team) /datum/game_mode/abduction/check_finished() if(!finished) - for(var/team_number=1,team_number<=abductor_teams,team_number++) - var/obj/machinery/abductor/console/con = get_team_console(team_number) - var/datum/objective/objective = team_objectives[team_number] - if (con.experiment.points >= objective.target_amount) - SSshuttle.emergency.request(null, set_coefficient = 0.5) - finished = 1 - return ..() + for(var/datum/objective_team/abductor_team/team in abductor_teams) + for(var/datum/objective/O in team.objectives) + if(O.check_completion()) + SSshuttle.emergency.request(null, set_coefficient = 0.5) + finished = TRUE + return ..() return ..() /datum/game_mode/abduction/declare_completion() - for(var/team_number=1,team_number<=abductor_teams,team_number++) - var/obj/machinery/abductor/console/console = get_team_console(team_number) - var/datum/objective/objective = team_objectives[team_number] - var/team_name = team_names[team_number] - if(console.experiment.points >= objective.target_amount) - to_chat(world, "[team_name] team fulfilled its mission!") + for(var/datum/objective_team/abductor_team/team in abductor_teams) + var/won = TRUE + for(var/datum/objective/O in team.objectives) + if(!O.check_completion()) + won = FALSE + if(won) + to_chat(world, "[team.name] team fulfilled its mission!") else - to_chat(world, "[team_name] team failed its mission.") + to_chat(world, "[team.name] team failed its mission.") ..() - return 1 + return TRUE /datum/game_mode/proc/auto_declare_completion_abduction() var/text = "" @@ -200,40 +123,28 @@ text += "
" to_chat(world, text) -//Landmarks -// TODO: Split into separate landmarks for prettier ships +// LANDMARKS /obj/effect/landmark/abductor - var/team = 1 + var/team_number = 1 /obj/effect/landmark/abductor/agent /obj/effect/landmark/abductor/scientist - // OBJECTIVES /datum/objective/experiment target_amount = 6 - var/team /datum/objective/experiment/New() explanation_text = "Experiment on [target_amount] humans." /datum/objective/experiment/check_completion() - var/ab_team = team - if(owner) - if(!owner.current || !ishuman(owner.current)) - return 0 - var/mob/living/carbon/human/H = owner.current - if(H.dna.species.id != "abductor") - return 0 - var/datum/species/abductor/S = H.dna.species - ab_team = S.team for(var/obj/machinery/abductor/experiment/E in GLOB.machines) - if(E.team == ab_team) - if(E.points >= target_amount) - return 1 - else - return 0 - return 0 + if(!istype(team, /datum/objective_team/abductor_team)) + return FALSE + var/datum/objective_team/abductor_team/T = team + if(E.team_number == T.team_number) + return E.points >= target_amount + return FALSE /datum/game_mode/proc/update_abductor_icons_added(datum/mind/alien_mind) var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_ABDUCTOR] diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index c55b4db407..8c6bf1a8aa 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -532,7 +532,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} flags_2 = BANG_PROTECT_2 /obj/item/device/radio/headset/abductor/Initialize(mapload) - ..() + . = ..() make_syndie() /obj/item/device/radio/headset/abductor/attackby(obj/item/W, mob/user, params) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm index aa97d1e2d8..b24bef0433 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm @@ -5,20 +5,14 @@ back = /obj/item/storage/backpack ears = /obj/item/device/radio/headset/abductor -/datum/outfit/abductor/proc/get_team_console(team_number) - for(var/obj/machinery/abductor/console/C in GLOB.machines) - if(C.team == team_number) - return C - /datum/outfit/abductor/proc/link_to_console(mob/living/carbon/human/H, team_number) - if(!team_number && isabductor(H)) - var/datum/species/abductor/S = H.dna.species - team_number = S.team - + var/datum/antagonist/abductor/A = H.mind.has_antag_datum(ANTAG_DATUM_ABDUCTOR) + if(!team_number && A) + team_number = A.team.team_number if(!team_number) team_number = 1 - var/obj/machinery/abductor/console/console = get_team_console(team_number) + var/obj/machinery/abductor/console/console = get_abductor_console(team_number) if(console) var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H if(V) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm index 97893d6d2e..eb4e4f8211 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm @@ -1,6 +1,6 @@ /obj/machinery/computer/camera_advanced/abductor name = "Human Observation Console" - var/team = 0 + var/team_number = 0 networks = list("SS13","Abductor") var/datum/action/innate/teleport_in/tele_in_action = new var/datum/action/innate/teleport_out/tele_out_action = new diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index f3deebc6b7..d44ff57c96 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -1,8 +1,13 @@ +/proc/get_abductor_console(team_number) + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.team_number == team_number) + return C + //Common /obj/machinery/abductor resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - var/team = 0 + var/team_number = 0 //Console @@ -139,21 +144,21 @@ return INITIALIZE_HINT_LATELOAD /obj/machinery/abductor/console/LateInitialize() - if(!team) + if(!team_number) return for(var/obj/machinery/abductor/pad/p in GLOB.machines) - if(p.team == team) + if(p.team_number == team_number) pad = p break for(var/obj/machinery/abductor/experiment/e in GLOB.machines) - if(e.team == team) + if(e.team_number == team_number) experiment = e e.console = src for(var/obj/machinery/computer/camera_advanced/abductor/c in GLOB.machines) - if(c.team == team) + if(c.team_number == team_number) camera = c c.console = src diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 182b7e2756..0a7427b610 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -13,7 +13,7 @@ var/flash = " - || - " var/obj/machinery/abductor/console/console var/message_cooldown = 0 - var/breakout_time = 0.75 + var/breakout_time = 450 /obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user) if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) @@ -50,9 +50,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the door of [src]!", \ - "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a metallic creaking from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) return user.visible_message("[user] successfully broke out of [src]!", \ diff --git a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm index bcb2218fe6..888a10669e 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm @@ -33,7 +33,7 @@ message_admins("No valid spawn locations found, aborting...") return MAP_ERROR - var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter((pick(spawn_locs))) + var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter((pick(spawn_locs))) var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder) S.holder = holder player_mind.transfer_to(S) diff --git a/code/game/gamemodes/nuclear/nuclear.dm.rej b/code/game/gamemodes/nuclear/nuclear.dm.rej deleted file mode 100644 index 19648547c7..0000000000 --- a/code/game/gamemodes/nuclear/nuclear.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm (rejected hunks) -@@ -325,7 +325,7 @@ - gloves = /obj/item/clothing/gloves/combat - back = /obj/item/weapon/storage/backpack - ears = /obj/item/device/radio/headset/syndicate/alt -- l_pocket = /obj/item/weapon/pinpointer/syndicate -+ l_pocket = /obj/item/weapon/pinpointer/nuke/syndicate - id = /obj/item/weapon/card/id/syndicate - belt = /obj/item/weapon/gun/ballistic/automatic/pistol - backpack_contents = list(/obj/item/weapon/storage/box/syndie=1) diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 7b2a20a297..f51b9ac914 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -19,7 +19,7 @@ return declaring_war = TRUE - var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew? You have [-round((world.time-SSticker.round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide", "Declare war?", "Yes", "No") + var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew? You have [DisplayTimeText(world.time-SSticker.round_start_time - CHALLENGE_TIME_LIMIT)] to decide", "Declare war?", "Yes", "No") declaring_war = FALSE if(!check_allowed(user)) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm.rej b/code/game/gamemodes/nuclear/nuclearbomb.dm.rej deleted file mode 100644 index 6a35e91cde..0000000000 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm.rej +++ /dev/null @@ -1,33 +0,0 @@ -diff a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm (rejected hunks) -@@ -362,9 +362,9 @@ - if(safety) - if(timing) - set_security_level(previous_level) -- for(var/obj/item/weapon/pinpointer/syndicate/S in GLOB.pinpointer_list) -+ for(var/obj/item/weapon/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) - S.switch_mode_to(initial(S.mode)) -- S.nuke_warning = FALSE -+ S.alert = FALSE - timing = FALSE - bomb_set = TRUE - detonation_timer = null -@@ -381,16 +381,16 @@ - bomb_set = TRUE - set_security_level("delta") - detonation_timer = world.time + (timer_set * 10) -- for(var/obj/item/weapon/pinpointer/syndicate/S in GLOB.pinpointer_list) -+ for(var/obj/item/weapon/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) - S.switch_mode_to(TRACK_INFILTRATOR) - countdown.start() - else - bomb_set = FALSE - detonation_timer = null - set_security_level(previous_level) -- for(var/obj/item/weapon/pinpointer/syndicate/S in GLOB.pinpointer_list) -+ for(var/obj/item/weapon/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) - S.switch_mode_to(initial(S.mode)) -- S.nuke_warning = FALSE -+ S.alert = FALSE - countdown.stop() - update_icon() - diff --git a/code/game/gamemodes/nuclear/pinpointer.dm.rej b/code/game/gamemodes/nuclear/pinpointer.dm.rej deleted file mode 100644 index 79d652af9b..0000000000 --- a/code/game/gamemodes/nuclear/pinpointer.dm.rej +++ /dev/null @@ -1,21 +0,0 @@ -diff a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm (rejected hunks) -@@ -30,7 +30,6 @@ - var/mob/living/L = loc - to_chat(L, "Your [name] vibrates and lets out a tinny alarm. Uh oh.") - -- - /obj/item/pinpointer/nuke/scan_for_target() - target = null - switch(mode) -@@ -58,10 +57,10 @@ - mode = new_mode - scan_for_target() - -- - /obj/item/pinpointer/nuke/syndicate // Syndicate pinpointers automatically point towards the infiltrator once the nuke is active. - name = "syndicate pinpointer" - desc = "A handheld tracking device that locks onto certain signals. It's configured to switch tracking modes once it detects the activation signal of a nuclear device." -+ icon_state = "pinpointer_syndicate" - - /obj/item/pinpointer/syndicate_cyborg // Cyborg pinpointers just look for a random operative. - name = "cyborg syndicate pinpointer" diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index baf0f69ab9..75ed90d712 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1,6 +1,8 @@ /datum/objective - var/datum/mind/owner = null //Who owns the objective. + var/datum/mind/owner //The primary owner of the objective. !!SOMEWHAT DEPRECATED!! Prefer using 'team' for new code. + var/datum/objective_team/team //An alternative to 'owner': a team. Use this when writing new code. var/explanation_text = "Nothing" //What that person is supposed to do. + var/team_explanation_text //For when there are multiple owners. var/datum/mind/target = null //If they are focused on a particular person. var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter. var/completed = 0 //currently only used for custom objectives. @@ -10,19 +12,48 @@ if(text) explanation_text = text +/datum/objective/proc/get_owners() // Combine owner and team into a single list. + . = (team && team.members) ? team.members.Copy() : list() + if(owner) + . += owner + +/datum/objective/proc/considered_alive(var/datum/mind/M) + if(M && M.current) + var/mob/living/carbon/human/H + if(ishuman(M.current)) + H = M.current + return M.current.stat != DEAD && !issilicon(M.current) && !isbrain(M.current) && (!H || H.dna.species.id != "memezombies") + return FALSE + +/datum/objective/proc/considered_escaped(datum/mind/M) + if(!considered_alive(M)) + return FALSE + if(SSticker.force_ending || SSticker.mode.station_was_nuked) // Just let them win. + return TRUE + if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) + return FALSE + var/turf/location = get_turf(M.current) + if(!location || istype(location, /turf/open/floor/plasteel/shuttle/red) || istype(location, /turf/open/floor/mineral/plastitanium/brig)) // Fails if they are in the shuttle brig + return FALSE + return location.onCentCom() || location.onSyndieBase() + +/datum/objective/proc/considered_afk(datum/mind/M) + return !M || !M.current || !M.current.client || M.current.client.is_afk() + /datum/objective/proc/check_completion() return completed /datum/objective/proc/is_unique_objective(possible_target) - for(var/datum/objective/O in owner.objectives) - if(istype(O, type) && O.get_target() == possible_target) - return 0 - return 1 + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + for(var/datum/objective/O in M.objectives) + if(istype(O, type) && O.get_target() == possible_target) + return FALSE + return TRUE /datum/objective/proc/get_target() return target - /datum/objective/proc/get_crewmember_minds() . = list() for(var/V in GLOB.data_core.locked) @@ -32,9 +63,10 @@ . += M.mind /datum/objective/proc/find_target() + var/list/datum/mind/owners = get_owners() var/list/possible_targets = list() for(var/datum/mind/possible_target in get_crewmember_minds()) - if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && is_unique_objective(possible_target)) + if(!(possible_target in owners) && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && is_unique_objective(possible_target)) possible_targets += possible_target if(possible_targets.len > 0) target = pick(possible_targets) @@ -42,8 +74,9 @@ return target /datum/objective/proc/find_target_by_role(role, role_type=0, invert=0)//Option sets either to check assigned role or special role. Default to assigned., invert inverts the check, eg: "Don't choose a Ling" + var/list/datum/mind/owners = get_owners() for(var/datum/mind/possible_target in get_crewmember_minds()) - if((possible_target != owner) && ishuman(possible_target.current)) + if(!(possible_target in owners) && ishuman(possible_target.current)) var/is_role = 0 if(role_type) if(possible_target.special_role == role) @@ -64,13 +97,15 @@ update_explanation_text() /datum/objective/proc/update_explanation_text() - //Default does nothing, override where needed + if(team_explanation_text && LAZYLEN(get_owners()) > 1) + explanation_text = team_explanation_text /datum/objective/proc/give_special_equipment(special_equipment) - if(owner && owner.current) - if(ishuman(owner.current)) - var/mob/living/carbon/human/H = owner.current - var/list/slots = list ("backpack" = slot_in_backpack) + var/datum/mind/receiver = pick(get_owners()) + if(receiver && receiver.current) + if(ishuman(receiver.current)) + var/mob/living/carbon/human/H = receiver.current + var/list/slots = list("backpack" = slot_in_backpack) for(var/eq_path in special_equipment) var/obj/O = new eq_path H.equip_in_one_of_slots(O, slots) @@ -86,14 +121,7 @@ return target /datum/objective/assassinate/check_completion() - if(target && target.current) - var/mob/living/carbon/human/H - if(ishuman(target.current)) - H = target.current - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey || (H && H.dna.species.id == "memezombies")) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return 1 - return 0 - return 1 + return !target || !considered_alive(target) /datum/objective/assassinate/update_explanation_text() ..() @@ -110,7 +138,6 @@ if(target && !target.current) explanation_text = "Assassinate [target.name], who was obliterated" - /datum/objective/mutiny var/target_role_type=0 martyr_compatible = 1 @@ -122,14 +149,10 @@ return target /datum/objective/mutiny/check_completion() - if(target && target.current) - if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey) - return 1 - var/turf/T = get_turf(target.current) - if(T && (!(T.z in GLOB.station_z_levels)) || (target.current.client && target.current.client.is_afk())) //If they leave the station or go afk they count as dead for this - return 2 - return 0 - return 1 + if(!target || !considered_alive(target) || considered_afk(target)) + return TRUE + var/turf/T = get_turf(target.current) + return T && !(T.z in GLOB.station_z_levels) /datum/objective/mutiny/update_explanation_text() ..() @@ -138,8 +161,6 @@ else explanation_text = "Free Objective" - - /datum/objective/maroon var/target_role_type=0 martyr_compatible = 1 @@ -151,15 +172,7 @@ return target /datum/objective/maroon/check_completion() - if(target && target.current) - var/mob/living/carbon/human/H - if(ishuman(target.current)) - H = target.current - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey || (H && H.dna.species.id == "memezombies")) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return 1 - if(target.current.onCentCom() || target.current.onSyndieBase()) - return 0 - return 1 + return !target || !considered_alive(target) || (!target.current.onCentCom() && !target.current.onSyndieBase()) /datum/objective/maroon/update_explanation_text() if(target && target.current) @@ -167,9 +180,7 @@ else explanation_text = "Free Objective" - - -/datum/objective/debrain//I want braaaainssss +/datum/objective/debrain var/target_role_type=0 /datum/objective/debrain/find_target_by_role(role, role_type=0, invert=0) @@ -180,17 +191,20 @@ /datum/objective/debrain/check_completion() if(!target)//If it's a free objective. - return 1 - if( !owner.current || owner.current.stat==DEAD )//If you're otherwise dead. - return 0 - if( !target.current || !isbrain(target.current) ) - return 0 + return TRUE + + if(!target.current || !isbrain(target.current)) + return FALSE + var/atom/A = target.current - while(A.loc) //check to see if the brainmob is on our person + var/list/datum/mind/owners = get_owners() + + while(A.loc) // Check to see if the brainmob is on our person A = A.loc - if(A == owner.current) - return 1 - return 0 + for(var/datum/mind/M in owners) + if(M.current && M.current.stat != DEAD && A == M.current) + return TRUE + return FALSE /datum/objective/debrain/update_explanation_text() ..() @@ -199,8 +213,6 @@ else explanation_text = "Free Objective" - - /datum/objective/protect//The opposite of killing a dude. var/target_role_type=0 martyr_compatible = 1 @@ -212,13 +224,7 @@ return target /datum/objective/protect/check_completion() - if(!target) //If it's a free objective. - return 1 - if(target.current) - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current)) - return 0 - return 1 - return 0 + return !target || considered_alive(target) /datum/objective/protect/update_explanation_text() ..() @@ -227,76 +233,32 @@ else explanation_text = "Free Objective" - - /datum/objective/hijack explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody." + team_explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody. Leave no team member behind." martyr_compatible = 0 //Technically you won't get both anyway. -/datum/objective/hijack/check_completion() - if(!owner.current || owner.current.stat) - return 0 +/datum/objective/hijack/check_completion() // Requires all owners to escape. if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) - return 0 - if(issilicon(owner.current)) - return 0 - if(!SSshuttle.emergency.shuttle_areas[get_area(owner.current)]) - return 0 + return FALSE + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!considered_alive(M) || !SSshuttle.emergency.shuttle_areas[get_area(M.current)]) + return FALSE return SSshuttle.emergency.is_hijacked() - -/datum/objective/hijackclone - explanation_text = "Hijack the emergency shuttle by ensuring only you (or your copies) escape." - martyr_compatible = 0 - -/datum/objective/hijackclone/check_completion() - if(!owner.current) - return FALSE - if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) - return FALSE - - var/in_shuttle = FALSE - for(var/mob/living/player in GLOB.player_list) //Make sure nobody else is onboard - if(SSshuttle.emergency.shuttle_areas[get_area(player)]) - if(player.mind && player.mind != owner) - if(player.stat != DEAD) - if(issilicon(player)) //Borgs are technically dead anyways - continue - if(isanimal(player)) //animals don't count - continue - if(isbrain(player)) //also technically dead - continue - var/location = get_turf(player.mind.current) - if(istype(location, /turf/open/floor/plasteel/shuttle/red)) - continue - if(istype(location, /turf/open/floor/mineral/plastitanium/brig)) - continue - if(player.real_name != owner.current.real_name) - return FALSE - else - in_shuttle = TRUE - return in_shuttle - /datum/objective/block explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive." martyr_compatible = 1 /datum/objective/block/check_completion() - if(!issilicon(owner.current)) - return 0 if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) - return 1 - + return TRUE for(var/mob/living/player in GLOB.player_list) - if(issilicon(player)) - continue - if(player.mind) - if(player.stat != DEAD) - if(get_area(player) in SSshuttle.emergency.shuttle_areas) - return 0 - - return 1 - + if(player.mind && player.stat != DEAD && !issilicon(player)) + if(get_area(player) in SSshuttle.emergency.shuttle_areas) + return FALSE + return TRUE /datum/objective/purge explanation_text = "Ensure no mutant humanoid species are present aboard the escape shuttle." @@ -304,63 +266,41 @@ /datum/objective/purge/check_completion() if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) - return 1 - + return TRUE for(var/mob/living/player in GLOB.player_list) if(get_area(player) in SSshuttle.emergency.shuttle_areas && player.mind && player.stat != DEAD && ishuman(player)) var/mob/living/carbon/human/H = player if(H.dna.species.id != "human") - return 0 - - return 1 - + return FALSE + return TRUE /datum/objective/robot_army explanation_text = "Have at least eight active cyborgs synced to you." martyr_compatible = 0 /datum/objective/robot_army/check_completion() - if(!isAI(owner.current)) - return 0 - var/mob/living/silicon/ai/A = owner.current - var/counter = 0 - - for(var/mob/living/silicon/robot/R in A.connected_robots) - if(R.stat != DEAD) - counter++ - - if(counter < 8) - return 0 - return 1 + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!M.current || !isAI(M.current)) + continue + var/mob/living/silicon/ai/A = M.current + for(var/mob/living/silicon/robot/R in A.connected_robots) + if(R.stat != DEAD) + counter++ + return counter >= 8 /datum/objective/escape explanation_text = "Escape on the shuttle or an escape pod alive and without being in custody." + team_explanation_text = "Have all members of your team escape on a shuttle or pod alive, without being in custody." /datum/objective/escape/check_completion() - if(issilicon(owner.current)) - return 0 - if(isbrain(owner.current)) - return 0 - if(!owner.current || owner.current.stat == DEAD) - return 0 - if(SSticker.force_ending) //This one isn't their fault, so lets just assume good faith - return 1 - if(SSticker.mode.station_was_nuked) //If they escaped the blast somehow, let them win - return 1 - if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) - return 0 - var/turf/location = get_turf(owner.current) - if(!location) - return 0 - - if(istype(location, /turf/open/floor/plasteel/shuttle/red) || istype(location, /turf/open/floor/mineral/plastitanium/brig)) // Fails traitors if they are in the shuttle brig -- Polymorph - return 0 - - if(location.onCentCom() || location.onSyndieBase()) - return 1 - - return 0 + // Require all owners escape safely. + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!considered_escaped(M)) + return FALSE + return TRUE /datum/objective/escape/escape_with_identity var/target_real_name // Has to be stored because the target's real_name can change over the course of the round @@ -387,39 +327,44 @@ explanation_text = "Free Objective." /datum/objective/escape/escape_with_identity/check_completion() - if(!target_real_name) - return 1 - if(!ishuman(owner.current)) - return 0 - var/mob/living/carbon/human/H = owner.current - if(..()) - if(H.dna.real_name == target_real_name) - if(H.get_id_name()== target_real_name || target_missing_id) - return 1 - return 0 - + if(!target || !target_real_name) + return TRUE + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!ishuman(M.current) || !considered_escaped(M)) + continue + var/mob/living/carbon/human/H = M.current + if(H.dna.real_name == target_real_name && (H.get_id_name() == target_real_name || target_missing_id)) + return TRUE + return FALSE /datum/objective/survive explanation_text = "Stay alive until the end." /datum/objective/survive/check_completion() - if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current)) - return 0 //Brains no longer win survive objectives. --NEO - if(!is_special_character(owner.current)) //This fails borg'd traitors - return 0 - return 1 + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!considered_alive(M)) + return FALSE + return TRUE +//Like survive, but works for silicons and zombies and such. +/datum/objective/survive/exist/considered_alive(var/datum/mind/M) + if(M && M.current) + if(isliving(M.current)) + var/mob/living/L = M.current + return L.stat != DEAD + return FALSE /datum/objective/martyr explanation_text = "Die a glorious death." /datum/objective/martyr/check_completion() - if(!owner.current) //Gibbed, etc. - return 1 - if(owner.current && owner.current.stat == DEAD) //You're dead! Yay! - return 1 - return 0 - + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(considered_alive(M)) + return FALSE + return TRUE /datum/objective/nuclear explanation_text = "Destroy the station with a nuclear device." @@ -427,8 +372,8 @@ /datum/objective/nuclear/check_completion() if(SSticker && SSticker.mode && SSticker.mode.station_was_nuked) - return 1 - return 0 + return TRUE + return FALSE GLOBAL_LIST_EMPTY(possible_items) /datum/objective/steal @@ -446,16 +391,21 @@ GLOBAL_LIST_EMPTY(possible_items) new I /datum/objective/steal/find_target() + var/list/datum/mind/owners = get_owners() var/approved_targets = list() - for(var/datum/objective_item/possible_item in GLOB.possible_items) - if(is_unique_objective(possible_item.targetitem) && !(owner.current.mind.assigned_role in possible_item.excludefromjob)) + check_items: + for(var/datum/objective_item/possible_item in GLOB.possible_items) + if(!is_unique_objective(possible_item.targetitem)) + continue + for(var/datum/mind/M in owners) + if(M.current.mind.assigned_role in possible_item.excludefromjob) + continue check_items approved_targets += possible_item return set_target(safepick(approved_targets)) /datum/objective/steal/proc/set_target(datum/objective_item/item) if(item) targetinfo = item - steal_target = targetinfo.targetitem explanation_text = "Steal [targetinfo.name]" give_special_equipment(targetinfo.special_equipment) @@ -483,23 +433,26 @@ GLOBAL_LIST_EMPTY(possible_items) return steal_target /datum/objective/steal/check_completion() + var/list/datum/mind/owners = get_owners() if(!steal_target) - return 1 - if(!isliving(owner.current)) - return 0 - var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. + return TRUE + for(var/datum/mind/M in owners) + if(!isliving(M.current)) + continue - for(var/obj/I in all_items) //Check for items - if(istype(I, steal_target)) - if(!targetinfo) //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1. - return 1 - else if(targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled. - return 1 + var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. - if(targetinfo && I.type in targetinfo.altitems) //Ok, so you don't have the item. Do you have an alternative, at least? - if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! - return 1 - return 0 + for(var/obj/I in all_items) //Check for items + if(istype(I, steal_target)) + if(!targetinfo) //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1. + return TRUE + else if(targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled. + return TRUE + + if(targetinfo && I.type in targetinfo.altitems) //Ok, so you don't have the item. Do you have an alternative, at least? + if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! + return TRUE + return FALSE GLOBAL_LIST_EMPTY(possible_items_special) @@ -553,31 +506,22 @@ GLOBAL_LIST_EMPTY(possible_items_special) explanation_text = "Download [target_amount] research level\s." return target_amount -/datum/objective/download/check_completion()//NINJACODE - if(!ishuman(owner.current)) - return 0 - - var/mob/living/carbon/human/H = owner.current - if(!H || H.stat == DEAD) - return 0 - - if(!istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja)) - return 0 - - var/obj/item/clothing/suit/space/space_ninja/SN = H.wear_suit - if(!SN.s_initialized) - return 0 - - var/current_amount - if(!SN.stored_research.len) - return 0 - else +/datum/objective/download/check_completion()//NINJACODE. + var/current_amount = 0 + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!ishuman(owner.current)) + continue + var/mob/living/carbon/human/H = owner.current + if(!H || H.stat == DEAD || !istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja)) + continue + var/obj/item/clothing/suit/space/space_ninja/SN = H.wear_suit + if(!SN.s_initialized) + continue for(var/datum/tech/current_data in SN.stored_research) if(current_data.level) current_amount += (current_data.level-1) - if(current_amount= target_amount @@ -614,10 +558,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) captured_amount+=1 continue captured_amount+=2 - if(captured_amount= target_amount /datum/objective/absorb @@ -625,13 +566,14 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/absorb/proc/gen_amount_goal(lowbound = 4, highbound = 6) target_amount = rand (lowbound,highbound) var/n_p = 1 //autowin + var/list/datum/mind/owners = get_owners() if (SSticker.current_state == GAME_STATE_SETTING_UP) for(var/mob/dead/new_player/P in GLOB.player_list) - if(P.client && P.ready == PLAYER_READY_TO_PLAY && P.mind!=owner) + if(P.client && P.ready == PLAYER_READY_TO_PLAY && !(P.mind in owners)) n_p ++ else if (SSticker.IsRoundInProgress()) for(var/mob/living/carbon/human/P in GLOB.player_list) - if(P.client && !(P.mind in SSticker.mode.changelings) && P.mind!=owner) + if(P.client && !(P.mind in SSticker.mode.changelings) && !(P.mind in owners)) n_p ++ target_amount = min(target_amount, n_p) @@ -639,10 +581,13 @@ GLOBAL_LIST_EMPTY(possible_items_special) return target_amount /datum/objective/absorb/check_completion() - if(owner && owner.changeling && owner.changeling.stored_profiles && (owner.changeling.absorbedcount >= target_amount)) - return 1 - else - return 0 + var/list/datum/mind/owners = get_owners() + var/absorbedcount = 0 + for(var/datum/mind/M in owners) + if(!owner || !owner.changeling || !owner.changeling.stored_profiles) + continue + absorbedcount += M.changeling.absorbedcount + return absorbedcount >= target_amount @@ -658,10 +603,8 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/destroy/check_completion() if(target && target.current) - if(target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return 1 - return 0 - return 1 + return target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey //Borgs/brains/AIs count as dead for traitor objectives. + return TRUE /datum/objective/destroy/update_explanation_text() ..() @@ -690,18 +633,16 @@ GLOBAL_LIST_EMPTY(possible_items_special) wanted_items = list(/obj/item/spellbook, /obj/item/gun/magic, /obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/scrying, /obj/item/antag_spawner/contract, /obj/item/device/necromantic_stone) /datum/objective/steal_five_of_type/check_completion() - if(!isliving(owner.current)) - return 0 + var/list/datum/mind/owners = get_owners() var/stolen_count = 0 - var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. - for(var/obj/I in all_items) //Check for wanted items - if(is_type_in_typecache(I, wanted_items)) - stolen_count++ - if(stolen_count >= 5) - return 1 - else - return 0 - return 0 + for(var/datum/mind/M in owners) + if(!isliving(M.current)) + continue + var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. + for(var/obj/I in all_items) //Check for wanted items + if(is_type_in_typecache(I, wanted_items)) + stolen_count++ + return stolen_count >= 5 //////////////////////////////// diff --git a/code/game/gamemodes/objective_items.dm.rej b/code/game/gamemodes/objective_items.dm.rej deleted file mode 100644 index 3770d7eea9..0000000000 --- a/code/game/gamemodes/objective_items.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm (rejected hunks) -@@ -158,7 +158,7 @@ - difficulty = 10 - - //Old ninja objectives. --/datum/objective_item/special/pinpointer -+/datum/objective_item/special/pinpointer/nuke - name = "the captain's pinpointer." - targetitem = /obj/item/pinpointer - difficulty = 10 diff --git a/code/game/gamemodes/objective_team.dm b/code/game/gamemodes/objective_team.dm new file mode 100644 index 0000000000..ba6b2546ca --- /dev/null +++ b/code/game/gamemodes/objective_team.dm @@ -0,0 +1,13 @@ +//A barebones antagonist team. +/datum/objective_team + var/list/datum/mind/members = list() + var/name = "team" + var/member_name = "member" + +/datum/objective_team/New(starting_members) + . = ..() + if(starting_members) + members += starting_members + +/datum/objective_team/proc/is_solo() + return members.len == 1 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 43c1b335f4..8384892044 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -281,7 +281,7 @@ ////////////////////////////////////////////////////////////////////////////// //Deals with players being converted from the revolution (Not a rev anymore)// // Modified to handle borged MMIs. Accepts another var if the target is being borged at the time -- Polymorph. ////////////////////////////////////////////////////////////////////////////// -/datum/game_mode/proc/remove_revolutionary(datum/mind/rev_mind , beingborged) +/datum/game_mode/proc/remove_revolutionary(datum/mind/rev_mind , beingborged, deconverter) var/remove_head = 0 if(beingborged && (rev_mind in head_revolutionaries)) head_revolutionaries -= rev_mind @@ -290,17 +290,16 @@ if((rev_mind in revolutionaries) || remove_head) revolutionaries -= rev_mind rev_mind.special_role = null - rev_mind.current.log_message("Has renounced the revolution!", INDIVIDUAL_ATTACK_LOG) + log_attack("[rev_mind.current] (Key: [key_name(rev_mind.current)]) has been deconverted from the revolution by [deconverter] (Key: [key_name(deconverter)])!") if(beingborged) - rev_mind.current.visible_message("The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.",\ - "The frame's firmware detects and deletes your neural reprogramming! You remember nothing[remove_head ? "." : " but the name of the one who flashed you."]") + rev_mind.current.visible_message("The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.", \ + "The frame's firmware detects and deletes your neural reprogramming! You remember nothing[remove_head ? "." : " but the name of the one who flashed you."]") message_admins("[ADMIN_LOOKUPFLW(rev_mind.current)] has been borged while being a [remove_head ? "leader" : " member"] of the revolution.") - else + rev_mind.current.visible_message("[rev_mind.current] looks like they just remembered their real allegiance!", \ + "You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...") rev_mind.current.Unconscious(100) - rev_mind.current.visible_message("[rev_mind.current] looks like they just remembered their real allegiance!",\ - "You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...") update_rev_icons_removed(rev_mind) ///////////////////////////////////// diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 1b8370068f..77b91a8571 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -54,10 +54,7 @@ log_game("[traitor.key] (ckey) has been selected as a [traitor_name]") antag_candidates.Remove(traitor) - - if(pre_traitors.len < required_enemies) - return 0 - return 1 + return pre_traitors.len > 0 /datum/game_mode/traitor/post_setup() diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 130839a373..aae0261320 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -119,7 +119,7 @@ ////////////////////////////Proc for moving soul in and out off stone////////////////////////////////////// -/obj/item/device/soulstone/proc/transfer_soul(choice as text, target, mob/user). +/obj/item/device/soulstone/proc/transfer_soul(choice as text, target, mob/user) switch(choice) if("FORCE") if(!iscarbon(target)) //TODO: Add sacrifice stoning for non-organics, just because you have no body doesnt mean you dont have a soul @@ -237,6 +237,7 @@ S.name = "Shade of [T.real_name]" S.real_name = "Shade of [T.real_name]" S.key = T.key + S.language_holder = U.language_holder.copy(S) if(U) S.faction |= "\ref[U]" //Add the master as a faction, allowing inter-mob cooperation if(U && iscultist(U)) diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 4f691e053f..8a4c854d76 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -43,7 +43,7 @@ to_chat(user, "[src] is out of foam and cannot be activated.") return if(cooldown_time > world.time) - to_chat(user, "[src] cannot be activated for another [round((world.time - cooldown_time) * 0.1)] second\s.") + to_chat(user, "[src] cannot be activated for [DisplayTimeText(world.time - cooldown_time)].") return new /obj/effect/particle_effect/foam(loc) uses-- diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index 69ccb4240a..b5175b215f 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -20,28 +20,28 @@ close(1) if("unlock") - locked = FALSE + locked = FALSE update_icon() if("lock") - locked = TRUE + locked = TRUE update_icon() if("secure_open") - locked = FALSE + locked = FALSE update_icon() sleep(2) open(1) - locked = TRUE + locked = TRUE update_icon() if("secure_close") - locked = FALSE + locked = FALSE close(1) - locked = TRUE + locked = TRUE sleep(2) update_icon() @@ -88,7 +88,7 @@ name = "airlock sensor" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - anchored = TRUE + anchored = TRUE power_channel = ENVIRON var/id_tag @@ -97,8 +97,8 @@ var/datum/radio_frequency/radio_connection - var/on = TRUE - var/alert = FALSE + var/on = TRUE + var/alert = FALSE /obj/machinery/airlock_sensor/update_icon() @@ -143,9 +143,9 @@ radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_AIRLOCK) /obj/machinery/airlock_sensor/Initialize() - ..() + . = ..() set_frequency(frequency) /obj/machinery/airlock_sensor/Destroy() - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) return ..() \ No newline at end of file diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index c185a8f734..9fa53765ed 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -32,8 +32,6 @@ var/selected_category var/screen = 1 - var/datum/material_container/materials - var/list/categories = list( "Tools", "Electronics", @@ -48,15 +46,15 @@ ) /obj/machinery/autolathe/Initialize() - materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS)) + AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS)) + . = ..() + wires = new /datum/wires/autolathe(src) files = new /datum/research/autolathe(src) matching_designs = list() - return ..() /obj/machinery/autolathe/Destroy() QDEL_NULL(wires) - QDEL_NULL(materials) return ..() /obj/machinery/autolathe/interact(mob/user) @@ -81,6 +79,7 @@ popup.open() /obj/machinery/autolathe/on_deconstruction() + GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_all() /obj/machinery/autolathe/attackby(obj/item/O, mob/user, params) @@ -123,42 +122,26 @@ busy = FALSE return 1 - if(O.flags_2 & HOLOGRAM_2) - return 1 + return ..() - var/material_amount = materials.get_item_material_amount(O) - if(!material_amount) - to_chat(user, "This object does not contain sufficient amounts of metal or glass to be accepted by the autolathe.") - return 1 - if(!materials.has_space(material_amount)) - to_chat(user, "The autolathe is full. Please remove metal or glass from the autolathe in order to insert more.") - return 1 - if(!user.temporarilyRemoveItemFromInventory(O)) - to_chat(user, "\The [O] is stuck to you and cannot be placed into the autolathe.") - return 1 - - busy = TRUE - var/inserted = materials.insert_item(O) - if(inserted) - if(istype(O, /obj/item/stack)) - if (O.materials[MAT_METAL]) - flick("autolathe_o",src)//plays metal insertion animation - if (O.materials[MAT_GLASS]) - flick("autolathe_r",src)//plays glass insertion animation - to_chat(user, "You insert [inserted] sheet[inserted>1 ? "s" : ""] to the autolathe.") - use_power(inserted*100) - if(!QDELETED(O)) - user.put_in_active_hand(O) +/obj/machinery/mecha_part_fabricator/ComponentActivated(datum/component/C) + ..() + if(istype(C, /datum/component/material_container)) + var/datum/component/material_container/M = C + if(!M.last_insert_success) + return + var/lit = M.last_inserted_type + if(ispath(lit, /obj/item/ore/bluespace_crystal)) + use_power(max(500,M.last_amount_inserted/10)) else - to_chat(user, "You insert a material total of [inserted] to the autolathe.") - use_power(max(500,inserted/10)) - qdel(O) - else - user.put_in_active_hand(O) - - busy = FALSE - updateUsrDialog() - return 1 + var/obj/item/stack/S = lit + var/list/initmats = initial(S.materials) + if (initmats[MAT_METAL]) + flick("autolathe_o",src)//plays metal insertion animation + if (initmats[MAT_GLASS]) + flick("autolathe_r",src)//plays glass insertion animation + use_power(M.last_amount_inserted*100) + updateUsrDialog() /obj/machinery/autolathe/Topic(href, href_list) if(..()) @@ -193,6 +176,7 @@ var/power = max(2000, (metal_cost+glass_cost)*multiplier/5) + GET_COMPONENT(materials, /datum/component/material_container) if((materials.amount(MAT_METAL) >= metal_cost*multiplier*coeff) && (materials.amount(MAT_GLASS) >= glass_cost*multiplier*coeff)) busy = TRUE use_power(power) @@ -246,6 +230,7 @@ var/T = 0 for(var/obj/item/stock_parts/matter_bin/MB in component_parts) T += MB.rating*75000 + GET_COMPONENT(materials, /datum/component/material_container) materials.max_amount = T T=1.2 for(var/obj/item/stock_parts/manipulator/M in component_parts) @@ -294,6 +279,7 @@ dat += "[D.name]" if(ispath(D.build_path, /obj/item/stack)) + GET_COMPONENT(materials, /datum/component/material_container) var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS]?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY) if (max_multiplier>10 && !disabled) dat += " x10" @@ -325,6 +311,7 @@ dat += "[D.name]" if(ispath(D.build_path, /obj/item/stack)) + GET_COMPONENT(materials, /datum/component/material_container) var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS]?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY) if (max_multiplier>10 && !disabled) dat += " x10" @@ -339,6 +326,7 @@ return dat /obj/machinery/autolathe/proc/materials_printout() + GET_COMPONENT(materials, /datum/component/material_container) var/dat = "Total amount: [materials.total_amount] / [materials.max_amount] cm3
" for(var/mat_id in materials.materials) var/datum/material/M = materials.materials[mat_id] @@ -351,6 +339,7 @@ var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff) + GET_COMPONENT(materials, /datum/component/material_container) if(D.materials[MAT_METAL] && (materials.amount(MAT_METAL) < (D.materials[MAT_METAL] * coeff * amount))) return 0 if(D.materials[MAT_GLASS] && (materials.amount(MAT_GLASS) < (D.materials[MAT_GLASS] * coeff * amount))) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index bc6833f84a..d7832622c5 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -39,6 +39,8 @@ // Upgrades bitflag var/upgrades = 0 + var/internal_light = TRUE //Whether it can light up when an AI views it + /obj/machinery/camera/Initialize(mapload) . = ..() assembly = new(src) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 2276b5154b..88941c2344 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -218,6 +218,7 @@ if(!is_operational()) //Autoeject if power is lost if(mob_occupant) go_out() + mob_occupant.apply_vore_prefs() connected_message("Clone Ejected: Loss of power.") else if(mob_occupant && (mob_occupant.loc == src)) @@ -226,6 +227,7 @@ SPEAK("The cloning of [mob_occupant.real_name] has been \ aborted due to unrecoverable tissue failure.") go_out() + mob_occupant.apply_vore_prefs() else if(mob_occupant.cloneloss > (100 - heal_level)) mob_occupant.Unconscious(80) @@ -270,6 +272,7 @@ BP.attach_limb(mob_occupant) go_out() + mob_occupant.apply_vore_prefs() else if (!mob_occupant || mob_occupant.loc != src) occupant = null diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 2033fd7146..a8e9c7bcca 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -4,17 +4,17 @@ icon_screen = "crew" icon_keyboard = "med_key" circuit = /obj/item/circuitboard/computer/operating - var/mob/living/carbon/human/patient - var/obj/structure/table/optable/table + var/mob/living/carbon/human/patient + var/obj/structure/table/optable/table light_color = LIGHT_COLOR_BLUE /obj/machinery/computer/operating/Initialize() - ..() + . = ..() find_table() /obj/machinery/computer/operating/proc/find_table() - for(var/dir in GLOB.cardinals) + for(var/dir in GLOB.cardinals) table = locate(/obj/structure/table/optable, get_step(src, dir)) if(table) table.computer = src @@ -63,4 +63,4 @@ var/datum/surgery_step/surgery_step = procedure.get_surgery_step() dat += "Next step: [capitalize(surgery_step.name)]
" dat += "" - return dat + return dat \ No newline at end of file diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 033676264c..77bb50e8c4 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -22,7 +22,7 @@ if(!QDELETED(C)) qdel(circuit) circuit = C - C.forceMove(null) + C.loc = null /obj/machinery/computer/Destroy() QDEL_NULL(circuit) diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 8131dbd4a6..2d1d771203 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -84,7 +84,7 @@ light_color = LIGHT_COLOR_CYAN /obj/machinery/computer/atmos_control/Initialize() - ..() + . = ..() set_frequency(frequency) /obj/machinery/computer/atmos_control/Destroy() @@ -227,4 +227,4 @@ else if(output_tag == id_tag) output_info = signal.data else - ..(signal) + ..(signal) \ No newline at end of file diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index aafe74f2b3..105fb64042 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -169,7 +169,7 @@ if("working") temp_html += status temp_html += "

System Busy

" - temp_html += "Working ... Please wait ([radduration] Seconds)" + temp_html += "Working ... Please wait ([DisplayTimeText(radduration)])" if("buffer") temp_html += status temp_html += buttons diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 44822d3771..f3fabcc21c 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -40,25 +40,25 @@ return ..() /obj/machinery/computer/message_monitor/emag_act(mob/user) - if(emagged) - return - if(!isnull(src.linkedServer)) - emagged = TRUE - screen = 2 - spark_system.set_up(5, 0, src) - src.spark_system.start() - var/obj/item/paper/monitorkey/MK = new/obj/item/paper/monitorkey - MK.loc = src.loc - // Will help make emagging the console not so easy to get away with. - MK.info += "

�%@%(*$%&(�&?*(%&�/{}" - var/time = 100 * length(src.linkedServer.decryptkey) - addtimer(CALLBACK(src, .proc/UnmagConsole), time) - message = rebootmsg - else - to_chat(user, "A no server error appears on the screen.") + if(emagged) + return + if(!isnull(src.linkedServer)) + emagged = TRUE + screen = 2 + spark_system.set_up(5, 0, src) + src.spark_system.start() + var/obj/item/paper/monitorkey/MK = new/obj/item/paper/monitorkey + MK.loc = src.loc + // Will help make emagging the console not so easy to get away with. + MK.info += "

�%@%(*$%&(�&?*(%&�/{}" + var/time = 100 * length(src.linkedServer.decryptkey) + addtimer(CALLBACK(src, .proc/UnmagConsole), time) + message = rebootmsg + else + to_chat(user, "A no server error appears on the screen.") /obj/machinery/computer/message_monitor/Initialize() - ..() + . = ..() //Is the server isn't linked to a server, and there's a server available, default it to the first one in the list. if(!linkedServer) if(GLOB.message_servers && GLOB.message_servers.len > 0) @@ -236,7 +236,7 @@ src.screen = 0 // Return the screen back to normal /obj/machinery/computer/message_monitor/proc/UnmagConsole() - emagged = FALSE + emagged = FALSE /obj/machinery/computer/message_monitor/proc/ResetMessage() customsender = "System Administrator" @@ -309,7 +309,7 @@ message = noserver else if(auth) - var/dkey = trim(stripped_input(usr, "Please enter the decryption key.")) + var/dkey = trim(stripped_input(usr, "Please enter the decryption key.")) if(dkey && dkey != "") if(src.linkedServer.decryptkey == dkey) var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):")) @@ -414,11 +414,11 @@ customrecepient.tnote += "← From [customsender] ([customjob]):
[custommessage]
" if (!customrecepient.silent) playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) - customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3) + customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3) if( customrecepient.loc && ishuman(customrecepient.loc) ) var/mob/living/carbon/human/H = customrecepient.loc - to_chat(H, "[icon2html(customrecepient, viewers(H))] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)") - log_talk(usr,"[key_name(usr)] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA) + to_chat(H, "[icon2html(customrecepient, viewers(H))] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)") + log_talk(usr,"[key_name(usr)] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA) customrecepient.cut_overlays() customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r")) //Sender is faking as someone who exists @@ -427,11 +427,11 @@ customrecepient.tnote += "← From [PDARec.owner] ([customjob]):
[custommessage]
" if (!customrecepient.silent) playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) - customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3) + customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3) if( customrecepient.loc && ishuman(customrecepient.loc) ) var/mob/living/carbon/human/H = customrecepient.loc - to_chat(H, "[icon2html(customrecepient, H)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)") - log_talk(usr,"[key_name(usr)] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA) + to_chat(H, "[icon2html(customrecepient, H)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)") + log_talk(usr,"[key_name(usr)] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA) customrecepient.cut_overlays() customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r")) //Finally.. @@ -468,4 +468,4 @@ info = "

Daily Key Reset


The new message monitor key is '[server.decryptkey]'.
Please keep this a secret and away from the clown.
If necessary, change the password to a more secure one." info_links = info add_overlay("paper_words") - break + break \ No newline at end of file diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 3f18cc29e9..7cb1304326 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -1,145 +1,143 @@ -/obj/machinery/computer/pod - name = "mass driver launch control" - desc = "A combined blastdoor and mass driver control unit." - var/obj/machinery/mass_driver/connected = null - var/title = "Mass Driver Controls" - var/id = 1 - var/timing = 0 - var/time = 30 - var/range = 4 - - -/obj/machinery/computer/pod/Initialize() - ..() - for(var/obj/machinery/mass_driver/M in range(range, src)) - if(M.id == id) - connected = M - - -/obj/machinery/computer/pod/proc/alarm() - if(stat & (NOPOWER|BROKEN)) - return - - if(!connected) +/obj/machinery/computer/pod + name = "mass driver launch control" + desc = "A combined blastdoor and mass driver control unit." + var/obj/machinery/mass_driver/connected = null + var/title = "Mass Driver Controls" + var/id = 1 + var/timing = 0 + var/time = 30 + var/range = 4 + + +/obj/machinery/computer/pod/Initialize() + . = ..() + for(var/obj/machinery/mass_driver/M in range(range, src)) + if(M.id == id) + connected = M + + +/obj/machinery/computer/pod/proc/alarm() + if(stat & (NOPOWER|BROKEN)) + return + + if(!connected) say("Cannot locate mass driver connector. Cancelling firing sequence!") - return - - for(var/obj/machinery/door/poddoor/M in range(range, src)) - if(M.id == id) - M.open() - - sleep(20) - for(var/obj/machinery/mass_driver/M in range(range, src)) - if(M.id == id) - M.power = connected.power - M.drive() - - sleep(50) - for(var/obj/machinery/door/poddoor/M in range(range, src)) - if(M.id == id) - M.close() - -/obj/machinery/computer/pod/attack_hand(mob/user) - if(..()) - return - - var/dat = "" - user.set_machine(src) - if(connected) - var/d2 - if(timing) //door controls do not need timers. - d2 = "Stop Time Launch" - else - d2 = "Initiate Time Launch" - var/second = time % 60 - var/minute = (time - second) / 60 - dat += "
\nTimer System: [d2]\nTime Left: [minute ? "[minute]:" : null][second] - - + +" - var/temp = "" - var/list/L = list( 0.25, 0.5, 1, 2, 4, 8, 16 ) - for(var/t in L) - if(t == connected.power) - temp += "[t] " - else - temp += "[t] " - dat += "
\nPower Level: [temp]
\nFiring Sequence
\nTest Fire Driver
\nToggle Outer Door
" - else - dat += "
\nToggle Outer Door
" - dat += "

Close" - add_fingerprint(usr) - var/datum/browser/popup = new(user, "computer", title, 400, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - popup.open() - - -/obj/machinery/computer/pod/process() - if(!..()) - return - if(timing) - if(time > 0) - time = round(time) - 1 - else - alarm() - time = 0 - timing = 0 - updateDialog() - - -/obj/machinery/computer/pod/Topic(href, href_list) - if(..()) - return - if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) - usr.set_machine(src) - if(href_list["power"]) - var/t = text2num(href_list["power"]) - t = min(max(0.25, t), 16) - if(connected) - connected.power = t - if(href_list["alarm"]) - alarm() - if(href_list["time"]) - timing = text2num(href_list["time"]) - if(href_list["tp"]) - var/tp = text2num(href_list["tp"]) - time += tp - time = min(max(round(time), 0), 120) - if(href_list["door"]) - for(var/obj/machinery/door/poddoor/M in range(range, src)) - if(M.id == id) - if(M.density) - M.open() - else - M.close() - if(href_list["drive"]) - for(var/obj/machinery/mass_driver/M in range(range, src)) - if(M.id == id) - M.power = connected.power - M.drive() - updateUsrDialog() - - -/obj/machinery/computer/pod/old - name = "\improper DoorMex control console" - title = "Door Controls" - icon_state = "oldcomp" - icon_screen = "library" - icon_keyboard = null - - -/obj/machinery/computer/pod/old/syndicate - name = "\improper ProComp Executive IIc" - desc = "The Syndicate operate on a tight budget. Operates external airlocks." - title = "External Airlock Controls" + return + + for(var/obj/machinery/door/poddoor/M in range(range, src)) + if(M.id == id) + M.open() + + sleep(20) + for(var/obj/machinery/mass_driver/M in range(range, src)) + if(M.id == id) + M.power = connected.power + M.drive() + + sleep(50) + for(var/obj/machinery/door/poddoor/M in range(range, src)) + if(M.id == id) + M.close() + +/obj/machinery/computer/pod/attack_hand(mob/user) + if(..()) + return + + var/dat = "" + user.set_machine(src) + if(connected) + var/d2 + if(timing) //door controls do not need timers. + d2 = "Stop Time Launch" + else + d2 = "Initiate Time Launch" + dat += "
\nTimer System: [d2]\nTime Left: [DisplayTimeText(time)] - - + +" + var/temp = "" + var/list/L = list( 0.25, 0.5, 1, 2, 4, 8, 16 ) + for(var/t in L) + if(t == connected.power) + temp += "[t] " + else + temp += "[t] " + dat += "
\nPower Level: [temp]
\nFiring Sequence
\nTest Fire Driver
\nToggle Outer Door
" + else + dat += "
\nToggle Outer Door
" + dat += "

Close" + add_fingerprint(usr) + var/datum/browser/popup = new(user, "computer", title, 400, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) + popup.open() + + +/obj/machinery/computer/pod/process() + if(!..()) + return + if(timing) + if(time > 0) + time = round(time) - 1 + else + alarm() + time = 0 + timing = 0 + updateDialog() + + +/obj/machinery/computer/pod/Topic(href, href_list) + if(..()) + return + if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) + usr.set_machine(src) + if(href_list["power"]) + var/t = text2num(href_list["power"]) + t = min(max(0.25, t), 16) + if(connected) + connected.power = t + if(href_list["alarm"]) + alarm() + if(href_list["time"]) + timing = text2num(href_list["time"]) + if(href_list["tp"]) + var/tp = text2num(href_list["tp"]) + time += tp + time = min(max(round(time), 0), 120) + if(href_list["door"]) + for(var/obj/machinery/door/poddoor/M in range(range, src)) + if(M.id == id) + if(M.density) + M.open() + else + M.close() + if(href_list["drive"]) + for(var/obj/machinery/mass_driver/M in range(range, src)) + if(M.id == id) + M.power = connected.power + M.drive() + updateUsrDialog() + + +/obj/machinery/computer/pod/old + name = "\improper DoorMex control console" + title = "Door Controls" + icon_state = "oldcomp" + icon_screen = "library" + icon_keyboard = null + + +/obj/machinery/computer/pod/old/syndicate + name = "\improper ProComp Executive IIc" + desc = "The Syndicate operate on a tight budget. Operates external airlocks." + title = "External Airlock Controls" req_access = list(ACCESS_SYNDICATE) - -/obj/machinery/computer/pod/old/syndicate/attack_hand(mob/user) - if(!allowed(user)) - to_chat(user, "Access denied.") - return - else - ..() - - -/obj/machinery/computer/pod/old/swf - name = "\improper Magix System IV" - desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorceror's Edition" + +/obj/machinery/computer/pod/old/syndicate/attack_hand(mob/user) + if(!allowed(user)) + to_chat(user, "Access denied.") + return + else + ..() + + +/obj/machinery/computer/pod/old/swf + name = "\improper Magix System IV" + desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorceror's Edition" diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 678d856dce..52de3830df 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -22,7 +22,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E var/obj/machinery/computer/telecrystals/boss/linkedboss = null /obj/machinery/computer/telecrystals/uplinker/Initialize() - ..() + . = ..() var/ID = pick_n_take(GLOB.possible_uplinker_IDs) if(!ID) @@ -220,4 +220,4 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E src.updateUsrDialog() return -#undef NUKESCALINGMODIFIER +#undef NUKESCALINGMODIFIER \ No newline at end of file diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 9ba8e1d34d..f919bdbab8 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -96,7 +96,7 @@ dat += "
" dat += " Select Track
" dat += "Track Selected: [selection.song_name]
" - dat += "Track Length: [selection.song_length/10] seconds

" + dat += "Track Length: [DisplayTimeText(selection.song_length)]

" dat += "
DJ's Soundboard:
" dat +="
" dat += "Air Horn " @@ -122,7 +122,7 @@ return if(!active) if(stop > world.time) - to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [round((stop-world.time)/10)] seconds.") + to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [DisplayTimeText(stop-world.time)].") playsound(src, 'sound/misc/compiler-failure.ogg', 50, 1) return active = TRUE diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 4085b4edb4..034a260925 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -15,7 +15,7 @@ var/scan_level var/precision_coeff var/message_cooldown - var/breakout_time = 2 + var/breakout_time = 1200 /obj/machinery/dna_scannernew/RefreshParts() scan_level = 0 @@ -73,9 +73,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the door of [src]!", \ - "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a metallic creaking from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked) return locked = FALSE diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 13e6ca1253..e7fa7447b5 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1011,7 +1011,7 @@ if(AIRLOCK_SECURITY_NONE) if(istype(C, /obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/metal/S = C - if(S.amount < 2) + if(S.get_amount() < 2) to_chat(user, "You need at least 2 metal sheets to reinforce [src].") return to_chat(user, "You start reinforcing [src]") @@ -1025,7 +1025,7 @@ return else if(istype(C, /obj/item/stack/sheet/plasteel)) var/obj/item/stack/sheet/plasteel/S = C - if(S.amount < 2) + if(S.get_amount() < 2) to_chat(user, "You need at least 2 plasteel sheets to reinforce [src].") return to_chat(user, "You start reinforcing [src].") @@ -1347,19 +1347,19 @@ return TRUE operating = TRUE update_icon(AIRLOCK_OPENING, 1) - src.set_opacity(0) - sleep(5) - density = FALSE - sleep(9) - src.layer = OPEN_DOOR_LAYER - update_icon(AIRLOCK_OPEN, 1) + sleep(1) set_opacity(0) - operating = FALSE - air_update_turf(1) update_freelook_sight() + sleep(4) + density = FALSE + air_update_turf(1) + sleep(1) + layer = OPEN_DOOR_LAYER + update_icon(AIRLOCK_OPEN, 1) + operating = FALSE if(delayed_close_requested) delayed_close_requested = FALSE - addtimer(CALLBACK(src, .proc/close), 2) + addtimer(CALLBACK(src, .proc/close), 1) return TRUE @@ -1391,21 +1391,24 @@ return TRUE operating = TRUE update_icon(AIRLOCK_CLOSING, 1) - src.layer = CLOSED_DOOR_LAYER + layer = CLOSED_DOOR_LAYER if(air_tight) density = TRUE - sleep(5) - density = TRUE + air_update_turf(1) + sleep(1) + if(!air_tight) + density = TRUE + air_update_turf(1) + sleep(4) if(!safe) crush() - sleep(9) - update_icon(AIRLOCK_CLOSED, 1) if(visible && !glass) set_opacity(1) + update_freelook_sight() + sleep(1) + update_icon(AIRLOCK_CLOSED, 1) operating = FALSE delayed_close_requested = FALSE - air_update_turf(1) - update_freelook_sight() if(safe) CheckForMobs() return TRUE diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 02f3f03b91..95adf12875 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -434,6 +434,15 @@ constructionStep = CONSTRUCTION_GUTTED update_icon() return + if(istype(C, /obj/item/device/electroadaptive_pseudocircuit)) + var/obj/item/device/electroadaptive_pseudocircuit/P = C + if(!P.adapt_circuit(user, 30)) + return + user.visible_message("[user] fabricates a circuit and places it into [src].", \ + "You adapt a firelock circuit and slot it into the assembly.") + constructionStep = CONSTRUCTION_GUTTED + update_icon() + return return ..() /obj/structure/firelock_frame/heavy diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 31643fa177..5d7be7fbd8 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -22,7 +22,6 @@ var/icon_recharging = "recharge" var/icon_creating = "make" - var/datum/material_container/materials var/list/using_materials var/starting_amount = 0 var/metal_cost = 1000 @@ -55,14 +54,10 @@ /obj/machinery/droneDispenser/Initialize() . = ..() - materials = new(src, list(MAT_METAL, MAT_GLASS), MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2) + var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE) materials.insert_amount(starting_amount) using_materials = list(MAT_METAL=metal_cost, MAT_GLASS=glass_cost) -/obj/machinery/droneDispenser/Destroy() - QDEL_NULL(materials) - return ..() - /obj/machinery/droneDispenser/preloaded starting_amount = 5000 @@ -81,7 +76,7 @@ exterminator drones when supplied with metal and glass. \ Disgusting. This one seems ominous." dispense_type = /obj/item/drone_shell/syndrone/badass - end_create_message = "dispenses a ominous suspicious drone shell." + end_create_message = "dispenses an ominous suspicious drone shell." // I don't need your forgiveness, this is awesome. /obj/machinery/droneDispenser/snowflake @@ -148,10 +143,6 @@ ..() if((mode == DRONE_RECHARGING) && !stat && recharging_text) to_chat(user, "[recharging_text]") - if(metal_cost) - to_chat(user, "It has [materials.amount(MAT_METAL)] units of metal stored.") - if(glass_cost) - to_chat(user, "It has [materials.amount(MAT_GLASS)] units of glass stored.") /obj/machinery/droneDispenser/power_change() ..() @@ -166,6 +157,7 @@ if((stat & (NOPOWER|BROKEN)) || !anchored) return + GET_COMPONENT(materials, /datum/component/material_container) if(!materials.has_materials(using_materials)) return // We require more minerals @@ -232,25 +224,8 @@ icon_state = icon_on /obj/machinery/droneDispenser/attackby(obj/item/O, mob/living/user) - if(istype(O, /obj/item/stack)) - if(!O.materials[MAT_METAL] && !O.materials[MAT_GLASS]) - return ..() - if(!metal_cost && !glass_cost) - to_chat(user, "There isn't a place to insert [O]!") - return - var/obj/item/stack/sheets = O - if(!user.canUnEquip(sheets)) - to_chat(user, "[O] is stuck to your hand, you can't get it off!") - return - - var/used = materials.insert_stack(sheets, sheets.amount) - - if(used) - to_chat(user, "You insert [used] sheet[used > 1 ? "s" : ""] into [src].") - else - to_chat(user, "The [src] isn't accepting the [sheets].") - - else if(istype(O, /obj/item/crowbar)) + if(istype(O, /obj/item/crowbar)) + GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_all() playsound(loc, O.usesound, 50, 1) to_chat(user, "You retrieve the materials from [src].") diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 518cd8ab09..ebbeb1bee2 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -220,6 +220,16 @@ update_icon() return + else if(istype(W, /obj/item/device/electroadaptive_pseudocircuit)) + var/obj/item/device/electroadaptive_pseudocircuit/P = W + if(!P.adapt_circuit(user, 15)) + return + user.visible_message("[user] fabricates a circuit and places it into [src].", \ + "You adapt a fire alarm circuit and slot it into the assembly.") + buildstage = 1 + update_icon() + return + else if(istype(W, /obj/item/wrench)) user.visible_message("[user] removes the fire alarm assembly from the wall.", \ "You remove the fire alarm assembly from the wall.") diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index d77e91af90..2d7c7708b3 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -20,7 +20,7 @@ The console is located at computer/gulag_teleporter.dm circuit = /obj/item/circuitboard/machine/gulag_teleporter var/locked = FALSE var/message_cooldown - var/breakout_time = 1 + var/breakout_time = 600 var/jumpsuit_type = /obj/item/clothing/under/rank/prisoner var/shoes_type = /obj/item/clothing/shoes/sneakers/orange var/obj/machinery/gulag_item_reclaimer/linked_reclaimer @@ -104,9 +104,9 @@ The console is located at computer/gulag_teleporter.dm user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the door of [src]!", \ - "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a metallic creaking from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked) return locked = FALSE diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index d0d40e7233..36366ffbd9 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -215,7 +215,7 @@ /obj/machinery/magnetic_controller/Initialize() - ..() + . = ..() if(autolink) for(var/obj/machinery/magnetic_module/M in GLOB.machines) if(M.freq == frequency && M.code == code) @@ -391,4 +391,4 @@ if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore rpath += copytext(path, i, i+1) // else, add to list - // there doesn't HAVE to be separators but it makes paths syntatically visible + // there doesn't HAVE to be separators but it makes paths syntatically visible \ No newline at end of file diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index 545414577e..f800309131 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -31,8 +31,6 @@ imap += icon('icons/misc/imap.dmi', "blank") imap += icon('icons/misc/imap.dmi', "blank") - //to_chat(world, "[icount] images in list") - for(var/wx = 1 ; wx <= world.maxx; wx++) @@ -142,13 +140,10 @@ var/rx = ((wx*2+xoff)%32) + 1 var/ry = ((wy*2+yoff)%32) + 1 - //to_chat(world, "trying [ix],[iy] : [ix+icx*iy]") var/icon/I = imap[1+(ix + icx*iy)*2] var/icon/I2 = imap[2+(ix + icx*iy)*2] - //to_chat(world, "icon: [icon2html(I, world)]") - I.DrawBox(colour, rx, ry, rx+1, ry+1) I2.DrawBox(colour2, rx, ry, rx+1, ry+1) @@ -164,8 +159,6 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //to_chat(world, "[icon2html(I, world)] at [H.screen_loc]") - H.name = (i==0)?"maprefresh":"map" var/icon/HI = new/icon @@ -272,12 +265,8 @@ var/rx = ((wx*2+xoff)%32) + 1 var/ry = ((wy*2+yoff)%32) + 1 - //to_chat(world, "trying [ix],[iy] : [ix+icx*iy]") var/icon/I = imap[1+(ix + icx*iy)] - - //to_chat(world, "icon: [icon2html(I, world)]") - I.DrawBox(colour, rx, ry, rx, ry) @@ -291,8 +280,6 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //to_chat(world, "[icon2html(I, world)] at [H.screen_loc]") - H.name = (i==0)?"maprefresh":"map" var/icon/I = imap[i+1] diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 4a5e32d4e8..3fb3447f61 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -30,6 +30,7 @@ Buildable meters PIPE_HE_MANIFOLD, \ PIPE_HE_4WAYMANIFOLD, \ PIPE_JUNCTION, \ + PIPE_BLUESPACE, \ \ PIPE_CONNECTOR, \ PIPE_UVENT, \ @@ -90,6 +91,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( "[PIPE_HE_MANIFOLD]" = "he_manifold", \ "[PIPE_HE_4WAYMANIFOLD]" = "he_manifold4w", \ "[PIPE_JUNCTION]" = "junction", \ + "[PIPE_BLUESPACE]" = "bluespace", \ \ "[PIPE_CONNECTOR]" = "connector", \ "[PIPE_UVENT]" = "uvent", \ @@ -118,6 +120,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( "[PIPE_HE_MANIFOLD]" = "h/e manifold", \ "[PIPE_HE_4WAYMANIFOLD]"= "h/e 4-way manifold", \ "[PIPE_JUNCTION]" = "junction", \ + "[PIPE_BLUESPACE]" = "bluespace pipe", \ \ "[PIPE_CONNECTOR]" = "connector", \ "[PIPE_UVENT]" = "vent", \ diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 456fc1d0bd..39b3760f7e 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -13,13 +13,14 @@ if(..()) return 1 var/dat = {" -Regular pipes:
+Pipes:
Pipe
Bent Pipe
Manifold
4-Way Manifold
Manual Valve
Digital Valve
+Bluespace Pipe
Devices:
Connector
Vent
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index ee8363e1b3..b84de7cf18 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -570,8 +570,8 @@ /obj/machinery/porta_turret/syndicate/pod integrity_failure = 20 max_integrity = 40 - stun_projectile = /obj/item/projectile/bullet/weakbullet3 - lethal_projectile = /obj/item/projectile/bullet/weakbullet3 + stun_projectile = /obj/item/projectile/bullet/syndicate_turret + lethal_projectile = /obj/item/projectile/bullet/syndicate_turret /obj/machinery/porta_turret/ai faction = "silicon" diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index e86f78722b..6af0240214 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -79,7 +79,7 @@ return if(world.time < last_teleport + teleport_cooldown) - to_chat(user, "[src] is recharging power. Please wait [round((last_teleport + teleport_cooldown - world.time) / 10)] seconds.") + to_chat(user, "[src] is recharging power. Please wait [DisplayTimeText(last_teleport + teleport_cooldown - world.time)].") return if(teleporting) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index b4bee2bdae..fbe02dca37 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -14,15 +14,14 @@ var/blood = 0 var/eat_dir = WEST var/amount_produced = 50 - var/datum/material_container/materials var/crush_damage = 1000 var/eat_victim_items = TRUE var/item_recycle_sound = 'sound/items/welder.ogg' /obj/machinery/recycler/Initialize() - materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM)) + AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM)) + . = ..() update_icon() - return ..() /obj/machinery/recycler/RefreshParts() var/amt_made = 0 @@ -32,6 +31,7 @@ mat_mod *= 50000 for(var/obj/item/stock_parts/manipulator/M in component_parts) amt_made = 12.5 * M.rating //% of materials salvaged + GET_COMPONENT(materials, /datum/component/material_container) materials.max_amount = mat_mod amount_produced = min(50, amt_made) + 50 @@ -126,6 +126,7 @@ /obj/machinery/recycler/proc/recycle_item(obj/item/I) I.loc = src.loc + GET_COMPONENT(materials, /datum/component/material_container) var/material_amount = materials.get_item_material_amount(I) if(!material_amount) qdel(I) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index a78fa50a6a..7c51c383fa 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -27,7 +27,7 @@ var/uv_super = FALSE var/uv_cycles = 6 var/message_cooldown - var/breakout_time = 0.5 + var/breakout_time = 300 /obj/machinery/suit_storage_unit/standard_unit suit_type = /obj/item/clothing/suit/space/eva @@ -267,9 +267,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the doors of [src]!", \ - "You start kicking against the doors... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You start kicking against the doors... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a thump from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src ) return user.visible_message("[user] successfully broke out of [src]!", \ diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 07b21c1fe4..b3a7f99758 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -706,7 +706,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C ..() var/T = pick(subtypesof(/obj/machinery/vending/snack) - /obj/machinery/vending/snack/random) new T(get_turf(src)) - qdel(src) + return INITIALIZE_HINT_QDEL /obj/machinery/vending/snack/blue icon_state = "snackblue" @@ -758,7 +758,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C . = ..() var/T = pick(subtypesof(/obj/machinery/vending/cola) - /obj/machinery/vending/cola/random) new T(get_turf(src)) - qdel(src) + return INITIALIZE_HINT_QDEL /obj/machinery/vending/cola/blue icon_state = "Cola_Machine" @@ -1142,7 +1142,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C /obj/machinery/vending/toyliberationstation name = "\improper Syndicate Donksoft Toy Vendor" - desc = "A ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!" + desc = "An ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!" icon_state = "syndi" req_access_txt = "1" product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get perma briged!" @@ -1156,7 +1156,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C /obj/item/toy/foamblade = 10, /obj/item/toy/syndicateballoon = 10, /obj/item/clothing/suit/syndicatefake = 5, - /obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just a assistant + /obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just an assistant contraband = list(/obj/item/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting! /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot = 10, /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/riot = 10, @@ -1195,4 +1195,4 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C #undef STANDARD_CHARGE #undef CONTRABAND_CHARGE -#undef COIN_CHARGE +#undef COIN_CHARGE \ No newline at end of file diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index b6b4241402..1e9616ae12 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -251,7 +251,7 @@ icon_state = "mecha_carbine" origin_tech = "materials=4;combat=4" equip_cooldown = 10 - projectile = /obj/item/projectile/bullet/incendiary/shell + projectile = /obj/item/projectile/bullet/incendiary/fnx99 projectiles = 24 projectile_energy_cost = 15 @@ -271,7 +271,7 @@ icon_state = "mecha_scatter" origin_tech = "combat=4" equip_cooldown = 20 - projectile = /obj/item/projectile/bullet/midbullet + projectile = /obj/item/projectile/bullet/scattershot projectiles = 40 projectile_energy_cost = 25 projectiles_per_shot = 4 @@ -283,7 +283,7 @@ icon_state = "mecha_uac2" origin_tech = "combat=4" equip_cooldown = 10 - projectile = /obj/item/projectile/bullet/weakbullet3 + projectile = /obj/item/projectile/bullet/lmg projectiles = 300 projectile_energy_cost = 20 projectiles_per_shot = 3 diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 79c4971665..8efc14d966 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -12,7 +12,6 @@ circuit = /obj/item/circuitboard/machine/mechfab var/time_coeff = 1 var/component_coeff = 1 - var/datum/material_container/materials var/datum/research/files var/sync = 0 var/part_set @@ -36,9 +35,11 @@ ) /obj/machinery/mecha_part_fabricator/Initialize() + AddComponent(/datum/component/material_container, + list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), + FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready)) + . = ..() files = new /datum/research(src) //Setup the research data holder. - materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE)) - return ..() /obj/machinery/mecha_part_fabricator/RefreshParts() var/T = 0 @@ -46,6 +47,7 @@ //maximum stocking amount (default 300000, 600000 at T4) for(var/obj/item/stock_parts/matter_bin/M in component_parts) T += M.rating + GET_COMPONENT(materials, /datum/component/material_container) materials.max_amount = (200000 + (T*50000)) //resources adjustment coefficient (1 -> 0.85 -> 0.7 -> 0.55) @@ -113,6 +115,7 @@ /obj/machinery/mecha_part_fabricator/proc/output_available_resources() var/output + GET_COMPONENT(materials, /datum/component/material_container) for(var/mat_id in materials.materials) var/datum/material/M = materials.materials[mat_id] output += "[M.name]: [M.amount] cm³" @@ -133,6 +136,7 @@ /obj/machinery/mecha_part_fabricator/proc/check_resources(datum/design/D) if(D.reagents_list.len) // No reagents storage - no reagent designs. return 0 + GET_COMPONENT(materials, /datum/component/material_container) if(materials.has_materials(get_resources_w_coeff(D))) return 1 return 0 @@ -142,6 +146,7 @@ desc = "It's building \a [initial(D.name)]." var/list/res_coef = get_resources_w_coeff(D) + GET_COMPONENT(materials, /datum/component/material_container) materials.use_amount(res_coef) add_overlay("fab-active") use_power = ACTIVE_POWER_USE @@ -398,15 +403,34 @@ break if(href_list["remove_mat"] && href_list["material"]) + GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_sheets(text2num(href_list["remove_mat"]), href_list["material"]) updateUsrDialog() return /obj/machinery/mecha_part_fabricator/on_deconstruction() + GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_all() ..() +/obj/machinery/mecha_part_fabricator/ComponentActivated(datum/component/C) + ..() + if(istype(C, /datum/component/material_container)) + var/datum/component/material_container/M = C + if(!M.last_insert_success) + return + var/lit = M.last_inserted_type + var/stack_name + if(ispath(lit, /obj/item/ore/bluespace_crystal)) + stack_name = "bluespace" + else + var/obj/item/stack/S = lit + stack_name = material2name(initial(S.materials)[1]) + add_overlay("fab-load-[stack_name]") + addtimer(CALLBACK(src, /atom/proc/cut_overlay, "fab-load-[stack_name]"), 10) + updateUsrDialog() + /obj/machinery/mecha_part_fabricator/attackby(obj/item/W, mob/user, params) if(default_deconstruction_screwdriver(user, "fab-o", "fab-idle", W)) return 1 @@ -417,55 +441,7 @@ if(default_deconstruction_crowbar(W)) return 1 - if(istype(W, /obj/item/stack/sheet)) - - if(!is_insertion_ready(user)) - return 1 - - var/material_amount = materials.get_item_material_amount(W) - - if(!try_insert(user, W, material_amount)) - return 1 - - var/inserted = materials.insert_item(W) - if(inserted) - to_chat(user, "You insert [inserted] sheet\s into [src].") - if(W && W.materials.len) - if(!QDELETED(W)) - user.put_in_active_hand(W) - var/mat_overlay = "fab-load-[material2name(W.materials[1])]" - add_overlay(mat_overlay) - sleep(10) - if(!QDELETED(src)) - cut_overlay(mat_overlay) //No matter what the overlay shall still be deleted - - updateUsrDialog() - - else if(istype(W, /obj/item/ore/bluespace_crystal)) - - if(!is_insertion_ready(user)) - return 1 - - var/material_amount = materials.get_item_material_amount(W) - - if(!try_insert(user, W, material_amount)) - return 1 - - var/inserted = materials.insert_item(W) - if(inserted) - to_chat(user, "You add [W] to the [src].") - if(W && W.materials.len) - qdel(W) - var/mat_overlay = "fab-load-bluespace" - add_overlay(mat_overlay) - sleep(10) - if(!QDELETED(src)) - cut_overlay(mat_overlay) - - updateUsrDialog() - - else - return ..() + return ..() /obj/machinery/mecha_part_fabricator/proc/material2name(ID) return copytext(ID,2) @@ -479,17 +455,3 @@ return FALSE return TRUE - - -/obj/machinery/mecha_part_fabricator/proc/try_insert(mob/user, obj/item/I, material_amount) - if(!material_amount) - to_chat(user, "This object does not contain sufficient amounts of materials to be accepted by [src].") - return FALSE - if(!materials.has_space(material_amount)) - to_chat(user, "\The [src] is full. Please remove some materials from [src] in order to insert more.") - return FALSE - if(!user.temporarilyRemoveItemFromInventory(I)) - to_chat(user, "\The [I] is stuck to you and cannot be placed into [src].") - return FALSE - - return TRUE \ No newline at end of file diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index fd52a75c18..ed2a1ff82a 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -289,7 +289,7 @@ if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank if(internal_tank) var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) + var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.1) if(loc) loc.assume_air(leaked_gas) air_update_turf() @@ -766,7 +766,7 @@ . = t_air.return_pressure() return -/obj/mecha/proc/return_temperature() +/obj/mecha/return_temperature() var/datum/gas_mixture/t_air = return_air() if(t_air) . = t_air.return_temperature() diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 863e3f32cc..674854c22e 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -1,404 +1,404 @@ -///////////////////////// -////// Mecha Parts ////// -///////////////////////// - -/obj/item/mecha_parts - name = "mecha part" - icon = 'icons/mecha/mech_construct.dmi' - icon_state = "blank" - w_class = WEIGHT_CLASS_GIGANTIC +///////////////////////// +////// Mecha Parts ////// +///////////////////////// + +/obj/item/mecha_parts + name = "mecha part" + icon = 'icons/mecha/mech_construct.dmi' + icon_state = "blank" + w_class = WEIGHT_CLASS_GIGANTIC flags_1 = CONDUCT_1 - origin_tech = "programming=2;materials=2;engineering=2" - -/obj/item/mecha_parts/chassis - name="Mecha Chassis" - icon_state = "backbone" - var/datum/construction/construct - -/obj/item/mecha_parts/chassis/attackby(obj/item/W, mob/user, params) - if(!construct || !construct.action(W, user)) - return ..() - -/obj/item/mecha_parts/chassis/attack_hand() - return - -/////////// Ripley - -/obj/item/mecha_parts/chassis/ripley - name = "\improper Ripley chassis" - -/obj/item/mecha_parts/chassis/ripley/New() - ..() - construct = new /datum/construction/mecha/ripley_chassis(src) - -/obj/item/mecha_parts/part/ripley_torso - name = "\improper Ripley torso" - desc = "A torso part of Ripley APLU. Contains power unit, processing core and life support systems." - icon_state = "ripley_harness" - origin_tech = "programming=2;materials=2;biotech=2;engineering=2" - -/obj/item/mecha_parts/part/ripley_left_arm - name = "\improper Ripley left arm" - desc = "A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools." - icon_state = "ripley_l_arm" - -/obj/item/mecha_parts/part/ripley_right_arm - name = "\improper Ripley right arm" - desc = "A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools." - icon_state = "ripley_r_arm" - -/obj/item/mecha_parts/part/ripley_left_leg - name = "\improper Ripley left leg" - desc = "A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems." - icon_state = "ripley_l_leg" - -/obj/item/mecha_parts/part/ripley_right_leg - name = "\improper Ripley right leg" - desc = "A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems." - icon_state = "ripley_r_leg" - -///////// Odysseus - -/obj/item/mecha_parts/chassis/odysseus - name = "\improper Odysseus chassis" - -/obj/item/mecha_parts/chassis/odysseus/New() - ..() - construct = new /datum/construction/mecha/odysseus_chassis(src) - -/obj/item/mecha_parts/part/odysseus_head - name = "\improper Odysseus head" - desc = "An Odysseus head. Contains an integrated medical HUD scanner." - icon_state = "odysseus_head" - -/obj/item/mecha_parts/part/odysseus_torso - name = "\improper Odysseus torso" - desc="A torso part of Odysseus. Contains power unit, processing core and life support systems along with an attachment port for a mounted sleeper." - icon_state = "odysseus_torso" - origin_tech = "programming=2;materials=2;biotech=2;engineering=2" - -/obj/item/mecha_parts/part/odysseus_left_arm - name = "\improper Odysseus left arm" - desc = "An Odysseus left arm. Data and power sockets are compatible with specialized medical equipment." - icon_state = "odysseus_l_arm" - -/obj/item/mecha_parts/part/odysseus_right_arm - name = "\improper Odysseus right arm" - desc = "An Odysseus right arm. Data and power sockets are compatible with specialized medical equipment." - icon_state = "odysseus_r_arm" - -/obj/item/mecha_parts/part/odysseus_left_leg - name = "\improper Odysseus left leg" - desc = "An Odysseus left leg. Contains complex servodrives and balance maintaining systems to maintain stability for critical patients." - icon_state = "odysseus_l_leg" - -/obj/item/mecha_parts/part/odysseus_right_leg - name = "\improper Odysseus right leg" - desc = "A Odysseus right leg. Contains complex servodrives and balance maintaining systems to maintain stability for critical patients." - icon_state = "odysseus_r_leg" - -///////// Gygax - -/obj/item/mecha_parts/chassis/gygax - name = "\improper Gygax chassis" - -/obj/item/mecha_parts/chassis/gygax/New() - ..() - construct = new /datum/construction/mecha/gygax_chassis(src) - -/obj/item/mecha_parts/part/gygax_torso - name = "\improper Gygax torso" - desc = "A torso part of Gygax. Contains power unit, processing core and life support systems." - icon_state = "gygax_harness" - origin_tech = "programming=2;materials=4;biotech=3;engineering=3" - -/obj/item/mecha_parts/part/gygax_head - name = "\improper Gygax head" - desc = "A Gygax head. Houses advanced surveillance and targeting sensors." - icon_state = "gygax_head" - origin_tech = "programming=2;materials=4;magnets=3;engineering=3" - -/obj/item/mecha_parts/part/gygax_left_arm - name = "\improper Gygax left arm" - desc = "A Gygax left arm. Data and power sockets are compatible with most exosuit tools and weapons." - icon_state = "gygax_l_arm" - origin_tech = "programming=2;materials=4;engineering=3" - -/obj/item/mecha_parts/part/gygax_right_arm - name = "\improper Gygax right arm" - desc = "A Gygax right arm. Data and power sockets are compatible with most exosuit tools and weapons." - icon_state = "gygax_r_arm" - origin_tech = "programming=2;materials=4;engineering=3" - -/obj/item/mecha_parts/part/gygax_left_leg - name = "\improper Gygax left leg" - desc = "A Gygax left leg. Constructed with advanced servomechanisms and actuators to enable faster speed." - icon_state = "gygax_l_leg" - origin_tech = "programming=2;materials=4;engineering=3" - -/obj/item/mecha_parts/part/gygax_right_leg - name = "\improper Gygax right leg" - desc = "A Gygax right leg. Constructed with advanced servomechanisms and actuators to enable faster speed." - icon_state = "gygax_r_leg" - origin_tech = "programming=2;materials=4;engineering=3" - -/obj/item/mecha_parts/part/gygax_armor - gender = PLURAL - name = "\improper Gygax armor plates" - desc = "A set of armor plates designed for the Gygax. Designed to effectively deflect damage with a lightweight construction." - icon_state = "gygax_armor" - origin_tech = "materials=6;combat=4;engineering=4" - - -//////////// Durand - -/obj/item/mecha_parts/chassis/durand - name = "\improper Durand chassis" - -/obj/item/mecha_parts/chassis/durand/New() - ..() - construct = new /datum/construction/mecha/durand_chassis(src) - -/obj/item/mecha_parts/part/durand_torso - name = "\improper Durand torso" - desc = "A torso part of Durand. Contains power unit, processing core and life support systems within a robust protective frame." - icon_state = "durand_harness" - origin_tech = "programming=2;materials=3;biotech=3;engineering=3" - -/obj/item/mecha_parts/part/durand_head - name = "\improper Durand head" - desc = "A Durand head. Houses advanced surveillance and targeting sensors." - icon_state = "durand_head" - origin_tech = "programming=2;materials=3;magnets=3;engineering=3" - -/obj/item/mecha_parts/part/durand_left_arm - name = "\improper Durand left arm" - desc = "A Durand left arm. Data and power sockets are compatible with most exosuit tools and weapons. Packs a really mean punch as well." - icon_state = "durand_l_arm" - origin_tech = "programming=2;materials=3;engineering=3" - -/obj/item/mecha_parts/part/durand_right_arm - name = "\improper Durand right arm" - desc = "A Durand right arm. Data and power sockets are compatible with most exosuit tools and weapons. Packs a really mean punch as well." - icon_state = "durand_r_arm" - origin_tech = "programming=2;materials=3;engineering=3" - -/obj/item/mecha_parts/part/durand_left_leg - name = "\improper Durand left leg" - desc = "A Durand left leg. Built particlarly sturdy to support the Durand's heavy weight and defensive needs." - icon_state = "durand_l_leg" - origin_tech = "programming=2;materials=3;engineering=3" - -/obj/item/mecha_parts/part/durand_right_leg - name = "\improper Durand right leg" - desc = "A Durand right leg. Built particlarly sturdy to support the Durand's heavy weight and defensive needs." - icon_state = "durand_r_leg" - origin_tech = "programming=2;materials=3;engineering=3" - -/obj/item/mecha_parts/part/durand_armor - gender = PLURAL - name = "\improper Durand armor plates" - desc = "A set of armor plates for the Durand. Built heavy to resist an incredible amount of brute force." - icon_state = "durand_armor" - origin_tech = "materials=5;combat=4;engineering=4" - -////////// Firefighter - -/obj/item/mecha_parts/chassis/firefighter - name = "Firefighter chassis" - -/obj/item/mecha_parts/chassis/firefighter/New() - ..() - construct = new /datum/construction/mecha/firefighter_chassis(src) - - -////////// HONK - -/obj/item/mecha_parts/chassis/honker - name = "\improper H.O.N.K chassis" - -/obj/item/mecha_parts/chassis/honker/New() - ..() - construct = new /datum/construction/mecha/honker_chassis(src) - -/obj/item/mecha_parts/part/honker_torso - name = "\improper H.O.N.K torso" - desc = "A torso part of H.O.N.K. Contains chuckle unit, bananium core and honk support systems." - icon_state = "honker_harness" - -/obj/item/mecha_parts/part/honker_head - name = "\improper H.O.N.K head" - desc = "A H.O.N.K head. Appears to lack a face plate." - icon_state = "honker_head" - -/obj/item/mecha_parts/part/honker_left_arm - name = "\improper H.O.N.K left arm" - desc = "A H.O.N.K left arm. With unique sockets that accept odd weaponry designed by clown scientists." - icon_state = "honker_l_arm" - -/obj/item/mecha_parts/part/honker_right_arm - name = "\improper H.O.N.K right arm" - desc = "A H.O.N.K right arm. With unique sockets that accept odd weaponry designed by clown scientists." - icon_state = "honker_r_arm" - -/obj/item/mecha_parts/part/honker_left_leg - name = "\improper H.O.N.K left leg" - desc = "A H.O.N.K left leg. The foot appears just large enough to fully accommodate a clown shoe." - icon_state = "honker_l_leg" - -/obj/item/mecha_parts/part/honker_right_leg - name = "\improper H.O.N.K right leg" - desc = "A H.O.N.K right leg. The foot appears just large enough to fully accommodate a clown shoe." - icon_state = "honker_r_leg" - - -////////// Phazon - -/obj/item/mecha_parts/chassis/phazon - name = "\improper Phazon chassis" - -/obj/item/mecha_parts/chassis/phazon/New() - ..() - construct = new /datum/construction/mecha/phazon_chassis(src) - -/obj/item/mecha_parts/part/phazon_torso - name="\improper Phazon torso" - desc="A Phazon torso part. The socket for the bluespace core that powers the exosuit's unique phase drives is located in the middle." - icon_state = "phazon_harness" - origin_tech = "programming=4;materials=4;bluespace=4;plasmatech=5" - -/obj/item/mecha_parts/part/phazon_head - name="\improper Phazon head" - desc="A Phazon head. Its sensors are carefully calibrated to provide vision and data even when the exosuit is phasing." - icon_state = "phazon_head" - origin_tech = "programming=3;materials=3;magnets=3" - -/obj/item/mecha_parts/part/phazon_left_arm - name="\improper Phazon left arm" - desc="A Phazon left arm. Several microtool arrays are located under the armor plating, which can be adjusted to the situation at hand." - icon_state = "phazon_l_arm" - origin_tech = "materials=3;bluespace=3;magnets=3" - -/obj/item/mecha_parts/part/phazon_right_arm - name="\improper Phazon right arm" - desc="A Phazon right arm. Several microtool arrays are located under the armor plating, which can be adjusted to the situation at hand." - icon_state = "phazon_r_arm" - origin_tech = "materials=3;bluespace=3;magnets=3" - -/obj/item/mecha_parts/part/phazon_left_leg - name="\improper Phazon left leg" - desc="A Phazon left leg. It contains the unique phase drives that allow the exosuit to phase through solid matter when engaged." - icon_state = "phazon_l_leg" - origin_tech = "materials=3;bluespace=3;magnets=3" - -/obj/item/mecha_parts/part/phazon_right_leg - name="\improper Phazon right leg" - desc="A Phazon right leg. It contains the unique phase drives that allow the exosuit to phase through solid matter when engaged." - icon_state = "phazon_r_leg" - origin_tech = "materials=3;bluespace=3;magnets=3" - -/obj/item/mecha_parts/part/phazon_armor - name="Phazon armor" - desc="Phazon armor plates. They are layered with plasma to protect the pilot from the stress of phasing and have unusual properties." - icon_state = "phazon_armor" - origin_tech = "materials=4;bluespace=4;plasmatech=5" - - -///////// Circuitboards - -/obj/item/circuitboard/mecha - name = "exosuit circuit board" - icon = 'icons/obj/module.dmi' - icon_state = "std_mod" - item_state = "electronic" + origin_tech = "programming=2;materials=2;engineering=2" + +/obj/item/mecha_parts/chassis + name="Mecha Chassis" + icon_state = "backbone" + var/datum/construction/construct + +/obj/item/mecha_parts/chassis/attackby(obj/item/W, mob/user, params) + if(!construct || !construct.action(W, user)) + return ..() + +/obj/item/mecha_parts/chassis/attack_hand() + return + +/////////// Ripley + +/obj/item/mecha_parts/chassis/ripley + name = "\improper Ripley chassis" + +/obj/item/mecha_parts/chassis/ripley/New() + ..() + construct = new /datum/construction/mecha/ripley_chassis(src) + +/obj/item/mecha_parts/part/ripley_torso + name = "\improper Ripley torso" + desc = "A torso part of Ripley APLU. Contains power unit, processing core and life support systems." + icon_state = "ripley_harness" + origin_tech = "programming=2;materials=2;biotech=2;engineering=2" + +/obj/item/mecha_parts/part/ripley_left_arm + name = "\improper Ripley left arm" + desc = "A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools." + icon_state = "ripley_l_arm" + +/obj/item/mecha_parts/part/ripley_right_arm + name = "\improper Ripley right arm" + desc = "A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools." + icon_state = "ripley_r_arm" + +/obj/item/mecha_parts/part/ripley_left_leg + name = "\improper Ripley left leg" + desc = "A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems." + icon_state = "ripley_l_leg" + +/obj/item/mecha_parts/part/ripley_right_leg + name = "\improper Ripley right leg" + desc = "A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems." + icon_state = "ripley_r_leg" + +///////// Odysseus + +/obj/item/mecha_parts/chassis/odysseus + name = "\improper Odysseus chassis" + +/obj/item/mecha_parts/chassis/odysseus/New() + ..() + construct = new /datum/construction/mecha/odysseus_chassis(src) + +/obj/item/mecha_parts/part/odysseus_head + name = "\improper Odysseus head" + desc = "An Odysseus head. Contains an integrated medical HUD scanner." + icon_state = "odysseus_head" + +/obj/item/mecha_parts/part/odysseus_torso + name = "\improper Odysseus torso" + desc="A torso part of Odysseus. Contains power unit, processing core and life support systems along with an attachment port for a mounted sleeper." + icon_state = "odysseus_torso" + origin_tech = "programming=2;materials=2;biotech=2;engineering=2" + +/obj/item/mecha_parts/part/odysseus_left_arm + name = "\improper Odysseus left arm" + desc = "An Odysseus left arm. Data and power sockets are compatible with specialized medical equipment." + icon_state = "odysseus_l_arm" + +/obj/item/mecha_parts/part/odysseus_right_arm + name = "\improper Odysseus right arm" + desc = "An Odysseus right arm. Data and power sockets are compatible with specialized medical equipment." + icon_state = "odysseus_r_arm" + +/obj/item/mecha_parts/part/odysseus_left_leg + name = "\improper Odysseus left leg" + desc = "An Odysseus left leg. Contains complex servodrives and balance maintaining systems to maintain stability for critical patients." + icon_state = "odysseus_l_leg" + +/obj/item/mecha_parts/part/odysseus_right_leg + name = "\improper Odysseus right leg" + desc = "An odysseus right leg. Contains complex servodrives and balance maintaining systems to maintain stability for critical patients." + icon_state = "odysseus_r_leg" + +///////// Gygax + +/obj/item/mecha_parts/chassis/gygax + name = "\improper Gygax chassis" + +/obj/item/mecha_parts/chassis/gygax/New() + ..() + construct = new /datum/construction/mecha/gygax_chassis(src) + +/obj/item/mecha_parts/part/gygax_torso + name = "\improper Gygax torso" + desc = "A torso part of Gygax. Contains power unit, processing core and life support systems." + icon_state = "gygax_harness" + origin_tech = "programming=2;materials=4;biotech=3;engineering=3" + +/obj/item/mecha_parts/part/gygax_head + name = "\improper Gygax head" + desc = "A Gygax head. Houses advanced surveillance and targeting sensors." + icon_state = "gygax_head" + origin_tech = "programming=2;materials=4;magnets=3;engineering=3" + +/obj/item/mecha_parts/part/gygax_left_arm + name = "\improper Gygax left arm" + desc = "A Gygax left arm. Data and power sockets are compatible with most exosuit tools and weapons." + icon_state = "gygax_l_arm" + origin_tech = "programming=2;materials=4;engineering=3" + +/obj/item/mecha_parts/part/gygax_right_arm + name = "\improper Gygax right arm" + desc = "A Gygax right arm. Data and power sockets are compatible with most exosuit tools and weapons." + icon_state = "gygax_r_arm" + origin_tech = "programming=2;materials=4;engineering=3" + +/obj/item/mecha_parts/part/gygax_left_leg + name = "\improper Gygax left leg" + desc = "A Gygax left leg. Constructed with advanced servomechanisms and actuators to enable faster speed." + icon_state = "gygax_l_leg" + origin_tech = "programming=2;materials=4;engineering=3" + +/obj/item/mecha_parts/part/gygax_right_leg + name = "\improper Gygax right leg" + desc = "A Gygax right leg. Constructed with advanced servomechanisms and actuators to enable faster speed." + icon_state = "gygax_r_leg" + origin_tech = "programming=2;materials=4;engineering=3" + +/obj/item/mecha_parts/part/gygax_armor + gender = PLURAL + name = "\improper Gygax armor plates" + desc = "A set of armor plates designed for the Gygax. Designed to effectively deflect damage with a lightweight construction." + icon_state = "gygax_armor" + origin_tech = "materials=6;combat=4;engineering=4" + + +//////////// Durand + +/obj/item/mecha_parts/chassis/durand + name = "\improper Durand chassis" + +/obj/item/mecha_parts/chassis/durand/New() + ..() + construct = new /datum/construction/mecha/durand_chassis(src) + +/obj/item/mecha_parts/part/durand_torso + name = "\improper Durand torso" + desc = "A torso part of Durand. Contains power unit, processing core and life support systems within a robust protective frame." + icon_state = "durand_harness" + origin_tech = "programming=2;materials=3;biotech=3;engineering=3" + +/obj/item/mecha_parts/part/durand_head + name = "\improper Durand head" + desc = "A Durand head. Houses advanced surveillance and targeting sensors." + icon_state = "durand_head" + origin_tech = "programming=2;materials=3;magnets=3;engineering=3" + +/obj/item/mecha_parts/part/durand_left_arm + name = "\improper Durand left arm" + desc = "A Durand left arm. Data and power sockets are compatible with most exosuit tools and weapons. Packs a really mean punch as well." + icon_state = "durand_l_arm" + origin_tech = "programming=2;materials=3;engineering=3" + +/obj/item/mecha_parts/part/durand_right_arm + name = "\improper Durand right arm" + desc = "A Durand right arm. Data and power sockets are compatible with most exosuit tools and weapons. Packs a really mean punch as well." + icon_state = "durand_r_arm" + origin_tech = "programming=2;materials=3;engineering=3" + +/obj/item/mecha_parts/part/durand_left_leg + name = "\improper Durand left leg" + desc = "A Durand left leg. Built particlarly sturdy to support the Durand's heavy weight and defensive needs." + icon_state = "durand_l_leg" + origin_tech = "programming=2;materials=3;engineering=3" + +/obj/item/mecha_parts/part/durand_right_leg + name = "\improper Durand right leg" + desc = "A Durand right leg. Built particlarly sturdy to support the Durand's heavy weight and defensive needs." + icon_state = "durand_r_leg" + origin_tech = "programming=2;materials=3;engineering=3" + +/obj/item/mecha_parts/part/durand_armor + gender = PLURAL + name = "\improper Durand armor plates" + desc = "A set of armor plates for the Durand. Built heavy to resist an incredible amount of brute force." + icon_state = "durand_armor" + origin_tech = "materials=5;combat=4;engineering=4" + +////////// Firefighter + +/obj/item/mecha_parts/chassis/firefighter + name = "Firefighter chassis" + +/obj/item/mecha_parts/chassis/firefighter/New() + ..() + construct = new /datum/construction/mecha/firefighter_chassis(src) + + +////////// HONK + +/obj/item/mecha_parts/chassis/honker + name = "\improper H.O.N.K chassis" + +/obj/item/mecha_parts/chassis/honker/New() + ..() + construct = new /datum/construction/mecha/honker_chassis(src) + +/obj/item/mecha_parts/part/honker_torso + name = "\improper H.O.N.K torso" + desc = "A torso part of H.O.N.K. Contains chuckle unit, bananium core and honk support systems." + icon_state = "honker_harness" + +/obj/item/mecha_parts/part/honker_head + name = "\improper H.O.N.K head" + desc = "A H.O.N.K head. Appears to lack a face plate." + icon_state = "honker_head" + +/obj/item/mecha_parts/part/honker_left_arm + name = "\improper H.O.N.K left arm" + desc = "A H.O.N.K left arm. With unique sockets that accept odd weaponry designed by clown scientists." + icon_state = "honker_l_arm" + +/obj/item/mecha_parts/part/honker_right_arm + name = "\improper H.O.N.K right arm" + desc = "A H.O.N.K right arm. With unique sockets that accept odd weaponry designed by clown scientists." + icon_state = "honker_r_arm" + +/obj/item/mecha_parts/part/honker_left_leg + name = "\improper H.O.N.K left leg" + desc = "A H.O.N.K left leg. The foot appears just large enough to fully accommodate a clown shoe." + icon_state = "honker_l_leg" + +/obj/item/mecha_parts/part/honker_right_leg + name = "\improper H.O.N.K right leg" + desc = "A H.O.N.K right leg. The foot appears just large enough to fully accommodate a clown shoe." + icon_state = "honker_r_leg" + + +////////// Phazon + +/obj/item/mecha_parts/chassis/phazon + name = "\improper Phazon chassis" + +/obj/item/mecha_parts/chassis/phazon/New() + ..() + construct = new /datum/construction/mecha/phazon_chassis(src) + +/obj/item/mecha_parts/part/phazon_torso + name="\improper Phazon torso" + desc="A Phazon torso part. The socket for the bluespace core that powers the exosuit's unique phase drives is located in the middle." + icon_state = "phazon_harness" + origin_tech = "programming=4;materials=4;bluespace=4;plasmatech=5" + +/obj/item/mecha_parts/part/phazon_head + name="\improper Phazon head" + desc="A Phazon head. Its sensors are carefully calibrated to provide vision and data even when the exosuit is phasing." + icon_state = "phazon_head" + origin_tech = "programming=3;materials=3;magnets=3" + +/obj/item/mecha_parts/part/phazon_left_arm + name="\improper Phazon left arm" + desc="A Phazon left arm. Several microtool arrays are located under the armor plating, which can be adjusted to the situation at hand." + icon_state = "phazon_l_arm" + origin_tech = "materials=3;bluespace=3;magnets=3" + +/obj/item/mecha_parts/part/phazon_right_arm + name="\improper Phazon right arm" + desc="A Phazon right arm. Several microtool arrays are located under the armor plating, which can be adjusted to the situation at hand." + icon_state = "phazon_r_arm" + origin_tech = "materials=3;bluespace=3;magnets=3" + +/obj/item/mecha_parts/part/phazon_left_leg + name="\improper Phazon left leg" + desc="A Phazon left leg. It contains the unique phase drives that allow the exosuit to phase through solid matter when engaged." + icon_state = "phazon_l_leg" + origin_tech = "materials=3;bluespace=3;magnets=3" + +/obj/item/mecha_parts/part/phazon_right_leg + name="\improper Phazon right leg" + desc="A Phazon right leg. It contains the unique phase drives that allow the exosuit to phase through solid matter when engaged." + icon_state = "phazon_r_leg" + origin_tech = "materials=3;bluespace=3;magnets=3" + +/obj/item/mecha_parts/part/phazon_armor + name="Phazon armor" + desc="Phazon armor plates. They are layered with plasma to protect the pilot from the stress of phasing and have unusual properties." + icon_state = "phazon_armor" + origin_tech = "materials=4;bluespace=4;plasmatech=5" + + +///////// Circuitboards + +/obj/item/circuitboard/mecha + name = "exosuit circuit board" + icon = 'icons/obj/module.dmi' + icon_state = "std_mod" + item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' flags_1 = CONDUCT_1 - force = 5 - w_class = WEIGHT_CLASS_SMALL - throwforce = 0 - throw_speed = 3 - throw_range = 7 - -/obj/item/circuitboard/mecha/ripley - origin_tech = "programming=2" - -/obj/item/circuitboard/mecha/ripley/peripherals - name = "Ripley Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/ripley/main - name = "Ripley Central Control module (Exosuit Board)" - icon_state = "mainboard" - -/obj/item/circuitboard/mecha/gygax - origin_tech = "programming=4;combat=3;engineering=3" - -/obj/item/circuitboard/mecha/gygax/peripherals - name = "Gygax Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/gygax/targeting - name = "Gygax Weapon Control and Targeting module (Exosuit Board)" - icon_state = "mcontroller" - origin_tech = "programming=4;combat=4" - -/obj/item/circuitboard/mecha/gygax/main - name = "Gygax Central Control module (Exosuit Board)" - icon_state = "mainboard" - -/obj/item/circuitboard/mecha/durand - origin_tech = "programming=4;combat=3;engineering=3" - -/obj/item/circuitboard/mecha/durand/peripherals - name = "Durand Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/durand/targeting - name = "Durand Weapon Control and Targeting module (Exosuit Board)" - icon_state = "mcontroller" - origin_tech = "programming=4;combat=4;engineering=3" - -/obj/item/circuitboard/mecha/durand/main - name = "Durand Central Control module (Exosuit Board)" - icon_state = "mainboard" - -/obj/item/circuitboard/mecha/honker - origin_tech = "programming=3;engineering=3" - -/obj/item/circuitboard/mecha/honker/peripherals - name = "H.O.N.K Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/honker/targeting - name = "H.O.N.K Weapon Control and Targeting module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/honker/main - name = "H.O.N.K Central Control module (Exosuit Board)" - icon_state = "mainboard" - -/obj/item/circuitboard/mecha/odysseus - origin_tech = "programming=3;biotech=3" - -/obj/item/circuitboard/mecha/odysseus/peripherals - name = "Odysseus Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/odysseus/main - name = "Odysseus Central Control module (Exosuit Board)" - icon_state = "mainboard" - -/obj/item/circuitboard/mecha/phazon - origin_tech = "programming=5;plasmatech=4" - -/obj/item/circuitboard/mecha/phazon/peripherals - name = "Phazon Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/phazon/targeting - name = "Phazon Weapon Control and Targeting module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/phazon/main - name = "Phazon Central Control module (Exosuit Board)" + force = 5 + w_class = WEIGHT_CLASS_SMALL + throwforce = 0 + throw_speed = 3 + throw_range = 7 + +/obj/item/circuitboard/mecha/ripley + origin_tech = "programming=2" + +/obj/item/circuitboard/mecha/ripley/peripherals + name = "Ripley Peripherals Control module (Exosuit Board)" + icon_state = "mcontroller" + +/obj/item/circuitboard/mecha/ripley/main + name = "Ripley Central Control module (Exosuit Board)" + icon_state = "mainboard" + +/obj/item/circuitboard/mecha/gygax + origin_tech = "programming=4;combat=3;engineering=3" + +/obj/item/circuitboard/mecha/gygax/peripherals + name = "Gygax Peripherals Control module (Exosuit Board)" + icon_state = "mcontroller" + +/obj/item/circuitboard/mecha/gygax/targeting + name = "Gygax Weapon Control and Targeting module (Exosuit Board)" + icon_state = "mcontroller" + origin_tech = "programming=4;combat=4" + +/obj/item/circuitboard/mecha/gygax/main + name = "Gygax Central Control module (Exosuit Board)" + icon_state = "mainboard" + +/obj/item/circuitboard/mecha/durand + origin_tech = "programming=4;combat=3;engineering=3" + +/obj/item/circuitboard/mecha/durand/peripherals + name = "Durand Peripherals Control module (Exosuit Board)" + icon_state = "mcontroller" + +/obj/item/circuitboard/mecha/durand/targeting + name = "Durand Weapon Control and Targeting module (Exosuit Board)" + icon_state = "mcontroller" + origin_tech = "programming=4;combat=4;engineering=3" + +/obj/item/circuitboard/mecha/durand/main + name = "Durand Central Control module (Exosuit Board)" + icon_state = "mainboard" + +/obj/item/circuitboard/mecha/honker + origin_tech = "programming=3;engineering=3" + +/obj/item/circuitboard/mecha/honker/peripherals + name = "H.O.N.K Peripherals Control module (Exosuit Board)" + icon_state = "mcontroller" + +/obj/item/circuitboard/mecha/honker/targeting + name = "H.O.N.K Weapon Control and Targeting module (Exosuit Board)" + icon_state = "mcontroller" + +/obj/item/circuitboard/mecha/honker/main + name = "H.O.N.K Central Control module (Exosuit Board)" + icon_state = "mainboard" + +/obj/item/circuitboard/mecha/odysseus + origin_tech = "programming=3;biotech=3" + +/obj/item/circuitboard/mecha/odysseus/peripherals + name = "Odysseus Peripherals Control module (Exosuit Board)" + icon_state = "mcontroller" + +/obj/item/circuitboard/mecha/odysseus/main + name = "Odysseus Central Control module (Exosuit Board)" + icon_state = "mainboard" + +/obj/item/circuitboard/mecha/phazon + origin_tech = "programming=5;plasmatech=4" + +/obj/item/circuitboard/mecha/phazon/peripherals + name = "Phazon Peripherals Control module (Exosuit Board)" + icon_state = "mcontroller" + +/obj/item/circuitboard/mecha/phazon/targeting + name = "Phazon Weapon Control and Targeting module (Exosuit Board)" + icon_state = "mcontroller" + +/obj/item/circuitboard/mecha/phazon/main + name = "Phazon Central Control module (Exosuit Board)" diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index f09ae53e31..3f32b18178 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -283,13 +283,13 @@ var/area/A = get_area(location) var/where = "[A.name] | [location.x], [location.y]" - var/whereLink = "[where]" + var/whereLink = "[where]" if(carry.my_atom.fingerprintslast) var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) var/more = "" if(M) - more = "(?) (FLW) " + more = "(?) (FLW) " message_admins("Smoke: ([whereLink])[contained]. Key: [carry.my_atom.fingerprintslast][more].", 0, 1) log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].") else diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index e0cec3af02..7401797a47 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -160,7 +160,7 @@ /obj/effect/landmark/start/wizard/Initialize(mapload) ..() GLOB.wizardstart += loc - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/landmark/start/new_player name = "New Player" @@ -173,7 +173,7 @@ /obj/effect/landmark/start/new_player/Initialize(mapload) ..() - qdel(src) + return INITIALIZE_HINT_QDEL @@ -183,7 +183,7 @@ /obj/effect/landmark/latejoin/Initialize(mapload) ..() SSjob.latejoin_trackers += loc - qdel(src) + return INITIALIZE_HINT_QDEL // carp. /obj/effect/landmark/carpspawn @@ -229,7 +229,7 @@ /obj/effect/landmark/xeno_spawn/Initialize(mapload) ..() GLOB.xeno_spawn += loc - qdel(src) + return INITIALIZE_HINT_QDEL // blobs. /obj/effect/landmark/blobstart @@ -238,7 +238,7 @@ /obj/effect/landmark/blobstart/Initialize(mapload) ..() GLOB.blobstart += loc - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/landmark/secequipment name = "secequipment" @@ -246,7 +246,7 @@ /obj/effect/landmark/secequipment/Initialize(mapload) ..() GLOB.secequipment += loc - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/landmark/prisonwarp name = "prisonwarp" @@ -254,15 +254,15 @@ /obj/effect/landmark/prisonwarp/Initialize(mapload) ..() GLOB.prisonwarp += loc - qdel(src) - + return INITIALIZE_HINT_QDEL + /obj/effect/landmark/ert_spawn name = "Emergencyresponseteam" /obj/effect/landmark/ert_spawn/Initialize(mapload) ..() GLOB.emergencyresponseteamspawn += loc - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/landmark/holding_facility name = "Holding Facility" @@ -270,7 +270,7 @@ /obj/effect/landmark/holding_facility/Initialize(mapload) ..() GLOB.holdingfacility += loc - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/landmark/thunderdome/observe name = "tdomeobserve" @@ -278,7 +278,7 @@ /obj/effect/landmark/thunderdome/observe/Initialize(mapload) ..() GLOB.tdomeobserve += loc - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/landmark/thunderdome/one name = "tdome1" @@ -286,7 +286,7 @@ /obj/effect/landmark/thunderdome/one/Initialize(mapload) ..() GLOB.tdome1 += loc - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/landmark/thunderdome/two name = "tdome2" @@ -294,7 +294,7 @@ /obj/effect/landmark/thunderdome/two/Initialize(mapload) ..() GLOB.tdome2 += loc - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/landmark/thunderdome/admin name = "tdomeadmin" @@ -302,7 +302,7 @@ /obj/effect/landmark/thunderdome/admin/Initialize(mapload) ..() GLOB.tdomeadmin += loc - qdel(src) + return INITIALIZE_HINT_QDEL //generic event spawns /obj/effect/landmark/event_spawn @@ -330,4 +330,4 @@ /obj/effect/landmark/ruin/Destroy() GLOB.ruin_landmarks -= src ruin_template = null - . = ..() + . = ..() \ No newline at end of file diff --git a/code/game/objects/effects/spawners/bundle.dm b/code/game/objects/effects/spawners/bundle.dm index cfe8761b84..be32f0df19 100644 --- a/code/game/objects/effects/spawners/bundle.dm +++ b/code/game/objects/effects/spawners/bundle.dm @@ -12,7 +12,7 @@ var/turf/T = get_turf(src) for(var/path in items) new path(T) - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/spawner/bundle/costume/chicken name = "chicken costume spawner" diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 94cabaf6e1..2bfce20ccd 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -18,7 +18,7 @@ if(lootspawn) new lootspawn(T) lootcount-- - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/spawner/lootdrop/armory_contraband name = "armory contraband gun spawner" @@ -89,7 +89,7 @@ /obj/effect/spawner/lootdrop/maintenance/Initialize(mapload) loot = GLOB.maintenance_loot - ..() + . = ..() /obj/effect/spawner/lootdrop/crate_spawner name = "lootcrate spawner" //USE PROMO CODE "SELLOUT" FOR 20% OFF! @@ -130,7 +130,7 @@ loot = list() for(var/path in subtypesof(/obj/effect/spawner/bundle/costume)) loot[path] = TRUE - ..() + . = ..() // Minor lootdrops follow @@ -162,4 +162,4 @@ name = "25% cyborg mask spawner" loot = list( /obj/item/clothing/mask/gas/cyborg = 25, - "" = 75) + "" = 75) \ No newline at end of file diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 94c301991c..285aeeaf8c 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -9,7 +9,7 @@ again. var/list/spawn_list /obj/effect/spawner/structure/Initialize() - ..() + . = ..() if(spawn_list && spawn_list.len) for(var/I in spawn_list) new I(get_turf(src)) @@ -22,145 +22,130 @@ again. icon = 'icons/obj/structures_spawners.dmi' icon_state = "window_spawner" name = "window spawner" - spawn_list = list(/obj/structure/grille, /obj/structure/window/fulltile) + spawn_list = list(/obj/structure/grille, /obj/structure/window/fulltile) + dir = SOUTH /obj/effect/spawner/structure/window/hollow name = "hollow window spawner" icon_state = "hwindow_spawner_full" - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) - -/obj/effect/spawner/structure/window/hollow/corner - icon_state = "hwindow_spawner_corner_se" - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/east) - -/obj/effect/spawner/structure/window/hollow/corner/northeast - icon_state = "hwindow_spawner_corner_ne" - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east) - -/obj/effect/spawner/structure/window/hollow/corner/northwest - icon_state = "hwindow_spawner_corner_nw" - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north, /obj/structure/window/spawner/west) - -/obj/effect/spawner/structure/window/hollow/corner/southwest - icon_state = "hwindow_spawner_corner_sw" - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/west) + spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) /obj/effect/spawner/structure/window/hollow/end - icon_state = "hwindow_spawner_end_s" - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) + icon_state = "hwindow_spawner_end" -/obj/effect/spawner/structure/window/hollow/end/north - icon_state = "hwindow_spawner_end_n" - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) - -/obj/effect/spawner/structure/window/hollow/end/east - icon_state = "hwindow_spawner_end_e" - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east) - -/obj/effect/spawner/structure/window/hollow/end/west - icon_state = "hwindow_spawner_end_w" - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north, /obj/structure/window/spawner/west) +/obj/effect/spawner/structure/window/hollow/end/Initialize() + switch(dir) + if(NORTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) + if(EAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east) + if(SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) + if(WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north, /obj/structure/window/spawner/west) + . = ..() /obj/effect/spawner/structure/window/hollow/middle - icon_state = "hwindow_spawner_ns" - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north) + icon_state = "hwindow_spawner_middle" -/obj/effect/spawner/structure/window/hollow/middle/vertical - icon_state = "hwindow_spawner_ew" - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) +/obj/effect/spawner/structure/window/hollow/middle/Initialize() + switch(dir) + if(NORTH,SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north) + if(EAST,WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) + . = ..() -/obj/effect/spawner/structure/window/hollow/one_side - icon_state = "hwindow_spawner_single_s" - spawn_list = list(/obj/structure/grille, /obj/structure/window) - -/obj/effect/spawner/structure/window/hollow/one_side/north - icon_state = "hwindow_spawner_single_n" - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north) - -/obj/effect/spawner/structure/window/hollow/one_side/east - icon_state = "hwindow_spawner_single_e" - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/east) - -/obj/effect/spawner/structure/window/hollow/one_side/west - icon_state = "hwindow_spawner_single_w" - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/west) +/obj/effect/spawner/structure/window/hollow/directional + icon_state = "hwindow_spawner_directional" +/obj/effect/spawner/structure/window/hollow/directional/Initialize() + switch(dir) + if(NORTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north) + if(NORTHEAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east) + if(EAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/east) + if(SOUTHEAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/east) + if(SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window) + if(SOUTHWEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/west) + if(WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/west) + if(NORTHWEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north, /obj/structure/window/spawner/west) + . = ..() //reinforced /obj/effect/spawner/structure/window/reinforced name = "reinforced window spawner" icon_state = "rwindow_spawner" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/fulltile) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/fulltile) /obj/effect/spawner/structure/window/hollow/reinforced name = "hollow reinforced window spawner" icon_state = "hrwindow_spawner_full" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) - -/obj/effect/spawner/structure/window/hollow/reinforced/corner - icon_state = "hrwindow_spawner_corner_se" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/east) - -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northeast - icon_state = "hrwindow_spawner_corner_ne" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east) - -/obj/effect/spawner/structure/window/hollow/reinforced/corner/northwest - icon_state = "hrwindow_spawner_corner_nw" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/west) - -/obj/effect/spawner/structure/window/hollow/reinforced/corner/southwest - icon_state = "hrwindow_spawner_corner_sw" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/west) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) /obj/effect/spawner/structure/window/hollow/reinforced/end - icon_state = "hrwindow_spawner_end_s" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) + icon_state = "hrwindow_spawner_end" -/obj/effect/spawner/structure/window/hollow/reinforced/end/north - icon_state = "hrwindow_spawner_end_n" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) - -/obj/effect/spawner/structure/window/hollow/reinforced/end/east - icon_state = "hrwindow_spawner_end_e" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east) - -/obj/effect/spawner/structure/window/hollow/reinforced/end/west - icon_state = "hrwindow_spawner_end_w" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/west) +/obj/effect/spawner/structure/window/hollow/reinforced/end/Initialize() + switch(dir) + if(NORTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) + if(EAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east) + if(SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) + if(WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/west) + . = ..() /obj/effect/spawner/structure/window/hollow/reinforced/middle - icon_state = "hrwindow_spawner_ns" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north) + icon_state = "hrwindow_spawner_middle" -/obj/effect/spawner/structure/window/hollow/reinforced/middle/vertical - icon_state = "hrwindow_spawner_ew" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) +/obj/effect/spawner/structure/window/hollow/reinforced/middle/Initialize() + switch(dir) + if(NORTH,SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north) + if(EAST,WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) + . = ..() -/obj/effect/spawner/structure/window/hollow/reinforced/one_side - icon_state = "hrwindow_spawner_single_s" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced) - -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/north - icon_state = "hrwindow_spawner_single_n" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north) - -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/east - icon_state = "hrwindow_spawner_single_e" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/east) - -/obj/effect/spawner/structure/window/hollow/reinforced/one_side/west - icon_state = "hrwindow_spawner_single_w" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/west) +/obj/effect/spawner/structure/window/hollow/reinforced/directional + icon_state = "hrwindow_spawner_directional" +/obj/effect/spawner/structure/window/hollow/reinforced/directional/Initialize() + switch(dir) + if(NORTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north) + if(NORTHEAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east) + if(EAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/east) + if(SOUTHEAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/east) + if(SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced) + if(SOUTHWEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/west) + if(WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/west) + if(NORTHWEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/west) + . = ..() //tinted /obj/effect/spawner/structure/window/reinforced/tinted name = "tinted reinforced window spawner" icon_state = "twindow_spawner" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/tinted/fulltile) + spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/tinted/fulltile) //shuttle window @@ -168,7 +153,7 @@ again. /obj/effect/spawner/structure/window/shuttle name = "reinforced tinted window spawner" icon_state = "swindow_spawner" - spawn_list = list(/obj/structure/grille, /obj/structure/window/shuttle) + spawn_list = list(/obj/structure/grille, /obj/structure/window/shuttle) //plasma windows @@ -176,134 +161,119 @@ again. /obj/effect/spawner/structure/window/plasma name = "plasma window spawner" icon_state = "pwindow_spawner" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/fulltile) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/fulltile) /obj/effect/spawner/structure/window/hollow/plasma name = "hollow plasma window spawner" icon_state = "phwindow_spawner_full" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) - -/obj/effect/spawner/structure/window/hollow/plasma/corner - icon_state = "phwindow_spawner_corner_se" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/east) - -/obj/effect/spawner/structure/window/hollow/plasma/corner/northeast - icon_state = "phwindow_spawner_corner_ne" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east) - -/obj/effect/spawner/structure/window/hollow/plasma/corner/northwest - icon_state = "phwindow_spawner_corner_nw" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/west) - -/obj/effect/spawner/structure/window/hollow/plasma/corner/southwest - icon_state = "phwindow_spawner_corner_sw" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/west) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) /obj/effect/spawner/structure/window/hollow/plasma/end - icon_state = "phwindow_spawner_end_s" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) + icon_state = "phwindow_spawner_end" -/obj/effect/spawner/structure/window/hollow/plasma/end/north - icon_state = "phwindow_spawner_end_n" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) - -/obj/effect/spawner/structure/window/hollow/plasma/end/east - icon_state = "phwindow_spawner_end_e" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east) - -/obj/effect/spawner/structure/window/hollow/plasma/end/west - icon_state = "phwindow_spawner_end_w" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/west) +/obj/effect/spawner/structure/window/hollow/plasma/end/Initialize() + switch(dir) + if(NORTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) + if(EAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east) + if(SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) + if(WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/west) + . = ..() /obj/effect/spawner/structure/window/hollow/plasma/middle - icon_state = "phwindow_spawner_ns" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north) + icon_state = "phwindow_spawner_middle" -/obj/effect/spawner/structure/window/hollow/plasma/middle/vertical - icon_state = "phwindow_spawner_ew" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) +/obj/effect/spawner/structure/window/hollow/plasma/middle/Initialize() + switch(dir) + if(NORTH,SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north) + if(EAST,WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) + . = ..() -/obj/effect/spawner/structure/window/hollow/plasma/one_side - icon_state = "phwindow_spawner_single_s" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma) - -/obj/effect/spawner/structure/window/hollow/plasma/one_side/north - icon_state = "phwindow_spawner_single_n" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north) - -/obj/effect/spawner/structure/window/hollow/plasma/one_side/east - icon_state = "phwindow_spawner_single_e" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/east) - -/obj/effect/spawner/structure/window/hollow/plasma/one_side/west - icon_state = "phwindow_spawner_single_w" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/west) +/obj/effect/spawner/structure/window/hollow/plasma/directional + icon_state = "phwindow_spawner_directional" +/obj/effect/spawner/structure/window/hollow/plasma/directional/Initialize() + switch(dir) + if(NORTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north) + if(NORTHEAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east) + if(EAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/east) + if(SOUTHEAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/east) + if(SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma) + if(SOUTHWEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/west) + if(WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/west) + if(NORTHWEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/west) + . = ..() //plasma reinforced /obj/effect/spawner/structure/window/plasma/reinforced name = "reinforced plasma window spawner" icon_state = "prwindow_spawner" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/fulltile) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/fulltile) /obj/effect/spawner/structure/window/hollow/plasma/reinforced - name = "hollow reinforced plasma window spawner" + name = "hollow plasma window spawner" icon_state = "phrwindow_spawner_full" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/east, /obj/structure/window/plasma/reinforced/spawner/west) - -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/corner - icon_state = "phrwindow_spawner_corner_se" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/east) - -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/corner/northeast - icon_state = "phrwindow_spawner_corner_ne" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/east) - -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/corner/northwest - icon_state = "phrwindow_spawner_corner_nw" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/west) - -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/corner/southwest - icon_state = "phrwindow_spawner_corner_sw" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/west) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/east, /obj/structure/window/plasma/reinforced/spawner/west) /obj/effect/spawner/structure/window/hollow/plasma/reinforced/end - icon_state = "phrwindow_spawner_end_s" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/east, /obj/structure/window/plasma/reinforced/spawner/west) + icon_state = "phrwindow_spawner_end" -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/end/north - icon_state = "phrwindow_spawner_end_n" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/east, /obj/structure/window/plasma/reinforced/spawner/west) - -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/end/east - icon_state = "phrwindow_spawner_end_e" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/east) - -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/end/west - icon_state = "phrwindow_spawner_end_w" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/west) +/obj/effect/spawner/structure/window/hollow/plasma/reinforced/end/Initialize() + switch(dir) + if(NORTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/east, /obj/structure/window/plasma/reinforced/spawner/west) + if(EAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/east) + if(SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/east, /obj/structure/window/plasma/reinforced/spawner/west) + if(WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/west) + . = ..() /obj/effect/spawner/structure/window/hollow/plasma/reinforced/middle - icon_state = "phrwindow_spawner_ns" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/north) + icon_state = "phrwindow_spawner_middle" -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/middle/vertical - icon_state = "phrwindow_spawner_ew" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/east, /obj/structure/window/plasma/reinforced/spawner/west) +/obj/effect/spawner/structure/window/hollow/plasma/reinforced/middle/Initialize() + switch(dir) + if(NORTH,SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/north) + if(EAST,WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/east, /obj/structure/window/plasma/reinforced/spawner/west) + . = ..() -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/one_side - icon_state = "phrwindow_spawner_single_s" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced) +/obj/effect/spawner/structure/window/hollow/plasma/reinforced/directional + icon_state = "phrwindow_spawner_directional" -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/one_side/north - icon_state = "phrwindow_spawner_single_n" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/north) - -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/one_side/east - icon_state = "phrwindow_spawner_single_e" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/east) - -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/one_side/west - icon_state = "phrwindow_spawner_single_w" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/west) +/obj/effect/spawner/structure/window/hollow/plasma/reinforced/directional/Initialize() + switch(dir) + if(NORTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/north) + if(NORTHEAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/east) + if(EAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/east) + if(SOUTHEAST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/east) + if(SOUTH) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced) + if(SOUTHWEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/west) + if(WEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/west) + if(NORTHWEST) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/west) + . = ..() diff --git a/code/game/objects/effects/spawners/xeno_egg_delivery.dm b/code/game/objects/effects/spawners/xeno_egg_delivery.dm index a452dae749..593c953adf 100644 --- a/code/game/objects/effects/spawners/xeno_egg_delivery.dm +++ b/code/game/objects/effects/spawners/xeno_egg_delivery.dm @@ -17,4 +17,4 @@ log_game("An alien egg has been delivered to [A] at [COORD(T)]") var/message = "Attention [station_name()], we have entrusted you with a research specimen in [A]. Remember to follow all safety precautions when dealing with the specimen." SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, CALLBACK(GLOBAL_PROC, /.proc/print_command_report, message), announcement_time)) - qdel(src) + return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 84c75270f9..7a0faed690 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -91,6 +91,10 @@ var/poison_per_bite = 5 var/list/faction = list("spiders") +/obj/structure/spider/spiderling/Destroy() + new/obj/item/reagent_containers/food/snacks/spiderling(get_turf(src)) + . = ..() + /obj/structure/spider/spiderling/Initialize() pixel_x = rand(6,-6) pixel_y = rand(6,-6) @@ -103,6 +107,15 @@ /obj/structure/spider/spiderling/nurse grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/nurse +/obj/structure/spider/spiderling/midwife + grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife + +/obj/structure/spider/spiderling/viper + grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper + +/obj/structure/spider/spiderling/tarantula + grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/tarantula + /obj/structure/spider/spiderling/Collide(atom/user) if(istype(user, /obj/structure/table)) src.loc = user.loc @@ -171,7 +184,10 @@ amount_grown += rand(0,2) if(amount_grown >= 100) if(!grow_as) - grow_as = pick(/mob/living/simple_animal/hostile/poison/giant_spider, /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /mob/living/simple_animal/hostile/poison/giant_spider/nurse) + if(prob(3)) + grow_as = pick(/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife) + else + grow_as = pick(/mob/living/simple_animal/hostile/poison/giant_spider, /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /mob/living/simple_animal/hostile/poison/giant_spider/nurse) var/mob/living/simple_animal/hostile/poison/giant_spider/S = new grow_as(src.loc) S.poison_per_bite = poison_per_bite S.poison_type = poison_type @@ -194,12 +210,12 @@ . = ..() /obj/structure/spider/cocoon/container_resist(mob/living/user) - var/breakout_time = 1 + var/breakout_time = 600 user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - to_chat(user, "You struggle against the tight bonds... (This will take about [breakout_time] minutes.)") + to_chat(user, "You struggle against the tight bonds... (This will take about [DisplayTimeText(breakout_time)].)") visible_message("You see something struggling and writhing in \the [src]!") - if(do_after(user,(breakout_time*60*10), target = src)) + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src) return qdel(src) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d8ed75737d..072896ac01 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -61,6 +61,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/equip_delay_other = 20 //In deciseconds, how long an item takes to put on another person var/strip_delay = 40 //In deciseconds, how long an item takes to remove from another person var/breakouttime = 0 + var/being_removed = FALSE var/list/materials var/origin_tech = null //Used by R&D to determine what research bonuses it grants. var/needs_permit = 0 //Used by security bots to determine if this item is safe for public use. @@ -218,9 +219,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/proc/speechModification(message) //For speech modification by mask slot items. return message -/obj/item/attack_self(mob/user) - interact(user) - /obj/item/interact(mob/user) add_fingerprint(user) if(hidden_uplink && hidden_uplink.active) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 4c4c537859..6e094a5bbb 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -31,7 +31,7 @@ obj/item/construction var/no_ammo_message = "The \'Low Ammo\' light on the device blinks yellow." /obj/item/construction/Initialize() - ..() + . = ..() desc = "A [src]. It currently holds [matter]/[max_matter] matter-units." spark_system = new /datum/effect_system/spark_spread spark_system.set_up(5, 0, src) @@ -144,7 +144,7 @@ obj/item/construction set category = "Object" set src in usr // What does this do? - var window_type_name + var/window_type_name if (window_type == /obj/structure/window/fulltile) window_type = /obj/structure/window/reinforced/fulltile @@ -240,11 +240,11 @@ obj/item/construction set category = "Object" set src in usr - var airlockcat = input(usr, "Select whether the airlock is solid or glass.") in list("Solid", "Glass") + var/airlockcat = input(usr, "Select whether the airlock is solid or glass.") in list("Solid", "Glass") switch(airlockcat) if("Solid") if(advanced_airlock_setting == 1) - var airlockpaint = input(usr, "Select the paintjob of the airlock.") in list("Default", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining", "Maintenance", "External", "High Security") + var/airlockpaint = input(usr, "Select the paintjob of the airlock.") in list("Default", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining", "Maintenance", "External", "High Security") switch(airlockpaint) if("Default") airlock_type = /obj/machinery/door/airlock @@ -275,7 +275,7 @@ obj/item/construction if("Glass") if(advanced_airlock_setting == 1) - var airlockpaint = input(usr, "Select the paintjob of the airlock.") in list("Default", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining") + var/airlockpaint = input(usr, "Select the paintjob of the airlock.") in list("Default", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining") switch(airlockpaint) if("Default") airlock_type = /obj/machinery/door/airlock/glass diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 4aa37253c4..15abe72a52 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -79,13 +79,14 @@ GLOBAL_LIST_INIT(disposalpipeID2State, list( //find these defines in code\game\machinery\pipe\consruction.dm GLOBAL_LIST_INIT(RPD_recipes, list( - "Regular Pipes" = list( + "Pipes" = list( "Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 1, PIPE_BENDABLE), //"Bent Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 5, PIPE_BENT), "Manifold" = new /datum/pipe_info(PIPE_MANIFOLD, 1, PIPE_TRINARY), "Manual Valve" = new /datum/pipe_info(PIPE_MVALVE, 1, PIPE_BINARY), "Digital Valve" = new /datum/pipe_info(PIPE_DVALVE, 1, PIPE_BINARY), "4-Way Manifold" = new /datum/pipe_info(PIPE_4WAYMANIFOLD, 1, PIPE_QUAD), + "Bluespace Pipe" = new /datum/pipe_info(PIPE_BLUESPACE, 1, PIPE_UNARY), ), "Devices"=list( "Connector" = new /datum/pipe_info(PIPE_CONNECTOR, 1, PIPE_UNARY), diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index f3e78dfac9..bfc8bc9da3 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -160,7 +160,7 @@ update_label("John Doe", "Clowny") var/anyone = FALSE //Can anyone forge the ID or just syndicate? /obj/item/card/id/syndicate/Initialize() - ..() + . = ..() var/datum/action/item_action/chameleon/change/chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/card/id chameleon_action.chameleon_name = "ID Card" @@ -180,14 +180,14 @@ update_label("John Doe", "Clowny") if(isliving(user) && user.mind) if(user.mind.special_role || anyone) if(alert(user, "Action", "Agent ID", "Show", "Forge") == "Forge") - var t = copytext(sanitize(input(user, "What name would you like to put on this card?", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name))as text | null),1,26) + var/t = copytext(sanitize(input(user, "What name would you like to put on this card?", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name))as text | null),1,26) if(!t || t == "Unknown" || t == "floor" || t == "wall" || t == "r-wall") //Same as mob/dead/new_player/prefrences.dm if (t) alert("Invalid name.") return registered_name = t - var u = copytext(sanitize(input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Assistant")as text | null),1,MAX_MESSAGE_LEN) + var/u = copytext(sanitize(input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Assistant")as text | null),1,MAX_MESSAGE_LEN) if(!u) registered_name = "" return @@ -220,7 +220,7 @@ update_label("John Doe", "Clowny") /obj/item/card/id/captains_spare/Initialize() var/datum/job/captain/J = new/datum/job/captain access = J.get_access() - ..() + . = ..() /obj/item/card/id/centcom name = "\improper CentCom ID" @@ -231,7 +231,7 @@ update_label("John Doe", "Clowny") /obj/item/card/id/centcom/Initialize() access = get_all_centcom_access() - ..() + . = ..() /obj/item/card/id/ert name = "\improper CentCom ID" @@ -242,7 +242,7 @@ update_label("John Doe", "Clowny") /obj/item/card/id/ert/Initialize() access = get_all_accesses()+get_ert_access("commander")-ACCESS_CHANGE_IDS - ..() + . = ..() /obj/item/card/id/ert/Security registered_name = "Security Response Officer" @@ -250,7 +250,7 @@ update_label("John Doe", "Clowny") /obj/item/card/id/ert/Security/Initialize() access = get_all_accesses()+get_ert_access("sec")-ACCESS_CHANGE_IDS - ..() + . = ..() /obj/item/card/id/ert/Engineer registered_name = "Engineer Response Officer" @@ -258,7 +258,7 @@ update_label("John Doe", "Clowny") /obj/item/card/id/ert/Engineer/Initialize() access = get_all_accesses()+get_ert_access("eng")-ACCESS_CHANGE_IDS - ..() + . = ..() /obj/item/card/id/ert/Medical registered_name = "Medical Response Officer" @@ -266,7 +266,7 @@ update_label("John Doe", "Clowny") /obj/item/card/id/ert/Medical/Initialize() access = get_all_accesses()+get_ert_access("med")-ACCESS_CHANGE_IDS - ..() + . = ..() /obj/item/card/id/prisoner name = "prisoner ID card" diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index d5134f729c..ee7a91140c 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -59,7 +59,7 @@ to_chat(user, "Your name has been sent to your employers for approval.") // Autoapproves after a certain time response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE) - to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [new_name] (will autoapprove in [approval_time / 10] seconds). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]") + to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [new_name] (will autoapprove in [DisplayTimeText(approval_time)]). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]") /obj/item/station_charter/proc/reject_proposed(user) if(!user) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 1c3c712db6..aae4aad91d 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -107,39 +107,26 @@ throw_speed = 3 throw_range = 7 attack_verb = list("HONKED") - var/next_usable = 0 - var/honksound = 'sound/items/bikehorn.ogg' - var/cooldowntime = 20 + +/obj/item/bikehorn/Initialize() + . = ..() + AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50) /obj/item/bikehorn/suicide_act(mob/user) user.visible_message("[user] solemnly points the horn at [user.p_their()] temple! It looks like [user.p_theyre()] trying to commit suicide!") - playsound(src.loc, honksound, 50, 1) + playsound(src, 'sound/items/bikehorn.ogg', 50, 1) return (BRUTELOSS) -/obj/item/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user) - if(!(next_usable > world.time)) - playsound(loc, honksound, 50, 1, -1) //plays instead of tap.ogg! - return ..() - -/obj/item/bikehorn/attack_self(mob/user) - if(!(next_usable > world.time)) - next_usable = world.time + cooldowntime - playsound(src.loc, honksound, 50, 1) - src.add_fingerprint(user) - -/obj/item/bikehorn/Crossed(mob/living/L) - if(isliving(L)) - playsound(loc, honksound, 50, 1, -1) - ..() - /obj/item/bikehorn/airhorn name = "air horn" desc = "Damn son, where'd you find this?" icon_state = "air_horn" - honksound = 'sound/items/airhorn2.ogg' - cooldowntime = 50 origin_tech = "materials=4;engineering=4" +/obj/item/bikehorn/airhorn/Initialize() + . = ..() + AddComponent(/datum/component/squeak, list('sound/items/airhorn2.ogg'=1), 50) + /obj/item/bikehorn/golden name = "golden bike horn" desc = "Golden? Clearly, it's made with bananium! Honk!" @@ -155,14 +142,13 @@ ..() /obj/item/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user) - if(!(next_usable > world.time)) - var/turf/T = get_turf(src) - for(M in ohearers(7, T)) - if(ishuman(M) && M.can_hear()) - var/mob/living/carbon/human/H = M - if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) - continue - M.emote("flip") + var/turf/T = get_turf(src) + for(M in ohearers(7, T)) + if(ishuman(M) && M.can_hear()) + var/mob/living/carbon/human/H = M + if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) + continue + M.emote("flip") /obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter name = "Canned Laughter" diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index 4f2c1a620a..8ec32f088e 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -1,186 +1,189 @@ -/obj/item/lipstick - gender = PLURAL - name = "red lipstick" - desc = "A generic brand of lipstick." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "lipstick" - w_class = WEIGHT_CLASS_TINY - var/colour = "red" - var/open = FALSE - - -/obj/item/lipstick/purple - name = "purple lipstick" - colour = "purple" - -/obj/item/lipstick/jade - //It's still called Jade, but theres no HTML color for jade, so we use lime. - name = "jade lipstick" - colour = "lime" - -/obj/item/lipstick/black - name = "black lipstick" - colour = "black" - - -/obj/item/lipstick/random - name = "lipstick" - -/obj/item/lipstick/random/New() - ..() - colour = pick("red","purple","lime","black","green","blue","white") - name = "[colour] lipstick" - - - -/obj/item/lipstick/attack_self(mob/user) - cut_overlays() - to_chat(user, "You twist \the [src] [open ? "closed" : "open"].") - open = !open - if(open) - var/mutable_appearance/colored_overlay = mutable_appearance(icon, "lipstick_uncap_color") - colored_overlay.color = colour - icon_state = "lipstick_uncap" - add_overlay(colored_overlay) - else - icon_state = "lipstick" - -/obj/item/lipstick/attack(mob/M, mob/user) - if(!open) - return - - if(!ismob(M)) - return - - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.is_mouth_covered()) - to_chat(user, "Remove [ H == user ? "your" : "their" ] mask!") - return - if(H.lip_style) //if they already have lipstick on - to_chat(user, "You need to wipe off the old lipstick first!") - return - if(H == user) - user.visible_message("[user] does their lips with \the [src].", \ - "You take a moment to apply \the [src]. Perfect!") - H.lip_style = "lipstick" - H.lip_color = colour - H.update_body() - else - user.visible_message("[user] begins to do [H]'s lips with \the [src].", \ - "You begin to apply \the [src] on [H]'s lips...") - if(do_after(user, 20, target = H)) - user.visible_message("[user] does [H]'s lips with \the [src].", \ - "You apply \the [src] on [H]'s lips.") - H.lip_style = "lipstick" - H.lip_color = colour - H.update_body() - else - to_chat(user, "Where are the lips on that?") - -//you can wipe off lipstick with paper! -/obj/item/paper/attack(mob/M, mob/user) - if(user.zone_selected == "mouth") - if(!ismob(M)) - return - - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H == user) - to_chat(user, "You wipe off the lipstick with [src].") - H.lip_style = null - H.update_body() - else - user.visible_message("[user] begins to wipe [H]'s lipstick off with \the [src].", \ - "You begin to wipe off [H]'s lipstick...") - if(do_after(user, 10, target = H)) - user.visible_message("[user] wipes [H]'s lipstick off with \the [src].", \ - "You wipe off [H]'s lipstick.") - H.lip_style = null - H.update_body() - else - ..() - - -/obj/item/razor - name = "electric razor" - desc = "The latest and greatest power razor born from the science of shaving." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "razor" - flags_1 = CONDUCT_1 - w_class = WEIGHT_CLASS_TINY - - -/obj/item/razor/proc/shave(mob/living/carbon/human/H, location = "mouth") - if(location == "mouth") - H.facial_hair_style = "Shaved" - else - H.hair_style = "Skinhead" - - H.update_hair() - playsound(loc, 'sound/items/welder2.ogg', 20, 1) - - -/obj/item/razor/attack(mob/M, mob/user) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/location = user.zone_selected - if(location == "mouth") - if(!(FACEHAIR in H.dna.species.species_traits)) - to_chat(user, "There is no facial hair to shave!") - return - if(!get_location_accessible(H, location)) - to_chat(user, "The mask is in the way!") - return - if(H.facial_hair_style == "Shaved") - to_chat(user, "Already clean-shaven!") - return - - if(H == user) //shaving yourself - user.visible_message("[user] starts to shave their facial hair with [src].", \ - "You take a moment to shave your facial hair with [src]...") - if(do_after(user, 50, target = H)) - user.visible_message("[user] shaves his facial hair clean with [src].", \ - "You finish shaving with [src]. Fast and clean!") - shave(H, location) - else - var/turf/H_loc = H.loc - user.visible_message("[user] tries to shave [H]'s facial hair with [src].", \ - "You start shaving [H]'s facial hair...") - if(do_after(user, 50, target = H)) - if(H_loc == H.loc) - user.visible_message("[user] shaves off [H]'s facial hair with [src].", \ - "You shave [H]'s facial hair clean off.") - shave(H, location) - - else if(location == "head") - if(!(HAIR in H.dna.species.species_traits)) - to_chat(user, "There is no hair to shave!") - return - if(!get_location_accessible(H, location)) - to_chat(user, "The headgear is in the way!") - return - if(H.hair_style == "Bald" || H.hair_style == "Balding Hair" || H.hair_style == "Skinhead") - to_chat(user, "There is not enough hair left to shave!") - return - - if(H == user) //shaving yourself - user.visible_message("[user] starts to shave their head with [src].", \ - "You start to shave your head with [src]...") - if(do_after(user, 5, target = H)) - user.visible_message("[user] shaves his head with [src].", \ - "You finish shaving with [src].") - shave(H, location) - else - var/turf/H_loc = H.loc - user.visible_message("[user] tries to shave [H]'s head with [src]!", \ - "You start shaving [H]'s head...") - if(do_after(user, 50, target = H)) - if(H_loc == H.loc) - user.visible_message("[user] shaves [H]'s head bald with [src]!", \ - "You shave [H]'s head bald.") - shave(H, location) - else - ..() - else - ..() \ No newline at end of file +/obj/item/lipstick + gender = PLURAL + name = "red lipstick" + desc = "A generic brand of lipstick." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "lipstick" + w_class = WEIGHT_CLASS_TINY + var/colour = "red" + var/open = FALSE + + +/obj/item/lipstick/purple + name = "purple lipstick" + colour = "purple" + +/obj/item/lipstick/jade + //It's still called Jade, but theres no HTML color for jade, so we use lime. + name = "jade lipstick" + colour = "lime" + +/obj/item/lipstick/black + name = "black lipstick" + colour = "black" + + +/obj/item/lipstick/random + name = "lipstick" + +/obj/item/lipstick/random/New() + ..() + colour = pick("red","purple","lime","black","green","blue","white") + name = "[colour] lipstick" + + + +/obj/item/lipstick/attack_self(mob/user) + cut_overlays() + to_chat(user, "You twist \the [src] [open ? "closed" : "open"].") + open = !open + if(open) + var/mutable_appearance/colored_overlay = mutable_appearance(icon, "lipstick_uncap_color") + colored_overlay.color = colour + icon_state = "lipstick_uncap" + add_overlay(colored_overlay) + else + icon_state = "lipstick" + +/obj/item/lipstick/attack(mob/M, mob/user) + if(!open) + return + + if(!ismob(M)) + return + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.is_mouth_covered()) + to_chat(user, "Remove [ H == user ? "your" : "their" ] mask!") + return + if(H.lip_style) //if they already have lipstick on + to_chat(user, "You need to wipe off the old lipstick first!") + return + if(H == user) + user.visible_message("[user] does their lips with \the [src].", \ + "You take a moment to apply \the [src]. Perfect!") + H.lip_style = "lipstick" + H.lip_color = colour + H.update_body() + else + user.visible_message("[user] begins to do [H]'s lips with \the [src].", \ + "You begin to apply \the [src] on [H]'s lips...") + if(do_after(user, 20, target = H)) + user.visible_message("[user] does [H]'s lips with \the [src].", \ + "You apply \the [src] on [H]'s lips.") + H.lip_style = "lipstick" + H.lip_color = colour + H.update_body() + else + to_chat(user, "Where are the lips on that?") + +//you can wipe off lipstick with paper! +/obj/item/paper/attack(mob/M, mob/user) + if(user.zone_selected == "mouth") + if(!ismob(M)) + return + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H == user) + to_chat(user, "You wipe off the lipstick with [src].") + H.lip_style = null + H.update_body() + else + user.visible_message("[user] begins to wipe [H]'s lipstick off with \the [src].", \ + "You begin to wipe off [H]'s lipstick...") + if(do_after(user, 10, target = H)) + user.visible_message("[user] wipes [H]'s lipstick off with \the [src].", \ + "You wipe off [H]'s lipstick.") + H.lip_style = null + H.update_body() + else + ..() + + +/obj/item/razor + name = "electric razor" + desc = "The latest and greatest power razor born from the science of shaving." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "razor" + flags_1 = CONDUCT_1 + w_class = WEIGHT_CLASS_TINY + + +/obj/item/razor/proc/shave(mob/living/carbon/human/H, location = "mouth") + if(location == "mouth") + H.facial_hair_style = "Shaved" + else + H.hair_style = "Skinhead" + + H.update_hair() + playsound(loc, 'sound/items/welder2.ogg', 20, 1) + + +/obj/item/razor/attack(mob/M, mob/user) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/location = user.zone_selected + if((location in list("eyes", "mouth", "head")) && !H.get_bodypart("head")) + to_chat(user, "[H] doesn't have a head!") + return + if(location == "mouth") + if(!(FACEHAIR in H.dna.species.species_traits)) + to_chat(user, "There is no facial hair to shave!") + return + if(!get_location_accessible(H, location)) + to_chat(user, "The mask is in the way!") + return + if(H.facial_hair_style == "Shaved") + to_chat(user, "Already clean-shaven!") + return + + if(H == user) //shaving yourself + user.visible_message("[user] starts to shave their facial hair with [src].", \ + "You take a moment to shave your facial hair with [src]...") + if(do_after(user, 50, target = H)) + user.visible_message("[user] shaves his facial hair clean with [src].", \ + "You finish shaving with [src]. Fast and clean!") + shave(H, location) + else + var/turf/H_loc = H.loc + user.visible_message("[user] tries to shave [H]'s facial hair with [src].", \ + "You start shaving [H]'s facial hair...") + if(do_after(user, 50, target = H)) + if(H_loc == H.loc) + user.visible_message("[user] shaves off [H]'s facial hair with [src].", \ + "You shave [H]'s facial hair clean off.") + shave(H, location) + + else if(location == "head") + if(!(HAIR in H.dna.species.species_traits)) + to_chat(user, "There is no hair to shave!") + return + if(!get_location_accessible(H, location)) + to_chat(user, "The headgear is in the way!") + return + if(H.hair_style == "Bald" || H.hair_style == "Balding Hair" || H.hair_style == "Skinhead") + to_chat(user, "There is not enough hair left to shave!") + return + + if(H == user) //shaving yourself + user.visible_message("[user] starts to shave their head with [src].", \ + "You start to shave your head with [src]...") + if(do_after(user, 5, target = H)) + user.visible_message("[user] shaves his head with [src].", \ + "You finish shaving with [src].") + shave(H, location) + else + var/turf/H_loc = H.loc + user.visible_message("[user] tries to shave [H]'s head with [src]!", \ + "You start shaving [H]'s head...") + if(do_after(user, 50, target = H)) + if(H_loc == H.loc) + user.visible_message("[user] shaves [H]'s head bald with [src]!", \ + "You shave [H]'s head bald.") + shave(H, location) + else + ..() + else + ..() diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 9432a434f0..649efc0802 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -4,13 +4,13 @@ */ //Child of carpplushie because this should do everything the toy does and more -/obj/item/toy/carpplushie/dehy_carp +/obj/item/toy/plush/carpplushie/dehy_carp var/mob/owner = null //Carp doesn't attack owner, set when using in hand var/owned = 0 //Boolean, no owner to begin with var/mobtype = /mob/living/simple_animal/hostile/carp //So admins can change what mob spawns via var fuckery //Attack self -/obj/item/toy/carpplushie/dehy_carp/attack_self(mob/user) +/obj/item/toy/plush/carpplushie/dehy_carp/attack_self(mob/user) src.add_fingerprint(user) //Anyone can add their fingerprints to it with this if(!owned) to_chat(user, "You pet [src]. You swear it looks up at you.") @@ -18,7 +18,7 @@ owned = 1 else return ..() -/obj/item/toy/carpplushie/dehy_carp/proc/Swell() +/obj/item/toy/plush/carpplushie/dehy_carp/proc/Swell() desc = "It's growing!" visible_message("[src] swells up!") diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 642a7ffc3a..eb521d8510 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -538,7 +538,7 @@ GLOBAL_LIST_EMPTY(PDAs) P.show_recieved_message(msg,src) if(!multiple) show_to_ghosts(user,msg) - log_talk(user,"[user] (PDA: [name]) sent \"[message]\" to [P.name]",LOGPDA) + log_talk(user,"[key_name(user)] (PDA: [name]) sent \"[message]\" to [key_name(P,null,TRUE)]",LOGPDA) else if(!multiple) to_chat(user, "ERROR: Server isn't responding.") @@ -856,9 +856,6 @@ GLOBAL_LIST_EMPTY(PDAs) var/list/plist = list() var/list/namecounts = list() - if(user.stat == DEAD) - return //won't work if dead - if(src.aiPDA.toff) to_chat(user, "Turn on your receiver in order to send messages.") return @@ -883,6 +880,10 @@ GLOBAL_LIST_EMPTY(PDAs) if(add_photo=="Yes") var/datum/picture/Pic = aicamera.selectpicture(aicamera) src.aiPDA.photo = Pic.fields["img"] + + if(incapacitated()) + return + src.aiPDA.create_message(src, selected) @@ -910,8 +911,8 @@ GLOBAL_LIST_EMPTY(PDAs) to_chat(usr, "You do not have a PDA. You should make an issue report about this.") /mob/living/silicon/ai/proc/cmd_show_message_log(mob/user) - if(user.stat == DEAD) - return //won't work if dead + if(incapacitated()) + return if(!isnull(aiPDA)) var/HTML = "AI PDA Message Log[aiPDA.tnote]" user << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0") diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm new file mode 100644 index 0000000000..204a1f81d9 --- /dev/null +++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm @@ -0,0 +1,65 @@ +//Used by engineering cyborgs in place of generic circuits. +/obj/item/device/electroadaptive_pseudocircuit + name = "electroadaptive pseudocircuit" + desc = "An all-in-one circuit imprinter, designer, synthesizer, outfitter, creator, and chef. It can be used in place of any generic circuit board during construction." + icon = 'icons/obj/module.dmi' + icon_state = "boris" + w_class = WEIGHT_CLASS_TINY + materials = list(MAT_METAL = 50, MAT_GLASS = 300) + origin_tech = "engineering=4" + var/recharging = FALSE + var/circuits = 5 //How many circuits the pseudocircuit has left + var/static/recycleable_circuits = typecacheof(list(/obj/item/electronics/firelock, /obj/item/electronics/airalarm, /obj/item/electronics/firealarm, \ + /obj/item/electronics/apc))//A typecache of circuits consumable for material + +/obj/item/device/electroadaptive_pseudocircuit/Initialize() + . = ..() + maptext = "[circuits]" + +/obj/item/device/electroadaptive_pseudocircuit/examine(mob/user) + ..() + if(iscyborg(user)) + to_chat(user, "It has material for [circuits] circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.") + to_chat(user, "Serves as a substitute for fire/air alarm, firelock, and APC electronics.") + to_chat(user, "It can also be used on an APC with no power cell to fabricate a low-capacity cell at a high power cost.") + +/obj/item/device/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0) + if(QDELETED(R) || !istype(R)) + return + if(!R.cell) + to_chat(R, "You need a power cell installed for that.") + return + if(!R.cell.use(circuit_cost)) + to_chat(R, "You don't have the power for that (you need [DisplayPower(circuit_cost)].)") + return + if(recharging) + to_chat(R, "[src] needs some time to recharge first.") + return + if(!circuits) + to_chat(R, "You need more material. Use [src] on existing simple circuits to break them down.") + return + playsound(R, 'sound/items/rped.ogg', 50, TRUE) + recharging = TRUE + circuits-- + maptext = "[circuits]" + icon_state = "[initial(icon_state)]_recharging" + var/recharge_time = min(600, circuit_cost * 5) //40W of cost for one fabrication = 20 seconds of recharge time; this is to prevent spamming + addtimer(CALLBACK(src, .proc/recharge), recharge_time) + return TRUE //The actual circuit magic itself is done on a per-object basis + +/obj/item/device/electroadaptive_pseudocircuit/afterattack(atom/target, mob/living/user, proximity) + if(!proximity) + return + if(!is_type_in_typecache(target, recycleable_circuits)) + return + circuits++ + maptext = "[circuits]" + user.visible_message("User breaks down [target] with [src].", \ + "You recycle [target] into [src]. It now has material for [circuits] circuits.") + playsound(user, 'sound/items/deconstruct.ogg', 50, TRUE) + qdel(target) + +/obj/item/device/electroadaptive_pseudocircuit/proc/recharge() + playsound(src, 'sound/machines/chime.ogg', 25, TRUE) + recharging = FALSE + icon_state = initial(icon_state) diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index fdcf781a4d..19a81e8640 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -1,3 +1,4 @@ +GLOBAL_LIST_INIT(pipe_paint_colors, list("grey"=rgb(255,255,255), "red"=rgb(255,0,0), "blue"=rgb(0,0,255), "cyan"=rgb(0,256,249), "green"=rgb(30,255,0), "yellow"=rgb(255,198,0), "purple"=rgb(130,43,255))) /obj/item/device/pipe_painter name = "pipe painter" @@ -5,16 +6,7 @@ icon_state = "labeler1" item_state = "flight" flags_1 = NOBLUDGEON_1 - var/list/modes = list( - "grey" = rgb(255,255,255), - "red" = rgb(255,0,0), - "blue" = rgb(0,0,255), - "cyan" = rgb(0,256,249), - "green" = rgb(30,255,0), - "yellow" = rgb(255,198,0), - "purple" = rgb(130,43,255) - ) - var/mode = "grey" + var/paint_color = "grey" materials = list(MAT_METAL=5000, MAT_GLASS=2000) @@ -27,14 +19,13 @@ return var/obj/machinery/atmospherics/pipe/P = A - P.add_atom_colour(modes[mode], FIXED_COLOUR_PRIORITY) - P.pipe_color = modes[mode] - user.visible_message("[user] paints \the [P] [mode].","You paint \the [P] [mode].") - P.update_node_icon() //updates the neighbors + if(P.paint(GLOB.pipe_paint_colors[paint_color])) + playsound(src, 'sound/machines/click.ogg', 50, 1) + user.visible_message("[user] paints \the [P] [paint_color].","You paint \the [P] [paint_color].") /obj/item/device/pipe_painter/attack_self(mob/user) - mode = input("Which colour do you want to use?","Pipe painter") in modes + paint_color = input("Which colour do you want to use?","Pipe painter") in GLOB.pipe_paint_colors -/obj/item/device/pipe_painter/examine() +/obj/item/device/pipe_painter/examine(mob/user) ..() - to_chat(usr, "It is set to [mode].") + to_chat(user, "It is set to [paint_color].") diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index e3f767f9fa..d32ae86090 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -138,7 +138,7 @@ if(power_drained > max_power * 0.98) if (!admins_warned) admins_warned = TRUE - message_admins("Power sink at ([x],[y],[z] - JMP) is 95% full. Explosion imminent.") + message_admins("Power sink at ([x],[y],[z] - JMP) is 95% full. Explosion imminent.") playsound(src, 'sound/effects/screech.ogg', 100, 1, 1) if(power_drained >= max_power) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index bd54fda56f..8b27659ada 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -4,13 +4,13 @@ icon = 'icons/obj/radio.dmi' icon_state = "electropack0" item_state = "electropack" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - flags_1 = CONDUCT_1 + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + flags_1 = CONDUCT_1 slot_flags = SLOT_BACK w_class = WEIGHT_CLASS_HUGE materials = list(MAT_METAL=10000, MAT_GLASS=2500) - var/on = TRUE + var/on = TRUE var/code = 2 var/frequency = 1449 var/shock_cooldown = 0 @@ -20,11 +20,11 @@ return (FIRELOSS) /obj/item/device/electropack/Initialize() - ..() + . = ..() SSradio.add_object(src, frequency, GLOB.RADIO_CHAT) /obj/item/device/electropack/Destroy() - SSradio.remove_object(src, frequency) + SSradio.remove_object(src, frequency) return ..() /obj/item/device/electropack/attack_hand(mob/user) @@ -52,8 +52,8 @@ user.put_in_hands(A) A.add_fingerprint(user) - if(src.flags_1 & NODROP_1) - A.flags_1 |= NODROP_1 + if(src.flags_1 & NODROP_1) + A.flags_1 |= NODROP_1 else return ..() @@ -108,7 +108,7 @@ spawn(100) shock_cooldown = 0 var/mob/living/L = loc - step(L, pick(GLOB.cardinals)) + step(L, pick(GLOB.cardinals)) to_chat(L, "You feel a sharp shock!") var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread @@ -143,4 +143,4 @@ Code: "} user << browse(dat, "window=radio") onclose(user, "radio") - return + return \ No newline at end of file diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 31e5b70732..7d3eabfdc6 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -181,7 +181,7 @@ MASS SPECTROMETER to_chat(user, "Time of Death: [M.tod]") var/tdelta = round(world.time - M.timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) - to_chat(user, "Subject died [tdelta / 10] seconds ago, defibrillation may be possible!") + to_chat(user, "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!") for(var/thing in M.viruses) var/datum/disease/D = thing diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 2cc0ab0417..663eed0a8d 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -111,7 +111,6 @@ effective or pretty fucking useless. /obj/item/device/healthanalyzer/rad_laser/interact(mob/user) user.set_machine(src) - var/cooldown = GetCooldown() var/dat = "Irradiation: [irradiate ? "On" : "Off"]
" dat += "Stealth Mode (NOTE: Deactivates automatically while Irradiation is off): [stealth ? "On" : "Off"]
" dat += "Scan Mode: " @@ -133,7 +132,7 @@ effective or pretty fucking useless. -- [(wavelength+(intensity*4))] ++
- Laser Cooldown: [cooldown] Seconds
+ Laser Cooldown: [DisplayTimeText(GetCooldown())]
"} var/datum/browser/popup = new(user, "radlaser", "Radioactive Microlaser Interface", 400, 240) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 1b47bbf3f9..045da484ed 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -1,213 +1,213 @@ -/obj/item/device/transfer_valve - icon = 'icons/obj/assemblies.dmi' - name = "tank transfer valve" - icon_state = "valve_1" - item_state = "ttv" +/obj/item/device/transfer_valve + icon = 'icons/obj/assemblies.dmi' + name = "tank transfer valve" + icon_state = "valve_1" + item_state = "ttv" lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi' - desc = "Regulates the transfer of air between two tanks" - var/obj/item/tank/tank_one - var/obj/item/tank/tank_two + desc = "Regulates the transfer of air between two tanks" + var/obj/item/tank/tank_one + var/obj/item/tank/tank_two var/obj/item/device/assembly/attached_device - var/mob/attacher = null + var/mob/attacher = null var/valve_open = FALSE - var/toggle = 1 - origin_tech = "materials=1;engineering=1" - -/obj/item/device/transfer_valve/IsAssemblyHolder() - return 1 - -/obj/item/device/transfer_valve/attackby(obj/item/item, mob/user, params) - if(istype(item, /obj/item/tank)) - if(tank_one && tank_two) - to_chat(user, "There are already two tanks attached, remove one first!") - return - - if(!tank_one) - if(!user.transferItemToLoc(item, src)) - return - tank_one = item - to_chat(user, "You attach the tank to the transfer valve.") - if(item.w_class > w_class) - w_class = item.w_class - else if(!tank_two) - if(!user.transferItemToLoc(item, src)) - return - tank_two = item - to_chat(user, "You attach the tank to the transfer valve.") - if(item.w_class > w_class) - w_class = item.w_class - - update_icon() -//TODO: Have this take an assemblyholder - else if(isassembly(item)) - var/obj/item/device/assembly/A = item - if(A.secured) - to_chat(user, "The device is secured.") - return - if(attached_device) - to_chat(user, "There is already a device attached to the valve, remove it first!") - return - if(!user.transferItemToLoc(item, src)) - return - attached_device = A - to_chat(user, "You attach the [item] to the valve controls and secure it.") - A.holder = src - A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). - - GLOB.bombers += "[key_name(user)] attached a [item] to a transfer valve." - message_admins("[key_name_admin(user)] attached a [item] to a transfer valve.") - log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") - attacher = user - return - -/obj/item/device/transfer_valve/attack_self(mob/user) - user.set_machine(src) - var/dat = {" Valve properties: -
Attachment one: [tank_one] [tank_one ? "Remove" : ""] -
Attachment two: [tank_two] [tank_two ? "Remove" : ""] -
Valve attachment: [attached_device ? "[attached_device]" : "None"] [attached_device ? "Remove" : ""] -
Valve status: [ valve_open ? "Closed Open" : "Closed Open"]"} - - var/datum/browser/popup = new(user, "trans_valve", name) - popup.set_content(dat) - popup.open() - return - -/obj/item/device/transfer_valve/Topic(href, href_list) - ..() - if ( usr.stat || usr.restrained() ) - return - if (src.loc == usr) - if(tank_one && href_list["tankone"]) - split_gases() + var/toggle = 1 + origin_tech = "materials=1;engineering=1" + +/obj/item/device/transfer_valve/IsAssemblyHolder() + return 1 + +/obj/item/device/transfer_valve/attackby(obj/item/item, mob/user, params) + if(istype(item, /obj/item/tank)) + if(tank_one && tank_two) + to_chat(user, "There are already two tanks attached, remove one first!") + return + + if(!tank_one) + if(!user.transferItemToLoc(item, src)) + return + tank_one = item + to_chat(user, "You attach the tank to the transfer valve.") + if(item.w_class > w_class) + w_class = item.w_class + else if(!tank_two) + if(!user.transferItemToLoc(item, src)) + return + tank_two = item + to_chat(user, "You attach the tank to the transfer valve.") + if(item.w_class > w_class) + w_class = item.w_class + + update_icon() +//TODO: Have this take an assemblyholder + else if(isassembly(item)) + var/obj/item/device/assembly/A = item + if(A.secured) + to_chat(user, "The device is secured.") + return + if(attached_device) + to_chat(user, "There is already a device attached to the valve, remove it first!") + return + if(!user.transferItemToLoc(item, src)) + return + attached_device = A + to_chat(user, "You attach the [item] to the valve controls and secure it.") + A.holder = src + A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). + + GLOB.bombers += "[key_name(user)] attached a [item] to a transfer valve." + message_admins("[key_name_admin(user)] attached a [item] to a transfer valve.") + log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") + attacher = user + return + +/obj/item/device/transfer_valve/attack_self(mob/user) + user.set_machine(src) + var/dat = {" Valve properties: +
Attachment one: [tank_one] [tank_one ? "Remove" : ""] +
Attachment two: [tank_two] [tank_two ? "Remove" : ""] +
Valve attachment: [attached_device ? "[attached_device]" : "None"] [attached_device ? "Remove" : ""] +
Valve status: [ valve_open ? "Closed Open" : "Closed Open"]"} + + var/datum/browser/popup = new(user, "trans_valve", name) + popup.set_content(dat) + popup.open() + return + +/obj/item/device/transfer_valve/Topic(href, href_list) + ..() + if ( usr.stat || usr.restrained() ) + return + if (src.loc == usr) + if(tank_one && href_list["tankone"]) + split_gases() valve_open = FALSE - tank_one.loc = get_turf(src) - tank_one = null - update_icon() - if((!tank_two || tank_two.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL)) - w_class = WEIGHT_CLASS_NORMAL - else if(tank_two && href_list["tanktwo"]) - split_gases() + tank_one.loc = get_turf(src) + tank_one = null + update_icon() + if((!tank_two || tank_two.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL)) + w_class = WEIGHT_CLASS_NORMAL + else if(tank_two && href_list["tanktwo"]) + split_gases() valve_open = FALSE - tank_two.loc = get_turf(src) - tank_two = null - update_icon() - if((!tank_one || tank_one.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL)) - w_class = WEIGHT_CLASS_NORMAL - else if(href_list["open"]) - toggle_valve() - else if(attached_device) - if(href_list["rem_device"]) + tank_two.loc = get_turf(src) + tank_two = null + update_icon() + if((!tank_one || tank_one.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL)) + w_class = WEIGHT_CLASS_NORMAL + else if(href_list["open"]) + toggle_valve() + else if(attached_device) + if(href_list["rem_device"]) attached_device.forceMove(get_turf(src)) attached_device.holder = null - attached_device = null - update_icon() - if(href_list["device"]) - attached_device.attack_self(usr) - - src.attack_self(usr) - src.add_fingerprint(usr) - return - return - -/obj/item/device/transfer_valve/proc/process_activation(obj/item/device/D) - if(toggle) - toggle = 0 - toggle_valve() - spawn(50) // To stop a signal being spammed from a proxy sensor constantly going off or whatever - toggle = 1 - -/obj/item/device/transfer_valve/update_icon() - cut_overlays() - underlays = null - - if(!tank_one && !tank_two && !attached_device) - icon_state = "valve_1" - return - icon_state = "valve" - - if(tank_one) - add_overlay("[tank_one.icon_state]") - if(tank_two) - var/icon/J = new(icon, icon_state = "[tank_two.icon_state]") - J.Shift(WEST, 13) - underlays += J - if(attached_device) - add_overlay("device") - -/obj/item/device/transfer_valve/proc/merge_gases() - tank_two.air_contents.volume += tank_one.air_contents.volume - var/datum/gas_mixture/temp - temp = tank_one.air_contents.remove_ratio(1) - tank_two.air_contents.merge(temp) - -/obj/item/device/transfer_valve/proc/split_gases() - if (!valve_open || !tank_one || !tank_two) - return - var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume - var/datum/gas_mixture/temp - temp = tank_two.air_contents.remove_ratio(ratio1) - tank_one.air_contents.merge(temp) - tank_two.air_contents.volume -= tank_one.air_contents.volume - - /* - Exadv1: I know this isn't how it's going to work, but this was just to check - it explodes properly when it gets a signal (and it does). - */ - -/obj/item/device/transfer_valve/proc/toggle_valve() - if(!valve_open && tank_one && tank_two) + attached_device = null + update_icon() + if(href_list["device"]) + attached_device.attack_self(usr) + + src.attack_self(usr) + src.add_fingerprint(usr) + return + return + +/obj/item/device/transfer_valve/proc/process_activation(obj/item/device/D) + if(toggle) + toggle = 0 + toggle_valve() + spawn(50) // To stop a signal being spammed from a proxy sensor constantly going off or whatever + toggle = 1 + +/obj/item/device/transfer_valve/update_icon() + cut_overlays() + underlays = null + + if(!tank_one && !tank_two && !attached_device) + icon_state = "valve_1" + return + icon_state = "valve" + + if(tank_one) + add_overlay("[tank_one.icon_state]") + if(tank_two) + var/icon/J = new(icon, icon_state = "[tank_two.icon_state]") + J.Shift(WEST, 13) + underlays += J + if(attached_device) + add_overlay("device") + +/obj/item/device/transfer_valve/proc/merge_gases() + tank_two.air_contents.volume += tank_one.air_contents.volume + var/datum/gas_mixture/temp + temp = tank_one.air_contents.remove_ratio(1) + tank_two.air_contents.merge(temp) + +/obj/item/device/transfer_valve/proc/split_gases() + if (!valve_open || !tank_one || !tank_two) + return + var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume + var/datum/gas_mixture/temp + temp = tank_two.air_contents.remove_ratio(ratio1) + tank_one.air_contents.merge(temp) + tank_two.air_contents.volume -= tank_one.air_contents.volume + + /* + Exadv1: I know this isn't how it's going to work, but this was just to check + it explodes properly when it gets a signal (and it does). + */ + +/obj/item/device/transfer_valve/proc/toggle_valve() + if(!valve_open && tank_one && tank_two) valve_open = TRUE - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - - var/attachment = "no device" - if(attached_device) - if(istype(attached_device, /obj/item/device/assembly/signaler)) - attachment = "[attached_device]" - else - attachment = attached_device - - var/attacher_name = "" - if(!attacher) - attacher_name = "Unknown" - else - attacher_name = "[key_name_admin(attacher)]" - - var/log_str1 = "Bomb valve opened in " - var/log_str2 = "with [attachment] attacher: [attacher_name]" - - var/log_attacher = "" - if(attacher) - log_attacher = "[ADMIN_QUE(attacher)] [ADMIN_FLW(attacher)]" - - var/mob/mob = get_mob_by_key(src.fingerprintslast) - var/last_touch_info = "" - if(mob) - last_touch_info = "[ADMIN_QUE(mob)] [ADMIN_FLW(mob)]" - - var/log_str3 = " Last touched by: [key_name_admin(mob)]" - - var/bomb_message = "[log_str1] [A.name][ADMIN_JMP(bombturf)] [log_str2][log_attacher] [log_str3][last_touch_info]" - - GLOB.bombers += bomb_message - - message_admins(bomb_message, 0, 1) - log_game("[log_str1] [A.name][COORD(bombturf)] [log_str2] [log_str3]") - merge_gases() - spawn(20) // In case one tank bursts - for (var/i=0,i<5,i++) - src.update_icon() - sleep(10) - src.update_icon() - - else if(valve_open && tank_one && tank_two) - split_gases() + var/turf/bombturf = get_turf(src) + var/area/A = get_area(bombturf) + + var/attachment = "no device" + if(attached_device) + if(istype(attached_device, /obj/item/device/assembly/signaler)) + attachment = "[attached_device]" + else + attachment = attached_device + + var/attacher_name = "" + if(!attacher) + attacher_name = "Unknown" + else + attacher_name = "[key_name_admin(attacher)]" + + var/log_str1 = "Bomb valve opened in " + var/log_str2 = "with [attachment] attacher: [attacher_name]" + + var/log_attacher = "" + if(attacher) + log_attacher = "[ADMIN_QUE(attacher)] [ADMIN_FLW(attacher)]" + + var/mob/mob = get_mob_by_key(src.fingerprintslast) + var/last_touch_info = "" + if(mob) + last_touch_info = "[ADMIN_QUE(mob)] [ADMIN_FLW(mob)]" + + var/log_str3 = " Last touched by: [key_name_admin(mob)]" + + var/bomb_message = "[log_str1] [A.name][ADMIN_JMP(bombturf)] [log_str2][log_attacher] [log_str3][last_touch_info]" + + GLOB.bombers += bomb_message + + message_admins(bomb_message, 0, 1) + log_game("[log_str1] [A.name][COORD(bombturf)] [log_str2] [log_str3]") + merge_gases() + spawn(20) // In case one tank bursts + for (var/i=0,i<5,i++) + src.update_icon() + sleep(10) + src.update_icon() + + else if(valve_open && tank_one && tank_two) + split_gases() valve_open = FALSE - src.update_icon() - -// this doesn't do anything but the timer etc. expects it to be here -// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs -/obj/item/device/transfer_valve/proc/c_state() - return + src.update_icon() + +// this doesn't do anything but the timer etc. expects it to be here +// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs +/obj/item/device/transfer_valve/proc/c_state() + return diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 771d322c34..7cf88e77ef 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -1,193 +1,192 @@ -/obj/item/storage/pill_bottle/dice - name = "bag of dice" - desc = "Contains all the luck you'll ever need." - icon = 'icons/obj/dice.dmi' - icon_state = "dicebag" - -/obj/item/storage/pill_bottle/dice/New() - ..() - var/special_die = pick("1","2","fudge","space","00","8bd20","4dd6","100") - if(special_die == "1") - new /obj/item/dice/d1(src) - if(special_die == "2") - new /obj/item/dice/d2(src) - new /obj/item/dice/d4(src) - new /obj/item/dice/d6(src) - if(special_die == "fudge") - new /obj/item/dice/fudge(src) - if(special_die == "space") - new /obj/item/dice/d6/space(src) - new /obj/item/dice/d8(src) - new /obj/item/dice/d10(src) - if(special_die == "00") - new /obj/item/dice/d00(src) - new /obj/item/dice/d12(src) - new /obj/item/dice/d20(src) - if(special_die == "8bd20") - new /obj/item/dice/eightbd20(src) - if(special_die == "4dd6") - new /obj/item/dice/fourdd6(src) - if(special_die == "100") - new /obj/item/dice/d100(src) - -/obj/item/dice //depreciated d6, use /obj/item/dice/d6 if you actually want a d6 - name = "die" - desc = "A die with six sides. Basic and servicable." - icon = 'icons/obj/dice.dmi' - icon_state = "d6" - w_class = WEIGHT_CLASS_TINY - var/sides = 6 - var/result = null - var/list/special_faces = list() //entries should match up to sides var if used - var/can_be_rigged = TRUE - var/rigged = FALSE - -/obj/item/dice/New() - result = rand(1, sides) - update_icon() - ..() - -/obj/item/dice/d1 - name = "d1" - desc = "A die with one side. Deterministic!" - icon_state = "d1" - sides = 1 - -/obj/item/dice/d2 - name = "d2" - desc = "A die with two sides. Coins are undignified!" - icon_state = "d2" - sides = 2 - -/obj/item/dice/d4 - name = "d4" - desc = "A die with four sides. The nerd's caltrop." - icon_state = "d4" - sides = 4 - -/obj/item/dice/d6 - name = "d6" - -/obj/item/dice/d6/space - name = "space cube" - desc = "A die with six sides. 6 TIMES 255 TIMES 255 TILE TOTAL EXISTENCE, SQUARE YOUR MIND OF EDUCATED STUPID: 2 DOES NOT EXIST." - icon_state = "spaced6" - -/obj/item/dice/d6/space/New() - ..() - if(prob(10)) - name = "spess cube" - -/obj/item/dice/fudge - name = "fudge die" - desc = "A die with six sides but only three results. Is this a plus or a minus? Your mind is drawing a blank..." - sides = 3 //shhh - icon_state = "fudge" - special_faces = list("minus","blank","plus") - -/obj/item/dice/d8 - name = "d8" - desc = "A die with eight sides. It feels... lucky." - icon_state = "d8" - sides = 8 - -/obj/item/dice/d10 - name = "d10" - desc = "A die with ten sides. Useful for percentages." - icon_state = "d10" - sides = 10 - -/obj/item/dice/d00 - name = "d00" - desc = "A die with ten sides. Works better for d100 rolls than a golfball." - icon_state = "d00" - sides = 10 - -/obj/item/dice/d12 - name = "d12" - desc = "A die with twelve sides. There's an air of neglect about it." - icon_state = "d12" - sides = 12 - -/obj/item/dice/d20 - name = "d20" - desc = "A die with twenty sides. The prefered die to throw at the GM." - icon_state = "d20" - sides = 20 - -/obj/item/dice/d100 - name = "d100" - desc = "A die with one hundred sides! Probably not fairly weighted..." - icon_state = "d100" - sides = 100 - -/obj/item/dice/d100/update_icon() - return - -/obj/item/dice/eightbd20 - name = "strange d20" - desc = "A weird die with raised text printed on the faces. Everything's white on white so reading it is a struggle. What poor design!" - icon_state = "8bd20" - sides = 20 - special_faces = list("It is certain","It is decidedly so","Without a doubt","Yes, definitely","You may rely on it","As I see it, yes","Most likely","Outlook good","Yes","Signs point to yes","Reply hazy try again","Ask again later","Better not tell you now","Cannot predict now","Concentrate and ask again","Don't count on it","My reply is no","My sources say no","Outlook not so good","Very doubtful") - -/obj/item/dice/eightbd20/update_icon() - return - -/obj/item/dice/fourdd6 - name = "4d d6" - desc = "A die that exists in four dimensional space. Properly interpreting them can only be properly done with the help of a mathematician, a physicist, and a priest." - icon_state = "4dd6" - sides = 48 - special_faces = list("Cube-Side: 1-1","Cube-Side: 1-2","Cube-Side: 1-3","Cube-Side: 1-4","Cube-Side: 1-5","Cube-Side: 1-6","Cube-Side: 2-1","Cube-Side: 2-2","Cube-Side: 2-3","Cube-Side: 2-4","Cube-Side: 2-5","Cube-Side: 2-6","Cube-Side: 3-1","Cube-Side: 3-2","Cube-Side: 3-3","Cube-Side: 3-4","Cube-Side: 3-5","Cube-Side: 3-6","Cube-Side: 4-1","Cube-Side: 4-2","Cube-Side: 4-3","Cube-Side: 4-4","Cube-Side: 4-5","Cube-Side: 4-6","Cube-Side: 5-1","Cube-Side: 5-2","Cube-Side: 5-3","Cube-Side: 5-4","Cube-Side: 5-5","Cube-Side: 5-6","Cube-Side: 6-1","Cube-Side: 6-2","Cube-Side: 6-3","Cube-Side: 6-4","Cube-Side: 6-5","Cube-Side: 6-6","Cube-Side: 7-1","Cube-Side: 7-2","Cube-Side: 7-3","Cube-Side: 7-4","Cube-Side: 7-5","Cube-Side: 7-6","Cube-Side: 8-1","Cube-Side: 8-2","Cube-Side: 8-3","Cube-Side: 8-4","Cube-Side: 8-5","Cube-Side: 8-6") - -/obj/item/dice/fourdd6/update_icon() - return - -/obj/item/dice/attack_self(mob/user) - diceroll(user) - -/obj/item/dice/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) - if(!..()) - return - diceroll(thrower) - -/obj/item/dice/proc/diceroll(mob/user) - result = rand(1, sides) - if(rigged && result != rigged) - if(prob(Clamp(1/(sides - 1) * 100, 25, 80))) - result = rigged - var/fake_result = rand(1, sides)//Daredevil isn't as good as he used to be - var/comment = "" - if(sides == 20 && result == 20) - comment = "Nat 20!" - else if(sides == 20 && result == 1) - comment = "Ouch, bad luck." - update_icon() - if(initial(icon_state) == "d00") - result = (result - 1)*10 - if(special_faces.len == sides) - result = special_faces[result] - if(user != null) //Dice was rolled in someone's hand - user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ - "You throw [src]. It lands on [result]. [comment]", \ - "You hear [src] rolling, it sounds like a [fake_result].") - else if(!src.throwing) //Dice was thrown and is coming to rest - visible_message("[src] rolls to a stop, landing on [result]. [comment]") - -/obj/item/dice/d4/Crossed(mob/living/carbon/human/H) - if(istype(H) && !H.shoes) - if(PIERCEIMMUNE in H.dna.species.species_traits) - return 0 - to_chat(H, "You step on the D4!") - H.apply_damage(4,BRUTE,(pick("l_leg", "r_leg"))) - H.Knockdown(60) - -/obj/item/dice/update_icon() - cut_overlays() - add_overlay("[src.icon_state][src.result]") - -/obj/item/dice/microwave_act(obj/machinery/microwave/M) - if(can_be_rigged) - rigged = result - ..(M) +/obj/item/storage/pill_bottle/dice + name = "bag of dice" + desc = "Contains all the luck you'll ever need." + icon = 'icons/obj/dice.dmi' + icon_state = "dicebag" + +/obj/item/storage/pill_bottle/dice/New() + ..() + var/special_die = pick("1","2","fudge","space","00","8bd20","4dd6","100") + if(special_die == "1") + new /obj/item/dice/d1(src) + if(special_die == "2") + new /obj/item/dice/d2(src) + new /obj/item/dice/d4(src) + new /obj/item/dice/d6(src) + if(special_die == "fudge") + new /obj/item/dice/fudge(src) + if(special_die == "space") + new /obj/item/dice/d6/space(src) + new /obj/item/dice/d8(src) + new /obj/item/dice/d10(src) + if(special_die == "00") + new /obj/item/dice/d00(src) + new /obj/item/dice/d12(src) + new /obj/item/dice/d20(src) + if(special_die == "8bd20") + new /obj/item/dice/eightbd20(src) + if(special_die == "4dd6") + new /obj/item/dice/fourdd6(src) + if(special_die == "100") + new /obj/item/dice/d100(src) + +/obj/item/dice //depreciated d6, use /obj/item/dice/d6 if you actually want a d6 + name = "die" + desc = "A die with six sides. Basic and servicable." + icon = 'icons/obj/dice.dmi' + icon_state = "d6" + w_class = WEIGHT_CLASS_TINY + var/sides = 6 + var/result = null + var/list/special_faces = list() //entries should match up to sides var if used + var/can_be_rigged = TRUE + var/rigged = FALSE + +/obj/item/dice/New() + result = rand(1, sides) + update_icon() + ..() + +/obj/item/dice/d1 + name = "d1" + desc = "A die with one side. Deterministic!" + icon_state = "d1" + sides = 1 + +/obj/item/dice/d2 + name = "d2" + desc = "A die with two sides. Coins are undignified!" + icon_state = "d2" + sides = 2 + +/obj/item/dice/d4 + name = "d4" + desc = "A die with four sides. The nerd's caltrop." + icon_state = "d4" + sides = 4 + +/obj/item/dice/d6 + name = "d6" + +/obj/item/dice/d6/space + name = "space cube" + desc = "A die with six sides. 6 TIMES 255 TIMES 255 TILE TOTAL EXISTENCE, SQUARE YOUR MIND OF EDUCATED STUPID: 2 DOES NOT EXIST." + icon_state = "spaced6" + +/obj/item/dice/d6/space/New() + ..() + if(prob(10)) + name = "spess cube" + +/obj/item/dice/fudge + name = "fudge die" + desc = "A die with six sides but only three results. Is this a plus or a minus? Your mind is drawing a blank..." + sides = 3 //shhh + icon_state = "fudge" + special_faces = list("minus","blank","plus") + +/obj/item/dice/d8 + name = "d8" + desc = "A die with eight sides. It feels... lucky." + icon_state = "d8" + sides = 8 + +/obj/item/dice/d10 + name = "d10" + desc = "A die with ten sides. Useful for percentages." + icon_state = "d10" + sides = 10 + +/obj/item/dice/d00 + name = "d00" + desc = "A die with ten sides. Works better for d100 rolls than a golfball." + icon_state = "d00" + sides = 10 + +/obj/item/dice/d12 + name = "d12" + desc = "A die with twelve sides. There's an air of neglect about it." + icon_state = "d12" + sides = 12 + +/obj/item/dice/d20 + name = "d20" + desc = "A die with twenty sides. The prefered die to throw at the GM." + icon_state = "d20" + sides = 20 + +/obj/item/dice/d100 + name = "d100" + desc = "A die with one hundred sides! Probably not fairly weighted..." + icon_state = "d100" + sides = 100 + +/obj/item/dice/d100/update_icon() + return + +/obj/item/dice/eightbd20 + name = "strange d20" + desc = "A weird die with raised text printed on the faces. Everything's white on white so reading it is a struggle. What poor design!" + icon_state = "8bd20" + sides = 20 + special_faces = list("It is certain","It is decidedly so","Without a doubt","Yes, definitely","You may rely on it","As I see it, yes","Most likely","Outlook good","Yes","Signs point to yes","Reply hazy try again","Ask again later","Better not tell you now","Cannot predict now","Concentrate and ask again","Don't count on it","My reply is no","My sources say no","Outlook not so good","Very doubtful") + +/obj/item/dice/eightbd20/update_icon() + return + +/obj/item/dice/fourdd6 + name = "4d d6" + desc = "A die that exists in four dimensional space. Properly interpreting them can only be properly done with the help of a mathematician, a physicist, and a priest." + icon_state = "4dd6" + sides = 48 + special_faces = list("Cube-Side: 1-1","Cube-Side: 1-2","Cube-Side: 1-3","Cube-Side: 1-4","Cube-Side: 1-5","Cube-Side: 1-6","Cube-Side: 2-1","Cube-Side: 2-2","Cube-Side: 2-3","Cube-Side: 2-4","Cube-Side: 2-5","Cube-Side: 2-6","Cube-Side: 3-1","Cube-Side: 3-2","Cube-Side: 3-3","Cube-Side: 3-4","Cube-Side: 3-5","Cube-Side: 3-6","Cube-Side: 4-1","Cube-Side: 4-2","Cube-Side: 4-3","Cube-Side: 4-4","Cube-Side: 4-5","Cube-Side: 4-6","Cube-Side: 5-1","Cube-Side: 5-2","Cube-Side: 5-3","Cube-Side: 5-4","Cube-Side: 5-5","Cube-Side: 5-6","Cube-Side: 6-1","Cube-Side: 6-2","Cube-Side: 6-3","Cube-Side: 6-4","Cube-Side: 6-5","Cube-Side: 6-6","Cube-Side: 7-1","Cube-Side: 7-2","Cube-Side: 7-3","Cube-Side: 7-4","Cube-Side: 7-5","Cube-Side: 7-6","Cube-Side: 8-1","Cube-Side: 8-2","Cube-Side: 8-3","Cube-Side: 8-4","Cube-Side: 8-5","Cube-Side: 8-6") + +/obj/item/dice/fourdd6/update_icon() + return + +/obj/item/dice/attack_self(mob/user) + diceroll(user) + +/obj/item/dice/throw_impact(atom/target) + diceroll(thrownby) + . = ..() + +/obj/item/dice/proc/diceroll(mob/user) + result = rand(1, sides) + if(rigged && result != rigged) + if(prob(Clamp(1/(sides - 1) * 100, 25, 80))) + result = rigged + var/fake_result = rand(1, sides)//Daredevil isn't as good as he used to be + var/comment = "" + if(sides == 20 && result == 20) + comment = "Nat 20!" + else if(sides == 20 && result == 1) + comment = "Ouch, bad luck." + update_icon() + if(initial(icon_state) == "d00") + result = (result - 1)*10 + if(special_faces.len == sides) + result = special_faces[result] + if(user != null) //Dice was rolled in someone's hand + user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ + "You throw [src]. It lands on [result]. [comment]", \ + "You hear [src] rolling, it sounds like a [fake_result].") + else if(!src.throwing) //Dice was thrown and is coming to rest + visible_message("[src] rolls to a stop, landing on [result]. [comment]") + +/obj/item/dice/d4/Crossed(mob/living/carbon/human/H) + if(istype(H) && !H.shoes) + if(PIERCEIMMUNE in H.dna.species.species_traits) + return 0 + to_chat(H, "You step on the D4!") + H.apply_damage(4,BRUTE,(pick("l_leg", "r_leg"))) + H.Knockdown(60) + +/obj/item/dice/update_icon() + cut_overlays() + add_overlay("[src.icon_state][src.result]") + +/obj/item/dice/microwave_act(obj/machinery/microwave/M) + if(can_be_rigged) + rigged = result + ..(M) diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index 82d4c3d99f..d8be420a08 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -37,10 +37,10 @@ "Very doubtful") /obj/item/toy/eightball/Initialize(mapload) - ..() + . = ..() if(prob(1)) new /obj/item/toy/eightball/haunted(get_turf(src)) - qdel(src) + return INITIALIZE_HINT_QDEL /obj/item/toy/eightball/attack_self(mob/user) if(shaking) @@ -81,7 +81,7 @@ var/fixed_answer /obj/item/toy/eightball/broken/Initialize(mapload) - ..() + . = ..() fixed_answer = pick(possible_answers) /obj/item/toy/eightball/broken/get_answer() @@ -97,7 +97,7 @@ var/list/votes /obj/item/toy/eightball/haunted/Initialize(mapload) - ..() + . = ..() votes = list() GLOB.poi_list |= src diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index b352596e2f..833d215180 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -292,7 +292,7 @@ var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast) var/turf/T = get_turf(src) var/area/A = get_area(T) - message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") + message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") else addtimer(CALLBACK(src, .proc/prime), det_time) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index bf5cf0417c..50b0f4e7e6 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -253,7 +253,7 @@ var/trap_damage = 20 /obj/item/restraints/legcuffs/beartrap/Initialize() - ..() + . = ..() icon_state = "[initial(icon_state)][armed]" /obj/item/restraints/legcuffs/beartrap/suicide_act(mob/user) @@ -369,4 +369,4 @@ var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom)) B.Crossed(hit_atom) qdel(src) - ..() + ..() \ No newline at end of file diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index ac5519c698..1badef90cf 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -9,6 +9,7 @@ throw_speed = 3 throw_range = 4 throwforce = 10 + unique_rename = TRUE w_class = WEIGHT_CLASS_TINY var/reskinned = FALSE @@ -244,6 +245,7 @@ S.name = name S.ckey = theghost.ckey S.status_flags |= GODMODE + S.language_holder = user.language_holder.copy(S) var/input = stripped_input(S,"What are you named?", ,"", MAX_NAME_LEN) if(src && input) @@ -381,12 +383,10 @@ flags_2 = SLOWS_WHILE_IN_HAND_2 /obj/item/nullrod/tribal_knife/Initialize(mapload) - ..() - -/obj/item/nullrod/tribal_knife/New() - ..() + . = ..() START_PROCESSING(SSobj, src) + /obj/item/nullrod/tribal_knife/Destroy() STOP_PROCESSING(SSobj, src) . = ..() @@ -408,7 +408,7 @@ /obj/item/nullrod/egyptian name = "egyptian staff" - desc = "A tutorial in mummification is carved into the staff. You could probably follow the steps yourself if you had some bandages." + desc = "A tutorial in mummification is carved into the staff. You could probably craft the wraps if you had some cloth." icon = 'icons/obj/guns/magic.dmi' icon_state = "pharoah_sceptre" item_state = "pharoah_sceptre" diff --git a/code/game/objects/items/implants/implant_abductor.dm b/code/game/objects/items/implants/implant_abductor.dm index 74642edd66..710e2d738e 100644 --- a/code/game/objects/items/implants/implant_abductor.dm +++ b/code/game/objects/items/implants/implant_abductor.dm @@ -26,21 +26,15 @@ if(..()) var/obj/machinery/abductor/console/console if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.dna.species.id == "abductor") - var/datum/species/abductor/S = H.dna.species - console = get_team_console(S.team) + var/datum/antagonist/abductor/A = target.mind.has_antag_datum(ANTAG_DATUM_ABDUCTOR) + if(A) + console = get_abductor_console(A.team.team_number) home = console.pad if(!home) - console = get_team_console(pick(1, 2, 3, 4)) + var/list/consoles = list() + for(var/obj/machinery/abductor/console/C in GLOB.machines) + consoles += C + console = pick(consoles) home = console.pad - return 1 - -/obj/item/implant/abductor/proc/get_team_console(var/team) - var/obj/machinery/abductor/console/console - for(var/obj/machinery/abductor/console/c in GLOB.machines) - if(c.team == team) - console = c - break - return console + return TRUE diff --git a/code/game/objects/items/implants/implant_loyality.dm b/code/game/objects/items/implants/implant_loyality.dm index e25fc8dda6..a1e9a0e4d5 100644 --- a/code/game/objects/items/implants/implant_loyality.dm +++ b/code/game/objects/items/implants/implant_loyality.dm @@ -26,7 +26,7 @@ qdel(src) return 0 if(target.mind in SSticker.mode.revolutionaries) - SSticker.mode.remove_revolutionary(target.mind) + SSticker.mode.remove_revolutionary(target.mind, FALSE, user) if(!silent) if(target.mind in SSticker.mode.cult) to_chat(target, "You feel something interfering with your mental conditioning, but you resist it!") diff --git a/code/game/objects/items/implants/implantcase.dm b/code/game/objects/items/implants/implantcase.dm index 08681ac9e4..0bafff176b 100644 --- a/code/game/objects/items/implants/implantcase.dm +++ b/code/game/objects/items/implants/implantcase.dm @@ -61,7 +61,7 @@ return ..() /obj/item/implantcase/Initialize(mapload) - ..() + . = ..() if(imp_type) imp = new imp_type(src) update_icon() @@ -80,4 +80,4 @@ /obj/item/implantcase/adrenaline name = "implant case - 'Adrenaline'" desc = "A glass case containing an adrenaline implant." - imp_type = /obj/item/implant/adrenalin + imp_type = /obj/item/implant/adrenalin \ No newline at end of file diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index 2f59020cbe..8d252cb5af 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -20,7 +20,7 @@ var/special = FALSE var/special_name = "special function" var/message_cooldown - var/breakout_time = 1 + var/breakout_time = 600 /obj/machinery/implantchair/Initialize() . = ..() @@ -85,10 +85,17 @@ update_icon() /obj/machinery/implantchair/proc/implant_action(mob/living/M) - var/obj/item/implant/I = new implant_type - if(I.implant(M)) - visible_message("[M] has been implanted by the [name].") - return 1 + var/obj/item/I = new implant_type + if(istype(I, /obj/item/implant)) + var/obj/item/implant/P = I + if(P.implant(M)) + visible_message("[M] has been implanted by [src].") + return TRUE + else if(istype(I, /obj/item/organ)) + var/obj/item/organ/P = I + P.Insert(M, drop_if_replaced = FALSE) + visible_message("[M] has been implanted by [src].") + return TRUE /obj/machinery/implantchair/update_icon() icon_state = initial(icon_state) @@ -117,9 +124,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the door of [src]!", \ - "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a metallic creaking from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) return user.visible_message("[user] successfully broke out of [src]!", \ diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm index 24b1928dbc..372671acf5 100644 --- a/code/game/objects/items/implants/implanter.dm +++ b/code/game/objects/items/implants/implanter.dm @@ -59,7 +59,7 @@ return ..() /obj/item/implanter/Initialize(mapload) - ..() + . = ..() if(imp_type) imp = new imp_type(src) update_icon() @@ -70,4 +70,4 @@ /obj/item/implanter/emp name = "implanter (EMP)" - imp_type = /obj/item/implant/emp + imp_type = /obj/item/implant/emp \ No newline at end of file diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 2ba1f89b03..4bc134e4da 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -1,229 +1,230 @@ -/obj/item/melee/transforming/energy - hitsound_on = 'sound/weapons/blade1.ogg' - heat = 3500 - max_integrity = 200 - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30) - resistance_flags = FIRE_PROOF - var/brightness_on = 3 - -/obj/item/melee/transforming/energy/Initialize() - . = ..() - if(active) - set_light(brightness_on) - START_PROCESSING(SSobj, src) - -/obj/item/melee/transforming/energy/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/melee/transforming/energy/suicide_act(mob/user) - user.visible_message("[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku!") - return (BRUTELOSS|FIRELOSS) - -/obj/item/melee/transforming/energy/add_blood(list/blood_dna) - return 0 - -/obj/item/melee/transforming/energy/is_sharp() - return active * sharpness - -/obj/item/melee/transforming/energy/process() - open_flame() - -/obj/item/melee/transforming/energy/transform_weapon(mob/living/user, supress_message_text) - . = ..() - if(.) - if(active) - if(item_color) - icon_state = "sword[item_color]" - START_PROCESSING(SSobj, src) - set_light(brightness_on) - else - STOP_PROCESSING(SSobj, src) - set_light(0) - -/obj/item/melee/transforming/energy/is_hot() - return active * heat - -/obj/item/melee/transforming/energy/ignition_effect(atom/A, mob/user) - if(!active) - return "" - - var/in_mouth = "" - if(iscarbon(user)) - var/mob/living/carbon/C = user - if(C.wear_mask == src) - in_mouth = ", barely missing their nose" - . = "[user] swings their [src][in_mouth]. They light [A] in the process." - playsound(loc, hitsound, get_clamped_volume(), 1, -1) - add_fingerprint(user) - -/obj/item/melee/transforming/energy/axe - name = "energy axe" - desc = "An energized battle axe." - icon_state = "axe0" - lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi' - force = 40 - force_on = 150 - throwforce = 25 - throwforce_on = 30 - hitsound = 'sound/weapons/bladeslice.ogg' - throw_speed = 3 - throw_range = 5 - w_class = WEIGHT_CLASS_NORMAL - w_class_on = WEIGHT_CLASS_HUGE - flags_1 = CONDUCT_1 - armour_penetration = 100 - origin_tech = "combat=4;magnets=3" - attack_verb_off = list("attacked", "chopped", "cleaved", "torn", "cut") - attack_verb_on = list() - light_color = "#40ceff" - -/obj/item/melee/transforming/energy/axe/suicide_act(mob/user) - user.visible_message("[user] swings [src] towards [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") - return (BRUTELOSS|FIRELOSS) - -/obj/item/melee/transforming/energy/sword - name = "energy sword" - desc = "May the force be within you." - icon_state = "sword0" - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - force = 3 - throwforce = 5 - hitsound = "swing_hit" //it starts deactivated - attack_verb_off = list("tapped", "poked") - throw_speed = 3 - throw_range = 5 - sharpness = IS_SHARP - embed_chance = 75 - embedded_impact_pain_multiplier = 10 - armour_penetration = 35 - origin_tech = "combat=3;magnets=4;syndicate=4" - block_chance = 50 - -/obj/item/melee/transforming/energy/sword/transform_weapon(mob/living/user, supress_message_text) - . = ..() - if(. && active && item_color) - icon_state = "sword[item_color]" - -/obj/item/melee/transforming/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(active) - return ..() - return 0 - -/obj/item/melee/transforming/energy/sword/cyborg - var/hitcost = 50 - -/obj/item/melee/transforming/energy/sword/cyborg/attack(mob/M, var/mob/living/silicon/robot/R) - if(R.cell) - var/obj/item/stock_parts/cell/C = R.cell - if(active && !(C.use(hitcost))) - attack_self(R) - to_chat(R, "It's out of charge!") - return - return ..() - -/obj/item/melee/transforming/energy/sword/cyborg/saw //Used by medical Syndicate cyborgs - name = "energy saw" - desc = "For heavy duty cutting. It has a carbon-fiber blade in addition to a toggleable hard-light edge to dramatically increase sharpness." - icon_state = "esaw" - force_on = 30 - force = 18 //About as much as a spear - hitsound = 'sound/weapons/circsawhit.ogg' - icon = 'icons/obj/surgery.dmi' - icon_state = "esaw_0" - icon_state_on = "esaw_1" - hitcost = 75 //Costs more than a standard cyborg esword - w_class = WEIGHT_CLASS_NORMAL - sharpness = IS_SHARP - light_color = "#40ceff" - -/obj/item/melee/transforming/energy/sword/cyborg/saw/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - return 0 - -/obj/item/melee/transforming/energy/sword/saber - var/list/possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER) - var/hacked = FALSE - -/obj/item/melee/transforming/energy/sword/saber/Initialize(mapload) - . = ..() - if(LAZYLEN(possible_colors)) - var/set_color = pick(possible_colors) - item_color = set_color - light_color = possible_colors[set_color] - -/obj/item/melee/transforming/energy/sword/saber/process() - . = ..() - if(hacked) - var/set_color = pick(possible_colors) - light_color = possible_colors[set_color] - update_light() - -/obj/item/melee/transforming/energy/sword/saber/red - possible_colors = list("red" = LIGHT_COLOR_RED) - -/obj/item/melee/transforming/energy/sword/saber/blue - possible_colors = list("blue" = LIGHT_COLOR_LIGHT_CYAN) - -/obj/item/melee/transforming/energy/sword/saber/green - possible_colors = list("green" = LIGHT_COLOR_GREEN) - -/obj/item/melee/transforming/energy/sword/saber/purple - possible_colors = list("purple" = LIGHT_COLOR_LAVENDER) - -/obj/item/melee/transforming/energy/sword/saber/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/device/multitool)) - if(!hacked) - hacked = TRUE - item_color = "rainbow" - to_chat(user, "RNBW_ENGAGE") - - if(active) - icon_state = "swordrainbow" - user.update_inv_hands() - else - to_chat(user, "It's already fabulous!") - else - return ..() - -/obj/item/melee/transforming/energy/sword/pirate - name = "energy cutlass" - desc = "Arrrr matey." - icon_state = "cutlass0" - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - icon_state_on = "cutlass1" - light_color = "#ff0000" - -/obj/item/melee/transforming/energy/blade - name = "energy blade" - desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." - icon_state = "blade" - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - force = 30 //Normal attacks deal esword damage - hitsound = 'sound/weapons/blade1.ogg' - active = 1 - throwforce = 1 //Throwing or dropping the item deletes it. - throw_speed = 3 - throw_range = 1 - w_class = WEIGHT_CLASS_BULKY//So you can't hide it in your pocket or some such. - var/datum/effect_system/spark_spread/spark_system - sharpness = IS_SHARP - -//Most of the other special functions are handled in their own files. aka special snowflake code so kewl -/obj/item/melee/transforming/energy/blade/Initialize() - . = ..() - spark_system = new /datum/effect_system/spark_spread() - spark_system.set_up(5, 0, src) - spark_system.attach(src) - -/obj/item/melee/transforming/energy/blade/transform_weapon(mob/living/user, supress_message_text) - return - -/obj/item/melee/transforming/energy/blade/hardlight - name = "hardlight blade" - desc = "An extremely sharp blade made out of hard light. Packs quite a punch." - icon_state = "lightblade" - item_state = "lightblade" +/obj/item/melee/transforming/energy + hitsound_on = 'sound/weapons/blade1.ogg' + heat = 3500 + max_integrity = 200 + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30) + resistance_flags = FIRE_PROOF + var/brightness_on = 3 + +/obj/item/melee/transforming/energy/Initialize() + . = ..() + if(active) + set_light(brightness_on) + START_PROCESSING(SSobj, src) + +/obj/item/melee/transforming/energy/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/melee/transforming/energy/suicide_act(mob/user) + user.visible_message("[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku!") + return (BRUTELOSS|FIRELOSS) + +/obj/item/melee/transforming/energy/add_blood(list/blood_dna) + return 0 + +/obj/item/melee/transforming/energy/is_sharp() + return active * sharpness + +/obj/item/melee/transforming/energy/process() + open_flame() + +/obj/item/melee/transforming/energy/transform_weapon(mob/living/user, supress_message_text) + . = ..() + if(.) + if(active) + if(item_color) + icon_state = "sword[item_color]" + START_PROCESSING(SSobj, src) + set_light(brightness_on) + else + STOP_PROCESSING(SSobj, src) + set_light(0) + +/obj/item/melee/transforming/energy/is_hot() + return active * heat + +/obj/item/melee/transforming/energy/ignition_effect(atom/A, mob/user) + if(!active) + return "" + + var/in_mouth = "" + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(C.wear_mask == src) + in_mouth = ", barely missing their nose" + . = "[user] swings their [src][in_mouth]. They light [A] in the process." + playsound(loc, hitsound, get_clamped_volume(), 1, -1) + add_fingerprint(user) + +/obj/item/melee/transforming/energy/axe + name = "energy axe" + desc = "An energized battle axe." + icon_state = "axe0" + lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi' + force = 40 + force_on = 150 + throwforce = 25 + throwforce_on = 30 + hitsound = 'sound/weapons/bladeslice.ogg' + throw_speed = 3 + throw_range = 5 + w_class = WEIGHT_CLASS_NORMAL + w_class_on = WEIGHT_CLASS_HUGE + flags_1 = CONDUCT_1 + armour_penetration = 100 + origin_tech = "combat=4;magnets=3" + attack_verb_off = list("attacked", "chopped", "cleaved", "torn", "cut") + attack_verb_on = list() + light_color = "#40ceff" + +/obj/item/melee/transforming/energy/axe/suicide_act(mob/user) + user.visible_message("[user] swings [src] towards [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") + return (BRUTELOSS|FIRELOSS) + +/obj/item/melee/transforming/energy/sword + name = "energy sword" + desc = "May the force be within you." + icon_state = "sword0" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + force = 3 + throwforce = 5 + hitsound = "swing_hit" //it starts deactivated + attack_verb_off = list("tapped", "poked") + throw_speed = 3 + throw_range = 5 + sharpness = IS_SHARP + embed_chance = 75 + embedded_impact_pain_multiplier = 10 + armour_penetration = 35 + origin_tech = "combat=3;magnets=4;syndicate=4" + block_chance = 50 + +/obj/item/melee/transforming/energy/sword/transform_weapon(mob/living/user, supress_message_text) + . = ..() + if(. && active && item_color) + icon_state = "sword[item_color]" + +/obj/item/melee/transforming/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(active) + return ..() + return 0 + +/obj/item/melee/transforming/energy/sword/cyborg + item_color = "red" + var/hitcost = 50 + +/obj/item/melee/transforming/energy/sword/cyborg/attack(mob/M, var/mob/living/silicon/robot/R) + if(R.cell) + var/obj/item/stock_parts/cell/C = R.cell + if(active && !(C.use(hitcost))) + attack_self(R) + to_chat(R, "It's out of charge!") + return + return ..() + +/obj/item/melee/transforming/energy/sword/cyborg/saw //Used by medical Syndicate cyborgs + name = "energy saw" + desc = "For heavy duty cutting. It has a carbon-fiber blade in addition to a toggleable hard-light edge to dramatically increase sharpness." + force_on = 30 + force = 18 //About as much as a spear + hitsound = 'sound/weapons/circsawhit.ogg' + icon = 'icons/obj/surgery.dmi' + icon_state = "esaw_0" + icon_state_on = "esaw_1" + item_color = null //stops icon from breaking when turned on. + hitcost = 75 //Costs more than a standard cyborg esword + w_class = WEIGHT_CLASS_NORMAL + sharpness = IS_SHARP + light_color = "#40ceff" + +/obj/item/melee/transforming/energy/sword/cyborg/saw/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + return 0 + +/obj/item/melee/transforming/energy/sword/saber + var/list/possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER) + var/hacked = FALSE + +/obj/item/melee/transforming/energy/sword/saber/Initialize(mapload) + . = ..() + if(LAZYLEN(possible_colors)) + var/set_color = pick(possible_colors) + item_color = set_color + light_color = possible_colors[set_color] + +/obj/item/melee/transforming/energy/sword/saber/process() + . = ..() + if(hacked) + var/set_color = pick(possible_colors) + light_color = possible_colors[set_color] + update_light() + +/obj/item/melee/transforming/energy/sword/saber/red + possible_colors = list("red" = LIGHT_COLOR_RED) + +/obj/item/melee/transforming/energy/sword/saber/blue + possible_colors = list("blue" = LIGHT_COLOR_LIGHT_CYAN) + +/obj/item/melee/transforming/energy/sword/saber/green + possible_colors = list("green" = LIGHT_COLOR_GREEN) + +/obj/item/melee/transforming/energy/sword/saber/purple + possible_colors = list("purple" = LIGHT_COLOR_LAVENDER) + +/obj/item/melee/transforming/energy/sword/saber/attackby(obj/item/W, mob/living/user, params) + if(istype(W, /obj/item/device/multitool)) + if(!hacked) + hacked = TRUE + item_color = "rainbow" + to_chat(user, "RNBW_ENGAGE") + + if(active) + icon_state = "swordrainbow" + user.update_inv_hands() + else + to_chat(user, "It's already fabulous!") + else + return ..() + +/obj/item/melee/transforming/energy/sword/pirate + name = "energy cutlass" + desc = "Arrrr matey." + icon_state = "cutlass0" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + icon_state_on = "cutlass1" + light_color = "#ff0000" + +/obj/item/melee/transforming/energy/blade + name = "energy blade" + desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." + icon_state = "blade" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + force = 30 //Normal attacks deal esword damage + hitsound = 'sound/weapons/blade1.ogg' + active = 1 + throwforce = 1 //Throwing or dropping the item deletes it. + throw_speed = 3 + throw_range = 1 + w_class = WEIGHT_CLASS_BULKY//So you can't hide it in your pocket or some such. + var/datum/effect_system/spark_spread/spark_system + sharpness = IS_SHARP + +//Most of the other special functions are handled in their own files. aka special snowflake code so kewl +/obj/item/melee/transforming/energy/blade/Initialize() + . = ..() + spark_system = new /datum/effect_system/spark_spread() + spark_system.set_up(5, 0, src) + spark_system.attach(src) + +/obj/item/melee/transforming/energy/blade/transform_weapon(mob/living/user, supress_message_text) + return + +/obj/item/melee/transforming/energy/blade/hardlight + name = "hardlight blade" + desc = "An extremely sharp blade made out of hard light. Packs quite a punch." + icon_state = "lightblade" + item_state = "lightblade" diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm new file mode 100644 index 0000000000..b22383ad58 --- /dev/null +++ b/code/game/objects/items/plushes.dm @@ -0,0 +1,74 @@ +/obj/item/toy/plush + name = "plush" + desc = "this is the special coder plush, do not steal" + icon = 'icons/obj/plushes.dmi' + icon_state = "debug" + attack_verb = list("thumped", "whomped", "bumped") + w_class = WEIGHT_CLASS_SMALL + resistance_flags = FLAMMABLE + var/list/squeak_override //Weighted list; If you want your plush to have different squeak sounds use this + +/obj/item/toy/plush/Initialize() + . = ..() + AddComponent(/datum/component/squeak, squeak_override) + +/obj/item/toy/plush/attack_self(mob/user) + . = ..() + to_chat(user, "You pet [src]. D'awww.") + +/obj/item/toy/plush/carpplushie + name = "space carp plushie" + desc = "An adorable stuffed toy that resembles a space carp." + icon_state = "carpplush" + item_state = "carp_plushie" + attack_verb = list("bitten", "eaten", "fin slapped") + squeak_override = list('sound/weapons/bite.ogg'=1) + +/obj/item/toy/plush/bubbleplush + name = "bubblegum plushie" + desc = "The friendly red demon that gives good miners gifts." + icon_state = "bubbleplush" + attack_verb = list("rends") + squeak_override = list('sound/magic/demon_attack1.ogg'=1) + +/obj/item/toy/plush/plushvar + name = "ratvar plushie" + desc = "An adorable plushie of the clockwork justiciar himself with new and improved spring arm action." + icon_state = "plushvar" + +/obj/item/toy/plush/narplush + name = "nar'sie plushie" + desc = "A small stuffed doll of the elder god nar'sie. Who thought this was a good children's toy?" + icon_state = "narplush" + +/obj/item/toy/plush/lizardplushie + name = "lizard plushie" + desc = "An adorable stuffed toy that resembles a lizardperson." + icon_state = "plushie_lizard" + item_state = "plushie_lizard" + attack_verb = list("clawed", "hissed", "tail slapped") + squeak_override = list('sound/weapons/slash.ogg' = 1) + +/obj/item/toy/plush/snakeplushie + name = "snake plushie" + desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." + icon_state = "plushie_snake" + item_state = "plushie_snake" + attack_verb = list("bitten", "hissed", "tail slapped") + squeak_override = list('sound/weapons/bite.ogg' = 1) + +/obj/item/toy/plush/nukeplushie + name = "operative plushie" + desc = "An stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious." + icon_state = "plushie_nuke" + item_state = "plushie_nuke" + attack_verb = list("shot", "nuked", "detonated") + squeak_override = list('sound/effects/hit_punch.ogg' = 1) + +/obj/item/toy/plush/slimeplushie + name = "slime plushie" + desc = "An adorable stuffed toy that resembles a slime. It is practically just a hacky sack." + icon_state = "plushie_slime" + item_state = "plushie_slime" + attack_verb = list("blorbled", "slimed", "absorbed") + squeak_override = list('sound/effects/blobattack.ogg' = 1) \ No newline at end of file diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index bcb7162617..3febaecfa9 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -113,7 +113,7 @@ /obj/item/borg/upgrade/thrusters name = "ion thruster upgrade" - desc = "A energy-operated thruster system for cyborgs." + desc = "An energy-operated thruster system for cyborgs." icon_state = "cyborg_upgrade3" origin_tech = "engineering=4;powerstorage=4" diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d4e9d596d7..cc718be2bd 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -149,7 +149,7 @@ if(!building_checks(R, multiplier)) return - var/atom/O = new R.result_type( usr.loc ) + var/obj/O = new R.result_type() O.setDir(usr.dir) use(R.req_amount * multiplier) @@ -168,11 +168,10 @@ new_item.amount = R.res_amount*multiplier new_item.update_icon() - if(new_item.amount <= 0)//if the stack is empty, i.e it has been merged with an existing stack and has been garbage collected - return - if (isitem(O)) usr.put_in_hands(O) + else + O.forceMove(usr.drop_location()) O.add_fingerprint(usr) //BubbleWrap - so newly formed boxes are empty diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index fe89f42338..2290ea91d3 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -289,7 +289,7 @@ icon_state = initial(icon_state) /obj/item/storage/backpack/satchel/flat/Initialize(mapload) - ..() + . = ..() SSpersistence.new_secret_satchels += src /obj/item/storage/backpack/satchel/flat/PopulateContents() @@ -306,7 +306,7 @@ var/revealed = 0 /obj/item/storage/backpack/satchel/flat/secret/Initialize() - ..() + . = ..() if(isfloorturf(loc) && !istype(loc, /turf/open/floor/plating/)) hide(1) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index cc60c9ba9c..489f1c6bf0 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -731,17 +731,18 @@ /obj/item/storage/box/ingredients //This box is for the randomely chosen version the chef spawns with, it shouldn't actually exist. name = "ingredients box" - illustration = "donk_kit" + illustration = "fruit" + var/theme_name /obj/item/storage/box/ingredients/Initialize() - ..() - if(icon_state) - name = "[name] ([icon_state])" - desc = "A box containing supplementary ingredients for the aspiring chef. This box's theme is '[icon_state]'." + . = ..() + if(theme_name) + name = "[name] ([theme_name])" + desc = "A box containing supplementary ingredients for the aspiring chef. The box's theme is '[theme_name]'." item_state = "syringe_kit" /obj/item/storage/box/ingredients/wildcard - icon_state = "wildcard" + theme_name = "wildcard" /obj/item/storage/box/ingredients/wildcard/PopulateContents() for(var/i in 1 to 7) @@ -762,7 +763,7 @@ new randomFood(src) /obj/item/storage/box/ingredients/fiesta - icon_state = "fiesta" + theme_name = "fiesta" /obj/item/storage/box/ingredients/fiesta/PopulateContents() new /obj/item/reagent_containers/food/snacks/tortilla(src) @@ -772,7 +773,7 @@ new /obj/item/reagent_containers/food/snacks/grown/chili(src) /obj/item/storage/box/ingredients/italian - icon_state = "italian" + theme_name = "italian" /obj/item/storage/box/ingredients/italian/PopulateContents() for(var/i in 1 to 3) @@ -781,7 +782,7 @@ new /obj/item/reagent_containers/food/drinks/bottle/wine(src) /obj/item/storage/box/ingredients/vegetarian - icon_state = "vegetarian" + theme_name = "vegetarian" /obj/item/storage/box/ingredients/vegetarian/PopulateContents() for(var/i in 1 to 2) @@ -793,7 +794,7 @@ new /obj/item/reagent_containers/food/snacks/grown/tomato(src) /obj/item/storage/box/ingredients/american - icon_state = "american" + theme_name = "american" /obj/item/storage/box/ingredients/american/PopulateContents() for(var/i in 1 to 2) @@ -803,7 +804,7 @@ new /obj/item/reagent_containers/food/snacks/faggot(src) /obj/item/storage/box/ingredients/fruity - icon_state = "fruity" + theme_name = "fruity" /obj/item/storage/box/ingredients/fruity/PopulateContents() for(var/i in 1 to 2) @@ -814,7 +815,7 @@ new /obj/item/reagent_containers/food/snacks/grown/watermelon(src) /obj/item/storage/box/ingredients/sweets - icon_state = "sweets" + theme_name = "sweets" /obj/item/storage/box/ingredients/sweets/PopulateContents() for(var/i in 1 to 2) @@ -825,7 +826,7 @@ new /obj/item/reagent_containers/food/snacks/grown/apple(src) /obj/item/storage/box/ingredients/delights - icon_state = "delights" + theme_name = "delights" /obj/item/storage/box/ingredients/delights/PopulateContents() for(var/i in 1 to 2) @@ -836,7 +837,7 @@ new /obj/item/reagent_containers/food/snacks/grown/berries(src) /obj/item/storage/box/ingredients/grains - icon_state = "grains" + theme_name = "grains" /obj/item/storage/box/ingredients/grains/PopulateContents() for(var/i in 1 to 3) @@ -847,7 +848,7 @@ new /obj/item/seeds/poppy(src) /obj/item/storage/box/ingredients/carnivore - icon_state = "carnivore" + theme_name = "carnivore" /obj/item/storage/box/ingredients/carnivore/PopulateContents() new /obj/item/reagent_containers/food/snacks/meat/slab/bear(src) @@ -859,7 +860,7 @@ new /obj/item/reagent_containers/food/snacks/faggot(src) /obj/item/storage/box/ingredients/exotic - icon_state = "exotic" + theme_name = "exotic" /obj/item/storage/box/ingredients/exotic/PopulateContents() for(var/i in 1 to 2) diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index 8107c5a1f8..df40b2898c 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -1,57 +1,56 @@ -/obj/item/storage/briefcase - name = "briefcase" - desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional." - icon_state = "briefcase" - lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi' - flags_1 = CONDUCT_1 - force = 8 - hitsound = "swing_hit" - throw_speed = 2 - throw_range = 4 - w_class = WEIGHT_CLASS_BULKY - max_w_class = WEIGHT_CLASS_NORMAL - max_combined_w_class = 21 - attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") - resistance_flags = FLAMMABLE - max_integrity = 150 - var/folder_path = /obj/item/folder //this is the path of the folder that gets spawned in New() - -/obj/item/storage/briefcase/PopulateContents() - new /obj/item/pen(src) - var/obj/item/folder/folder = new folder_path(src) - for(var/i in 1 to 6) - new /obj/item/paper(folder) - -/obj/item/storage/briefcase/lawyer - folder_path = /obj/item/folder/blue - -/obj/item/storage/briefcase/lawyer/PopulateContents() - new /obj/item/stamp/law(src) - ..() - -/obj/item/storage/briefcase/sniperbundle - name = "briefcase" - desc = "It's label reads genuine hardened Captain leather, but suspiciously has no other tags or branding. Smells like L'Air du Temps." - icon_state = "briefcase" - flags_1 = CONDUCT_1 - force = 10 - hitsound = "swing_hit" - throw_speed = 2 - throw_range = 4 - w_class = WEIGHT_CLASS_BULKY - max_w_class = WEIGHT_CLASS_NORMAL - max_combined_w_class = 21 - attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") - resistance_flags = FLAMMABLE - max_integrity = 150 - -/obj/item/storage/briefcase/sniperbundle/PopulateContents() - ..() // in case you need any paperwork done after your rampage - new /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate(src) - new /obj/item/clothing/neck/tie/red(src) - new /obj/item/clothing/under/syndicate/sniper(src) - new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) - new /obj/item/ammo_box/magazine/sniper_rounds/haemorrhage(src) - new /obj/item/suppressor/specialoffer(src) - +/obj/item/storage/briefcase + name = "briefcase" + desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional." + icon_state = "briefcase" + lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi' + flags_1 = CONDUCT_1 + force = 8 + hitsound = "swing_hit" + throw_speed = 2 + throw_range = 4 + w_class = WEIGHT_CLASS_BULKY + max_w_class = WEIGHT_CLASS_NORMAL + max_combined_w_class = 21 + attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") + resistance_flags = FLAMMABLE + max_integrity = 150 + var/folder_path = /obj/item/folder //this is the path of the folder that gets spawned in New() + +/obj/item/storage/briefcase/PopulateContents() + new /obj/item/pen(src) + var/obj/item/folder/folder = new folder_path(src) + for(var/i in 1 to 6) + new /obj/item/paper(folder) + +/obj/item/storage/briefcase/lawyer + folder_path = /obj/item/folder/blue + +/obj/item/storage/briefcase/lawyer/PopulateContents() + new /obj/item/stamp/law(src) + ..() + +/obj/item/storage/briefcase/sniperbundle + name = "briefcase" + desc = "It's label reads genuine hardened Captain leather, but suspiciously has no other tags or branding. Smells like L'Air du Temps." + icon_state = "briefcase" + flags_1 = CONDUCT_1 + force = 10 + hitsound = "swing_hit" + throw_speed = 2 + throw_range = 4 + w_class = WEIGHT_CLASS_BULKY + max_w_class = WEIGHT_CLASS_NORMAL + max_combined_w_class = 21 + attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") + resistance_flags = FLAMMABLE + max_integrity = 150 + +/obj/item/storage/briefcase/sniperbundle/PopulateContents() + ..() // in case you need any paperwork done after your rampage + new /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate(src) + new /obj/item/clothing/neck/tie/red(src) + new /obj/item/clothing/under/syndicate/sniper(src) + new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) + new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) + new /obj/item/suppressor/specialoffer(src) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 4b93fde13f..4dc90de6be 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -56,7 +56,7 @@ item_state = "firstaid-ointment" /obj/item/storage/firstaid/fire/Initialize(mapload) - ..() + . = ..() icon_state = pick("ointment","firefirstaid") /obj/item/storage/firstaid/fire/PopulateContents() diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index e6fe6da34d..dfcac18d29 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -19,7 +19,7 @@ var/has_latches = TRUE /obj/item/storage/toolbox/Initialize() - ..() + . = ..() if(has_latches) if(prob(10)) latches = "double_latch" @@ -183,4 +183,4 @@ new/obj/item/stack/cable_coil/pink(src) new/obj/item/stack/cable_coil/orange(src) new/obj/item/stack/cable_coil/cyan(src) - new/obj/item/stack/cable_coil/white(src) + new/obj/item/stack/cable_coil/white(src) \ No newline at end of file diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index e565ab1a1f..dd2ea47dc4 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -74,7 +74,7 @@ if (icon == src) to_chat(user, "If you want any more information you'll need to get closer.") return - to_chat(user, "The pressure gauge reads [src.air_contents.return_pressure()] kPa.") + to_chat(user, "The pressure gauge reads [round(src.air_contents.return_pressure(),0.01)] kPa.") var/celsius_temperature = src.air_contents.temperature-T0C var/descriptive @@ -236,7 +236,6 @@ if(!istype(src.loc, /obj/item/device/transfer_valve)) message_admins("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].") log_game("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].") - //to_chat(world, "\blue[x],[y] tank is exploding: [pressure] kPa") //Give the gas a chance to build up more pressure through reacting air_contents.react() air_contents.react() @@ -245,7 +244,6 @@ var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE var/turf/epicenter = get_turf(loc) - //to_chat(world, "\blue Exploding Pressure: [pressure] kPa, intensity: [range]") explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) if(istype(src.loc, /obj/item/device/transfer_valve)) @@ -254,7 +252,6 @@ qdel(src) else if(pressure > TANK_RUPTURE_PRESSURE) - //to_chat(world, "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]") if(integrity <= 0) var/turf/T = get_turf(src) if(!T) @@ -266,7 +263,6 @@ integrity-- else if(pressure > TANK_LEAK_PRESSURE) - //to_chat(world, "\blue[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]") if(integrity <= 0) var/turf/T = get_turf(src) if(!T) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 87ff199dfe..a683902a6c 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -14,7 +14,6 @@ * Cards * Toy nuke * Fake meteor - * Carp plushie * Foam armblade * Toy big red button * Beach ball @@ -40,7 +39,7 @@ icon = 'icons/obj/toy.dmi' icon_state = "waterballoon-e" item_state = "balloon-empty" - + /obj/item/toy/balloon/New() create_reagents(10) @@ -987,32 +986,6 @@ shake_camera(M, 3, 1) qdel(src) -/* - * Carp plushie - */ - -/obj/item/toy/carpplushie - name = "space carp plushie" - desc = "An adorable stuffed toy that resembles a space carp." - icon = 'icons/obj/toy.dmi' - icon_state = "carpplushie" - item_state = "carp_plushie" - w_class = WEIGHT_CLASS_SMALL - attack_verb = list("bitten", "eaten", "fin slapped") - resistance_flags = FLAMMABLE - var/bitesound = 'sound/weapons/bite.ogg' - -//Attack mob -/obj/item/toy/carpplushie/attack(mob/M, mob/user) - playsound(loc, bitesound, 20, 1) //Play bite sound in local area - return ..() - -//Attack self -/obj/item/toy/carpplushie/attack_self(mob/user) - playsound(src.loc, bitesound, 20, 1) - to_chat(user, "You pet [src]. D'awww.") - return ..() - /* * Toy big red button */ diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 326b945fd5..0a7b9eb312 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -45,14 +45,13 @@ switch(state) if(EMPTY_CORE) if(istype(P, /obj/item/circuitboard/aicore)) - if(!user.drop_item()) + if(!user.transferItemToLoc(P, src)) return playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) to_chat(user, "You place the circuit board inside the frame.") update_icon() state = CIRCUIT_CORE circuit = P - P.forceMove(src) return if(CIRCUIT_CORE) if(istype(P, /obj/item/screwdriver)) @@ -143,10 +142,9 @@ to_chat(user, "This [M.name] is mindless!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(M,src)) return - M.forceMove(src) brain = M to_chat(user, "You add [M.name] to the frame.") update_icon() @@ -176,7 +174,14 @@ SSticker.mode.remove_antag_for_borging(brain.brainmob.mind) if(!istype(brain.laws, /datum/ai_laws/ratvar)) remove_servant_of_ratvar(brain.brainmob, TRUE) - var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(loc, laws, brain.brainmob) + + var/mob/living/silicon/ai/A = null + + if (brain.overrides_aicore_laws) + A = new /mob/living/silicon/ai(loc, brain.laws, brain.brainmob) + else + A = new /mob/living/silicon/ai(loc, laws, brain.brainmob) + if(brain.force_replace_ai_name) A.fully_replace_character_name(A.name, brain.replacement_ai_name()) SSblackbox.inc("cyborg_ais_created",1) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 4f1348f3da..c7b63be32b 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -15,7 +15,7 @@ max_integrity = 200 integrity_failure = 50 armor = list(melee = 20, bullet = 10, laser = 10, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 70, acid = 60) - var/breakout_time = 2 + var/breakout_time = 1200 var/message_cooldown var/can_weld_shut = TRUE var/horizontal = FALSE @@ -366,9 +366,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("[src] begins to shake violently!", \ - "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear banging from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) ) return //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting @@ -450,3 +450,7 @@ /obj/structure/closet/AllowDrop() return TRUE + + +/obj/structure/closet/return_temperature() + return \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 11f087d052..087f58c89f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -1,72 +1,79 @@ -/obj/structure/closet/secure_closet/freezer - icon_state = "freezer" - -/obj/structure/closet/secure_closet/freezer/kitchen - name = "kitchen Cabinet" +/obj/structure/closet/secure_closet/freezer + icon_state = "freezer" + var/jones = FALSE + +/obj/structure/closet/secure_closet/freezer/ex_act() + if(!jones) + jones = TRUE + else + ..() + +/obj/structure/closet/secure_closet/freezer/kitchen + name = "kitchen Cabinet" req_access = list(ACCESS_KITCHEN) - -/obj/structure/closet/secure_closet/freezer/kitchen/PopulateContents() - ..() - for(var/i = 0, i < 3, i++) - new /obj/item/reagent_containers/food/condiment/flour(src) - new /obj/item/reagent_containers/food/condiment/rice(src) - new /obj/item/reagent_containers/food/condiment/sugar(src) - -/obj/structure/closet/secure_closet/freezer/kitchen/maintenance - name = "maintenance refrigerator" - desc = "This refrigerator looks quite dusty, is there anything edible still inside?" - req_access = list() - -/obj/structure/closet/secure_closet/freezer/kitchen/maintenance/PopulateContents() - ..() - for(var/i = 0, i < 5, i++) - new /obj/item/reagent_containers/food/condiment/milk(src) - for(var/i = 0, i < 5, i++) - new /obj/item/reagent_containers/food/condiment/soymilk(src) - for(var/i = 0, i < 2, i++) - new /obj/item/storage/fancy/egg_box(src) - -/obj/structure/closet/secure_closet/freezer/kitchen/mining - req_access = list() - -/obj/structure/closet/secure_closet/freezer/meat - name = "meat fridge" - -/obj/structure/closet/secure_closet/freezer/meat/PopulateContents() - ..() - for(var/i = 0, i < 4, i++) - new /obj/item/reagent_containers/food/snacks/meat/slab/monkey(src) -/obj/structure/closet/secure_closet/freezer/fridge - name = "refrigerator" - -/obj/structure/closet/secure_closet/freezer/fridge/PopulateContents() - ..() - for(var/i = 0, i < 5, i++) - new /obj/item/reagent_containers/food/condiment/milk(src) - for(var/i = 0, i < 5, i++) - new /obj/item/reagent_containers/food/condiment/soymilk(src) - for(var/i = 0, i < 2, i++) - new /obj/item/storage/fancy/egg_box(src) - -/obj/structure/closet/secure_closet/freezer/money - name = "freezer" - desc = "This contains cold hard cash." + +/obj/structure/closet/secure_closet/freezer/kitchen/PopulateContents() + ..() + for(var/i = 0, i < 3, i++) + new /obj/item/reagent_containers/food/condiment/flour(src) + new /obj/item/reagent_containers/food/condiment/rice(src) + new /obj/item/reagent_containers/food/condiment/sugar(src) + +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance + name = "maintenance refrigerator" + desc = "This refrigerator looks quite dusty, is there anything edible still inside?" + req_access = list() + +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance/PopulateContents() + ..() + for(var/i = 0, i < 5, i++) + new /obj/item/reagent_containers/food/condiment/milk(src) + for(var/i = 0, i < 5, i++) + new /obj/item/reagent_containers/food/condiment/soymilk(src) + for(var/i = 0, i < 2, i++) + new /obj/item/storage/fancy/egg_box(src) + +/obj/structure/closet/secure_closet/freezer/kitchen/mining + req_access = list() + +/obj/structure/closet/secure_closet/freezer/meat + name = "meat fridge" + +/obj/structure/closet/secure_closet/freezer/meat/PopulateContents() + ..() + for(var/i = 0, i < 4, i++) + new /obj/item/reagent_containers/food/snacks/meat/slab/monkey(src) +/obj/structure/closet/secure_closet/freezer/fridge + name = "refrigerator" + +/obj/structure/closet/secure_closet/freezer/fridge/PopulateContents() + ..() + for(var/i = 0, i < 5, i++) + new /obj/item/reagent_containers/food/condiment/milk(src) + for(var/i = 0, i < 5, i++) + new /obj/item/reagent_containers/food/condiment/soymilk(src) + for(var/i = 0, i < 2, i++) + new /obj/item/storage/fancy/egg_box(src) + +/obj/structure/closet/secure_closet/freezer/money + name = "freezer" + desc = "This contains cold hard cash." req_access = list(ACCESS_HEADS_VAULT) - -/obj/structure/closet/secure_closet/freezer/money/PopulateContents() - ..() - for(var/i = 0, i < 3, i++) - new /obj/item/stack/spacecash/c1000(src) - for(var/i = 0, i < 5, i++) - new /obj/item/stack/spacecash/c500(src) - for(var/i = 0, i < 6, i++) - new /obj/item/stack/spacecash/c200(src) - -/obj/structure/closet/secure_closet/freezer/cream_pie - name = "cream pie closet" - desc = "Contains pies filled with cream and/or custard, you sickos." + +/obj/structure/closet/secure_closet/freezer/money/PopulateContents() + ..() + for(var/i = 0, i < 3, i++) + new /obj/item/stack/spacecash/c1000(src) + for(var/i = 0, i < 5, i++) + new /obj/item/stack/spacecash/c500(src) + for(var/i = 0, i < 6, i++) + new /obj/item/stack/spacecash/c200(src) + +/obj/structure/closet/secure_closet/freezer/cream_pie + name = "cream pie closet" + desc = "Contains pies filled with cream and/or custard, you sickos." req_access = list(ACCESS_THEATRE) - -/obj/structure/closet/secure_closet/freezer/pie/PopulateContents() - ..() - new /obj/item/reagent_containers/food/snacks/pie/cream(src) + +/obj/structure/closet/secure_closet/freezer/pie/PopulateContents() + ..() + new /obj/item/reagent_containers/food/snacks/pie/cream(src) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 8290a2cd1c..56359d4492 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -1,147 +1,147 @@ -/obj/structure/closet/crate - name = "crate" - desc = "A rectangular steel crate." - icon = 'icons/obj/crates.dmi' - icon_state = "crate" - req_access = null - can_weld_shut = FALSE - horizontal = TRUE - allow_objects = TRUE - allow_dense = TRUE - dense_when_open = TRUE - climbable = TRUE - climb_time = 10 //real fast, because let's be honest stepping into or onto a crate is easy - climb_stun = 0 //climbing onto crates isn't hard, guys - delivery_icon = "deliverycrate" +/obj/structure/closet/crate + name = "crate" + desc = "A rectangular steel crate." + icon = 'icons/obj/crates.dmi' + icon_state = "crate" + req_access = null + can_weld_shut = FALSE + horizontal = TRUE + allow_objects = TRUE + allow_dense = TRUE + dense_when_open = TRUE + climbable = TRUE + climb_time = 10 //real fast, because let's be honest stepping into or onto a crate is easy + climb_stun = 0 //climbing onto crates isn't hard, guys + delivery_icon = "deliverycrate" var/obj/item/paper/fluff/jobs/cargo/manifest/manifest - -/obj/structure/closet/crate/New() - ..() - update_icon() - + +/obj/structure/closet/crate/New() + ..() + update_icon() + /obj/structure/closet/crate/CanPass(atom/movable/mover, turf/target) - if(!istype(mover, /obj/structure/closet)) - var/obj/structure/closet/crate/locatedcrate = locate(/obj/structure/closet/crate) in get_turf(mover) - if(locatedcrate) //you can walk on it like tables, if you're not in an open crate trying to move to a closed crate - if(opened) //if we're open, allow entering regardless of located crate openness - return 1 - if(!locatedcrate.opened) //otherwise, if the located crate is closed, allow entering - return 1 - return !density - -/obj/structure/closet/crate/update_icon() - icon_state = "[initial(icon_state)][opened ? "open" : ""]" - - cut_overlays() - if(manifest) - add_overlay("manifest") - -/obj/structure/closet/crate/attack_hand(mob/user) - if(manifest) - tear_manifest(user) - return - ..() - -/obj/structure/closet/crate/open(mob/living/user) - . = ..() - if(. && manifest) - to_chat(user, "The manifest is torn off [src].") - playsound(src, 'sound/items/poster_ripped.ogg', 75, 1) - manifest.forceMove(get_turf(src)) - manifest = null - update_icon() - -/obj/structure/closet/crate/proc/tear_manifest(mob/user) - to_chat(user, "You tear the manifest off of [src].") - playsound(src, 'sound/items/poster_ripped.ogg', 75, 1) - - manifest.forceMove(loc) - if(ishuman(user)) - user.put_in_hands(manifest) - manifest = null - update_icon() - -/obj/structure/closet/crate/internals - desc = "A internals crate." - name = "internals crate" - icon_state = "o2crate" - -/obj/structure/closet/crate/trashcart - desc = "A heavy, metal trashcart with wheels." - name = "trash cart" - icon_state = "trashcart" - -/obj/structure/closet/crate/medical - desc = "A medical crate." - name = "medical crate" - icon_state = "medicalcrate" - -/obj/structure/closet/crate/freezer - desc = "A freezer." - name = "freezer" - icon_state = "freezer" - -/obj/structure/closet/crate/freezer/blood - name = "blood freezer" - desc = "A freezer containing packs of blood." - -/obj/structure/closet/crate/freezer/blood/PopulateContents() - . = ..() - new /obj/item/reagent_containers/blood/empty(src) - new /obj/item/reagent_containers/blood/empty(src) - new /obj/item/reagent_containers/blood/AMinus(src) - new /obj/item/reagent_containers/blood/BMinus(src) - new /obj/item/reagent_containers/blood/BPlus(src) - new /obj/item/reagent_containers/blood/OMinus(src) - new /obj/item/reagent_containers/blood/OPlus(src) - new /obj/item/reagent_containers/blood/lizard(src) - for(var/i in 1 to 3) - new /obj/item/reagent_containers/blood/random(src) - -/obj/structure/closet/crate/freezer/surplus_limbs - name = "surplus prosthetic limbs" - desc = "A crate containing an assortment of cheap prosthetic limbs." - -/obj/structure/closet/crate/freezer/surplus_limbs/PopulateContents() - . = ..() - new /obj/item/bodypart/l_arm/robot/surplus(src) - new /obj/item/bodypart/l_arm/robot/surplus(src) - new /obj/item/bodypart/r_arm/robot/surplus(src) - new /obj/item/bodypart/r_arm/robot/surplus(src) - new /obj/item/bodypart/l_leg/robot/surplus(src) - new /obj/item/bodypart/l_leg/robot/surplus(src) - new /obj/item/bodypart/r_leg/robot/surplus(src) - new /obj/item/bodypart/r_leg/robot/surplus(src) - -/obj/structure/closet/crate/radiation - desc = "A crate with a radiation sign on it." - name = "radiation crate" - icon_state = "radiation" - -/obj/structure/closet/crate/hydroponics - name = "hydroponics crate" - desc = "All you need to destroy those pesky weeds and pests." - icon_state = "hydrocrate" - -/obj/structure/closet/crate/engineering - name = "engineering crate" - icon_state = "engi_crate" - -/obj/structure/closet/crate/engineering/electrical - icon_state = "engi_e_crate" - -/obj/structure/closet/crate/rcd - desc = "A crate for the storage of an RCD." - name = "\improper RCD crate" - icon_state = "engi_crate" - -/obj/structure/closet/crate/rcd/PopulateContents() - ..() - for(var/i in 1 to 4) - new /obj/item/rcd_ammo(src) - new /obj/item/construction/rcd(src) - -/obj/structure/closet/crate/science - name = "science crate" - desc = "A science crate." - icon_state = "scicrate" + if(!istype(mover, /obj/structure/closet)) + var/obj/structure/closet/crate/locatedcrate = locate(/obj/structure/closet/crate) in get_turf(mover) + if(locatedcrate) //you can walk on it like tables, if you're not in an open crate trying to move to a closed crate + if(opened) //if we're open, allow entering regardless of located crate openness + return 1 + if(!locatedcrate.opened) //otherwise, if the located crate is closed, allow entering + return 1 + return !density + +/obj/structure/closet/crate/update_icon() + icon_state = "[initial(icon_state)][opened ? "open" : ""]" + + cut_overlays() + if(manifest) + add_overlay("manifest") + +/obj/structure/closet/crate/attack_hand(mob/user) + if(manifest) + tear_manifest(user) + return + ..() + +/obj/structure/closet/crate/open(mob/living/user) + . = ..() + if(. && manifest) + to_chat(user, "The manifest is torn off [src].") + playsound(src, 'sound/items/poster_ripped.ogg', 75, 1) + manifest.forceMove(get_turf(src)) + manifest = null + update_icon() + +/obj/structure/closet/crate/proc/tear_manifest(mob/user) + to_chat(user, "You tear the manifest off of [src].") + playsound(src, 'sound/items/poster_ripped.ogg', 75, 1) + + manifest.forceMove(loc) + if(ishuman(user)) + user.put_in_hands(manifest) + manifest = null + update_icon() + +/obj/structure/closet/crate/internals + desc = "An internals crate." + name = "internals crate" + icon_state = "o2crate" + +/obj/structure/closet/crate/trashcart + desc = "A heavy, metal trashcart with wheels." + name = "trash cart" + icon_state = "trashcart" + +/obj/structure/closet/crate/medical + desc = "A medical crate." + name = "medical crate" + icon_state = "medicalcrate" + +/obj/structure/closet/crate/freezer + desc = "A freezer." + name = "freezer" + icon_state = "freezer" + +/obj/structure/closet/crate/freezer/blood + name = "blood freezer" + desc = "A freezer containing packs of blood." + +/obj/structure/closet/crate/freezer/blood/PopulateContents() + . = ..() + new /obj/item/reagent_containers/blood/empty(src) + new /obj/item/reagent_containers/blood/empty(src) + new /obj/item/reagent_containers/blood/AMinus(src) + new /obj/item/reagent_containers/blood/BMinus(src) + new /obj/item/reagent_containers/blood/BPlus(src) + new /obj/item/reagent_containers/blood/OMinus(src) + new /obj/item/reagent_containers/blood/OPlus(src) + new /obj/item/reagent_containers/blood/lizard(src) + for(var/i in 1 to 3) + new /obj/item/reagent_containers/blood/random(src) + +/obj/structure/closet/crate/freezer/surplus_limbs + name = "surplus prosthetic limbs" + desc = "A crate containing an assortment of cheap prosthetic limbs." + +/obj/structure/closet/crate/freezer/surplus_limbs/PopulateContents() + . = ..() + new /obj/item/bodypart/l_arm/robot/surplus(src) + new /obj/item/bodypart/l_arm/robot/surplus(src) + new /obj/item/bodypart/r_arm/robot/surplus(src) + new /obj/item/bodypart/r_arm/robot/surplus(src) + new /obj/item/bodypart/l_leg/robot/surplus(src) + new /obj/item/bodypart/l_leg/robot/surplus(src) + new /obj/item/bodypart/r_leg/robot/surplus(src) + new /obj/item/bodypart/r_leg/robot/surplus(src) + +/obj/structure/closet/crate/radiation + desc = "A crate with a radiation sign on it." + name = "radiation crate" + icon_state = "radiation" + +/obj/structure/closet/crate/hydroponics + name = "hydroponics crate" + desc = "All you need to destroy those pesky weeds and pests." + icon_state = "hydrocrate" + +/obj/structure/closet/crate/engineering + name = "engineering crate" + icon_state = "engi_crate" + +/obj/structure/closet/crate/engineering/electrical + icon_state = "engi_e_crate" + +/obj/structure/closet/crate/rcd + desc = "A crate for the storage of an RCD." + name = "\improper RCD crate" + icon_state = "engi_crate" + +/obj/structure/closet/crate/rcd/PopulateContents() + ..() + for(var/i in 1 to 4) + new /obj/item/rcd_ammo(src) + new /obj/item/construction/rcd(src) + +/obj/structure/closet/crate/science + name = "science crate" + desc = "A science crate." + icon_state = "scicrate" diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm index 3f631883c1..5261bb5332 100644 --- a/code/game/objects/structures/crates_lockers/crates/critter.dm +++ b/code/game/objects/structures/crates_lockers/crates/critter.dm @@ -1,38 +1,38 @@ -/obj/structure/closet/crate/critter - name = "critter crate" - desc = "A crate designed for safe transport of animals. It has an oxygen tank for safe transport in space." - icon_state = "crittercrate" - horizontal = FALSE - allow_objects = FALSE - breakout_time = 1 - material_drop = /obj/item/stack/sheet/mineral/wood - material_drop_amount = 4 - delivery_icon = "deliverybox" - var/obj/item/tank/internals/emergency_oxygen/tank - -/obj/structure/closet/crate/critter/New() - ..() - tank = new - -/obj/structure/closet/crate/critter/Destroy() - var/turf/T = get_turf(src) - if(tank) - tank.forceMove(T) - tank = null - - return ..() - -/obj/structure/closet/crate/critter/update_icon() - cut_overlays() - if(opened) - add_overlay("crittercrate_door_open") - else - add_overlay("crittercrate_door") - if(manifest) - add_overlay("manifest") - -/obj/structure/closet/crate/critter/return_air() - if(tank) - return tank.air_contents - else - return loc.return_air() \ No newline at end of file +/obj/structure/closet/crate/critter + name = "critter crate" + desc = "A crate designed for safe transport of animals. It has an oxygen tank for safe transport in space." + icon_state = "crittercrate" + horizontal = FALSE + allow_objects = FALSE + breakout_time = 600 + material_drop = /obj/item/stack/sheet/mineral/wood + material_drop_amount = 4 + delivery_icon = "deliverybox" + var/obj/item/tank/internals/emergency_oxygen/tank + +/obj/structure/closet/crate/critter/New() + ..() + tank = new + +/obj/structure/closet/crate/critter/Destroy() + var/turf/T = get_turf(src) + if(tank) + tank.forceMove(T) + tank = null + + return ..() + +/obj/structure/closet/crate/critter/update_icon() + cut_overlays() + if(opened) + add_overlay("crittercrate_door_open") + else + add_overlay("crittercrate_door") + if(manifest) + add_overlay("manifest") + +/obj/structure/closet/crate/critter/return_air() + if(tank) + return tank.air_contents + else + return loc.return_air() diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index e1204d86e3..1183618d5a 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -616,15 +616,15 @@ var/obj/item/stack/sheet/G = W if(G) if(G.get_amount() >= 1) - if(istype(G, /obj/item/stack/sheet/rglass) || istype(G, /obj/item/stack/sheet/glass)) + if(is_glass_sheet(G)) playsound(src.loc, 'sound/items/crowbar.ogg', 100, 1) user.visible_message("[user] adds [G.name] to the airlock assembly.", \ "You start to install [G.name] into the airlock assembly...") if(do_after(user, 40, target = src)) if(G.get_amount() < 1 || mineral) return - if (G.type == /obj/item/stack/sheet/rglass) - to_chat(user, "You install reinforced glass windows into the airlock assembly.") - heat_proof_finished = 1 //reinforced glass makes the airlock heat-proof + if(!istype(G, /obj/item/stack/sheet/glass)) + to_chat(user, "You install [G.name] windows into the airlock assembly.") + heat_proof_finished = 1 //plasma & reinforced glass makes the airlock heat-proof name = "near finished heat-proofed window airlock assembly" else to_chat(user, "You install regular glass windows into the airlock assembly.") diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 51e53e37d1..6aa338f047 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -265,6 +265,7 @@ /obj/item/twohanded/required/kirbyplants/equipped(mob/living/user) var/image/I = image(icon = 'icons/obj/flora/plants.dmi' , icon_state = src.icon_state, loc = user) + I.copy_overlays(src) I.override = 1 add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission", I) I.layer = ABOVE_MOB_LAYER @@ -300,6 +301,13 @@ desc = "A gift from the botanical staff, presented after the RD's reassignment. There's a tag on it that says \"Y'all come back now, y'hear?\"\nIt doesn't look very healthy..." icon_state = "plant-25" +/obj/item/twohanded/required/kirbyplants/photosynthetic + name = "photosynthetic potted plant" + desc = "A bioluminescent plant." + icon_state = "plant-09" + light_color = "#2cb2e8" + light_range = 3 + //a rock is flora according to where the icon file is //and now these defines diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index c603681909..59aaaca12b 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -43,8 +43,7 @@ death = FALSE anchored = FALSE density = FALSE - flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. \ - You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest." + flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest. You do not know how their magic works, nor where they come from, or the significance of their items." assignedrole = "Ash Walker" /obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn) @@ -123,7 +122,7 @@ golems, so that no golem may ever be forced to serve again.
" /obj/effect/mob_spawn/human/golem/Initialize(mapload, datum/species/golem/species = null, mob/creator = null) - ..() + . = ..() if(species) name += " ([initial(species.prefix)])" mob_species = species @@ -249,6 +248,11 @@ everyone? Where did they go? What happened to the hospital? And is that smoke you smell? You need to find someone else. Maybe they can tell you what happened.
" assignedrole = "Translocated Vet" +/obj/effect/mob_spawn/human/doctor/alive/lavaland/Destroy() + var/obj/structure/fluff/empty_sleeper/S = new(drop_location()) + S.setDir(dir) + return ..() + //Prisoner containment sleeper: Spawns in crashed prison ships in lavaland. Ghosts become escaped prisoners and are advised to find a way out of the mess they've gotten themselves into. /obj/effect/mob_spawn/human/prisoner_transport name = "prisoner containment sleeper" @@ -462,9 +466,9 @@ death = FALSE random = TRUE mob_species = /datum/species/human - flavour_text = "You are a security officer working for NanoTrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ - cryogenics pod due to a oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling sweels in your gut as you climb out of your pod." + flavour_text = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ + cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ + your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." uniform = /obj/item/clothing/under/rank/security shoes = /obj/item/clothing/shoes/jackboots id = /obj/item/card/id/away/old/sec @@ -473,22 +477,22 @@ assignedrole = "Ancient Crew" /obj/effect/mob_spawn/human/oldsec/Destroy() - new/obj/structure/showcase/oldpod/used(get_turf(src)) + new/obj/structure/showcase/machinery/oldpod/used(drop_location()) return ..() /obj/effect/mob_spawn/human/oldeng name = "old cryogenics pod" - desc = "A humming cryo pod. You can barely recognise a engineering uniform underneath the built up ice. The machine is attempting to wake up its occupant" - mob_name = "a engineer" + desc = "A humming cryo pod. You can barely recognise an engineering uniform underneath the built up ice. The machine is attempting to wake up its occupant" + mob_name = "an engineer" icon = 'icons/obj/cryogenic2.dmi' icon_state = "sleeper" roundstart = FALSE death = FALSE random = TRUE mob_species = /datum/species/human - flavour_text = "You are a engineer working for NanoTrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ - cryogenics pod due to a oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling sweels in your gut as you climb out of your pod." + flavour_text = "You are an engineer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ + cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ + your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." uniform = /obj/item/clothing/under/rank/engineer shoes = /obj/item/clothing/shoes/workboots id = /obj/item/card/id/away/old/eng @@ -497,7 +501,7 @@ assignedrole = "Ancient Crew" /obj/effect/mob_spawn/human/oldeng/Destroy() - new/obj/structure/showcase/oldpod/used(get_turf(src)) + new/obj/structure/showcase/machinery/oldpod/used(drop_location()) return ..() /obj/effect/mob_spawn/human/oldsci @@ -510,9 +514,9 @@ death = FALSE random = TRUE mob_species = /datum/species/human - flavour_text = "You are a scientist working for NanoTrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ - cryogenics pod due to a oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling sweels in your gut as you climb out of your pod." + flavour_text = "You are a scientist working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ + cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ + your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." uniform = /obj/item/clothing/under/rank/scientist shoes = /obj/item/clothing/shoes/laceup id = /obj/item/card/id/away/old/sci @@ -520,5 +524,5 @@ assignedrole = "Ancient Crew" /obj/effect/mob_spawn/human/oldsci/Destroy() - new/obj/structure/showcase/oldpod/used(get_turf(src)) + new/obj/structure/showcase/machinery/oldpod/used(drop_location()) return ..() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 6a3bdb81b4..914be24cfd 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -13,7 +13,7 @@ integrity_failure = 20 var/rods_type = /obj/item/stack/rods var/rods_amount = 2 - var/rods_broken = 1 + var/rods_broken = TRUE var/grille_type = null var/broken_type = /obj/structure/grille/broken @@ -37,7 +37,7 @@ if(locate(/obj/structure/window) in loc) return FALSE to_chat(user, "You construct the window.") - var/obj/structure/window/WD = new the_rcd.window_type(loc) + var/obj/structure/window/WD = new the_rcd.window_type(drop_location()) WD.anchored = TRUE return TRUE return FALSE @@ -66,7 +66,7 @@ if(user.a_intent == INTENT_HARM) if(!shock(user, 70)) ..(user, 1) - return 1 + return TRUE /obj/structure/grille/attack_hand(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) @@ -85,7 +85,7 @@ /obj/structure/grille/CanPass(atom/movable/mover, turf/target) if(istype(mover) && mover.checkpass(PASSGRILLE)) - return 1 + return TRUE else if(istype(mover, /obj/item/projectile) && density) return prob(30) @@ -103,11 +103,11 @@ add_fingerprint(user) if(istype(W, /obj/item/wirecutters)) if(!shock(user, 100)) - playsound(loc, W.usesound, 100, 1) + playsound(src, W.usesound, 100, 1) deconstruct() else if((istype(W, /obj/item/screwdriver)) && (isturf(loc) || anchored)) if(!shock(user, 90)) - playsound(loc, W.usesound, 100, 1) + playsound(src, W.usesound, 100, 1) anchored = !anchored user.visible_message("[user] [anchored ? "fastens" : "unfastens"] [src].", \ "You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor.") @@ -123,7 +123,7 @@ return //window placing begin - else if(istype(W, /obj/item/stack/sheet/rglass) || istype(W, /obj/item/stack/sheet/glass)) + else if(is_glass_sheet(W)) if (!broken) var/obj/item/stack/ST = W if (ST.get_amount() < 2) @@ -143,10 +143,14 @@ for(var/obj/structure/window/WINDOW in loc) //Another window already installed on grille return var/obj/structure/window/WD - if(istype(W, /obj/item/stack/sheet/rglass)) - WD = new/obj/structure/window/reinforced/fulltile(loc) //reinforced window + if(istype(W, /obj/item/stack/sheet/plasmarglass)) + WD = new/obj/structure/window/plasma/reinforced/fulltile(drop_location()) //reinforced plasma window + else if(istype(W, /obj/item/stack/sheet/plasmaglass)) + WD = new/obj/structure/window/plasma/fulltile(drop_location()) //plasma window + else if(istype(W, /obj/item/stack/sheet/rglass)) + WD = new/obj/structure/window/reinforced/fulltile(drop_location()) //reinforced window else - WD = new/obj/structure/window/fulltile(loc) //normal window + WD = new/obj/structure/window/fulltile(drop_location()) //normal window WD.setDir(dir_to_set) WD.ini_dir = dir_to_set WD.anchored = FALSE @@ -163,18 +167,18 @@ switch(damage_type) if(BRUTE) if(damage_amount) - playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) + playsound(src, 'sound/effects/grillehit.ogg', 80, 1) else - playsound(loc, 'sound/weapons/tap.ogg', 50, 1) + playsound(src, 'sound/weapons/tap.ogg', 50, 1) if(BURN) - playsound(loc, 'sound/items/welder.ogg', 80, 1) + playsound(src, 'sound/items/welder.ogg', 80, 1) /obj/structure/grille/deconstruct(disassembled = TRUE) if(!loc) //if already qdel'd somehow, we do nothing return if(!(flags_1&NODECONSTRUCT_1)) - var/obj/R = new rods_type(src.loc, rods_amount) + var/obj/R = new rods_type(drop_location(), rods_amount) transfer_fingerprints_to(R) qdel(src) ..() @@ -182,7 +186,7 @@ /obj/structure/grille/obj_break() if(!broken && !(flags_1 & NODECONSTRUCT_1)) new broken_type(src.loc) - var/obj/R = new rods_type(src.loc, rods_broken) + var/obj/R = new rods_type(drop_location(), rods_broken) transfer_fingerprints_to(R) qdel(src) @@ -192,11 +196,11 @@ /obj/structure/grille/proc/shock(mob/user, prb) if(!anchored || broken) // anchored/broken grilles are never connected - return 0 + return FALSE if(!prob(prb)) - return 0 + return FALSE if(!in_range(src, user))//To prevent TK and mech users from getting shocked - return 0 + return FALSE var/turf/T = get_turf(src) var/obj/structure/cable/C = T.get_cable_node() if(C) @@ -204,10 +208,10 @@ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(3, 1, src) s.start() - return 1 + return TRUE else - return 0 - return 0 + return FALSE + return FALSE /obj/structure/grille/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(!broken) @@ -221,7 +225,7 @@ var/turf/T = get_turf(src) var/obj/structure/cable/C = T.get_cable_node() if(C) - playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) + playsound(src, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) tesla_zap(src, 3, C.powernet.avail * 0.01) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. C.powernet.load += C.powernet.avail * 0.0375 // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. return ..() @@ -233,9 +237,9 @@ icon_state = "brokengrille" density = FALSE obj_integrity = 20 - broken = 1 + broken = TRUE rods_amount = 1 - rods_broken = 0 + rods_broken = FALSE grille_type = /obj/structure/grille broken_type = null @@ -269,8 +273,8 @@ icon_state = "brokenratvargrille" density = FALSE obj_integrity = 20 - broken = 1 + broken = TRUE rods_amount = 1 - rods_broken = 0 + rods_broken = FALSE grille_type = /obj/structure/grille/ratvar broken_type = null diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 081cf186a3..225d634a7f 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -55,7 +55,7 @@ icon = 'icons/obj/smooth_structures/lattice_clockwork.dmi' /obj/structure/lattice/clockwork/Initialize(mapload) - ..() + . = ..() ratvar_act() /obj/structure/lattice/clockwork/ratvar_act() @@ -63,7 +63,7 @@ new /obj/structure/lattice/clockwork/large(loc) // deletes old one /obj/structure/lattice/clockwork/large/Initialize(mapload) - ..() + . = ..() icon = 'icons/obj/smooth_structures/lattice_clockwork_large.dmi' pixel_x = -9 pixel_y = -9 @@ -101,7 +101,7 @@ icon = 'icons/obj/smooth_structures/catwalk_clockwork.dmi' /obj/structure/lattice/catwalk/clockwork/Initialize(mapload) - ..() + . = ..() new /obj/effect/temp_visual/ratvar/floor/catwalk(loc) new /obj/effect/temp_visual/ratvar/beam/catwalk(loc) diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index e15a655a63..52d9e38f6b 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -1,214 +1,214 @@ -/////// MANNED TURRET //////// - -/obj/machinery/manned_turret - name = "machine gun turret" - desc = "While the trigger is held down, this gun will redistribute recoil to allow its user to easily shift targets." - icon = 'icons/obj/turrets.dmi' - icon_state = "machinegun" - can_buckle = TRUE - density = TRUE - max_integrity = 100 - buckle_lying = FALSE - layer = ABOVE_MOB_LAYER - var/view_range = 10 - var/cooldown = 0 - var/projectile_type = /obj/item/projectile/bullet/weakbullet3 - var/rate_of_fire = 1 - var/number_of_shots = 40 - var/cooldown_duration = 90 - var/atom/target - var/turf/target_turf - var/warned = FALSE - var/list/calculated_projectile_vars - -/obj/machinery/manned_turret/Destroy() - target = null - target_turf = null - ..() - -//BUCKLE HOOKS - -/obj/machinery/manned_turret/unbuckle_mob(mob/living/buckled_mob,force = FALSE) - playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) - for(var/obj/item/I in buckled_mob.held_items) - if(istype(I, /obj/item/gun_control)) - qdel(I) - if(istype(buckled_mob)) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 0 - if(buckled_mob.client) - buckled_mob.client.change_view(world.view) - anchored = FALSE - . = ..() - STOP_PROCESSING(SSfastprocess, src) - -/obj/machinery/manned_turret/user_buckle_mob(mob/living/M, mob/living/carbon/user) - if(user.incapacitated() || !istype(user)) - return - M.forceMove(get_turf(src)) - . = ..() - if(!.) - return - for(var/V in M.held_items) - var/obj/item/I = V - if(istype(I)) - if(M.dropItemToGround(I)) - var/obj/item/gun_control/TC = new(src) - M.put_in_hands(TC) - else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand - var/obj/item/gun_control/TC = new(src) - M.put_in_hands(TC) - M.pixel_y = 14 - layer = ABOVE_MOB_LAYER - setDir(SOUTH) - playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) - anchored = TRUE - if(M.client) - M.client.change_view(view_range) - START_PROCESSING(SSfastprocess, src) - -/obj/machinery/manned_turret/process() - if(!LAZYLEN(buckled_mobs)) - return PROCESS_KILL - update_positioning() - -/obj/machinery/manned_turret/proc/update_positioning() - var/mob/living/controller = buckled_mobs[1] - if(!istype(controller)) - return - var/client/C = controller.client - if(C) - var/atom/A = C.mouseObject - var/turf/T = get_turf(A) - if(istype(T)) //They're hovering over something in the map. - direction_track(controller, T) - calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(controller, C.mouseParams) - -/obj/machinery/manned_turret/proc/direction_track(mob/user, atom/targeted) - if(user.incapacitated()) - return - setDir(get_dir(src,targeted)) - user.setDir(dir) - switch(dir) - if(NORTH) - layer = BELOW_MOB_LAYER - user.pixel_x = 0 - user.pixel_y = -14 - if(NORTHEAST) - layer = BELOW_MOB_LAYER - user.pixel_x = -8 - user.pixel_y = -4 - if(EAST) - layer = ABOVE_MOB_LAYER - user.pixel_x = -14 - user.pixel_y = 0 - if(SOUTHEAST) - layer = BELOW_MOB_LAYER - user.pixel_x = -8 - user.pixel_y = 4 - if(SOUTH) - layer = ABOVE_MOB_LAYER - user.pixel_x = 0 - user.pixel_y = 14 - if(SOUTHWEST) - layer = BELOW_MOB_LAYER - user.pixel_x = 8 - user.pixel_y = 4 - if(WEST) - layer = ABOVE_MOB_LAYER - user.pixel_x = 14 - user.pixel_y = 0 - if(NORTHWEST) - layer = BELOW_MOB_LAYER - user.pixel_x = 8 - user.pixel_y = -4 - -/obj/machinery/manned_turret/proc/checkfire(atom/targeted_atom, mob/user) - target = targeted_atom - if(target == user || user.incapacitated() || target == get_turf(src)) - return - if(world.time < cooldown) - if(!warned && world.time > (cooldown - cooldown_duration + rate_of_fire*number_of_shots)) // To capture the window where one is done firing - warned = TRUE - playsound(src, 'sound/weapons/sear.ogg', 100, 1) - return - else - cooldown = world.time + cooldown_duration - warned = FALSE - volley(user) - -/obj/machinery/manned_turret/proc/volley(mob/user) - target_turf = get_turf(target) - for(var/i in 1 to number_of_shots) - addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper, user), i*rate_of_fire) - -/obj/machinery/manned_turret/proc/fire_helper(mob/user) - if(user.incapacitated()) - return - update_positioning() //REFRESH MOUSE TRACKING!! - var/turf/targets_from = get_turf(src) - if(QDELETED(target)) - target = target_turf - var/obj/item/projectile/P = new projectile_type(targets_from) - P.current = targets_from - P.starting = targets_from - P.firer = user - P.original = target - playsound(src, 'sound/weapons/gunshot_smg.ogg', 75, 1) - P.xo = target.x - targets_from.x - P.yo = target.y - targets_from.y - P.Angle = calculated_projectile_vars[1] + rand(-9, 9) - P.p_x = calculated_projectile_vars[2] - P.p_y = calculated_projectile_vars[3] - P.fire() - -/obj/machinery/manned_turret/ultimate // Admin-only proof of concept for autoclicker automatics - name = "Infinity Gun" - view_range = 12 - projectile_type = /obj/item/projectile/bullet/weakbullet3 - -/obj/machinery/manned_turret/ultimate/checkfire(atom/targeted_atom, mob/user) - target = targeted_atom - if(target == user || target == get_turf(src)) - return - target_turf = get_turf(target) - fire_helper(user) - -/obj/item/gun_control - name = "turret controls" - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "offhand" - w_class = WEIGHT_CLASS_HUGE - flags_1 = ABSTRACT_1 | NODROP_1 | NOBLUDGEON_1 | DROPDEL_1 - resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/obj/machinery/manned_turret/turret - -/obj/item/gun_control/Initialize() - . = ..() - turret = loc - if(!istype(turret)) - return INITIALIZE_HINT_QDEL - -/obj/item/gun_control/Destroy() - turret = null - ..() - -/obj/item/gun_control/CanItemAutoclick() - return TRUE - -/obj/item/gun_control/attack_obj(obj/O, mob/living/user) - user.changeNext_move(CLICK_CD_MELEE) - O.attacked_by(src, user) - -/obj/item/gun_control/attack(mob/living/M, mob/living/user) - user.lastattacked = M - M.lastattacker = user - M.attacked_by(src, user) - add_fingerprint(user) - -/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user, flag, params) - ..() - var/obj/machinery/manned_turret/E = user.buckled - E.calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(user, params) - E.direction_track(user, targeted_atom) - E.checkfire(targeted_atom, user) +/////// MANNED TURRET //////// + +/obj/machinery/manned_turret + name = "machine gun turret" + desc = "While the trigger is held down, this gun will redistribute recoil to allow its user to easily shift targets." + icon = 'icons/obj/turrets.dmi' + icon_state = "machinegun" + can_buckle = TRUE + density = TRUE + max_integrity = 100 + buckle_lying = FALSE + layer = ABOVE_MOB_LAYER + var/view_range = 10 + var/cooldown = 0 + var/projectile_type = /obj/item/projectile/bullet/manned_turret + var/rate_of_fire = 1 + var/number_of_shots = 40 + var/cooldown_duration = 90 + var/atom/target + var/turf/target_turf + var/warned = FALSE + var/list/calculated_projectile_vars + +/obj/machinery/manned_turret/Destroy() + target = null + target_turf = null + ..() + +//BUCKLE HOOKS + +/obj/machinery/manned_turret/unbuckle_mob(mob/living/buckled_mob,force = FALSE) + playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) + for(var/obj/item/I in buckled_mob.held_items) + if(istype(I, /obj/item/gun_control)) + qdel(I) + if(istype(buckled_mob)) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 0 + if(buckled_mob.client) + buckled_mob.client.change_view(world.view) + anchored = FALSE + . = ..() + STOP_PROCESSING(SSfastprocess, src) + +/obj/machinery/manned_turret/user_buckle_mob(mob/living/M, mob/living/carbon/user) + if(user.incapacitated() || !istype(user)) + return + M.forceMove(get_turf(src)) + . = ..() + if(!.) + return + for(var/V in M.held_items) + var/obj/item/I = V + if(istype(I)) + if(M.dropItemToGround(I)) + var/obj/item/gun_control/TC = new(src) + M.put_in_hands(TC) + else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand + var/obj/item/gun_control/TC = new(src) + M.put_in_hands(TC) + M.pixel_y = 14 + layer = ABOVE_MOB_LAYER + setDir(SOUTH) + playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) + anchored = TRUE + if(M.client) + M.client.change_view(view_range) + START_PROCESSING(SSfastprocess, src) + +/obj/machinery/manned_turret/process() + if(!LAZYLEN(buckled_mobs)) + return PROCESS_KILL + update_positioning() + +/obj/machinery/manned_turret/proc/update_positioning() + var/mob/living/controller = buckled_mobs[1] + if(!istype(controller)) + return + var/client/C = controller.client + if(C) + var/atom/A = C.mouseObject + var/turf/T = get_turf(A) + if(istype(T)) //They're hovering over something in the map. + direction_track(controller, T) + calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(controller, C.mouseParams) + +/obj/machinery/manned_turret/proc/direction_track(mob/user, atom/targeted) + if(user.incapacitated()) + return + setDir(get_dir(src,targeted)) + user.setDir(dir) + switch(dir) + if(NORTH) + layer = BELOW_MOB_LAYER + user.pixel_x = 0 + user.pixel_y = -14 + if(NORTHEAST) + layer = BELOW_MOB_LAYER + user.pixel_x = -8 + user.pixel_y = -4 + if(EAST) + layer = ABOVE_MOB_LAYER + user.pixel_x = -14 + user.pixel_y = 0 + if(SOUTHEAST) + layer = BELOW_MOB_LAYER + user.pixel_x = -8 + user.pixel_y = 4 + if(SOUTH) + layer = ABOVE_MOB_LAYER + user.pixel_x = 0 + user.pixel_y = 14 + if(SOUTHWEST) + layer = BELOW_MOB_LAYER + user.pixel_x = 8 + user.pixel_y = 4 + if(WEST) + layer = ABOVE_MOB_LAYER + user.pixel_x = 14 + user.pixel_y = 0 + if(NORTHWEST) + layer = BELOW_MOB_LAYER + user.pixel_x = 8 + user.pixel_y = -4 + +/obj/machinery/manned_turret/proc/checkfire(atom/targeted_atom, mob/user) + target = targeted_atom + if(target == user || user.incapacitated() || target == get_turf(src)) + return + if(world.time < cooldown) + if(!warned && world.time > (cooldown - cooldown_duration + rate_of_fire*number_of_shots)) // To capture the window where one is done firing + warned = TRUE + playsound(src, 'sound/weapons/sear.ogg', 100, 1) + return + else + cooldown = world.time + cooldown_duration + warned = FALSE + volley(user) + +/obj/machinery/manned_turret/proc/volley(mob/user) + target_turf = get_turf(target) + for(var/i in 1 to number_of_shots) + addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper, user), i*rate_of_fire) + +/obj/machinery/manned_turret/proc/fire_helper(mob/user) + if(user.incapacitated()) + return + update_positioning() //REFRESH MOUSE TRACKING!! + var/turf/targets_from = get_turf(src) + if(QDELETED(target)) + target = target_turf + var/obj/item/projectile/P = new projectile_type(targets_from) + P.current = targets_from + P.starting = targets_from + P.firer = user + P.original = target + playsound(src, 'sound/weapons/gunshot_smg.ogg', 75, 1) + P.xo = target.x - targets_from.x + P.yo = target.y - targets_from.y + P.Angle = calculated_projectile_vars[1] + rand(-9, 9) + P.p_x = calculated_projectile_vars[2] + P.p_y = calculated_projectile_vars[3] + P.fire() + +/obj/machinery/manned_turret/ultimate // Admin-only proof of concept for autoclicker automatics + name = "Infinity Gun" + view_range = 12 + projectile_type = /obj/item/projectile/bullet/manned_turret + +/obj/machinery/manned_turret/ultimate/checkfire(atom/targeted_atom, mob/user) + target = targeted_atom + if(target == user || target == get_turf(src)) + return + target_turf = get_turf(target) + fire_helper(user) + +/obj/item/gun_control + name = "turret controls" + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "offhand" + w_class = WEIGHT_CLASS_HUGE + flags_1 = ABSTRACT_1 | NODROP_1 | NOBLUDGEON_1 | DROPDEL_1 + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + var/obj/machinery/manned_turret/turret + +/obj/item/gun_control/Initialize() + . = ..() + turret = loc + if(!istype(turret)) + return INITIALIZE_HINT_QDEL + +/obj/item/gun_control/Destroy() + turret = null + ..() + +/obj/item/gun_control/CanItemAutoclick() + return TRUE + +/obj/item/gun_control/attack_obj(obj/O, mob/living/user) + user.changeNext_move(CLICK_CD_MELEE) + O.attacked_by(src, user) + +/obj/item/gun_control/attack(mob/living/M, mob/living/user) + user.lastattacked = M + M.lastattacker = user + M.attacked_by(src, user) + add_fingerprint(user) + +/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user, flag, params) + ..() + var/obj/machinery/manned_turret/E = user.buckled + E.calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(user, params) + E.direction_track(user, targeted_atom) + E.checkfire(targeted_atom, user) \ No newline at end of file diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index f4a98811c0..a5def04e0b 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -24,7 +24,7 @@ var/locked = FALSE var/opendir = SOUTH var/message_cooldown - var/breakout_time = 1 + var/breakout_time = 600 /obj/structure/bodycontainer/Destroy() open() @@ -97,9 +97,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message(null, \ - "You lean on the back of [src] and start pushing the tray open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the tray open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a metallic creaking from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src ) return user.visible_message("[user] successfully broke out of [src]!", \ diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index ed0deef7d9..d253cbcf44 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -97,19 +97,15 @@ cur_acc[i] = "n" for(var/line in lines) - //to_chat(world, line) for(var/beat in splittext(lowertext(line), ",")) - //to_chat(world, "beat: [beat]") var/list/notes = splittext(beat, "/") for(var/note in splittext(notes[1], "-")) - //to_chat(world, "note: [note]") if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case playing = FALSE hearing_mobs = null return if(!lentext(note)) continue - //to_chat(world, "Parse: [copytext(note,1,2)]") var/cur_note = text2ascii(note) - 96 if(cur_note < 1 || cur_note > 7) continue diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index bbea363919..dc4ffe37b6 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -96,7 +96,10 @@ FLOOR SAFES if(!ishuman(usr)) return var/mob/living/carbon/human/user = usr - + + if(!user.canUseTopic(src)) + return + var/canhear = 0 if(user.is_holding_item_of_type(/obj/item/clothing/neck/stethoscope)) canhear = 1 diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index a755b3e88f..61f4efa824 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -39,16 +39,70 @@ icon = 'icons/obj/cloning.dmi' icon_state = "pod_g" -/obj/structure/showcase/oldpod +/obj/structure/showcase/machinery/oldpod name = "damaged cyrogenic pod" desc = "A damaged cyrogenic pod long since lost to time, including its former occupant..." icon = 'icons/obj/cryogenic2.dmi' icon_state = "sleeper-open" -/obj/structure/showcase/oldpod/used +/obj/structure/showcase/machinery/oldpod/used name = "opened cyrogenic pod" desc = "Cyrogenic pod that has recently discharged its occupand. The pod appears non-functional." +/obj/structure/showcase/cyborg/old + name = "Cyborg Statue" + desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze." + icon = 'icons/mob/robots.dmi' + icon_state = "robot_old" + density = FALSE + +/obj/structure/showcase/mecha/marauder + name = "combat mech exhibit" + desc = "A stand with an empty old Nanotrasen Corporation combat mech bolted to it. It is described as the premier unit used to defend corporate interests and employees." + icon = 'icons/mecha/mecha.dmi' + icon_state = "marauder" + +/obj/structure/showcase/mecha/ripley + name = "construction mech exhibit" + desc = "A stand with an retired construction mech bolted to it. The clamps are rated at 9300PSI. It seems to be falling apart." + icon = 'icons/mecha/mecha.dmi' + icon_state = "firefighter" + +/obj/structure/showcase/machinery/implanter + name = "Nanotrasen automated mindshield implanter exhibit" + desc = "A flimsy model of a standard Nanotrasen automated mindshield implant machine. With secure positioning harnesses and a robotic surgical injector, brain damage and other serious medical anomalies are now up to 60% less likely!" + icon = 'icons/obj/machines/implantchair.dmi' + icon_state = "implantchair" + +/obj/structure/showcase/machinery/microwave + name = "Nanotrasen-brand microwave" + desc = "The famous Nanotrasen-brand microwave, the multi-purpose cooking appliance every station needs! This one appears to be drawn onto a cardboard box." + icon = 'icons/obj/kitchen.dmi' + icon_state = "mw" + +/obj/structure/showcase/machinery/cloning_pod + name = "cloning pod exhibit" + desc = "Signs describe how cloning pods like these ensure that every Nanotrasen employee can carry out their contracts in full, even in the unlikely event of their catastrophic death. Hopefully they aren't all made of cardboard, like this one." + icon = 'icons/obj/cloning.dmi' + icon_state = "pod_0" + +/obj/structure/showcase/perfect_employee + name = "'Perfect Man' employee exhibit" + desc = "A stand with a model of the perfect Nanotrasen Employee bolted to it. Signs indicate it is robustly genetically engineered, as well as being ruthlessly loyal." + +/obj/structure/showcase/machinery/tv + name = "Nanotrasen corporate newsfeed" + desc = "A slightly battered looking TV. Various Nanotrasen infomercials play on a loop, accompanied by a jaunty tune." + icon = 'icons/obj/computer.dmi' + icon_state = "television" + +/obj/structure/showcase/machinery/signal_decrypter + name = "subsystem signal decrypter" + desc = "A strange machine thats supposedly used to help pick up and decrypt wave signals. " + icon = 'icons/obj/machines/telecomms.dmi' + icon_state = "processor" + + //Deconstructing //Showcases can be any sprite, so it makes sense that they can't be constructed. diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index e9f94d41f2..afa74cbb5e 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -209,16 +209,39 @@ desc = "To be Robust is not an action or a way of life, but a mental state. Only those with the force of Will strong enough to act during a crisis, saving friend from foe, are truly Robust. Stay Robust my friends." icon_state = "goldenplaque" +/obj/structure/sign/goldenplaque/captain + name = "The Most Robust Captain Award for Robustness" + /obj/structure/sign/kiddieplaque name = "AI developers plaque" desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be retarded. Beneath the image, someone has scratched the word \"PACKETS\"" icon_state = "kiddieplaque" +/obj/structure/sign/kiddieplaque/badger + name = "Remembrance Plaque" + desc = "A plaque commemorating the fallen, may they rest in peace, forever asleep amongst the stars. Someone has drawn a picture of a crying badger at the bottom." + +/obj/structure/sign/kiddieplaque/library + name = "Library Rules Sign" + desc = "A long list of rules to be followed when in the library, extolling the virtues of being quiet at all times and threatening those who would dare eat hot food inside." + +/obj/structure/sign/kiddieplaque/perfect_man + name = "\improper 'Perfect Man' sign" + desc = "A guide to the exhibit, explaining how recent developments in mindshield implant and cloning technologies by Nanotrasen Corporation have led to the development and the effective immortality of the 'perfect man', the loyal Nanotrasen Employee." + +/obj/structure/sign/kiddieplaque/perfect_drone + name = "\improper 'Perfect Drone' sign" + desc = "A guide to the drone shell dispenser, detailing the constructive and destructive applications of modern repair drones, as well as the development of the incorruptible cyborg servants of tomorrow, available today." + /obj/structure/sign/atmosplaque name = "\improper FEA Atmospherics Division plaque" desc = "This plaque commemorates the fall of the Atmos FEA division. For all the charred, dizzy, and brittle men who have died in its hands." icon_state = "atmosplaque" +/obj/structure/sign/atmosplaque/thunderdome + name = "Thunderdome Plaque" + desc = "This plaque commemorates those who have fallen in glorious combat. For all the charred, dizzy, and beaten men who have died in its hands." + /obj/structure/sign/nanotrasen name = "\improper NanoTrasen Logo " desc = "A sign with the Nanotrasen Logo on it. Glory to Nanotrasen!" diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 17f7f3f493..116ced183f 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -34,8 +34,8 @@ smooth = SMOOTH_TRUE canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced) -/obj/structure/table/New() - ..() +/obj/structure/table/Initialize() + . = ..() for(var/obj/structure/table/T in src.loc) if(T != src) qdel(T) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 1cf8e330fe..16d1072779 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -180,3 +180,6 @@ if(TT.has_exit(direction)) setDir(direction) return + +/obj/structure/transit_tube_pod/return_temperature() + return air_contents.temperature \ No newline at end of file diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index d82428ad98..8e6ba993cb 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -16,7 +16,7 @@ var/datum/effect_system/spark_spread/spark_system /obj/structure/trap/Initialize(mapload) - ..() + . = ..() spark_system = new spark_system.set_up(4,1,src) spark_system.attach(src) diff --git a/code/game/sound.dm b/code/game/sound.dm index cf6d4707a7..13a3343e06 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -178,4 +178,6 @@ 'sound/vore/prey/death_10.ogg') if("bullet_miss") soundin = pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg') + if("law") + soundin = pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg') return soundin diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 2ea3ffe7fc..68e5e31e84 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -69,7 +69,7 @@ icon = 'icons/obj/smooth_structures/reinforced_window.dmi' /turf/closed/indestructible/fakeglass/Initialize() - ..() + . = ..() icon_state = null //set the icon state to null, so our base state isn't visible underlays += mutable_appearance('icons/obj/structures.dmi', "grille") //add a grille underlay underlays += mutable_appearance('icons/turf/floors.dmi', "plating") //add the plating underlay, below the grille diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index da92d6b9dd..3fdd6b1cc9 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -125,7 +125,7 @@ /turf/open/chasm/straight_down/Initialize() - ..() + . = ..() drop_x = x drop_y = y if(z+1 <= world.maxz) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index df3d2aba86..02206646d2 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -21,7 +21,7 @@ broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5") if (!burnt_states) burnt_states = list() - ..() + . = ..() //This is so damaged or burnt tiles or platings don't get remembered as the default tile var/static/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","damaged4", "damaged5","panelscorched","floorscorched1","floorscorched2","platingdmg1","platingdmg2", "foam_plating", diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 59e7bed8ca..a24642c735 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -71,7 +71,7 @@ var/turfverb = "uproot" /turf/open/floor/grass/Initialize() - ..() + . = ..() update_icon() /turf/open/floor/grass/attackby(obj/item/C, mob/user, params) @@ -109,7 +109,7 @@ slowdown = 0 /turf/open/floor/grass/snow/basalt/Initialize() - ..() + . = ..() if(prob(15)) icon_state = "basalt[rand(0, 12)]" set_basalt_light(src) @@ -126,7 +126,7 @@ slowdown = 0 /turf/open/floor/grass/fakebasalt/Initialize() - ..() + . = ..() if(prob(15)) icon_state = "basalt[rand(0, 12)]" set_basalt_light(src) @@ -144,7 +144,7 @@ flags_1 = NONE /turf/open/floor/carpet/Initialize() - ..() + . = ..() update_icon() /turf/open/floor/carpet/update_icon() @@ -205,7 +205,7 @@ plane = PLANE_SPACE /turf/open/floor/fakespace/Initialize() - ..() + . = ..() icon_state = SPACE_ICON_STATE /turf/open/floor/fakespace/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm index 542a0ed81d..247382d03c 100644 --- a/code/game/turfs/simulated/floor/light_floor.dm +++ b/code/game/turfs/simulated/floor/light_floor.dm @@ -13,7 +13,7 @@ /turf/open/floor/light/Initialize() - ..() + . = ..() update_icon() /turf/open/floor/light/break_tile() diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index c28232410d..6f863d4bd0 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -18,7 +18,7 @@ /turf/open/floor/mineral/Initialize() broken_states = list("[initial(icon_state)]_dam") - ..() + . = ..() if (!icons) icons = list() @@ -221,7 +221,7 @@ icons = list("alienpod1", "alienpod2", "alienpod3", "alienpod4", "alienpod5", "alienpod6", "alienpod7", "alienpod8", "alienpod9") /turf/open/floor/mineral/abductor/Initialize() - ..() + . = ..() icon_state = "alienpod[rand(1,9)]" /turf/open/floor/mineral/abductor/break_tile() diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index f2475cf997..3656e146a6 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -20,7 +20,7 @@ /turf/open/floor/circuit/Initialize() SSmapping.nuke_tiles += src update_icon() - ..() + . = ..() /turf/open/floor/circuit/Destroy() SSmapping.nuke_tiles -= src @@ -145,7 +145,7 @@ var/obj/effect/clockwork/overlay/floor/realappearence /turf/open/floor/clockwork/Initialize() - ..() + . = ..() new /obj/effect/temp_visual/ratvar/floor(src) new /obj/effect/temp_visual/ratvar/beam(src) realappearence = new /obj/effect/clockwork/overlay/floor(src) @@ -230,53 +230,3 @@ icon_state = "sepia" desc = "Time seems to flow very slowly around these tiles" floor_tile = /obj/item/stack/tile/sepia - - - -// VINE FLOOR - -/turf/open/floor/vines - color = "#aa77aa" - icon_state = "vinefloor" - broken_states = list() - - -//All of this shit is useless for vines - -/turf/open/floor/vines/attackby() - return - -/turf/open/floor/vines/burn_tile() - return - -/turf/open/floor/vines/break_tile() - return - -/turf/open/floor/vines/make_plating() - return - -/turf/open/floor/vines/break_tile_to_plating() - return - -/turf/open/floor/vines/ex_act(severity, target) - ..() - if(severity < 3 || target == src) - ChangeTurf(src.baseturf) - -/turf/open/floor/vines/narsie_act(force, ignore_mobs, probability = 20) - if(prob(probability) || force) - ChangeTurf(baseturf) //nar sie eats this shit - narsie_act(force, ignore_mobs, probability) - -/turf/open/floor/vines/singularity_pull(S, current_size) - ..() - if(current_size >= STAGE_FIVE) - if(prob(50)) - ChangeTurf(src.baseturf) - -/turf/open/floor/vines/ChangeTurf(path, new_baseturf, defer_change = FALSE, ignore_air = FALSE, forceop = FALSE) - . = ..() - //Do this *after* the turf has changed as qdel in spacevines will call changeturf again if it hasn't - for(var/obj/structure/spacevine/SV in src) - if(!QDESTROYING(SV))//Helps avoid recursive loops - qdel(SV) diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index c99d2f3a9a..63c883f88c 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -361,6 +361,7 @@ name = "Mainframe Floor" /turf/open/floor/plasteel/vault/killroom name = "Killroom Floor" + initial_gas_mix = "n2=500;TEMP=80" /turf/open/floor/plasteel/cult icon_state = "cult" diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 3617759e99..8ad6657784 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -17,7 +17,7 @@ broken_states = list("platingdmg1", "platingdmg2", "platingdmg3") if (!burnt_states) burnt_states = list("panelscorched") - ..() + . = ..() icon_plating = icon_state /turf/open/floor/plating/update_icon() diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index eaf0e512f7..04c97aa7d5 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -108,7 +108,7 @@ var/obj/effect/clockwork/overlay/floor/bloodcult/realappearence /turf/open/floor/engine/cult/Initialize() - ..() + . = ..() new /obj/effect/temp_visual/cult/turf/floor(src) realappearence = new /obj/effect/clockwork/overlay/floor/bloodcult(src) realappearence.linked = src diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 9e0d57d782..630ded7daa 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -30,7 +30,7 @@ pixel_y = -4 pixel_x = -4 icon = smooth_icon - ..() + . = ..() if (mineralType && mineralAmt && spread && spreadChance) for(var/dir in GLOB.cardinals) if(prob(spreadChance)) @@ -153,7 +153,7 @@ /turf/closed/mineral/gibtonite = 4, /turf/open/floor/plating/asteroid/airless/cave = 2, /turf/closed/mineral/bscrystal = 1) if (display_icon_state) icon_state = display_icon_state - ..() + . = ..() if (prob(mineralChance)) var/path = pickweight(mineralSpawnChanceList) var/turf/T = ChangeTurf(path,FALSE,FALSE,TRUE) @@ -393,7 +393,7 @@ /turf/closed/mineral/gibtonite/Initialize() det_time = rand(8,10) //So you don't know exactly when the hot potato will explode - ..() + . = ..() /turf/closed/mineral/gibtonite/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner) && stage == 1) diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index b37c235d39..cf611560c3 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -30,6 +30,7 @@ throw_atom(AM) /turf/open/space/transit/proc/throw_atom(atom/movable/AM) + set waitfor = FALSE if(!AM || istype(AM, /obj/docking_port)) return if(AM.loc != src) // Multi-tile objects are "in" multiple locs but its loc is it's true placement. @@ -72,7 +73,7 @@ /turf/open/space/transit/Initialize() - ..() + . = ..() update_icon() for(var/atom/movable/AM in src) throw_atom(AM) diff --git a/code/game/world.dm b/code/game/world.dm index 87d76b9e8a..3763a408ac 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -6,7 +6,7 @@ GLOBAL_PROTECT(security_mode) SetupExternalRSC() - GLOB.config_error_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl + GLOB.config_error_log = GLOB.world_pda_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl CheckSecurityMode() @@ -88,10 +88,12 @@ GLOBAL_PROTECT(security_mode) GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") GLOB.world_qdel_log = file("[GLOB.log_directory]/qdel.log") GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") + GLOB.world_pda_log = file("[GLOB.log_directory]/pda.log") GLOB.sql_error_log = file("[GLOB.log_directory]/sql.log") WRITE_FILE(GLOB.world_game_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") WRITE_FILE(GLOB.world_attack_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") WRITE_FILE(GLOB.world_runtime_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") + WRITE_FILE(GLOB.world_pda_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently if(fexists(GLOB.config_error_log)) fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") @@ -106,7 +108,7 @@ GLOBAL_PROTECT(security_mode) GLOB.security_mode = SECURITY_ULTRASAFE warning("/tg/station 13 is not supported in ultrasafe security mode. Everything will break!") return - + //try to shell if(shell("echo \"The world is running in trusted mode\"") != null) GLOB.security_mode = SECURITY_TRUSTED diff --git a/code/modules/admin/DB_ban/functions.dm b/code/modules/admin/DB_ban/functions.dm index c6f44fd1da..086df300d3 100644 --- a/code/modules/admin/DB_ban/functions.dm +++ b/code/modules/admin/DB_ban/functions.dm @@ -354,6 +354,7 @@ output += "
Add custom ban: (ONLY use this if you can't ban through any other method)" output += "" + output += HrefTokenFormField() output += "" output += "" dat += "
Ban type:" + output += HrefTokenFormField() output += "Ckey: " output += "Admin ckey: " output += "" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 28a1b58235..b56caa4e9a 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -380,8 +380,6 @@ else dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" - //to_chat(world, "Channelname: [src.admincaster_feed_channel.channel_name] [src.admincaster_feed_channel.author]") - //to_chat(world, "Msg: [src.admincaster_feed_message.author] [src.admincaster_feed_message.body]") usr << browse(dat, "window=admincaster_main;size=400x600") onclose(usr, "admincaster_main") @@ -433,7 +431,7 @@ else rebootconfirm = TRUE if(rebootconfirm) - var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options + var/result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options if(result) SSblackbox.add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! switch(result) @@ -513,7 +511,7 @@ set category = "Server" set desc="Toggle dis bitch" set name="Toggle Dead OOC" - GLOB.dooc_allowed = !( GLOB.dooc_allowed ) + toggle_dooc() log_admin("[key_name(usr)] toggled OOC.") message_admins("[key_name_admin(usr)] toggled Dead OOC.") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 343e954a8d..526d05b76b 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -27,7 +27,8 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) return list( /client/proc/invisimin, /*allows our mob to go invisible/visible*/ // /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage - /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags_1*/ + /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/ + /datum/verbs/menu/Admin/verb/playerpanel, /client/proc/game_panel, /*game panel, allows to change game-mode etc*/ /client/proc/check_ai_laws, /*shows AI and borg laws*/ /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/ diff --git a/code/modules/admin/admin_verbs.dm.rej b/code/modules/admin/admin_verbs.dm.rej deleted file mode 100644 index c2f884d37c..0000000000 --- a/code/modules/admin/admin_verbs.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm (rejected hunks) -@@ -663,7 +664,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) - - if(!holder) - return -- -+ - if(has_antag_hud()) - toggle_antag_hud() - diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index e76385db59..93c354239b 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -6,7 +6,7 @@ create_mob_html = file2text('html/create_object.html') create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"") - user << browse(replacetext(create_mob_html, "/* ref src */", "\ref[src];[HrefToken()]"), "window=create_mob;size=425x475") + user << browse(create_panel_helper(create_mob_html), "window=create_mob;size=425x475") /proc/randomize_human(mob/living/carbon/human/H) H.gender = pick(MALE, FEMALE) diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm index cb947355b1..73bb998231 100644 --- a/code/modules/admin/create_object.dm +++ b/code/modules/admin/create_object.dm @@ -1,3 +1,8 @@ +/datum/admins/proc/create_panel_helper(template) + var/final_html = replacetext(template, "/* ref src */", "\ref[src];[HrefToken()]") + final_html = replacetext(final_html,"/* hreftokenfield */","[HrefTokenFormField()]") + return final_html + /datum/admins/proc/create_object(mob/user) var/static/create_object_html = null if (!create_object_html) @@ -6,7 +11,7 @@ create_object_html = file2text('html/create_object.html') create_object_html = replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"") - user << browse(replacetext(create_object_html, "/* ref src */", "\ref[src];[HrefToken()]"), "window=create_object;size=425x475") + user << browse(create_panel_helper(create_object_html), "window=create_object;size=425x475") /datum/admins/proc/quick_create_object(mob/user) var/static/list/create_object_forms = list( @@ -23,4 +28,4 @@ html_form = replacetext(html_form, "null /* object types */", "\"[objectjs]\"") create_object_forms[path] = html_form - user << browse(replacetext(html_form, "/* ref src */", "\ref[src];[HrefToken()]"), "window=qco[path];size=425x475") + user << browse(create_panel_helper(html_form), "window=qco[path];size=425x475") diff --git a/code/modules/admin/create_turf.dm b/code/modules/admin/create_turf.dm index f38b86a7b9..a25c02554e 100644 --- a/code/modules/admin/create_turf.dm +++ b/code/modules/admin/create_turf.dm @@ -6,4 +6,4 @@ create_turf_html = file2text('html/create_object.html') create_turf_html = replacetext(create_turf_html, "null /* object types */", "\"[turfjs]\"") - user << browse(replacetext(create_turf_html, "/* ref src */", "\ref[src];[HrefToken()]"), "window=create_turf;size=425x475") + user << browse(create_panel_helper(create_turf_html), "window=create_turf;size=425x475") diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 153fb2d8c2..238512c8b7 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -40,7 +40,7 @@ GLOBAL_PROTECT(href_token) for(var/I in 1 to 32) . += "[rand(10)]" -/proc/HrefToken(forceGlobal = FALSE) +/proc/RawHrefToken(forceGlobal = FALSE) var/tok = GLOB.href_token if(!forceGlobal && usr) var/client/C = usr.client @@ -49,7 +49,13 @@ GLOBAL_PROTECT(href_token) var/datum/admins/holder = C.holder if(holder) tok = holder.href_token - return "admin_token=[tok]" + return tok + +/proc/HrefToken(forceGlobal = FALSE) + return "admin_token=[RawHrefToken(forceGlobal)]" + +/proc/HrefTokenFormField(forceGlobal = FALSE) + return "" /datum/admins/proc/associate(client/C) if(IsAdminAdvancedProcCall()) diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index 552757b750..f0f263f815 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -86,7 +86,7 @@ admin_id = text2num(query_get_admin.item[1]) if(new_admin) - var/datum/DBQuery/query_add_admin = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin")]` (`id`, `ckey`, `rank`, `level`, `flags_1`) VALUES (null, '[adm_ckey]', '[new_rank]', -1, 0)") + var/datum/DBQuery/query_add_admin = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin")]` (`id`, `ckey`, `rank`, `level`, `flags`) VALUES (null, '[adm_ckey]', '[new_rank]', -1, 0)") if(!query_add_admin.warn_execute()) return var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');") @@ -119,7 +119,7 @@ if(!adm_ckey || !istext(adm_ckey) || !isnum(new_permission)) return - var/datum/DBQuery/query_get_perms = SSdbcore.NewQuery("SELECT id, flags_1 FROM [format_table_name("admin")] WHERE ckey = '[adm_ckey]'") + var/datum/DBQuery/query_get_perms = SSdbcore.NewQuery("SELECT id, flags FROM [format_table_name("admin")] WHERE ckey = '[adm_ckey]'") if(!query_get_perms.warn_execute()) return @@ -130,7 +130,7 @@ if(!admin_id) return - var/datum/DBQuery/query_change_perms = SSdbcore.NewQuery("UPDATE `[format_table_name("admin")]` SET flags_1 = [new_permission] WHERE id = [admin_id]") + var/datum/DBQuery/query_change_perms = SSdbcore.NewQuery("UPDATE `[format_table_name("admin")]` SET flags = [new_permission] WHERE id = [admin_id]") if(!query_change_perms.warn_execute()) return var/datum/DBQuery/query_change_perms_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edit permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');") diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index b0119b32d6..39e07e0a9f 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -317,7 +317,7 @@ dat += "Replacement Game Mode: [SSticker.mode.replacementmode.name]
" else dat += "Current Game Mode: [SSticker.mode.name]
" - dat += "Round Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]
" + dat += "Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
" dat += "Emergency shuttle
" if(EMERGENCY_IDLE_OR_RECALLED) dat += "Call Shuttle
" @@ -517,6 +517,21 @@ dat += "
PM
" + if(SSticker.mode.brother_teams.len > 0) + dat += "
" + for(var/datum/objective_team/brother_team/team in SSticker.mode.brother_teams) + for(var/datum/mind/brother in team.members) + var/mob/M = brother.current + if(M) + dat += "" + dat += "" + dat += "" + dat += "" + else + dat += "" + dat += "" + dat += "
Brothers
[M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""]PMFLWShow Objective
[brother.name]([brother.key])Brother body destroyed!PM
" + if(SSticker.mode.abductors.len) dat += "
" for(var/datum/mind/abductor in SSticker.mode.abductors) diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index 0664656f77..50236c548d 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -147,12 +147,13 @@ return var/output var/ruler = "
" - var/navbar = "\[All\]|\[#\]" + var/navbar = "\[All\]|\[#\]" for(var/letter in GLOB.alphabet) navbar += "|\[[letter]\]" - navbar += "|\[Memos\]|\[Watchlist\]" + navbar += "|\[Memos\]|\[Watchlist\]" navbar += "
\ \ + [HrefTokenFormField()]\ \ " if(!linkless) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index eaa98934d5..0842d82553 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -37,7 +37,6 @@ if(!query_text || length(query_text) < 1) return - //to_chat(world, query_text) var/list/query_list = SDQL2_tokenize(query_text) @@ -115,7 +114,7 @@ end_time -= start_time to_chat(usr, "SDQL query results: [query_text]") to_chat(usr, "SDQL query completed: [objs_all] objects selected by path, and [objs_eligible] objects executed on after WHERE filtering if applicable.") - to_chat(usr, "SDQL query took [end_time/10] seconds to complete.") + to_chat(usr, "SDQL query took [DisplayTimeText(end_time)] to complete.") /proc/SDQL_qdel_datum(datum/d) qdel(d) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index b444c62219..7922a89c80 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -106,8 +106,8 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) /datum/admin_help_tickets/proc/ClientLogin(client/C) C.current_ticket = CKey2ActiveTicket(C.ckey) if(C.current_ticket) - C.current_ticket.AddInteraction("Client reconnected.") C.current_ticket.initiator = C + C.current_ticket.AddInteraction("Client reconnected.") //Dissasociate ticket /datum/admin_help_tickets/proc/ClientLogout(client/C) @@ -152,6 +152,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) var/client/initiator //semi-misnomer, it's the person who ahelped/was bwoinked var/initiator_ckey var/initiator_key_name + var/heard_by_no_admins = FALSE var/list/_interactions //use AddInteraction() or, preferably, admin_ticket_log() @@ -199,6 +200,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) log_admin_private("Ticket #[id]: [key_name(initiator)]: [name] - heard by [admin_number_present] non-AFK admins who have +BAN.") if(admin_number_present <= 0) to_chat(C, "No active admins are online, your adminhelp was sent to the admin irc.") + heard_by_no_admins = TRUE GLOB.ahelp_tickets.active_tickets += src @@ -209,6 +211,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) return ..() /datum/admin_help/proc/AddInteraction(formatted_message) + if(heard_by_no_admins && usr && usr.ckey != initiator_ckey) + heard_by_no_admins = FALSE + send2irc(initiator_ckey, "Ticket #[id]: Answered by [key_name(usr)]") _interactions += "[gameTimestamp()]: [formatted_message]" //Removes the ahelp verb and returns it after 2 minutes @@ -394,9 +399,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) dat += "[GLOB.TAB][TicketHref("Refresh", ref_src)][GLOB.TAB][TicketHref("Re-Title", ref_src, "retitle")]" if(state != AHELP_ACTIVE) dat += "[GLOB.TAB][TicketHref("Reopen", ref_src, "reopen")]" - dat += "

Opened at: [gameTimestamp(wtime = opened_at)] (Approx [(world.time - opened_at) / 600] minutes ago)" + dat += "

Opened at: [gameTimestamp(wtime = opened_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)" if(closed_at) - dat += "
Closed at: [gameTimestamp(wtime = closed_at)] (Approx [(world.time - closed_at) / 600] minutes ago)" + dat += "
Closed at: [gameTimestamp(wtime = closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)" dat += "

" if(initiator) dat += "Actions: [FullMonty(ref_src)]
" @@ -674,7 +679,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(found.mind && found.mind.special_role) is_antag = 1 founds += "Name: [found.name]([found.real_name]) Ckey: [found.ckey] [is_antag ? "(Antag)" : null] " - msg += "[original_word](?|F) " + msg += "[original_word](?|F) " continue msg += "[original_word] " if(irc) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index a4482154d8..68df8a6666 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -43,8 +43,8 @@ log_admin("DEBUG: [key_name(M)] next_move = [M.next_move] lastDblClick = [M.next_click] world.time = [world.time]") M.next_move = 1 M.next_click = 0 - message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [largest_move_time/10] seconds!") - message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!") + message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [DisplayTimeText(largest_move_time)]!") + message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [DisplayTimeText(largest_click_time)]!") message_admins("world.time = [world.time]") SSblackbox.add_details("admin_verb","Unfreeze Everyone") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 069186f258..975e8aa731 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -844,8 +844,9 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits var/dat = {" Create Outfit - + + [HrefTokenFormField()]
Abductors
diff --git a/code/modules/admin/verbs/randomverbs.dm.rej b/code/modules/admin/verbs/randomverbs.dm.rej deleted file mode 100644 index 9941251566..0000000000 --- a/code/modules/admin/verbs/randomverbs.dm.rej +++ /dev/null @@ -1,25 +0,0 @@ -diff a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm (rejected hunks) -@@ -1246,7 +1246,8 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits - to_chat(usr, "ERROR: Client not found.") - return - -- C.set_db_player_flags() -+ if(!C.set_db_player_flags()) -+ to_chat(usr, "ERROR: Unable read player flags from database. Please check logs.") - var/dbflags = C.prefs.db_flags - var/newstate = FALSE - if(dbflags & DB_FLAG_EXEMPT) -@@ -1254,6 +1255,8 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits - else - newstate = TRUE - -- message_admins("[key_name_admin(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name_admin(C)]") -- log_admin("[key_name(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name(C)]") -- C.update_flag_db(DB_FLAG_EXEMPT, newstate) -\ No newline at end of file -+ if(C.update_flag_db(DB_FLAG_EXEMPT, newstate)) -+ to_chat(usr, "ERROR: Unable to update player flags. Please check logs.") -+ else -+ message_admins("[key_name_admin(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name_admin(C)]") -+ log_admin("[key_name(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name(C)]") -\ No newline at end of file diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index c3d6c24717..a16e58056b 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -106,7 +106,7 @@ T.air_update_turf(1) air_update_turf(1) -/atom/proc/atmos_spawn_air(text) //because a lot of people loves to copy paste awful code lets just make a easy proc to spawn your plasma fires +/atom/proc/atmos_spawn_air(text) //because a lot of people loves to copy paste awful code lets just make an easy proc to spawn your plasma fires var/turf/open/T = get_turf(src) if(!istype(T)) return diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index f5eb898163..ad1ba46d86 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -1,482 +1,482 @@ - /* -What are the archived variables for? - Calculations are done using the archived variables with the results merged into the regular variables. - This prevents race conditions that arise based on the order of tile processing. -*/ -#define MINIMUM_HEAT_CAPACITY 0.0003 -#define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that - once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */ - -GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm -GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) - -/proc/init_gaslist_cache() - . = list() - for(var/id in GLOB.meta_gas_info) - var/list/cached_gas = new(3) - - .[id] = cached_gas - - cached_gas[MOLES] = 0 - cached_gas[ARCHIVE] = 0 - cached_gas[GAS_META] = GLOB.meta_gas_info[id] - -#define GASLIST(id, out_list)\ - var/list/tmp_gaslist = GLOB.gaslist_cache[id];\ - out_list = tmp_gaslist.Copy(); - -/datum/gas_mixture - var/list/gases - var/temperature //kelvins - var/tmp/temperature_archived - var/volume //liters - var/last_share - var/list/reaction_results - -/datum/gas_mixture/New(volume = CELL_VOLUME) - gases = new - temperature = 0 - temperature_archived = 0 - src.volume = volume - last_share = 0 - reaction_results = new - -//listmos procs - - //assert_gas(gas_id) - used to guarantee that the gas list for this id exists. - //Must be used before adding to a gas. May be used before reading from a gas. -/datum/gas_mixture/proc/assert_gas(gas_id) - var/cached_gases = gases - if(cached_gases[gas_id]) - return - GASLIST(gas_id, cached_gases[gas_id]) - - //assert_gases(args) - shorthand for calling assert_gas() once for each gas type. -/datum/gas_mixture/proc/assert_gases() - for(var/id in args) - assert_gas(id) - - //add_gas(gas_id) - similar to assert_gas(), but does not check for an existing - //gas list for this id. This can clobber existing gases. - //Used instead of assert_gas() when you know the gas does not exist. Faster than assert_gas(). -/datum/gas_mixture/proc/add_gas(gas_id) - GASLIST(gas_id, gases[gas_id]) - - //add_gases(args) - shorthand for calling add_gas() once for each gas_type. -/datum/gas_mixture/proc/add_gases() - var/cached_gases = gases - for(var/id in args) - GASLIST(id, cached_gases[id]) - - //garbage_collect() - removes any gas list which is empty. - //If called with a list as an argument, only removes gas lists with IDs from that list. - //Must be used after subtracting from a gas. Must be used after assert_gas() - //if assert_gas() was called only to read from the gas. - //By removing empty gases, processing speed is increased. -/datum/gas_mixture/proc/garbage_collect(list/tocheck) - var/list/cached_gases = gases - for(var/id in (tocheck || cached_gases)) - if(cached_gases[id][MOLES] <= 0 && cached_gases[id][ARCHIVE] <= 0) - cached_gases -= id - - //PV = nRT -/datum/gas_mixture/proc/heat_capacity() //joules per kelvin - var/list/cached_gases = gases - . = 0 - for(var/id in cached_gases) - var/gas_data = cached_gases[id] - . += gas_data[MOLES] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] - -/datum/gas_mixture/proc/heat_capacity_archived() //joules per kelvin - var/list/cached_gases = gases - . = 0 - for(var/id in cached_gases) - var/gas_data = cached_gases[id] - . += gas_data[ARCHIVE] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] - -//prefer this in performance critical areas -#define TOTAL_MOLES(cached_gases, out_var)\ - out_var = 0;\ - for(var/total_moles_id in cached_gases){\ - out_var += cached_gases[total_moles_id][MOLES];\ - } - -/datum/gas_mixture/proc/total_moles() - var/cached_gases = gases - TOTAL_MOLES(cached_gases, .) - -/datum/gas_mixture/proc/return_pressure() //kilopascals - if(volume > 0) // to prevent division by zero - var/cached_gases = gases - TOTAL_MOLES(cached_gases, .) - . *= R_IDEAL_GAS_EQUATION * temperature / volume - return - return 0 - -/datum/gas_mixture/proc/return_temperature() //kelvins - return temperature - -/datum/gas_mixture/proc/return_volume() //liters - return max(0, volume) - -/datum/gas_mixture/proc/thermal_energy() //joules - return temperature * heat_capacity() - -/datum/gas_mixture/proc/archive() - //Update archived versions of variables - //Returns: 1 in all cases - -/datum/gas_mixture/proc/merge(datum/gas_mixture/giver) - //Merges all air from giver into self. Deletes giver. - //Returns: 1 if we are mutable, 0 otherwise - -/datum/gas_mixture/proc/remove(amount) - //Proportionally removes amount of gas from the gas_mixture - //Returns: gas_mixture with the gases removed - -/datum/gas_mixture/proc/remove_ratio(ratio) - //Proportionally removes amount of gas from the gas_mixture - //Returns: gas_mixture with the gases removed - -/datum/gas_mixture/proc/copy() - //Creates new, identical gas mixture - //Returns: duplicate gas mixture - -/datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample) - //Copies variables from sample - //Returns: 1 if we are mutable, 0 otherwise - -/datum/gas_mixture/proc/copy_from_turf(turf/model) - //Copies all gas info from the turf into the gas list along with temperature - //Returns: 1 if we are mutable, 0 otherwise - -/datum/gas_mixture/proc/parse_gas_string(gas_string) - //Copies variables from a particularly formatted string. - //Returns: 1 if we are mutable, 0 otherwise - -/datum/gas_mixture/proc/share(datum/gas_mixture/sharer) - //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length - //Returns: amount of gas exchanged (+ if sharer received) - -/datum/gas_mixture/proc/after_share(datum/gas_mixture/sharer) - //called on share's sharer to let it know it just got some gases - -/datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - //Performs temperature sharing calculations (via conduction) between two gas_mixtures assuming only 1 boundary length - //Returns: new temperature of the sharer - -/datum/gas_mixture/proc/compare(datum/gas_mixture/sample) - //Compares sample to self to see if within acceptable ranges that group processing may be enabled - //Returns: a string indicating what check failed, or "" if check passes - -/datum/gas_mixture/proc/react(turf/open/dump_location) - //Performs various reactions such as combustion or fusion (LOL) - //Returns: 1 if any reaction took place; 0 otherwise - -/datum/gas_mixture/archive() - var/list/cached_gases = gases - - temperature_archived = temperature - for(var/id in cached_gases) - cached_gases[id][ARCHIVE] = cached_gases[id][MOLES] - - return 1 - -/datum/gas_mixture/merge(datum/gas_mixture/giver) - if(!giver) - return 0 - - //heat transfer - if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity() - var/giver_heat_capacity = giver.heat_capacity() - var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity - if(combined_heat_capacity) - temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity - - var/list/cached_gases = gases //accessing datum vars is slower than proc vars - var/list/giver_gases = giver.gases - //gas transfer - for(var/giver_id in giver_gases) - assert_gas(giver_id) - cached_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES] - - return 1 - -/datum/gas_mixture/remove(amount) - var/sum - var/list/cached_gases = gases - TOTAL_MOLES(cached_gases, sum) - amount = min(amount, sum) //Can not take more air than tile has! - if(amount <= 0) - return null - var/datum/gas_mixture/removed = new - var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars - - removed.temperature = temperature - for(var/id in cached_gases) - removed.add_gas(id) - removed_gases[id][MOLES] = QUANTIZE((cached_gases[id][MOLES] / sum) * amount) - cached_gases[id][MOLES] -= removed_gases[id][MOLES] - garbage_collect() - - return removed - -/datum/gas_mixture/remove_ratio(ratio) - if(ratio <= 0) - return null - ratio = min(ratio, 1) - - var/list/cached_gases = gases - var/datum/gas_mixture/removed = new - var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars - - removed.temperature = temperature - for(var/id in cached_gases) - removed.add_gas(id) - removed_gases[id][MOLES] = QUANTIZE(cached_gases[id][MOLES] * ratio) - cached_gases[id][MOLES] -= removed_gases[id][MOLES] - - garbage_collect() - - return removed - -/datum/gas_mixture/copy() - var/list/cached_gases = gases - var/datum/gas_mixture/copy = new - var/list/copy_gases = copy.gases - - copy.temperature = temperature - for(var/id in cached_gases) - copy.add_gas(id) - copy_gases[id][MOLES] = cached_gases[id][MOLES] - - return copy - -/datum/gas_mixture/copy_from(datum/gas_mixture/sample) - var/list/cached_gases = gases //accessing datum vars is slower than proc vars - var/list/sample_gases = sample.gases - - temperature = sample.temperature - for(var/id in sample_gases) - assert_gas(id) - cached_gases[id][MOLES] = sample_gases[id][MOLES] - - //remove all gases not in the sample - cached_gases &= sample_gases - - return 1 - -/datum/gas_mixture/copy_from_turf(turf/model) - parse_gas_string(model.initial_gas_mix) - - //acounts for changes in temperature - var/turf/model_parent = model.parent_type - if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature)) - temperature = model.temperature - - return 1 - -/datum/gas_mixture/parse_gas_string(gas_string) - var/list/gases = src.gases - var/list/gas = params2list(gas_string) - if(gas["TEMP"]) - temperature = text2num(gas["TEMP"]) - gas -= "TEMP" - gases.Cut() - for(var/id in gas) - add_gas(id) - gases[id][MOLES] = text2num(gas[id]) - return 1 - -/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - if(!sharer) - return 0 - - var/list/cached_gases = gases - var/list/sharer_gases = sharer.gases - - var/temperature_delta = temperature_archived - sharer.temperature_archived - var/abs_temperature_delta = abs(temperature_delta) - - var/old_self_heat_capacity = 0 - var/old_sharer_heat_capacity = 0 - if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - old_self_heat_capacity = heat_capacity() - old_sharer_heat_capacity = sharer.heat_capacity() - - var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer - var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us - - var/moved_moles = 0 - var/abs_moved_moles = 0 - - //GAS TRANSFER - for(var/id in sharer_gases - cached_gases) // create gases not in our cache - add_gas(id) - for(var/id in cached_gases) // transfer gases - if(!sharer_gases[id]) //checking here prevents an uneeded proc call if the check fails. - sharer.add_gas(id) - - var/gas = cached_gases[id] - var/sharergas = sharer_gases[id] - - var/delta = QUANTIZE(gas[ARCHIVE] - sharergas[ARCHIVE])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures - - if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/gas_heat_capacity = delta * gas[GAS_META][META_GAS_SPECIFIC_HEAT] - if(delta > 0) - heat_capacity_self_to_sharer += gas_heat_capacity - else - heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative. saves a proc call. - - gas[MOLES] -= delta - sharergas[MOLES] += delta - moved_moles += delta - abs_moved_moles += abs(delta) - - last_share = abs_moved_moles - - //THERMAL ENERGY TRANSFER - if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer - var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self - - //transfer of thermal energy (via changed heat capacity) between self and sharer - if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) - temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity - - if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) - sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity - //thermal energy of the system (self and sharer) is unchanged - - if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY) - if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.10) // <10% change in sharer heat capacity - temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT) - - var/list/unique_gases = cached_gases ^ sharer_gases - if(unique_gases.len) //if all gases were present in both mixtures, we know that no gases are 0 - garbage_collect(cached_gases - sharer_gases) //any gases the sharer had, we are guaranteed to have. gases that it didn't have we are not. - sharer.garbage_collect(sharer_gases - cached_gases) //the reverse is equally true - sharer.after_share(src, atmos_adjacent_turfs) - if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) - var/our_moles - TOTAL_MOLES(cached_gases,our_moles) - var/their_moles - TOTAL_MOLES(sharer_gases,their_moles) - var/delta_pressure = temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles) - return delta_pressure * R_IDEAL_GAS_EQUATION / volume - -/datum/gas_mixture/after_share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - return - -/datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) - //transfer of thermal energy (via conduction) between self and sharer - if(sharer) - sharer_temperature = sharer.temperature_archived - var/temperature_delta = temperature_archived - sharer_temperature - if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity_archived() - sharer_heat_capacity = sharer_heat_capacity || sharer.heat_capacity_archived() - - if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*temperature_delta* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) - - temperature = max(temperature - heat/self_heat_capacity, TCMB) - sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB) - if(sharer) - sharer.temperature = sharer_temperature - return sharer_temperature - //thermal energy of the system (self and sharer) is unchanged - -/datum/gas_mixture/compare(datum/gas_mixture/sample) - var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars - var/list/cached_gases = gases - - for(var/id in cached_gases | sample_gases) // compare gases from either mixture - var/gas_moles = cached_gases[id] - gas_moles = gas_moles ? gas_moles[MOLES] : 0 - var/sample_moles = sample_gases[id] - sample_moles = sample_moles ? sample_moles[MOLES] : 0 - var/delta = abs(gas_moles - sample_moles) - if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && \ - delta > gas_moles * MINIMUM_AIR_RATIO_TO_MOVE) - return id - - var/our_moles - TOTAL_MOLES(cached_gases, our_moles) - if(our_moles > MINIMUM_MOLES_DELTA_TO_MOVE) - var/temp = temperature - var/sample_temp = sample.temperature - - var/temperature_delta = abs(temp - sample_temp) - if(temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return "temp" - - return "" - -/datum/gas_mixture/react(turf/open/dump_location) - . = 0 - if(temperature < TCMB) //just for safety - temperature = TCMB - reaction_results = new - - var/list/cached_gases = gases - var/temp = temperature - var/ener = thermal_energy() - - reaction_loop: - for(var/r in SSair.gas_reactions) - var/datum/gas_reaction/reaction = r - - var/list/min_reqs = reaction.min_requirements.Copy() - if((min_reqs["TEMP"] && temp < min_reqs["TEMP"]) \ - || (min_reqs["ENER"] && ener < min_reqs["ENER"])) - continue - min_reqs -= "TEMP" - min_reqs -= "ENER" - - for(var/id in min_reqs) - if(!cached_gases[id] || cached_gases[id][MOLES] < min_reqs[id]) - continue reaction_loop - //at this point, all minimum requirements for the reaction are satisfied. - - /* currently no reactions have maximum requirements, so we can leave the checks commented out for a slight performance boost - var/list/max_reqs = reaction.max_requirements.Copy() - if((max_reqs["TEMP"] && temp > max_reqs["TEMP"]) \ - || (max_reqs["ENER"] && ener > max_reqs["ENER"])) - continue - max_reqs -= "TEMP" - max_reqs -= "ENER" - - for(var/id in max_reqs) - if(cached_gases[id] && cached_gases[id][MOLES] > max_reqs[id]) - continue reaction_loop - //at this point, all requirements for the reaction are satisfied. we can now react() - */ - - . |= reaction.react(src, dump_location) - if(.) - garbage_collect() - -//Takes the amount of the gas you want to PP as an argument -//So I don't have to do some hacky switches/defines/magic strings -//eg: -//Tox_PP = get_partial_pressure(gas_mixture.toxins) -//O2_PP = get_partial_pressure(gas_mixture.oxygen) - -/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) - return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME -//inverse -/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) - return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature) - -//Mathematical proofs: -/* -get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp -get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() - -10/20*5 = 2.5 -10 = 2.5/5*20 -*/ + /* +What are the archived variables for? + Calculations are done using the archived variables with the results merged into the regular variables. + This prevents race conditions that arise based on the order of tile processing. +*/ +#define MINIMUM_HEAT_CAPACITY 0.0003 +#define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that + once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */ + +GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm +GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) + +/proc/init_gaslist_cache() + . = list() + for(var/id in GLOB.meta_gas_info) + var/list/cached_gas = new(3) + + .[id] = cached_gas + + cached_gas[MOLES] = 0 + cached_gas[ARCHIVE] = 0 + cached_gas[GAS_META] = GLOB.meta_gas_info[id] + +#define GASLIST(id, out_list)\ + var/list/tmp_gaslist = GLOB.gaslist_cache[id];\ + out_list = tmp_gaslist.Copy(); + +/datum/gas_mixture + var/list/gases + var/temperature //kelvins + var/tmp/temperature_archived + var/volume //liters + var/last_share + var/list/reaction_results + +/datum/gas_mixture/New(volume = CELL_VOLUME) + gases = new + temperature = 0 + temperature_archived = 0 + src.volume = volume + last_share = 0 + reaction_results = new + +//listmos procs + + //assert_gas(gas_id) - used to guarantee that the gas list for this id exists. + //Must be used before adding to a gas. May be used before reading from a gas. +/datum/gas_mixture/proc/assert_gas(gas_id) + var/cached_gases = gases + if(cached_gases[gas_id]) + return + GASLIST(gas_id, cached_gases[gas_id]) + + //assert_gases(args) - shorthand for calling assert_gas() once for each gas type. +/datum/gas_mixture/proc/assert_gases() + for(var/id in args) + assert_gas(id) + + //add_gas(gas_id) - similar to assert_gas(), but does not check for an existing + //gas list for this id. This can clobber existing gases. + //Used instead of assert_gas() when you know the gas does not exist. Faster than assert_gas(). +/datum/gas_mixture/proc/add_gas(gas_id) + GASLIST(gas_id, gases[gas_id]) + + //add_gases(args) - shorthand for calling add_gas() once for each gas_type. +/datum/gas_mixture/proc/add_gases() + var/cached_gases = gases + for(var/id in args) + GASLIST(id, cached_gases[id]) + + //garbage_collect() - removes any gas list which is empty. + //If called with a list as an argument, only removes gas lists with IDs from that list. + //Must be used after subtracting from a gas. Must be used after assert_gas() + //if assert_gas() was called only to read from the gas. + //By removing empty gases, processing speed is increased. +/datum/gas_mixture/proc/garbage_collect(list/tocheck) + var/list/cached_gases = gases + for(var/id in (tocheck || cached_gases)) + if(cached_gases[id][MOLES] <= 0 && cached_gases[id][ARCHIVE] <= 0) + cached_gases -= id + + //PV = nRT +/datum/gas_mixture/proc/heat_capacity() //joules per kelvin + var/list/cached_gases = gases + . = 0 + for(var/id in cached_gases) + var/gas_data = cached_gases[id] + . += gas_data[MOLES] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] + +/datum/gas_mixture/proc/heat_capacity_archived() //joules per kelvin + var/list/cached_gases = gases + . = 0 + for(var/id in cached_gases) + var/gas_data = cached_gases[id] + . += gas_data[ARCHIVE] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] + +//prefer this in performance critical areas +#define TOTAL_MOLES(cached_gases, out_var)\ + out_var = 0;\ + for(var/total_moles_id in cached_gases){\ + out_var += cached_gases[total_moles_id][MOLES];\ + } + +/datum/gas_mixture/proc/total_moles() + var/cached_gases = gases + TOTAL_MOLES(cached_gases, .) + +/datum/gas_mixture/proc/return_pressure() //kilopascals + if(volume > 0) // to prevent division by zero + var/cached_gases = gases + TOTAL_MOLES(cached_gases, .) + . *= R_IDEAL_GAS_EQUATION * temperature / volume + return + return 0 + +/datum/gas_mixture/proc/return_temperature() //kelvins + return temperature + +/datum/gas_mixture/proc/return_volume() //liters + return max(0, volume) + +/datum/gas_mixture/proc/thermal_energy() //joules + return temperature * heat_capacity() + +/datum/gas_mixture/proc/archive() + //Update archived versions of variables + //Returns: 1 in all cases + +/datum/gas_mixture/proc/merge(datum/gas_mixture/giver) + //Merges all air from giver into self. Deletes giver. + //Returns: 1 if we are mutable, 0 otherwise + +/datum/gas_mixture/proc/remove(amount) + //Proportionally removes amount of gas from the gas_mixture + //Returns: gas_mixture with the gases removed + +/datum/gas_mixture/proc/remove_ratio(ratio) + //Proportionally removes amount of gas from the gas_mixture + //Returns: gas_mixture with the gases removed + +/datum/gas_mixture/proc/copy() + //Creates new, identical gas mixture + //Returns: duplicate gas mixture + +/datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample) + //Copies variables from sample + //Returns: 1 if we are mutable, 0 otherwise + +/datum/gas_mixture/proc/copy_from_turf(turf/model) + //Copies all gas info from the turf into the gas list along with temperature + //Returns: 1 if we are mutable, 0 otherwise + +/datum/gas_mixture/proc/parse_gas_string(gas_string) + //Copies variables from a particularly formatted string. + //Returns: 1 if we are mutable, 0 otherwise + +/datum/gas_mixture/proc/share(datum/gas_mixture/sharer) + //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length + //Returns: amount of gas exchanged (+ if sharer received) + +/datum/gas_mixture/proc/after_share(datum/gas_mixture/sharer) + //called on share's sharer to let it know it just got some gases + +/datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) + //Performs temperature sharing calculations (via conduction) between two gas_mixtures assuming only 1 boundary length + //Returns: new temperature of the sharer + +/datum/gas_mixture/proc/compare(datum/gas_mixture/sample) + //Compares sample to self to see if within acceptable ranges that group processing may be enabled + //Returns: a string indicating what check failed, or "" if check passes + +/datum/gas_mixture/proc/react(turf/open/dump_location) + //Performs various reactions such as combustion or fusion (LOL) + //Returns: 1 if any reaction took place; 0 otherwise + +/datum/gas_mixture/archive() + var/list/cached_gases = gases + + temperature_archived = temperature + for(var/id in cached_gases) + cached_gases[id][ARCHIVE] = cached_gases[id][MOLES] + + return 1 + +/datum/gas_mixture/merge(datum/gas_mixture/giver) + if(!giver) + return 0 + + //heat transfer + if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity() + var/giver_heat_capacity = giver.heat_capacity() + var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity + if(combined_heat_capacity) + temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity + + var/list/cached_gases = gases //accessing datum vars is slower than proc vars + var/list/giver_gases = giver.gases + //gas transfer + for(var/giver_id in giver_gases) + assert_gas(giver_id) + cached_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES] + + return 1 + +/datum/gas_mixture/remove(amount) + var/sum + var/list/cached_gases = gases + TOTAL_MOLES(cached_gases, sum) + amount = min(amount, sum) //Can not take more air than tile has! + if(amount <= 0) + return null + var/datum/gas_mixture/removed = new + var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars + + removed.temperature = temperature + for(var/id in cached_gases) + removed.add_gas(id) + removed_gases[id][MOLES] = QUANTIZE((cached_gases[id][MOLES] / sum) * amount) + cached_gases[id][MOLES] -= removed_gases[id][MOLES] + garbage_collect() + + return removed + +/datum/gas_mixture/remove_ratio(ratio) + if(ratio <= 0) + return null + ratio = min(ratio, 1) + + var/list/cached_gases = gases + var/datum/gas_mixture/removed = new + var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars + + removed.temperature = temperature + for(var/id in cached_gases) + removed.add_gas(id) + removed_gases[id][MOLES] = QUANTIZE(cached_gases[id][MOLES] * ratio) + cached_gases[id][MOLES] -= removed_gases[id][MOLES] + + garbage_collect() + + return removed + +/datum/gas_mixture/copy() + var/list/cached_gases = gases + var/datum/gas_mixture/copy = new + var/list/copy_gases = copy.gases + + copy.temperature = temperature + for(var/id in cached_gases) + copy.add_gas(id) + copy_gases[id][MOLES] = cached_gases[id][MOLES] + + return copy + +/datum/gas_mixture/copy_from(datum/gas_mixture/sample) + var/list/cached_gases = gases //accessing datum vars is slower than proc vars + var/list/sample_gases = sample.gases + + temperature = sample.temperature + for(var/id in sample_gases) + assert_gas(id) + cached_gases[id][MOLES] = sample_gases[id][MOLES] + + //remove all gases not in the sample + cached_gases &= sample_gases + + return 1 + +/datum/gas_mixture/copy_from_turf(turf/model) + parse_gas_string(model.initial_gas_mix) + + //acounts for changes in temperature + var/turf/model_parent = model.parent_type + if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature)) + temperature = model.temperature + + return 1 + +/datum/gas_mixture/parse_gas_string(gas_string) + var/list/gases = src.gases + var/list/gas = params2list(gas_string) + if(gas["TEMP"]) + temperature = text2num(gas["TEMP"]) + gas -= "TEMP" + gases.Cut() + for(var/id in gas) + add_gas(id) + gases[id][MOLES] = text2num(gas[id]) + return 1 + +/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) + if(!sharer) + return 0 + + var/list/cached_gases = gases + var/list/sharer_gases = sharer.gases + + var/temperature_delta = temperature_archived - sharer.temperature_archived + var/abs_temperature_delta = abs(temperature_delta) + + var/old_self_heat_capacity = 0 + var/old_sharer_heat_capacity = 0 + if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + old_self_heat_capacity = heat_capacity() + old_sharer_heat_capacity = sharer.heat_capacity() + + var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer + var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us + + var/moved_moles = 0 + var/abs_moved_moles = 0 + + //GAS TRANSFER + for(var/id in sharer_gases - cached_gases) // create gases not in our cache + add_gas(id) + for(var/id in cached_gases) // transfer gases + if(!sharer_gases[id]) //checking here prevents an uneeded proc call if the check fails. + sharer.add_gas(id) + + var/gas = cached_gases[id] + var/sharergas = sharer_gases[id] + + var/delta = QUANTIZE(gas[ARCHIVE] - sharergas[ARCHIVE])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures + + if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/gas_heat_capacity = delta * gas[GAS_META][META_GAS_SPECIFIC_HEAT] + if(delta > 0) + heat_capacity_self_to_sharer += gas_heat_capacity + else + heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative. saves a proc call. + + gas[MOLES] -= delta + sharergas[MOLES] += delta + moved_moles += delta + abs_moved_moles += abs(delta) + + last_share = abs_moved_moles + + //THERMAL ENERGY TRANSFER + if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer + var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self + + //transfer of thermal energy (via changed heat capacity) between self and sharer + if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) + temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity + + if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) + sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity + //thermal energy of the system (self and sharer) is unchanged + + if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY) + if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.1) // <10% change in sharer heat capacity + temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT) + + var/list/unique_gases = cached_gases ^ sharer_gases + if(unique_gases.len) //if all gases were present in both mixtures, we know that no gases are 0 + garbage_collect(cached_gases - sharer_gases) //any gases the sharer had, we are guaranteed to have. gases that it didn't have we are not. + sharer.garbage_collect(sharer_gases - cached_gases) //the reverse is equally true + sharer.after_share(src, atmos_adjacent_turfs) + if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) + var/our_moles + TOTAL_MOLES(cached_gases,our_moles) + var/their_moles + TOTAL_MOLES(sharer_gases,their_moles) + var/delta_pressure = temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles) + return delta_pressure * R_IDEAL_GAS_EQUATION / volume + +/datum/gas_mixture/after_share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) + return + +/datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) + //transfer of thermal energy (via conduction) between self and sharer + if(sharer) + sharer_temperature = sharer.temperature_archived + var/temperature_delta = temperature_archived - sharer_temperature + if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity_archived() + sharer_heat_capacity = sharer_heat_capacity || sharer.heat_capacity_archived() + + if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) + var/heat = conduction_coefficient*temperature_delta* \ + (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) + + temperature = max(temperature - heat/self_heat_capacity, TCMB) + sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB) + if(sharer) + sharer.temperature = sharer_temperature + return sharer_temperature + //thermal energy of the system (self and sharer) is unchanged + +/datum/gas_mixture/compare(datum/gas_mixture/sample) + var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars + var/list/cached_gases = gases + + for(var/id in cached_gases | sample_gases) // compare gases from either mixture + var/gas_moles = cached_gases[id] + gas_moles = gas_moles ? gas_moles[MOLES] : 0 + var/sample_moles = sample_gases[id] + sample_moles = sample_moles ? sample_moles[MOLES] : 0 + var/delta = abs(gas_moles - sample_moles) + if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && \ + delta > gas_moles * MINIMUM_AIR_RATIO_TO_MOVE) + return id + + var/our_moles + TOTAL_MOLES(cached_gases, our_moles) + if(our_moles > MINIMUM_MOLES_DELTA_TO_MOVE) + var/temp = temperature + var/sample_temp = sample.temperature + + var/temperature_delta = abs(temp - sample_temp) + if(temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) + return "temp" + + return "" + +/datum/gas_mixture/react(turf/open/dump_location) + . = 0 + if(temperature < TCMB) //just for safety + temperature = TCMB + reaction_results = new + + var/list/cached_gases = gases + var/temp = temperature + var/ener = thermal_energy() + + reaction_loop: + for(var/r in SSair.gas_reactions) + var/datum/gas_reaction/reaction = r + + var/list/min_reqs = reaction.min_requirements.Copy() + if((min_reqs["TEMP"] && temp < min_reqs["TEMP"]) \ + || (min_reqs["ENER"] && ener < min_reqs["ENER"])) + continue + min_reqs -= "TEMP" + min_reqs -= "ENER" + + for(var/id in min_reqs) + if(!cached_gases[id] || cached_gases[id][MOLES] < min_reqs[id]) + continue reaction_loop + //at this point, all minimum requirements for the reaction are satisfied. + + /* currently no reactions have maximum requirements, so we can leave the checks commented out for a slight performance boost + var/list/max_reqs = reaction.max_requirements.Copy() + if((max_reqs["TEMP"] && temp > max_reqs["TEMP"]) \ + || (max_reqs["ENER"] && ener > max_reqs["ENER"])) + continue + max_reqs -= "TEMP" + max_reqs -= "ENER" + + for(var/id in max_reqs) + if(cached_gases[id] && cached_gases[id][MOLES] > max_reqs[id]) + continue reaction_loop + //at this point, all requirements for the reaction are satisfied. we can now react() + */ + + . |= reaction.react(src, dump_location) + if(.) + garbage_collect() + +//Takes the amount of the gas you want to PP as an argument +//So I don't have to do some hacky switches/defines/magic strings +//eg: +//Tox_PP = get_partial_pressure(gas_mixture.toxins) +//O2_PP = get_partial_pressure(gas_mixture.oxygen) + +/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) + return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME +//inverse +/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) + return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature) + +//Mathematical proofs: +/* +get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp +get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() + +10/20*5 = 2.5 +10 = 2.5/5*20 +*/ diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 1060c2daf2..a37e4d61c4 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -108,8 +108,6 @@ var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow var/temperature = air.temperature var/list/cached_results = air.reaction_results - - //to_chat(world, "pre [temperature], [cached_gases["o2"][MOLES]], [cached_gases["plasma"][MOLES]]") cached_results[id] = 0 //General volatile gas burn @@ -165,8 +163,6 @@ if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = (temperature*old_heat_capacity + energy_released)/new_heat_capacity - //to_chat(world, "post [temperature], [cached_gases["o2"][MOLES]], [cached_gases["plasma"][MOLES]]") - //let the floor know a fire is happening if(istype(location)) temperature = air.temperature @@ -201,7 +197,6 @@ //Fusion wont occur if the level of impurities is too high. return NO_REACTION - //to_chat(world, "pre [temperature, [cached_gases["plasma"][MOLES]], [cached_gases["co2"][MOLES]]) var/old_heat_capacity = air.heat_capacity() var/carbon_efficency = min(cached_gases["plasma"][MOLES]/cached_gases["co2"][MOLES],MAX_CARBON_EFFICENCY) var/reaction_energy = air.thermal_energy() @@ -226,7 +221,6 @@ if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB) //Prevents whatever mechanism is causing it to hit negative temperatures. - //to_chat(world, "post [temperature], [cached_gases["plasma"][MOLES]], [cached_gases["co2"][MOLES]]) return REACTING #undef REACTING diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 58a450bec9..6de564da6d 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -73,7 +73,7 @@ var/datum/radio_frequency/radio_connection var/list/TLV = list( // Breathable air. - "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE* 0.90, ONE_ATMOSPHERE * 1.10, ONE_ATMOSPHERE * 1.20), // kPa + "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), // K "o2" = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa "n2" = new/datum/tlv(-1, -1, 1000, 1000), // Partial pressure, kpa @@ -101,7 +101,7 @@ /obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures. TLV = list( - "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE* 0.90, ONE_ATMOSPHERE * 1.10, ONE_ATMOSPHERE * 1.20), // kPa + "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa "temperature" = new/datum/tlv(200,210,273.15,283.15), // K "o2" = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa "n2" = new/datum/tlv(-1, -1, 1000, 1000), // Partial pressure, kpa @@ -415,7 +415,6 @@ signal.data["sigtype"] = "command" radio_connection.post_signal(src, signal, GLOB.RADIO_FROM_AIRALARM) -// to_chat(world, text("Signal [] Broadcasted to []", command, target)) return 1 @@ -709,6 +708,16 @@ qdel(W) return + if(istype(W, /obj/item/device/electroadaptive_pseudocircuit)) + var/obj/item/device/electroadaptive_pseudocircuit/P = W + if(!P.adapt_circuit(user, 25)) + return + user.visible_message("[user] fabricates a circuit and places it into [src].", \ + "You adapt an air alarm circuit and slot it into the assembly.") + buildstage = 1 + update_icon() + return + if(istype(W, /obj/item/wrench)) to_chat(user, "You detach \the [src] from the wall.") playsound(src.loc, W.usesound, 50, 1) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 977d48fbd7..585b4c4550 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -91,7 +91,7 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/can_be_node(obj/machinery/atmospherics/target) if(target.initialize_directions & get_dir(target,src)) - return 1 + return TRUE /obj/machinery/atmospherics/proc/pipeline_expansion() return nodes @@ -208,6 +208,17 @@ Pipelines + Other Objects -> Pipe network pipe_overlay = . = pipeimages[identifier] = image(iconset, iconstate, dir = direction) pipe_overlay.color = col +/obj/machinery/atmospherics/proc/icon_addintact(var/obj/machinery/atmospherics/node) + var/image/img = getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', "pipe_intact", get_dir(src,node), node.pipe_color) + underlays += img + return img.dir + +/obj/machinery/atmospherics/proc/icon_addbroken(var/connected = FALSE) + var/unconnected = (~connected) & initialize_directions + for(var/direction in GLOB.cardinals) + if(unconnected & direction) + underlays += getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', "pipe_exposed", direction) + /obj/machinery/atmospherics/on_construction(pipe_type, obj_color) if(can_unwrench) add_atom_colour(obj_color, FIXED_COLOUR_PRIORITY) @@ -275,7 +286,7 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/can_crawl_through() - return 1 + return TRUE /obj/machinery/atmospherics/proc/returnPipenets() return list() @@ -288,4 +299,5 @@ Pipelines + Other Objects -> Pipe network //Used for certain children of obj/machinery/atmospherics to not show pipe vision when mob is inside it. /obj/machinery/atmospherics/proc/can_see_pipes() - return 1 \ No newline at end of file + return TRUE + diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index f76eb3bb65..786aff1038 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -1,70 +1,63 @@ -//node2, air2, network2 correspond to input -//node1, air1, network1 correspond to output - - -/obj/machinery/atmospherics/components/binary/circulator - name = "circulator/heat exchanger" - desc = "A gas circulator pump and heat exchanger." - icon_state = "circ1-off" - - var/side = CIRC_LEFT - var/status = 0 - - var/last_pressure_delta = 0 - +//node2, air2, network2 correspond to input +//node1, air1, network1 correspond to output + + +/obj/machinery/atmospherics/components/binary/circulator + name = "circulator/heat exchanger" + desc = "A gas circulator pump and heat exchanger." + icon_state = "circ1-off" + + var/side = CIRC_LEFT + var/status = 0 + + var/last_pressure_delta = 0 + anchored = TRUE density = TRUE - - var/global/const/CIRC_LEFT = 1 - var/global/const/CIRC_RIGHT = 2 - - -/obj/machinery/atmospherics/components/binary/circulator/proc/return_transfer_air() - - var/datum/gas_mixture/air1 = AIR1 - var/datum/gas_mixture/air2 = AIR2 - - var/output_starting_pressure = air1.return_pressure() - var/input_starting_pressure = air2.return_pressure() - - if(output_starting_pressure >= input_starting_pressure-10) - //Need at least 10 KPa difference to overcome friction in the mechanism - last_pressure_delta = 0 - return null - - //Calculate necessary moles to transfer using PV = nRT - if(air2.temperature>0) - var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2 - - var/transfer_moles = pressure_delta*air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION) - - last_pressure_delta = pressure_delta - - //to_chat(world, "pressure_delta = [pressure_delta]; transfer_moles = [transfer_moles];") - - //Actually transfer the gas - var/datum/gas_mixture/removed = air2.remove(transfer_moles) - - update_parents() - - return removed - - else - last_pressure_delta = 0 - -/obj/machinery/atmospherics/components/binary/circulator/process_atmos() - ..() - update_icon() - -/obj/machinery/atmospherics/components/binary/circulator/update_icon() - if(stat & (BROKEN|NOPOWER)) - icon_state = "circ[side]-p" - else if(last_pressure_delta > 0) - if(last_pressure_delta > ONE_ATMOSPHERE) - icon_state = "circ[side]-run" - else - icon_state = "circ[side]-slow" - else - icon_state = "circ[side]-off" - - return 1 + var/global/const/CIRC_LEFT = 1 + var/global/const/CIRC_RIGHT = 2 + + +/obj/machinery/atmospherics/components/binary/circulator/proc/return_transfer_air() + + var/datum/gas_mixture/air1 = AIR1 + var/datum/gas_mixture/air2 = AIR2 + + var/output_starting_pressure = air1.return_pressure() + var/input_starting_pressure = air2.return_pressure() + + if(output_starting_pressure >= input_starting_pressure-10) + //Need at least 10 KPa difference to overcome friction in the mechanism + last_pressure_delta = 0 + return null + + //Calculate necessary moles to transfer using PV = nRT + if(air2.temperature>0) + var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2 + + var/transfer_moles = pressure_delta*air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION) + + last_pressure_delta = pressure_delta + var/datum/gas_mixture/removed = air2.remove(transfer_moles) + + update_parents() + + return removed + + else + last_pressure_delta = 0 + +/obj/machinery/atmospherics/components/binary/circulator/process_atmos() + ..() + update_icon() + +/obj/machinery/atmospherics/components/binary/circulator/update_icon() + if(!is_operational()) + icon_state = "circ[side]-p" + else if(last_pressure_delta > 0) + if(last_pressure_delta > ONE_ATMOSPHERE) + icon_state = "circ[side]-run" + else + icon_state = "circ[side]-slow" + else + icon_state = "circ[side]-off" diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index 1ef52cc787..15f0ccddd2 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -1,211 +1,207 @@ -/* -Acts like a normal vent, but has an input AND output. -*/ -#define EXT_BOUND 1 -#define INPUT_MIN 2 -#define OUTPUT_MAX 4 - -/obj/machinery/atmospherics/components/binary/dp_vent_pump - icon = 'icons/obj/atmospherics/components/unary_devices.dmi' //We reuse the normal vent icons! - icon_state = "dpvent_map" - - //node2 is output port - //node1 is input port - - name = "dual-port air vent" - desc = "Has a valve and pump attached to it. There are two ports." - - level = 1 - var/frequency = 0 - var/id = null - var/datum/radio_frequency/radio_connection - +/* +Acts like a normal vent, but has an input AND output. +*/ +#define EXT_BOUND 1 +#define INPUT_MIN 2 +#define OUTPUT_MAX 4 + +/obj/machinery/atmospherics/components/binary/dp_vent_pump + icon = 'icons/obj/atmospherics/components/unary_devices.dmi' //We reuse the normal vent icons! + icon_state = "dpvent_map" + + //node2 is output port + //node1 is input port + + name = "dual-port air vent" + desc = "Has a valve and pump attached to it. There are two ports." + + level = 1 + var/frequency = 0 + var/id = null + var/datum/radio_frequency/radio_connection + var/on = FALSE - var/pump_direction = 1 //0 = siphoning, 1 = releasing - - var/external_pressure_bound = ONE_ATMOSPHERE - var/input_pressure_min = 0 - var/output_pressure_max = 0 - - var/pressure_checks = EXT_BOUND - //EXT_BOUND: Do not pass external_pressure_bound - //INPUT_MIN: Do not pass input_pressure_min - //OUTPUT_MAX: Do not pass output_pressure_max - -/obj/machinery/atmospherics/components/binary/dp_vent_pump/on - on = TRUE - icon_state = "dpvent_map_on" - -/obj/machinery/atmospherics/components/binary/dp_vent_pump/Destroy() + var/pump_direction = 1 //0 = siphoning, 1 = releasing + + var/external_pressure_bound = ONE_ATMOSPHERE + var/input_pressure_min = 0 + var/output_pressure_max = 0 + + var/pressure_checks = EXT_BOUND + //EXT_BOUND: Do not pass external_pressure_bound + //INPUT_MIN: Do not pass input_pressure_min + //OUTPUT_MAX: Do not pass output_pressure_max + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/on + on = TRUE + icon_state = "dpvent_map_on" + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/Destroy() SSradio.remove_object(src, frequency) - return ..() - -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume - name = "large dual-port air vent" - -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/on - on = TRUE - icon_state = "dpvent_map_on" - -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/New() - ..() - var/datum/gas_mixture/air1 = AIR1 - var/datum/gas_mixture/air2 = AIR2 - air1.volume = 1000 - air2.volume = 1000 - -/obj/machinery/atmospherics/components/binary/dp_vent_pump/update_icon_nopipes() - cut_overlays() - if(showpipe) - add_overlay(getpipeimage('icons/obj/atmospherics/components/unary_devices.dmi', "dpvent_cap")) - - if(!on || stat & (NOPOWER|BROKEN)) - icon_state = "vent_off" - return - - if(pump_direction) - icon_state = "vent_out" - else - icon_state = "vent_in" - -/obj/machinery/atmospherics/components/binary/dp_vent_pump/process_atmos() - ..() - - if(!on) - return FALSE - var/datum/gas_mixture/air1 = AIR1 - var/datum/gas_mixture/air2 = AIR2 - - var/datum/gas_mixture/environment = loc.return_air() - var/environment_pressure = environment.return_pressure() - - if(pump_direction) //input -> external - var/pressure_delta = 10000 - - if(pressure_checks&EXT_BOUND) - pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) - if(pressure_checks&INPUT_MIN) - pressure_delta = min(pressure_delta, (air1.return_pressure() - input_pressure_min)) - - if(pressure_delta > 0) - if(air1.temperature > 0) - var/transfer_moles = pressure_delta*environment.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - //Removed can be null if there is no atmosphere in air1 - if(!removed) - return FALSE - - loc.assume_air(removed) - air_update_turf() - - var/datum/pipeline/parent1 = PARENT1 - parent1.update = 1 - - else //external -> output - var/pressure_delta = 10000 - - if(pressure_checks&EXT_BOUND) - pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) - if(pressure_checks&INPUT_MIN) - pressure_delta = min(pressure_delta, (output_pressure_max - air2.return_pressure())) - - if(pressure_delta > 0) - if(environment.temperature > 0) - var/transfer_moles = pressure_delta*air2.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - //removed can be null if there is no air in the location - if(!removed) - return FALSE - - air2.merge(removed) - air_update_turf() - - var/datum/pipeline/parent2 = PARENT2 - parent2.update = 1 - - return TRUE - - //Radio remote control - -/obj/machinery/atmospherics/components/binary/dp_vent_pump/proc/set_frequency(new_frequency) - SSradio.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = SSradio.add_object(src, frequency, filter = GLOB.RADIO_ATMOSIA) - -/obj/machinery/atmospherics/components/binary/dp_vent_pump/proc/broadcast_status() - if(!radio_connection) - return 0 - - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - - signal.data = list( - "tag" = id, - "device" = "ADVP", - "power" = on, - "direction" = pump_direction?("release"):("siphon"), - "checks" = pressure_checks, - "input" = input_pressure_min, - "output" = output_pressure_max, - "external" = external_pressure_bound, - "sigtype" = "status" - ) - radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA) - - return 1 - -/obj/machinery/atmospherics/components/binary/dp_vent_pump/atmosinit() - ..() - if(frequency) - set_frequency(frequency) - broadcast_status() - -/obj/machinery/atmospherics/components/binary/dp_vent_pump/receive_signal(datum/signal/signal) - - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 - if("power" in signal.data) - on = text2num(signal.data["power"]) - - if("power_toggle" in signal.data) - on = !on - - if("set_direction" in signal.data) - pump_direction = text2num(signal.data["set_direction"]) - - if("checks" in signal.data) - pressure_checks = text2num(signal.data["checks"]) - - if("purge" in signal.data) - pressure_checks &= ~1 - pump_direction = 0 - - if("stabalize" in signal.data) - pressure_checks |= 1 - pump_direction = 1 - - if("set_input_pressure" in signal.data) - input_pressure_min = Clamp(text2num(signal.data["set_input_pressure"]),0,ONE_ATMOSPHERE*50) - - if("set_output_pressure" in signal.data) - output_pressure_max = Clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) - - if("set_external_pressure" in signal.data) - external_pressure_bound = Clamp(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) - - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon - //if(signal.data["tag"]) - spawn(2) - broadcast_status() - update_icon() - -#undef EXT_BOUND -#undef INPUT_MIN -#undef OUTPUT_MAX + return ..() + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume + name = "large dual-port air vent" + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/on + on = TRUE + icon_state = "dpvent_map_on" + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/New() + ..() + var/datum/gas_mixture/air1 = AIR1 + var/datum/gas_mixture/air2 = AIR2 + air1.volume = 1000 + air2.volume = 1000 + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/update_icon_nopipes() + cut_overlays() + if(showpipe) + add_overlay(getpipeimage('icons/obj/atmospherics/components/unary_devices.dmi', "dpvent_cap")) + + if(!on || !is_operational()) + icon_state = "vent_off" + return + + if(pump_direction) + icon_state = "vent_out" + else + icon_state = "vent_in" + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/process_atmos() + ..() + + if(!on) + return + var/datum/gas_mixture/air1 = AIR1 + var/datum/gas_mixture/air2 = AIR2 + + var/datum/gas_mixture/environment = loc.return_air() + var/environment_pressure = environment.return_pressure() + + if(pump_direction) //input -> external + var/pressure_delta = 10000 + + if(pressure_checks&EXT_BOUND) + pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) + if(pressure_checks&INPUT_MIN) + pressure_delta = min(pressure_delta, (air1.return_pressure() - input_pressure_min)) + + if(pressure_delta > 0) + if(air1.temperature > 0) + var/transfer_moles = pressure_delta*environment.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = air1.remove(transfer_moles) + //Removed can be null if there is no atmosphere in air1 + if(!removed) + return + + loc.assume_air(removed) + air_update_turf() + + var/datum/pipeline/parent1 = PARENT1 + parent1.update = 1 + + else //external -> output + var/pressure_delta = 10000 + + if(pressure_checks&EXT_BOUND) + pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) + if(pressure_checks&INPUT_MIN) + pressure_delta = min(pressure_delta, (output_pressure_max - air2.return_pressure())) + + if(pressure_delta > 0) + if(environment.temperature > 0) + var/transfer_moles = pressure_delta*air2.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + //removed can be null if there is no air in the location + if(!removed) + return + + air2.merge(removed) + air_update_turf() + + var/datum/pipeline/parent2 = PARENT2 + parent2.update = 1 + + //Radio remote control + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/proc/set_frequency(new_frequency) + SSradio.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = SSradio.add_object(src, frequency, filter = GLOB.RADIO_ATMOSIA) + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/proc/broadcast_status() + if(!radio_connection) + return + + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( + "tag" = id, + "device" = "ADVP", + "power" = on, + "direction" = pump_direction?("release"):("siphon"), + "checks" = pressure_checks, + "input" = input_pressure_min, + "output" = output_pressure_max, + "external" = external_pressure_bound, + "sigtype" = "status" + ) + radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA) + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/atmosinit() + ..() + if(frequency) + set_frequency(frequency) + broadcast_status() + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return + + if("power" in signal.data) + on = text2num(signal.data["power"]) + + if("power_toggle" in signal.data) + on = !on + + if("set_direction" in signal.data) + pump_direction = text2num(signal.data["set_direction"]) + + if("checks" in signal.data) + pressure_checks = text2num(signal.data["checks"]) + + if("purge" in signal.data) + pressure_checks &= ~1 + pump_direction = 0 + + if("stabalize" in signal.data) + pressure_checks |= 1 + pump_direction = 1 + + if("set_input_pressure" in signal.data) + input_pressure_min = Clamp(text2num(signal.data["set_input_pressure"]),0,ONE_ATMOSPHERE*50) + + if("set_output_pressure" in signal.data) + output_pressure_max = Clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) + + if("set_external_pressure" in signal.data) + external_pressure_bound = Clamp(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) + + if("status" in signal.data) + spawn(2) + broadcast_status() + return //do not update_icon + //if(signal.data["tag"]) + spawn(2) + broadcast_status() + update_icon() + +#undef EXT_BOUND +#undef INPUT_MIN +#undef OUTPUT_MAX diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index d2e6a3ae72..158c272543 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -12,7 +12,7 @@ Passive gate is similar to the regular pump except: name = "passive gate" desc = "A one-way air valve that does not require power." - can_unwrench = 1 + can_unwrench = TRUE var/on = FALSE var/target_pressure = ONE_ATMOSPHERE @@ -36,7 +36,7 @@ Passive gate is similar to the regular pump except: /obj/machinery/atmospherics/components/binary/passive_gate/process_atmos() ..() if(!on) - return 0 + return var/datum/gas_mixture/air1 = AIR1 var/datum/gas_mixture/air2 = AIR2 @@ -47,7 +47,7 @@ Passive gate is similar to the regular pump except: if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) //No need to pump gas if target is already reached or input pressure is too low //Need at least 10 KPa difference to overcome friction in the mechanism - return 1 + return //Calculate necessary moles to transfer using PV = nRT if((air1.total_moles() > 0) && (air1.temperature>0)) @@ -73,7 +73,7 @@ Passive gate is similar to the regular pump except: /obj/machinery/atmospherics/components/binary/passive_gate/proc/broadcast_status() if(!radio_connection) - return 0 + return var/datum/signal/signal = new signal.transmission_method = 1 //radio signal @@ -89,8 +89,6 @@ Passive gate is similar to the regular pump except: radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA) - return 1 - /obj/machinery/atmospherics/components/binary/passive_gate/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) @@ -137,7 +135,7 @@ Passive gate is similar to the regular pump except: /obj/machinery/atmospherics/components/binary/passive_gate/receive_signal(datum/signal/signal) if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 + return var/old_on = on //for logging @@ -159,16 +157,14 @@ Passive gate is similar to the regular pump except: broadcast_status() update_icon() - return /obj/machinery/atmospherics/components/binary/passive_gate/power_change() ..() update_icon() /obj/machinery/atmospherics/components/binary/passive_gate/can_unwrench(mob/user) - if(..()) - if(on) - to_chat(user, "You cannot unwrench [src], turn it off first!") - else - return 1 + . = ..() + if(. && on) + to_chat(user, "You cannot unwrench [src], turn it off first!") + return FALSE diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 0ec1b57a2e..c5242fb5cc 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -17,7 +17,7 @@ Thus, the two variables affect pump operation are set in New(): name = "gas pump" desc = "A pump that moves gas by pressure." - can_unwrench = 1 + can_unwrench = TRUE var/on = FALSE var/target_pressure = ONE_ATMOSPHERE @@ -36,7 +36,7 @@ Thus, the two variables affect pump operation are set in New(): return ..() /obj/machinery/atmospherics/components/binary/pump/update_icon_nopipes() - if(stat & NOPOWER) + if(!is_operational()) icon_state = "pump_off" return @@ -44,10 +44,8 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/pump/process_atmos() // ..() - if(stat & (NOPOWER|BROKEN)) - return 0 - if(!on) - return 0 + if(!on || !is_operational()) + return var/datum/gas_mixture/air1 = AIR1 var/datum/gas_mixture/air2 = AIR2 @@ -56,7 +54,7 @@ Thus, the two variables affect pump operation are set in New(): if((target_pressure - output_starting_pressure) < 0.01) //No need to pump gas if target is already reached! - return 1 + return //Calculate necessary moles to transfer using PV=nRT if((air1.total_moles() > 0) && (air1.temperature>0)) @@ -69,8 +67,6 @@ Thus, the two variables affect pump operation are set in New(): update_parents() - return 1 - //Radio remote control /obj/machinery/atmospherics/components/binary/pump/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) @@ -80,7 +76,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/pump/proc/broadcast_status() if(!radio_connection) - return 0 + return var/datum/signal/signal = new signal.transmission_method = 1 //radio signal @@ -96,8 +92,6 @@ Thus, the two variables affect pump operation are set in New(): radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA) - return 1 - /obj/machinery/atmospherics/components/binary/pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) @@ -121,8 +115,7 @@ Thus, the two variables affect pump operation are set in New(): if("power") on = !on investigate_log("Pump, [src.name], was turned [on ? "on" : "off"] by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) - message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)]") - log_admin("[key_name(usr)] manipulated a pump at [x], [y], [z]") + message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") . = TRUE if("pressure") var/pressure = params["pressure"] @@ -139,8 +132,7 @@ Thus, the two variables affect pump operation are set in New(): if(.) target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("Pump, [src.name], was set to [target_pressure] kPa by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) - message_admins("Pump, [src.name], was set to [target_pressure] kPa by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)]") - log_admin("[key_name(usr)] manipulated a pump at [x], [y], [z]") + message_admins("Pump, [src.name], was set to [target_pressure] kPa by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") update_icon() /obj/machinery/atmospherics/components/binary/pump/atmosinit() @@ -150,7 +142,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/pump/receive_signal(datum/signal/signal) if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 + return var/old_on = on //for logging @@ -172,21 +164,18 @@ Thus, the two variables affect pump operation are set in New(): broadcast_status() update_icon() - return /obj/machinery/atmospherics/components/binary/pump/power_change() ..() update_icon() /obj/machinery/atmospherics/components/binary/pump/can_unwrench(mob/user) - if(..()) - var/turf/T = get_turf(src) - var/area/A = get_area(src) - if(!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench [src], turn it off first!") - else - investigate_log("Pump, [src.name], was unwrenched by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) - message_admins("Pump, [src.name], was unwrenched by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(T)]") - log_admin("[key_name(usr)] unwrenched a pump at [x], [y], [z]") - return 1 - + . = ..() + var/area/A = get_area(src) + if(. && on && is_operational()) + to_chat(user, "You cannot unwrench [src], turn it off first!") + return FALSE + else + investigate_log("Pump, [src.name], was unwrenched by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) + message_admins("Pump, [src.name], was unwrenched by [ADMIN_LOOKUPFLW(user)] at [A]") + return TRUE diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index bbee3bcb59..7ef6cf2142 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -7,7 +7,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off. name = "manual valve" desc = "A pipe valve" - can_unwrench = 1 + can_unwrench = TRUE var/frequency = 0 var/id = null @@ -57,8 +57,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off. var/turf/T = get_turf(src) var/area/A = get_area(src) investigate_log("Valve, [src.name], was manipiulated by [key_name(usr)] at [x], [y], [z], [A]", "atmos") - message_admins("Valve, [src.name], was manipulated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(T)]") - log_admin("[key_name(usr)] manipulated a manual valve at [x], [y], [z]") + message_admins("Valve, [src.name], was manipulated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(T)], [A]") /obj/machinery/atmospherics/components/binary/valve/digital // can be controlled by AI @@ -71,7 +70,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off. return src.attack_hand(user) /obj/machinery/atmospherics/components/binary/valve/digital/update_icon_nopipes(animation) - if(stat & NOPOWER) + if(!is_operational()) normalize_dir() icon_state = "dvalve_nopower" return diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 4d3cf733fb..227c34d9ca 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -17,7 +17,7 @@ Thus, the two variables affect pump operation are set in New(): name = "volumetric gas pump" desc = "A pump that moves gas by volume." - can_unwrench = 1 + can_unwrench = TRUE var/on = FALSE var/transfer_rate = MAX_TRANSFER_RATE @@ -34,7 +34,7 @@ Thus, the two variables affect pump operation are set in New(): on = TRUE /obj/machinery/atmospherics/components/binary/volume_pump/update_icon_nopipes() - if(stat & NOPOWER) + if(!is_operational()) icon_state = "volpump_off" return @@ -42,10 +42,8 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/volume_pump/process_atmos() // ..() - if(stat & (NOPOWER|BROKEN)) + if(!on || !is_operational()) return - if(!on) - return 0 var/datum/gas_mixture/air1 = AIR1 var/datum/gas_mixture/air2 = AIR2 @@ -56,7 +54,7 @@ Thus, the two variables affect pump operation are set in New(): var/output_starting_pressure = air2.return_pressure() if((input_starting_pressure < 0.01) || (output_starting_pressure > 9000)) - return 1 + return var/transfer_ratio = min(1, transfer_rate/air1.volume) @@ -66,8 +64,6 @@ Thus, the two variables affect pump operation are set in New(): update_parents() - return 1 - /obj/machinery/atmospherics/components/binary/volume_pump/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) frequency = new_frequency @@ -76,7 +72,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/volume_pump/proc/broadcast_status() if(!radio_connection) - return 0 + return var/datum/signal/signal = new signal.transmission_method = 1 //radio signal @@ -91,8 +87,6 @@ Thus, the two variables affect pump operation are set in New(): ) radio_connection.post_signal(src, signal) - return 1 - /obj/machinery/atmospherics/components/binary/volume_pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) @@ -116,14 +110,12 @@ Thus, the two variables affect pump operation are set in New(): if(..()) return var/turf/T = get_turf(src) - //var/area/A = get_area(src) + var/area/A = get_area(src) switch(action) if("power") on = !on - investigate_log("Volume Pump, [src.name], was turned [on ? "on" : "off"] by [key_name(usr)] at [x], [y], [z], [loc.loc]", INVESTIGATE_ATMOS) - message_admins("Volume Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)]") - log_admin("[key_name(usr)] manipulated a volume pump at [x], [y], [z]") - + investigate_log("Volume Pump, [src.name], was turned [on ? "on" : "off"] by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) + message_admins("Volume Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") . = TRUE if("rate") var/rate = params["rate"] @@ -139,14 +131,13 @@ Thus, the two variables affect pump operation are set in New(): . = TRUE if(.) transfer_rate = Clamp(rate, 0, MAX_TRANSFER_RATE) - investigate_log("Volume Pump, [src.name], was set to [transfer_rate] L/s by [key_name(usr)] at [x], [y], [z], [loc.loc]", INVESTIGATE_ATMOS) - message_admins("Volume Pump, [src.name], was set to [transfer_rate] L/s by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)]") - log_admin("[key_name(usr)] manipulated a volume pump at [x], [y], [z]") + investigate_log("Volume Pump, [src.name], was set to [transfer_rate] L/s by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) + message_admins("Volume Pump, [src.name], was set to [transfer_rate] L/s by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") update_icon() /obj/machinery/atmospherics/components/binary/volume_pump/receive_signal(datum/signal/signal) if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 + return var/old_on = on //for logging @@ -169,22 +160,18 @@ Thus, the two variables affect pump operation are set in New(): broadcast_status() update_icon() - return /obj/machinery/atmospherics/components/binary/volume_pump/power_change() ..() update_icon() /obj/machinery/atmospherics/components/binary/volume_pump/can_unwrench(mob/user) - if(..()) - var/turf/T = get_turf(src) - //var/area/A = get_area(src) - if(!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench [src], turn it off first!") - else - investigate_log("Volume Pump, [src.name], was unwrenched by [key_name(usr)] at [x], [y], [z], [loc.loc]", INVESTIGATE_ATMOS) - message_admins("Volume Pump, [src.name], was unwrenched by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)]") - log_admin("[key_name(usr)] unwrenched a volume pump at [x], [y], [z]") - - return 1 - + . = ..() + var/area/A = get_area(src) + if(. && on && is_operational()) + to_chat(user, "You cannot unwrench [src], turn it off first!") + return FALSE + else + investigate_log("Volume Pump, [src.name], was unwrenched by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) + message_admins("Volume Pump, [src.name], was unwrenched by [ADMIN_LOOKUPFLW(usr)] at [A]") + return diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index 95357a4a7f..5fb4611d92 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -23,18 +23,6 @@ On top of that, now people can add component-speciic procs/vars if they want! Iconnery */ -/obj/machinery/atmospherics/components/proc/icon_addintact(var/obj/machinery/atmospherics/node) - var/image/img = getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', "pipe_intact", get_dir(src,node), node.pipe_color) - underlays += img - - return img.dir - -/obj/machinery/atmospherics/components/proc/icon_addbroken(var/connected = FALSE) - var/unconnected = (~connected) & initialize_directions - for(var/direction in GLOB.cardinals) - if(unconnected & direction) - underlays += getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', "pipe_exposed", direction) - /obj/machinery/atmospherics/components/proc/update_icon_nopipes() return @@ -52,7 +40,7 @@ Iconnery if(!showpipe) return //no need to update the pipes if they aren't showing - var/connected = FALSE + var/connected = 0 //Direction bitset for(DEVICE_TYPE_LOOP) //adds intact pieces if(NODE_I) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 87edfe8d11..c777e5fe17 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -2,7 +2,7 @@ name = "gas filter" icon_state = "filter_off" density = FALSE - can_unwrench = 1 + can_unwrench = TRUE var/on = FALSE var/target_pressure = ONE_ATMOSPHERE var/filter_type = "" @@ -11,7 +11,7 @@ /obj/machinery/atmospherics/components/trinary/filter/flipped icon_state = "filter_off_f" - flipped = 1 + flipped = TRUE // These two filter types have critical_machine flagged to on and thus causes the area they are in to be exempt from the Grid Check event. @@ -43,27 +43,21 @@ ..() /obj/machinery/atmospherics/components/trinary/filter/update_icon_nopipes() - - if(!(stat & NOPOWER) && on && NODE1 && NODE2 && NODE3) + if(on && NODE1 && NODE2 && NODE3 && is_operational()) icon_state = "filter_on[flipped?"_f":""]" return - icon_state = "filter_off[flipped?"_f":""]" /obj/machinery/atmospherics/components/trinary/filter/power_change() var/old_stat = stat ..() - if(stat & NOPOWER) - on = FALSE - if(old_stat != stat) + if(stat != old_stat) update_icon() /obj/machinery/atmospherics/components/trinary/filter/process_atmos() ..() - if(!on) - return 0 - if(!(NODE1 && NODE2 && NODE3)) - return 0 + if(!on || !(NODE1 && NODE2 && NODE3) || !is_operational()) + return var/datum/gas_mixture/air1 = AIR1 var/datum/gas_mixture/air2 = AIR2 @@ -73,7 +67,7 @@ if(output_starting_pressure >= target_pressure) //No need to mix if target is already full! - return 1 + return //Calculate necessary moles to transfer using PV=nRT @@ -113,8 +107,6 @@ update_parents() - return 1 - /obj/machinery/atmospherics/components/trinary/filter/atmosinit() set_frequency(frequency) return ..() @@ -167,3 +159,10 @@ investigate_log("was set to filter [filter_name] by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE update_icon() + +/obj/machinery/atmospherics/components/trinary/filter/can_unwrench(mob/user) + . = ..() + if(. && on && is_operational()) + to_chat(user, "You cannot unwrench [src], turn it off first!") + return FALSE + diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index 8c2622bb42..cb515ec75f 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -3,7 +3,7 @@ density = FALSE name = "gas mixer" - can_unwrench = 1 + can_unwrench = TRUE var/on = FALSE @@ -15,7 +15,7 @@ /obj/machinery/atmospherics/components/trinary/mixer/flipped icon_state = "mixer_off_f" - flipped = 1 + flipped = TRUE /obj/machinery/atmospherics/components/trinary/mixer/update_icon() cut_overlays() @@ -29,18 +29,15 @@ return ..() /obj/machinery/atmospherics/components/trinary/mixer/update_icon_nopipes() - if(!(stat & NOPOWER) && on && NODE1 && NODE2 && NODE3) + if(on && NODE1 && NODE2 && NODE3 && is_operational()) icon_state = "mixer_on[flipped?"_f":""]" return - icon_state = "mixer_off[flipped?"_f":""]" /obj/machinery/atmospherics/components/trinary/mixer/power_change() var/old_stat = stat ..() - if(stat & NOPOWER) - on = FALSE - if(old_stat != stat) + if(stat != old_stat) update_icon() /obj/machinery/atmospherics/components/trinary/mixer/New() @@ -51,10 +48,8 @@ /obj/machinery/atmospherics/components/trinary/mixer/process_atmos() ..() - if(!on) - return 0 - if(!(NODE1 && NODE2 && NODE3)) - return 0 + if(!on || !(NODE1 && NODE2 && NODE3) && !is_operational()) + return var/datum/gas_mixture/air1 = AIR1 var/datum/gas_mixture/air2 = AIR2 @@ -64,7 +59,7 @@ if(output_starting_pressure >= target_pressure) //No need to mix if target is already full! - return 1 + return //Calculate necessary moles to transfer using PV=nRT @@ -114,7 +109,7 @@ var/datum/pipeline/parent3 = PARENT3 parent3.update = TRUE - return TRUE + return /obj/machinery/atmospherics/components/trinary/mixer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) @@ -167,4 +162,12 @@ node1_concentration = max(0, min(1, node1_concentration - value)) investigate_log("was set to [node2_concentration] % on node 2 by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE - update_icon() \ No newline at end of file + update_icon() + + +/obj/machinery/atmospherics/components/trinary/filter/can_unwrench(mob/user) + . = ..() + if(. && on && is_operational()) + to_chat(user, "You cannot unwrench [src], turn it off first!") + return FALSE + diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm index 199d1907d8..14495cd237 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm @@ -6,7 +6,7 @@ device_type = TRINARY layer = GAS_FILTER_LAYER - var/flipped = 0 + var/flipped = FALSE /obj/machinery/atmospherics/components/trinary/SetInitDirections() switch(dir) @@ -44,4 +44,4 @@ Housekeeping and pipe network stuff node1_connect = turn(node1_connect, 180) node3_connect = turn(node3_connect, 180) - return list(node1_connect, node2_connect, node3_connect) \ No newline at end of file + return list(node1_connect, node2_connect, node3_connect) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 4583680d13..e368fdde92 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -33,7 +33,7 @@ var/escape_in_progress = FALSE var/message_cooldown - var/breakout_time = 0.5 + var/breakout_time = 300 /obj/machinery/atmospherics/components/unary/cryo_cell/Initialize() . = ..() @@ -115,7 +115,7 @@ occupant_overlay.dir = SOUTH occupant_overlay.pixel_y = 22 - if(on && is_operational() && !running_bob_anim) + if(on && !running_bob_anim && is_operational()) icon_state = "pod-on" running_bob_anim = TRUE run_bob_anim(TRUE, occupant_overlay) @@ -246,9 +246,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the glass of [src]!", \ - "You struggle inside [src], kicking the release with your foot... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You struggle inside [src], kicking the release with your foot... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a thump from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src ) return user.visible_message("[user] successfully broke out of [src]!", \ @@ -349,7 +349,7 @@ data["cellTemperature"] = round(air1.temperature, 1) data["isBeakerLoaded"] = beaker ? TRUE : FALSE - var beakerContents = list() + var/beakerContents = list() if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) for(var/datum/reagent/R in beaker.reagents.reagent_list) beakerContents += list(list("name" = R.name, "volume" = R.volume)) @@ -378,6 +378,8 @@ if("ejectbeaker") if(beaker) beaker.forceMove(loc) + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(beaker) beaker = null . = TRUE update_icon() @@ -394,4 +396,11 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/can_see_pipes() return 0 //you can't see the pipe network when inside a cryo cell. +/obj/machinery/atmospherics/components/unary/cryo_cell/return_temperature() + var/datum/gas_mixture/G = AIR1 + + if(G.total_moles() > 10) + return G.temperature + return ..() + #undef CRYOMOBS diff --git a/code/modules/atmospherics/machinery/components/unary_devices/generator_input.dm b/code/modules/atmospherics/machinery/components/unary_devices/generator_input.dm index 5ed771d41c..a1a67e2542 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/generator_input.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/generator_input.dm @@ -10,12 +10,7 @@ var/update_cycle /obj/machinery/atmospherics/components/unary/generator_input/update_icon() - if(NODE1) - icon_state = "intact" - else - icon_state = "exposed" - - return + icon_state = NODE1 ? "intact" : "exposed" /obj/machinery/atmospherics/components/unary/generator_input/proc/return_exchange_air() return AIR1 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm index 30ff1ebc30..ee6e31175b 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm @@ -5,7 +5,7 @@ name = "heat exchanger" desc = "Exchanges heat between two input gases. Setup for fast heat transfer" - can_unwrench = 1 + can_unwrench = TRUE layer = LOW_OBJ_LAYER @@ -20,8 +20,6 @@ else icon_state = "he_exposed" - return - /obj/machinery/atmospherics/components/unary/heat_exchanger/atmosinit() if(!partner) var/partner_connect = turn(dir,180) @@ -36,11 +34,8 @@ /obj/machinery/atmospherics/components/unary/heat_exchanger/process_atmos() ..() - if(!partner) - return 0 - - if(SSair.times_fired <= update_cycle) - return 0 + if(!partner || SSair.times_fired <= update_cycle) + return update_cycle = SSair.times_fired partner.update_cycle = SSair.times_fired @@ -67,5 +62,3 @@ if(abs(other_old_temperature-partner_air_contents.temperature) > 1) partner.update_parents() - - return 1 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 0bf467f234..d46d5b47a0 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -30,7 +30,7 @@ if(showpipe) add_overlay(getpipeimage(icon, "inje_cap", initialize_directions)) - if(!NODE1 || !on || stat & (NOPOWER|BROKEN)) + if(!NODE1 || !on || !is_operational()) icon_state = "inje_off" return @@ -47,8 +47,8 @@ ..() injecting = 0 - if(!on || stat & (NOPOWER|BROKEN)) - return 0 + if(!on || !is_operational()) + return var/datum/gas_mixture/air_contents = AIR1 @@ -62,11 +62,9 @@ update_parents() - return 1 - /obj/machinery/atmospherics/components/unary/outlet_injector/proc/inject() - if(on || injecting || stat & (NOPOWER|BROKEN)) - return 0 + if(on || injecting || !is_operational()) + return var/datum/gas_mixture/air_contents = AIR1 @@ -91,7 +89,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/proc/broadcast_status() if(!radio_connection) - return 0 + return var/datum/signal/signal = new signal.transmission_method = 1 //radio signal @@ -108,8 +106,6 @@ radio_connection.post_signal(src, signal) - return 1 - /obj/machinery/atmospherics/components/unary/outlet_injector/atmosinit() set_frequency(frequency) broadcast_status() @@ -117,7 +113,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/receive_signal(datum/signal/signal) if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 + return if("power" in signal.data) on = text2num(signal.data["power"]) @@ -139,8 +135,6 @@ broadcast_status() return //do not update_icon - //log_admin("DEBUG \[[world.timeofday]\]: outlet_injector/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") - //return spawn(2) broadcast_status() update_icon() @@ -188,9 +182,8 @@ broadcast_status() /obj/machinery/atmospherics/components/unary/outlet_injector/can_unwrench(mob/user) - if(..()) - if (!(stat & NOPOWER|BROKEN) && on) - to_chat(user, "You cannot unwrench [src], turn it off first!") - else - return 1 + . = ..() + if(. && on && is_operational()) + to_chat(user, "You cannot unwrench [src], turn it off first!") + return FALSE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/oxygen_generator.dm b/code/modules/atmospherics/machinery/components/unary_devices/oxygen_generator.dm index 65f2c37ac7..e31d1efa96 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/oxygen_generator.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/oxygen_generator.dm @@ -19,7 +19,7 @@ if(showpipe) add_overlay(getpipeimage('icons/obj/atmospherics/components/unary_devices.dmi', "scrub_cap", initialize_directions)) //it works for now - if(!NODE1 || !on || stat & BROKEN) + if(!NODE1 || !on || !is_operational()) icon_state = "o2gen_off" return diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm index 7dd6d62314..e17a2f796c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm @@ -3,7 +3,7 @@ desc = "For connecting portables devices related to atmospherics control." icon = 'icons/obj/atmospherics/components/unary_devices.dmi' icon_state = "connector_map" //Only for mapping purposes, so mappers can see direction - can_unwrench = 1 + can_unwrench = TRUE var/obj/machinery/portable_atmospherics/connected_device use_power = NO_POWER_USE level = 0 @@ -29,11 +29,10 @@ return ..() /obj/machinery/atmospherics/components/unary/portables_connector/can_unwrench(mob/user) - if(..()) - if(connected_device) - to_chat(user, "You cannot unwrench [src], detach [connected_device] first!") - else - return 1 + . = ..() + if(. && connected_device) + to_chat(user, "You cannot unwrench [src], detach [connected_device] first!") + return FALSE /obj/machinery/atmospherics/components/unary/portables_connector/portableConnectorReturnAir() return connected_device.portableConnectorReturnAir() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 6ea8b717bf..17fa3b2cdf 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -39,7 +39,6 @@ icon_state = icon_state_on else icon_state = initial(icon_state) - return /obj/machinery/atmospherics/components/unary/thermomachine/update_icon_nopipes() cut_overlays() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index f52d2d9b2b..df44b4ca9e 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -10,7 +10,7 @@ desc = "Has a valve and pump attached to it." icon_state = "vent_map" use_power = IDLE_POWER_USE - can_unwrench = 1 + can_unwrench = TRUE welded = FALSE level = 1 layer = GAS_SCRUBBER_LAYER @@ -92,7 +92,7 @@ icon_state = "vent_welded" return - if(!NODE1 || !on || stat & (NOPOWER|BROKEN)) + if(!NODE1 || !on || !is_operational()) icon_state = "vent_off" return @@ -103,12 +103,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/process_atmos() ..() - if(stat & (NOPOWER|BROKEN)) + if(!is_operational()) return - if (!NODE1) + if(!NODE1) on = FALSE if(!on || welded) - return 0 + return var/datum/gas_mixture/air_contents = AIR1 var/datum/gas_mixture/environment = loc.return_air() @@ -150,8 +150,6 @@ air_update_turf() update_parents() - return 1 - //Radio remote control /obj/machinery/atmospherics/components/unary/vent_pump/proc/set_frequency(new_frequency) @@ -162,7 +160,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/proc/broadcast_status() if(!radio_connection) - return 0 + return var/datum/signal/signal = new signal.transmission_method = 1 //radio signal @@ -189,8 +187,6 @@ radio_connection.post_signal(src, signal, radio_filter_out) - return 1 - /obj/machinery/atmospherics/components/unary/vent_pump/atmosinit() //some vents work his own spesial way @@ -202,11 +198,11 @@ ..() /obj/machinery/atmospherics/components/unary/vent_pump/receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN)) + if(!is_operational()) return //log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/components/unary/vent_pump/receive_signal([signal.debug_print()])") if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) - return 0 + return if("purge" in signal.data) pressure_checks &= ~EXT_BOUND @@ -257,7 +253,6 @@ //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") broadcast_status() update_icon() - return /obj/machinery/atmospherics/components/unary/vent_pump/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weldingtool)) @@ -266,7 +261,8 @@ playsound(loc, WT.usesound, 40, 1) to_chat(user, "You begin welding the vent...") if(do_after(user, 20*W.toolspeed, target = src)) - if(!src || !WT.isOn()) return + if(!src || !WT.isOn()) + return playsound(src.loc, 'sound/items/welder2.ogg', 50, 1) if(!welded) user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") @@ -282,11 +278,10 @@ return ..() /obj/machinery/atmospherics/components/unary/vent_pump/can_unwrench(mob/user) - if(..()) - if(!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench [src], turn it off first!") - else - return 1 + . = ..() + if(. && on && is_operational()) + to_chat(user, "You cannot unwrench [src], turn it off first!") + return FALSE /obj/machinery/atmospherics/components/unary/vent_pump/examine(mob/user) ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 095473c32c..d92b061cec 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -8,7 +8,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 60 - can_unwrench = 1 + can_unwrench = TRUE welded = FALSE level = 1 layer = GAS_SCRUBBER_LAYER @@ -17,12 +17,12 @@ var/on = FALSE var/scrubbing = SCRUBBING //0 = siphoning, 1 = scrubbing - var/scrub_CO2 = 1 - var/scrub_Toxins = 0 - var/scrub_N2O = 0 - var/scrub_BZ = 0 - var/scrub_Freon = 0 - var/scrub_WaterVapor = 0 + var/scrub_CO2 = TRUE + var/scrub_Toxins = FALSE + var/scrub_N2O = FALSE + var/scrub_BZ = FALSE + var/scrub_Freon = FALSE + var/scrub_WaterVapor = FALSE var/volume_rate = 200 @@ -58,12 +58,8 @@ return ..() /obj/machinery/atmospherics/components/unary/vent_scrubber/auto_use_power() - if(!powered(power_channel)) - return 0 - if(!on || welded) - return 0 - if(stat & (NOPOWER|BROKEN)) - return 0 + if(!on || welded || !is_operational() || !powered(power_channel)) + return FALSE var/amount = idle_power_usage @@ -86,7 +82,7 @@ if(widenet) amount += amount * (adjacent_turfs.len * (adjacent_turfs.len / 2)) use_power(amount, power_channel) - return 1 + return TRUE /obj/machinery/atmospherics/components/unary/vent_scrubber/update_icon_nopipes() cut_overlays() @@ -97,7 +93,7 @@ icon_state = "scrub_welded" return - if(!NODE1 || !on || stat & (NOPOWER|BROKEN)) + if(!NODE1 || !on || !is_operational()) icon_state = "scrub_off" return @@ -113,7 +109,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/broadcast_status() if(!radio_connection) - return 0 + return FALSE var/datum/signal/signal = new signal.transmission_method = 1 //radio signal @@ -143,7 +139,7 @@ radio_connection.post_signal(src, signal, radio_filter_out) - return 1 + return TRUE /obj/machinery/atmospherics/components/unary/vent_scrubber/atmosinit() radio_filter_in = frequency==initial(frequency)?(GLOB.RADIO_FROM_AIRALARM):null @@ -156,20 +152,21 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/process_atmos() ..() - if(stat & (NOPOWER|BROKEN)) - return - if (!NODE1) + if(!is_operational()) + return FALSE + if(!NODE1) on = FALSE if(!on || welded) - return 0 + return FALSE scrub(loc) if(widenet) - for (var/turf/tile in adjacent_turfs) + for(var/turf/tile in adjacent_turfs) scrub(tile) + return TRUE /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/scrub(var/turf/tile) - if (!istype(tile)) - return 0 + if(!istype(tile)) + return FALSE var/datum/gas_mixture/environment = tile.return_air() var/datum/gas_mixture/air_contents = AIR1 @@ -189,8 +186,8 @@ //Take a gas sample var/datum/gas_mixture/removed = tile.remove_air(transfer_moles) //Nothing left to remove from the tile - if (isnull(removed)) - return + if(isnull(removed)) + return FALSE var/list/removed_gases = removed.gases //Filter it @@ -199,39 +196,39 @@ filtered_out.temperature = removed.temperature if(scrub_Toxins && removed_gases["plasma"]) - filtered_out.assert_gas("plasma") + filtered_out.add_gas("plasma") filtered_gases["plasma"][MOLES] = removed_gases["plasma"][MOLES] removed.gases["plasma"][MOLES] = 0 if(scrub_CO2 && removed_gases["co2"]) - filtered_out.assert_gas("co2") - filtered_out.gases["co2"][MOLES] = removed_gases["co2"][MOLES] - removed.gases["co2"][MOLES] = 0 + filtered_out.add_gas("co2") + filtered_gases["co2"][MOLES] = removed_gases["co2"][MOLES] + removed_gases["co2"][MOLES] = 0 if(removed_gases["agent_b"]) - filtered_out.assert_gas("agent_b") - filtered_out.gases["agent_b"][MOLES] = removed_gases["agent_b"][MOLES] - removed.gases["agent_b"][MOLES] = 0 + filtered_out.add_gas("agent_b") + filtered_gases["agent_b"][MOLES] = removed_gases["agent_b"][MOLES] + removed_gases["agent_b"][MOLES] = 0 if(scrub_N2O && removed_gases["n2o"]) - filtered_out.assert_gas("n2o") - filtered_out.gases["n2o"][MOLES] = removed_gases["n2o"][MOLES] - removed.gases["n2o"][MOLES] = 0 + filtered_out.add_gas("n2o") + filtered_gases["n2o"][MOLES] = removed_gases["n2o"][MOLES] + removed_gases["n2o"][MOLES] = 0 if(scrub_BZ && removed_gases["bz"]) - filtered_out.assert_gas("bz") - filtered_out.gases["bz"][MOLES] = removed_gases["bz"][MOLES] - removed.gases["bz"][MOLES] = 0 + filtered_out.add_gas("bz") + filtered_gases["bz"][MOLES] = removed_gases["bz"][MOLES] + removed_gases["bz"][MOLES] = 0 if(scrub_Freon && removed_gases["freon"]) - filtered_out.assert_gas("freon") - filtered_out.gases["freon"][MOLES] = removed_gases["freon"][MOLES] - removed.gases["freon"][MOLES] = 0 + filtered_out.add_gas("freon") + filtered_gases["freon"][MOLES] = removed_gases["freon"][MOLES] + removed_gases["freon"][MOLES] = 0 if(scrub_WaterVapor && removed_gases["water_vapor"]) - filtered_out.assert_gas("water_vapor") - filtered_out.gases["water_vapor"][MOLES] = removed_gases["water_vapor"][MOLES] - removed.gases["water_vapor"][MOLES] = 0 + filtered_out.add_gas("water_vapor") + filtered_gases["water_vapor"][MOLES] = removed_gases["water_vapor"][MOLES] + removed_gases["water_vapor"][MOLES] = 0 removed.garbage_collect() @@ -242,8 +239,8 @@ tile.air_update_turf() else //Just siphoning all air - if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE) - return + if(air_contents.return_pressure()>=50*ONE_ATMOSPHERE) + return FALSE var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) @@ -254,7 +251,7 @@ update_parents() - return 1 + return TRUE //There is no easy way for an object to be notified of changes to atmos can pass flags_1 @@ -273,7 +270,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN)) + if(!is_operational()) return if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) return 0 @@ -363,11 +360,10 @@ return ..() /obj/machinery/atmospherics/components/unary/vent_scrubber/can_unwrench(mob/user) - if(..()) - if (!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench [src], turn it off first!") - else - return 1 + . = ..() + if(. && on && is_operational()) + to_chat(user, "You cannot unwrench [src], turn it off first!") + return FALSE /obj/machinery/atmospherics/components/unary/vent_scrubber/can_crawl_through() return !welded diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 67b1d0d569..11a7881a98 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -5,7 +5,7 @@ var/list/obj/machinery/atmospherics/pipe/members var/list/obj/machinery/atmospherics/components/other_atmosmch - var/update = 1 + var/update = TRUE /datum/pipeline/New() other_airs = list() @@ -25,7 +25,7 @@ /datum/pipeline/process() if(update) - update = 0 + update = FALSE reconcile_air() update = air.react() @@ -114,6 +114,7 @@ other_airs.Add(E.other_airs) E.members.Cut() E.other_atmosmch.Cut() + update = TRUE qdel(E) /obj/machinery/atmospherics/proc/addMember(obj/machinery/atmospherics/A) @@ -195,7 +196,7 @@ (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) air.temperature -= heat/total_heat_capacity - update = 1 + update = TRUE /datum/pipeline/proc/return_air() . = other_airs + air diff --git a/code/modules/atmospherics/machinery/pipes/bluespace_pipe.dm b/code/modules/atmospherics/machinery/pipes/bluespace_pipe.dm new file mode 100644 index 0000000000..476235d3d9 --- /dev/null +++ b/code/modules/atmospherics/machinery/pipes/bluespace_pipe.dm @@ -0,0 +1,47 @@ +GLOBAL_LIST_EMPTY(bluespace_pipes) + +/obj/machinery/atmospherics/pipe/bluespace + name = "bluespace pipe" + desc = "Transmits gas across large distances of space. Developed using bluespace technology." + icon = 'icons/obj/atmospherics/pipes/bluespace.dmi' + icon_state = "map" + dir = SOUTH + initialize_directions = SOUTH + device_type = UNARY + can_buckle = FALSE + +/obj/machinery/atmospherics/pipe/bluespace/New() + icon_state = "pipe" + GLOB.bluespace_pipes += src + ..() + +/obj/machinery/atmospherics/pipe/bluespace/Destroy() + GLOB.bluespace_pipes -= src + for(var/p in GLOB.bluespace_pipes) + var/obj/machinery/atmospherics/pipe/bluespace/P = p + QDEL_NULL(P.parent) + P.build_network() + return ..() + +/obj/machinery/atmospherics/pipe/bluespace/SetInitDirections() + initialize_directions = dir + +/obj/machinery/atmospherics/pipe/bluespace/pipeline_expansion() + return ..() + GLOB.bluespace_pipes - src + +/obj/machinery/atmospherics/components/pipe/bluespace/hide() + update_icon() + +/obj/machinery/atmospherics/pipe/bluespace/update_icon(showpipe) + underlays.Cut() + var/turf/T = loc + if(level != 2 && T.intact) + return //no need to update the pipes if they aren't showing + var/connected = 0 //Direction bitset + for(DEVICE_TYPE_LOOP) //adds intact pieces + if(NODE_I) + connected |= icon_addintact(NODE_I) + icon_addbroken(connected) //adds broken pieces + +/obj/machinery/atmospherics/pipe/bluespace/paint() + return FALSE diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index ffc797860b..49383a74cb 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -42,11 +42,6 @@ invisibility = i ? INVISIBILITY_MAXIMUM : 0 update_icon() -/obj/machinery/atmospherics/pipe/proc/check_pressure(pressure) - //Return 1 if parent should continue checking other pipes - //Return null if parent should stop checking other pipes. Recall: del(src) will by default return null - return 1 - /obj/machinery/atmospherics/pipe/proc/releaseAirToTurf() if(air_temporary) var/turf/T = loc @@ -103,3 +98,10 @@ if(damage_flag == "melee" && damage_amount < 12) return 0 . = ..() + +/obj/machinery/atmospherics/pipe/proc/paint(paint_color) + add_atom_colour(paint_color, FIXED_COLOUR_PRIORITY) + pipe_color = paint_color + update_node_icon() + return TRUE + diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 0bed5b94c7..2dc38a48f2 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -210,7 +210,7 @@ return if(user.ckey in team_members) if(user.ckey in recently_dead_ckeys) - to_chat(user, "It must be more than [respawn_cooldown/10] seconds from your last death to respawn!") + to_chat(user, "It must be more than [DisplayTimeText(respawn_cooldown)] from your last death to respawn!") return var/client/new_team_member = user.client if(user.mind && user.mind.current) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index ed7fb77bac..9a721bee62 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -123,7 +123,7 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation) to_chat(user, "Error: No destination found.") return if(world.time < wait) - to_chat(user, "Error: Warpspace triangulation in progress. Estimated time to completion: [round(((wait - world.time) / 10) / 60)] minutes.") + to_chat(user, "Error: Warpspace triangulation in progress. Estimated time to completion: [DisplayTimeText(wait - world.time)].") return for(var/obj/machinery/gateway/G in linked) diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index ea1f0081e5..fa9aff7f43 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -9,10 +9,13 @@ var/times_spoken_to = 0 var/list/shenanigans = list() -/obj/structure/speaking_tile/New() - var/savefile/S = new /savefile("data/npc_saves/Poly.sav") - S["phrases"] >> shenanigans - ..() +/obj/structure/speaking_tile/Initialize() + . = ..() + var/json_file = file("data/npc_saves/Poly.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + shenanigans = json["phrases"] /obj/structure/speaking_tile/interact(mob/user) if(!isliving(user) || speaking) @@ -63,7 +66,7 @@ if(204) SpeakPeace(list("Notice how there was no special message at 200?", "The slow automation of what used to be meaningful milestones?","It's all part of the joke.")) if(250) - SpeakPeace(list("Congratulations.", "By my very loose calculations you've now wasted a decent chunk of the round doing this.", "But you've seen this meme to its conclusion, and that's a experience in itself, right?")) + SpeakPeace(list("Congratulations.", "By my very loose calculations you've now wasted a decent chunk of the round doing this.", "But you've seen this meme to its conclusion, and that's an experience in itself, right?")) if(251) SpeakPeace(list("Anyway, here.", "I can't give you anything that would impact the progression of the round.","But you've earned this at least.")) var/obj/item/reagent_containers/food/drinks/trophy/silver_cup/the_ride = new(get_turf(user)) @@ -118,4 +121,4 @@ ..() /obj/effect/landmark/error - name = "error" + name = "error" \ No newline at end of file diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm index 64e90678de..9bd8c0a6e7 100644 --- a/code/modules/cargo/exports/weapons.dm +++ b/code/modules/cargo/exports/weapons.dm @@ -69,4 +69,98 @@ cost = 3 unit_name = "pair" message = "of handcuffs" - export_types = list(/obj/item/restraints/handcuffs) \ No newline at end of file + export_types = list(/obj/item/restraints/handcuffs) + +// relics of lavaland + +/datum/export/weapon/hierophant + cost = 40000 + unit_name = "Hierophant Club" + export_types = list(/obj/item/hierophant_club) + +/datum/export/weapon/lava + cost = 40000 + unit_name = "Lava Staff" + export_types = list(/obj/item/lava_staff) + +/datum/export/weapon/cleaving_saw + cost = 40000 + unit_name = "Cleaving Saw" + export_types = list(/obj/item/melee/transforming/cleaving_saw) + +/datum/export/weapon/mayhem + cost = 40000 + unit_name = "Mayhem in a bottle" + export_types = list(/obj/item/mayhem) + +/datum/export/weapon/blood_contract + cost = 40000 + unit_name = "Blood Contract" + export_types = list(/obj/item/blood_contract) + +//Artifacts of lavaland + +/datum/export/weapon/immortality_talisman + cost = 10000 + unit_name = "Immortality Talisman" + export_types = list(/obj/item/device/immortality_talisman) + +/datum/export/weapon/babel + cost = 10000 + unit_name = "Book of Babel" + export_types = list(/obj/item/book_of_babel) + +/datum/export/weapon/hook + cost = 10000 + unit_name = "Meat hook" + export_types = list(/obj/item/gun/magic/hook) + +/datum/export/weapon/shipbottle //the price for not breaking the bottle. + cost = 20000 + unit_name = "Ship in a bottle" + export_types = list(/obj/item/ship_in_a_bottle) + +/datum/export/weapon/tarot //price for sacraficing a very profitiable ally + cost = 20000 + unit_name = "Tarot cards" + export_types = list(/obj/item/guardiancreator) + +/datum/export/weapon/red //second half of telecube + cost = 5000 + unit_name = "Red Cube" + export_types = list(/obj/item/device/warp_cube/red) + +/datum/export/weapon/blue //first half of telecube + cost = 5000 + unit_name = "Blue Cube" + export_types = list(/obj/item/device/warp_cube) + +/datum/export/weapon/wisplantern //thermals on lavaland + cost = 10000 + unit_name = "Wisp Lantern" + export_types = list(/obj/item/device/wisp_lantern) + +/datum/export/weapon/flight //if xenobiology ever reaches the point to get these without shuttle being called they deserve it + cost = 10000 + unit_name = "Strange Elixer" + export_types = list(/obj/item/reagent_containers/glass/bottle/potion/flight) + +/datum/export/weapon/cheart //is a very powerfull healing artifact in the robust hands + cost = 10000 + unit_name = "Cursed Heart" + export_types = list(/obj/item/organ/heart/cursed/wizard) + +/datum/export/weapon/ckatana + cost = 10000 + unit_name = "Katana" + export_types = list(/obj/item/katana/cursed) + +/datum/export/weapon/geye //xray + cost = 10000 + unit_name = "God eye" + export_types = list(/obj/item/clothing/glasses/godeye) + +/datum/export/weapon/spectral + cost = 10000 + unit_name = "Spectral Sword" + export_types = list(/obj/item/melee/ghost_sword) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index ba536acdac..c5b180d8a1 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1643,7 +1643,11 @@ /obj/item/toy/talking/griffin, /obj/item/toy/nuke, /obj/item/toy/minimeteor, - /obj/item/toy/carpplushie, + /obj/item/toy/plush/carpplushie, + /obj/item/toy/plush/lizardplushie, + /obj/item/toy/plush/snakeplushie, + /obj/item/toy/plush/nukeplushie, + /obj/item/toy/plush/slimeplushie, /obj/item/coin/antagtoken, /obj/item/stack/tile/fakespace/loaded, /obj/item/gun/ballistic/shotgun/toy/crossbow, diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 4f576dd3e7..d5cf3aaf2c 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -150,7 +150,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the //all of our asset datums, used for referring to these later GLOBAL_LIST_EMPTY(asset_datums) -//get a assetdatum or make a new one +//get an assetdatum or make a new one /proc/get_asset_datum(var/type) if (!(type in GLOB.asset_datums)) return new type() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1df28192db..15b0bd95df 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -46,6 +46,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/preferred_map = null var/uses_glasses_colour = 0 + + var/screenshake = 100 + var/damagescreenshake = 2 //character preferences var/real_name //our character's name @@ -170,7 +173,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/parallax var/uplink_spawn_loc = UPLINK_PDA - + var/list/exp var/list/menuoptions @@ -363,6 +366,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "High" dat += "
" + dat += "Screen Shake:[(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]
" + + if (!user.client.prefs.screenshake==0) + dat += "Damage Screen Shake:[(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
" + dat += "
" dat += "

Special Role Settings

" @@ -922,7 +930,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("flavor_text") var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(features["flavor_text"])) as message if(msg != null) - msg = copytext(msg, 1, MAX_MESSAGE_LEN) + msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN)) msg = html_encode(msg) features["flavor_text"] = msg @@ -1486,6 +1494,20 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["exhibitionist"] = TRUE else features["exhibitionist"] = FALSE + if ("screenshake") + var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, 200 = maximum.)", "Character Preference", screenshake) as null|num + if (!isnull(desiredshake)) + screenshake = desiredshake + if("damagescreenshake") + switch(damagescreenshake) + if(0) + damagescreenshake = 1 + if(1) + damagescreenshake = 2 + if(2) + damagescreenshake = 0 + else + damagescreenshake = 1 if("publicity") if(unlock_content) diff --git a/code/modules/client/preferences.dm.rej b/code/modules/client/preferences.dm.rej deleted file mode 100644 index 02e6ad2d76..0000000000 --- a/code/modules/client/preferences.dm.rej +++ /dev/null @@ -1,14 +0,0 @@ -diff a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm (rejected hunks) -@@ -130,12 +130,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) - menuoptions = list() - return - --/datum/preferences/vv_edit_var(var_name, var_value) -- var/static/list/banned_edits = list("exp") -- if(var_name in banned_edits) -- return FALSE -- return ..() -- - /datum/preferences/proc/ShowChoices(mob/user) - if(!user || !user.client) - return diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 909df94d14..9daad5cae7 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -48,8 +48,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/B_monkey = 2048 var/B_gang = 4096 var/B_abductor = 16384 + var/B_brother = 32768 - var/list/archived = list(B_traitor,B_operative,B_changeling,B_wizard,B_malf,B_rev,B_alien,B_pai,B_cultist,B_blob,B_ninja,B_monkey,B_gang,B_abductor) + var/list/archived = list(B_traitor,B_operative,B_changeling,B_wizard,B_malf,B_rev,B_alien,B_pai,B_cultist,B_blob,B_ninja,B_monkey,B_gang,B_abductor,B_brother) be_special = list() @@ -83,6 +84,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car be_special += ROLE_MONKEY if(16384) be_special += ROLE_ABDUCTOR + if(32768) + be_special += ROLE_BROTHER /datum/preferences/proc/update_preferences(current_version, savefile/S) @@ -188,6 +191,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["menuoptions"] >> menuoptions //citadel code S["arousable"] >> arousable + S["screenshake"] >> screenshake + S["damagescreenshake"] >> damagescreenshake //try to fix any outdated data if necessary if(needs_update >= 0) @@ -212,6 +217,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION) menuoptions = SANITIZE_LIST(menuoptions) be_special = SANITIZE_LIST(be_special) + screenshake = sanitize_integer(screenshake, 0, 200, initial(screenshake)) + damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake)) return 1 @@ -253,7 +260,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["enable_tips"], enable_tips) WRITE_FILE(S["tip_delay"], tip_delay) //citadel code - S["arousable"] << arousable + WRITE_FILE(S["screenshake"], screenshake) + WRITE_FILE(S["damagescreenshake"], damagescreenshake) + WRITE_FILE(S["arousable"], arousable) return 1 @@ -384,8 +393,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if((S["flavor_text"] != "") && (S["flavor_text"] != null) && S["flavor_text"]) //If old text isn't null and isn't "" but still exists. S["flavor_text"] >> features["flavor_text"] //Load old flavortext as current dna-based flavortext - S["feature_flavor_text"] << features["flavor_text"] //Save it in our new type of flavor-text - S["flavor_text"] << "" //Remove old flavortext, completing the cut-and-paste into the new format. + WRITE_FILE(S["feature_flavor_text"], features["flavor_text"]) //Save it in our new type of flavor-text + WRITE_FILE(S["flavor_text"] , "") //Remove old flavortext, completing the cut-and-paste into the new format. else //We have no old flavortext, default to new S["feature_flavor_text"] >> features["flavor_text"] @@ -469,95 +478,95 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["version"] << SAVEFILE_VERSION_MAX //load_character will sanitize any bad data, so assume up-to-date. //Character - WRITE_FILE(S["OOC_Notes"] , metadata) - WRITE_FILE(S["real_name"] , real_name) + WRITE_FILE(S["OOC_Notes"], metadata) + WRITE_FILE(S["real_name"], real_name) WRITE_FILE(S["name_is_always_random"] , be_random_name) WRITE_FILE(S["body_is_always_random"] , be_random_body) - WRITE_FILE(S["gender"] , gender) - WRITE_FILE(S["age"] , age) - WRITE_FILE(S["hair_color"] , hair_color) - WRITE_FILE(S["facial_hair_color"] , facial_hair_color) - WRITE_FILE(S["eye_color"] , eye_color) - WRITE_FILE(S["skin_tone"] , skin_tone) - WRITE_FILE(S["hair_style_name"] , hair_style) - WRITE_FILE(S["facial_style_name"] , facial_hair_style) - WRITE_FILE(S["underwear"] , underwear) - WRITE_FILE(S["undershirt"] , undershirt) - WRITE_FILE(S["socks"] , socks) - WRITE_FILE(S["backbag"] , backbag) - WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc) - WRITE_FILE(S["species"] , pref_species.id) - WRITE_FILE(S["feature_mcolor"] , features["mcolor"]) - WRITE_FILE(S["feature_lizard_tail"] , features["tail_lizard"]) - WRITE_FILE(S["feature_human_tail"] , features["tail_human"]) - WRITE_FILE(S["feature_lizard_snout"] , features["snout"]) - WRITE_FILE(S["feature_lizard_horns"] , features["horns"]) - WRITE_FILE(S["feature_human_ears"] , features["ears"]) - WRITE_FILE(S["feature_lizard_frills"] , features["frills"]) - WRITE_FILE(S["feature_lizard_spines"] , features["spines"]) - WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"]) - WRITE_FILE(S["feature_lizard_legs"] , features["legs"]) - WRITE_FILE(S["clown_name"] , custom_names["clown"]) - WRITE_FILE(S["mime_name"] , custom_names["mime"]) - WRITE_FILE(S["ai_name"] , custom_names["ai"]) - WRITE_FILE(S["cyborg_name"] , custom_names["cyborg"]) - WRITE_FILE(S["religion_name"] , custom_names["religion"]) - WRITE_FILE(S["deity_name"] , custom_names["deity"]) - WRITE_FILE(S["prefered_security_department"] , prefered_security_department) + WRITE_FILE(S["gender"], gender) + WRITE_FILE(S["age"], age) + WRITE_FILE(S["hair_color"], hair_color) + WRITE_FILE(S["facial_hair_color"], facial_hair_color) + WRITE_FILE(S["eye_color"], eye_color) + WRITE_FILE(S["skin_tone"], skin_tone) + WRITE_FILE(S["hair_style_name"], hair_style) + WRITE_FILE(S["facial_style_name"], facial_hair_style) + WRITE_FILE(S["underwear"], underwear) + WRITE_FILE(S["undershirt"], undershirt) + WRITE_FILE(S["socks"], socks) + WRITE_FILE(S["backbag"], backbag) + WRITE_FILE(S["uplink_loc"], uplink_spawn_loc) + WRITE_FILE(S["species"], pref_species.id) + WRITE_FILE(S["feature_mcolor"], features["mcolor"]) + WRITE_FILE(S["feature_lizard_tail"], features["tail_lizard"]) + WRITE_FILE(S["feature_human_tail"], features["tail_human"]) + WRITE_FILE(S["feature_lizard_snout"], features["snout"]) + WRITE_FILE(S["feature_lizard_horns"], features["horns"]) + WRITE_FILE(S["feature_human_ears"], features["ears"]) + WRITE_FILE(S["feature_lizard_frills"], features["frills"]) + WRITE_FILE(S["feature_lizard_spines"], features["spines"]) + WRITE_FILE(S["feature_lizard_body_markings"], features["body_markings"]) + WRITE_FILE(S["feature_lizard_legs"] , features["legs"]) + WRITE_FILE(S["clown_name"], custom_names["clown"]) + WRITE_FILE(S["mime_name"], custom_names["mime"]) + WRITE_FILE(S["ai_name"] , custom_names["ai"]) + WRITE_FILE(S["cyborg_name"], custom_names["cyborg"]) + WRITE_FILE(S["religion_name"], custom_names["religion"]) + WRITE_FILE(S["deity_name"], custom_names["deity"]) + WRITE_FILE(S["prefered_security_department"], prefered_security_department) //Jobs - WRITE_FILE(S["joblessrole"] , joblessrole) - WRITE_FILE(S["job_civilian_high"] , job_civilian_high) - WRITE_FILE(S["job_civilian_med"] , job_civilian_med) - WRITE_FILE(S["job_civilian_low"] , job_civilian_low) - WRITE_FILE(S["job_medsci_high"] , job_medsci_high) - WRITE_FILE(S["job_medsci_med"] , job_medsci_med) - WRITE_FILE(S["job_medsci_low"] , job_medsci_low) - WRITE_FILE(S["job_engsec_high"] , job_engsec_high) - WRITE_FILE(S["job_engsec_med"] , job_engsec_med) - WRITE_FILE(S["job_engsec_low"] , job_engsec_low) + WRITE_FILE(S["joblessrole"], joblessrole) + WRITE_FILE(S["job_civilian_high"], job_civilian_high) + WRITE_FILE(S["job_civilian_med"], job_civilian_med) + WRITE_FILE(S["job_civilian_low"], job_civilian_low) + WRITE_FILE(S["job_medsci_high"], job_medsci_high) + WRITE_FILE(S["job_medsci_med"], job_medsci_med) + WRITE_FILE(S["job_medsci_low"], job_medsci_low) + WRITE_FILE(S["job_engsec_high"], job_engsec_high) + WRITE_FILE(S["job_engsec_med"], job_engsec_med) + WRITE_FILE(S["job_engsec_low"], job_engsec_low) //Citadel - S["feature_genitals_use_skintone"] << features["genitals_use_skintone"] - S["feature_exhibitionist"] << features["exhibitionist"] - S["feature_mcolor2"] << features["mcolor2"] - S["feature_mcolor3"] << features["mcolor3"] - S["feature_mam_body_markings"] << features["mam_body_markings"] - S["feature_mam_tail"] << features["mam_tail"] - S["feature_mam_ears"] << features["mam_ears"] - S["feature_mam_tail_animated"] << features["mam_tail_animated"] - S["feature_taur"] << features["taur"] + WRITE_FILE(S["feature_genitals_use_skintone"], features["genitals_use_skintone"]) + WRITE_FILE(S["feature_exhibitionist"], features["exhibitionist"]) + WRITE_FILE(S["feature_mcolor2"], features["mcolor2"]) + WRITE_FILE(S["feature_mcolor3"], features["mcolor3"]) + WRITE_FILE(S["feature_mam_body_markings"], features["mam_body_markings"]) + WRITE_FILE(S["feature_mam_tail"], features["mam_tail"]) + WRITE_FILE(S["feature_mam_ears"], features["mam_ears"]) + WRITE_FILE(S["feature_mam_tail_animated"], features["mam_tail_animated"]) + WRITE_FILE(S["feature_taur"], features["taur"]) //Xeno features - S["feature_xeno_tail"] << features["xenotail"] - S["feature_xeno_dors"] << features["xenodorsal"] - S["feature_xeno_head"] << features["xenohead"] + WRITE_FILE(S["feature_xeno_tail"], features["xenotail"]) + WRITE_FILE(S["feature_xeno_dors"], features["xenodorsal"]) + WRITE_FILE(S["feature_xeno_head"], features["xenohead"]) //cock features - S["feature_has_cock"] << features["has_cock"] - S["feature_cock_shape"] << features["cock_shape"] - S["feature_cock_color"] << features["cock_color"] - S["feature_cock_length"] << features["cock_length"] - S["feature_cock_girth"] << features["cock_girth"] - S["feature_has_sheath"] << features["sheath_color"] + WRITE_FILE(S["feature_has_cock"], features["has_cock"]) + WRITE_FILE(S["feature_cock_shape"], features["cock_shape"]) + WRITE_FILE(S["feature_cock_color"], features["cock_color"]) + WRITE_FILE(S["feature_cock_length"], features["cock_length"]) + WRITE_FILE(S["feature_cock_girth"], features["cock_girth"]) + WRITE_FILE(S["feature_has_sheath"], features["sheath_color"]) //balls features - S["feature_has_balls"] << features["has_balls"] - S["feature_balls_color"] << features["balls_color"] - S["feature_balls_size"] << features["balls_size"] - S["feature_balls_sack_size"] << features["balls_sack_size"] - S["feature_balls_fluid"] << features["balls_fluid"] + WRITE_FILE(S["feature_has_balls"], features["has_balls"]) + WRITE_FILE(S["feature_balls_color"], features["balls_color"]) + WRITE_FILE(S["feature_balls_size"], features["balls_size"]) + WRITE_FILE(S["feature_balls_sack_size"], features["balls_sack_size"]) + WRITE_FILE(S["feature_balls_fluid"], features["balls_fluid"]) //breasts features - S["feature_has_breasts"] << features["has_breasts"] - S["feature_breasts_size"] << features["breasts_size"] - S["feature_breasts_shape"] << features["breasts_shape"] - S["feature_breasts_color"] << features["breasts_color"] - S["feature_breasts_fluid"] << features["breasts_fluid"] + WRITE_FILE(S["feature_has_breasts"], features["has_breasts"]) + WRITE_FILE(S["feature_breasts_size"], features["breasts_size"]) + WRITE_FILE(S["feature_breasts_shape"], features["breasts_shape"]) + WRITE_FILE(S["feature_breasts_color"], features["breasts_color"]) + WRITE_FILE(S["feature_breasts_fluid"], features["breasts_fluid"]) //vagina features - S["feature_has_vag"] << features["has_vag"] - S["feature_vag_shape"] << features["vag_shape"] - S["feature_vag_color"] << features["vag_color"] + WRITE_FILE(S["feature_has_vag"], features["has_vag"]) + WRITE_FILE(S["feature_vag_shape"], features["vag_shape"]) + WRITE_FILE(S["feature_vag_color"], features["vag_color"]) //womb features - S["feature_has_womb"] << features["has_womb"] + WRITE_FILE(S["feature_has_womb"], features["has_womb"]) //flavor text - S["feature_flavor_text"] << features["flavor_text"] + WRITE_FILE(S["feature_flavor_text"], features["flavor_text"]) return 1 #undef SAVEFILE_VERSION_MAX diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index a86b30e605..7715362c06 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -80,6 +80,15 @@ GLOB.ooc_allowed = !GLOB.ooc_allowed to_chat(world, "The OOC channel has been globally [GLOB.ooc_allowed ? "enabled" : "disabled"].") +/proc/toggle_dooc(toggle = null) + if(toggle != null) + if(toggle != GLOB.dooc_allowed) + GLOB.dooc_allowed = toggle + else + return + else + GLOB.dooc_allowed = !GLOB.dooc_allowed + GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR) /client/proc/set_ooc(newColor as color) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 2343c2fdb2..9d8b25cebf 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -214,7 +214,7 @@ BLIND // can't see anything gender = PLURAL //Carn: for grammarically correct text-parsing w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/clothing/gloves.dmi' - siemens_coefficient = 0.50 + siemens_coefficient = 0.5 body_parts_covered = HANDS slot_flags = SLOT_GLOVES attack_verb = list("challenged") @@ -273,17 +273,6 @@ BLIND // can't see anything var/mob/M = loc M.update_inv_head() -/obj/item/clothing/head/equipped(mob/user, slot) - ..() - if(dynamic_hair_suffix) - user.update_hair() - -/obj/item/clothing/head/dropped(mob/user) - ..() - if(dynamic_hair_suffix) - user.update_hair() - - //Neck /obj/item/clothing/neck name = "necklace" @@ -372,7 +361,7 @@ BLIND // can't see anything body_parts_covered = FEET slot_flags = SLOT_FEET - permeability_coefficient = 0.50 + permeability_coefficient = 0.5 slowdown = SHOES_SLOWDOWN var/blood_state = BLOOD_STATE_NOT_BLOODY var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) @@ -514,7 +503,7 @@ BLIND // can't see anything icon = 'icons/obj/clothing/uniforms.dmi' name = "under" body_parts_covered = CHEST|GROIN|LEGS|ARMS - permeability_coefficient = 0.90 + permeability_coefficient = 0.9 slot_flags = SLOT_ICLOTHING armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm index 1ab0586af4..9d5433663e 100644 --- a/code/modules/clothing/ears/ears.dm +++ b/code/modules/clothing/ears/ears.dm @@ -1,11 +1,10 @@ - //Ears: currently only used for headsets and earmuffs /obj/item/clothing/ears name = "ears" w_class = WEIGHT_CLASS_TINY throwforce = 0 slot_flags = SLOT_EARS - resistance_flags = 0 + resistance_flags = NONE /obj/item/clothing/ears/earmuffs name = "earmuffs" @@ -15,7 +14,7 @@ strip_delay = 15 equip_delay_other = 25 resistance_flags = FLAMMABLE - flags_2 = BANG_PROTECT_2|HEALS_EARS_2 + flags_2 = BANG_PROTECT_2|HEALS_EARS_2 /obj/item/clothing/ears/headphones name = "headphones" @@ -43,4 +42,4 @@ H.update_inv_ears() H.update_inv_neck() H.update_inv_head() - to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") \ No newline at end of file + to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index b6b2eb9be1..a55b498e0b 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -1,213 +1,213 @@ -/obj/item/clothing/gloves/color/yellow - desc = "These gloves will protect the wearer from electric shock." - name = "insulated gloves" - icon_state = "yellow" - item_state = "ygloves" - siemens_coefficient = 0 - permeability_coefficient = 0.05 - item_color="yellow" - resistance_flags = 0 - -/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap - desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly." - name = "budget insulated gloves" - icon_state = "yellow" - item_state = "ygloves" - siemens_coefficient = 1 //Set to a default of 1, gets overridden in New() - permeability_coefficient = 0.05 - item_color="yellow" - resistance_flags = 0 - -/obj/item/clothing/gloves/color/fyellow/New() - ..() - siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5) - -/obj/item/clothing/gloves/color/fyellow/old - desc = "Old and worn out insulated gloves, hopefully they still work." - name = "worn out insulated gloves" - -/obj/item/clothing/gloves/color/fyellow/old/Initialize() - . = ..() - siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75) - -/obj/item/clothing/gloves/color/black - desc = "These gloves are fire-resistant." - name = "black gloves" - icon_state = "black" - item_state = "blackgloves" - item_color="black" - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT - heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - resistance_flags = 0 - var/can_be_cut = 1 - -/obj/item/clothing/gloves/color/black/hos - item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way. - -/obj/item/clothing/gloves/color/black/ce - item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way. - -/obj/item/clothing/gloves/color/black/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/wirecutters)) - if(can_be_cut && icon_state == initial(icon_state))//only if not dyed - to_chat(user, "You snip the fingertips off of [src].") - playsound(user.loc, W.usesound, rand(10,50), 1) - new /obj/item/clothing/gloves/fingerless(user.loc) - qdel(src) - ..() - -/obj/item/clothing/gloves/color/orange - name = "orange gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "orange" - item_state = "orangegloves" - item_color="orange" - -/obj/item/clothing/gloves/color/red - name = "red gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "red" - item_state = "redgloves" - item_color = "red" - - -/obj/item/clothing/gloves/color/red/insulated - name = "insulated gloves" - desc = "These gloves will protect the wearer from electric shock." - siemens_coefficient = 0 - permeability_coefficient = 0.05 - resistance_flags = 0 - -/obj/item/clothing/gloves/color/rainbow - name = "rainbow gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "rainbow" - item_state = "rainbowgloves" - item_color = "rainbow" - -/obj/item/clothing/gloves/color/rainbow/clown - item_color = "clown" - -/obj/item/clothing/gloves/color/blue - name = "blue gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "blue" - item_state = "bluegloves" - item_color="blue" - -/obj/item/clothing/gloves/color/purple - name = "purple gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "purple" - item_state = "purplegloves" - item_color="purple" - -/obj/item/clothing/gloves/color/green - name = "green gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "green" - item_state = "greengloves" - item_color="green" - -/obj/item/clothing/gloves/color/grey - name = "grey gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "gray" - item_state = "graygloves" - item_color="grey" - -/obj/item/clothing/gloves/color/grey/rd - item_color = "director" //Exists for washing machines. Is not different from gray gloves in any way. - -/obj/item/clothing/gloves/color/grey/hop - item_color = "hop" //Exists for washing machines. Is not different from gray gloves in any way. - -/obj/item/clothing/gloves/color/light_brown - name = "light brown gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "lightbrown" - item_state = "lightbrowngloves" - item_color="light brown" - -/obj/item/clothing/gloves/color/brown - name = "brown gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "brown" - item_state = "browngloves" - item_color="brown" - -/obj/item/clothing/gloves/color/brown/cargo - item_color = "cargo" //Exists for washing machines. Is not different from brown gloves in any way. - -/obj/item/clothing/gloves/color/captain - desc = "Regal blue gloves, with a nice gold trim. Swanky." - name = "captain's gloves" - icon_state = "captain" - item_state = "egloves" - item_color = "captain" - siemens_coefficient = 0 - permeability_coefficient = 0.05 - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT - heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - strip_delay = 60 - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 50) - -/obj/item/clothing/gloves/color/latex - name = "latex gloves" - desc = "Cheap sterile gloves made from latex." - icon_state = "latex" - item_state = "lgloves" - siemens_coefficient = 0.30 - permeability_coefficient = 0.01 - item_color="white" - transfer_prints = TRUE - resistance_flags = 0 - -/obj/item/clothing/gloves/color/latex/nitrile - name = "nitrile gloves" - desc = "Pricy sterile gloves that are stronger than latex." - icon_state = "nitrile" - item_state = "nitrilegloves" - item_color = "cmo" - transfer_prints = FALSE - -/obj/item/clothing/gloves/color/white - name = "white gloves" - desc = "These look pretty fancy." - icon_state = "white" - item_state = "wgloves" - item_color="mime" - -/obj/item/clothing/gloves/color/white/redcoat - item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way. - -/obj/item/clothing/gloves/color/random - name = "random gloves" - desc = "These gloves are supposed to be a random color..." - icon_state = "white" - item_state = "wgloves" - item_color = "mime" - -/obj/item/clothing/gloves/color/random/New() - ..() - var/list/gloves = list( - /obj/item/clothing/gloves/color/orange = 1, - /obj/item/clothing/gloves/color/red = 1, - /obj/item/clothing/gloves/color/blue = 1, - /obj/item/clothing/gloves/color/purple = 1, - /obj/item/clothing/gloves/color/green = 1, - /obj/item/clothing/gloves/color/grey = 1, - /obj/item/clothing/gloves/color/light_brown = 1, - /obj/item/clothing/gloves/color/brown = 1) - - var/obj/item/clothing/gloves/color/selected = pick(gloves) - - name = initial(selected.name) - desc = initial(selected.desc) - icon_state = initial(selected.icon_state) - item_state = initial(selected.item_state) - item_color = initial(selected.item_color) +/obj/item/clothing/gloves/color/yellow + desc = "These gloves will protect the wearer from electric shock." + name = "insulated gloves" + icon_state = "yellow" + item_state = "ygloves" + siemens_coefficient = 0 + permeability_coefficient = 0.5 + item_color="yellow" + resistance_flags = 0 + +/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap + desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly." + name = "budget insulated gloves" + icon_state = "yellow" + item_state = "ygloves" + siemens_coefficient = 1 //Set to a default of 1, gets overridden in New() + permeability_coefficient = 0.5 + item_color="yellow" + resistance_flags = 0 + +/obj/item/clothing/gloves/color/fyellow/New() + ..() + siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5) + +/obj/item/clothing/gloves/color/fyellow/old + desc = "Old and worn out insulated gloves, hopefully they still work." + name = "worn out insulated gloves" + +/obj/item/clothing/gloves/color/fyellow/old/Initialize() + . = ..() + siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75) + +/obj/item/clothing/gloves/color/black + desc = "These gloves are fire-resistant." + name = "black gloves" + icon_state = "black" + item_state = "blackgloves" + item_color="black" + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + resistance_flags = 0 + var/can_be_cut = 1 + +/obj/item/clothing/gloves/color/black/hos + item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way. + +/obj/item/clothing/gloves/color/black/ce + item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way. + +/obj/item/clothing/gloves/color/black/attackby(obj/item/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/wirecutters)) + if(can_be_cut && icon_state == initial(icon_state))//only if not dyed + to_chat(user, "You snip the fingertips off of [src].") + playsound(user.loc, W.usesound, rand(10,50), 1) + new /obj/item/clothing/gloves/fingerless(user.loc) + qdel(src) + ..() + +/obj/item/clothing/gloves/color/orange + name = "orange gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "orange" + item_state = "orangegloves" + item_color="orange" + +/obj/item/clothing/gloves/color/red + name = "red gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "red" + item_state = "redgloves" + item_color = "red" + + +/obj/item/clothing/gloves/color/red/insulated + name = "insulated gloves" + desc = "These gloves will protect the wearer from electric shock." + siemens_coefficient = 0 + permeability_coefficient = 0.5 + resistance_flags = 0 + +/obj/item/clothing/gloves/color/rainbow + name = "rainbow gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "rainbow" + item_state = "rainbowgloves" + item_color = "rainbow" + +/obj/item/clothing/gloves/color/rainbow/clown + item_color = "clown" + +/obj/item/clothing/gloves/color/blue + name = "blue gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "blue" + item_state = "bluegloves" + item_color="blue" + +/obj/item/clothing/gloves/color/purple + name = "purple gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "purple" + item_state = "purplegloves" + item_color="purple" + +/obj/item/clothing/gloves/color/green + name = "green gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "green" + item_state = "greengloves" + item_color="green" + +/obj/item/clothing/gloves/color/grey + name = "grey gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "gray" + item_state = "graygloves" + item_color="grey" + +/obj/item/clothing/gloves/color/grey/rd + item_color = "director" //Exists for washing machines. Is not different from gray gloves in any way. + +/obj/item/clothing/gloves/color/grey/hop + item_color = "hop" //Exists for washing machines. Is not different from gray gloves in any way. + +/obj/item/clothing/gloves/color/light_brown + name = "light brown gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "lightbrown" + item_state = "lightbrowngloves" + item_color="light brown" + +/obj/item/clothing/gloves/color/brown + name = "brown gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "brown" + item_state = "browngloves" + item_color="brown" + +/obj/item/clothing/gloves/color/brown/cargo + item_color = "cargo" //Exists for washing machines. Is not different from brown gloves in any way. + +/obj/item/clothing/gloves/color/captain + desc = "Regal blue gloves, with a nice gold trim. Swanky." + name = "captain's gloves" + icon_state = "captain" + item_state = "egloves" + item_color = "captain" + siemens_coefficient = 0 + permeability_coefficient = 0.5 + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + strip_delay = 60 + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 50) + +/obj/item/clothing/gloves/color/latex + name = "latex gloves" + desc = "Cheap sterile gloves made from latex." + icon_state = "latex" + item_state = "lgloves" + siemens_coefficient = 0.3 + permeability_coefficient = 0.1 + item_color="white" + transfer_prints = TRUE + resistance_flags = 0 + +/obj/item/clothing/gloves/color/latex/nitrile + name = "nitrile gloves" + desc = "Pricy sterile gloves that are stronger than latex." + icon_state = "nitrile" + item_state = "nitrilegloves" + item_color = "cmo" + transfer_prints = FALSE + +/obj/item/clothing/gloves/color/white + name = "white gloves" + desc = "These look pretty fancy." + icon_state = "white" + item_state = "wgloves" + item_color="mime" + +/obj/item/clothing/gloves/color/white/redcoat + item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way. + +/obj/item/clothing/gloves/color/random + name = "random gloves" + desc = "These gloves are supposed to be a random color..." + icon_state = "white" + item_state = "wgloves" + item_color = "mime" + +/obj/item/clothing/gloves/color/random/New() + ..() + var/list/gloves = list( + /obj/item/clothing/gloves/color/orange = 1, + /obj/item/clothing/gloves/color/red = 1, + /obj/item/clothing/gloves/color/blue = 1, + /obj/item/clothing/gloves/color/purple = 1, + /obj/item/clothing/gloves/color/green = 1, + /obj/item/clothing/gloves/color/grey = 1, + /obj/item/clothing/gloves/color/light_brown = 1, + /obj/item/clothing/gloves/color/brown = 1) + + var/obj/item/clothing/gloves/color/selected = pick(gloves) + + name = initial(selected.name) + desc = initial(selected.desc) + icon_state = initial(selected.icon_state) + item_state = initial(selected.item_state) + item_color = initial(selected.item_color) diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 3c076f572f..39099fb1a2 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -7,8 +7,8 @@ flags_1 = MASKINTERNALS_1 visor_flags = MASKINTERNALS_1 w_class = WEIGHT_CLASS_SMALL - gas_transfer_coefficient = 0.10 - permeability_coefficient = 0.50 + gas_transfer_coefficient = 0.1 + permeability_coefficient = 0.5 actions_types = list(/datum/action/item_action/adjust) flags_cover = MASKCOVERSMOUTH visor_flags_cover = MASKCOVERSMOUTH diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 6b91d1a265..8422b5b76f 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -5,7 +5,7 @@ item_state = "blindfold" flags_cover = MASKCOVERSMOUTH w_class = WEIGHT_CLASS_SMALL - gas_transfer_coefficient = 0.90 + gas_transfer_coefficient = 0.9 equip_delay_other = 20 /obj/item/clothing/mask/muzzle/attack_paw(mob/user) @@ -26,7 +26,7 @@ flags_cover = MASKCOVERSMOUTH visor_flags_inv = HIDEFACE visor_flags_cover = MASKCOVERSMOUTH - gas_transfer_coefficient = 0.90 + gas_transfer_coefficient = 0.9 permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0, fire = 0, acid = 0) actions_types = list(/datum/action/item_action/adjust) diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index e10f089eb8..bf3a1f28e0 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -5,59 +5,39 @@ desc = "Lost prototype of advanced clown tech. Powered by bananium, these shoes leave a trail of chaos in their wake." icon_state = "clown_prototype_off" var/on = FALSE - var/datum/material_container/bananium actions_types = list(/datum/action/item_action/toggle) -/obj/item/clothing/shoes/clown_shoes/banana_shoes/New() - ..() - bananium = new/datum/material_container(src,list(MAT_BANANIUM),200000) +/obj/item/clothing/shoes/clown_shoes/banana_shoes/Initialize() + . = ..() + AddComponent(/datum/component/material_container, list(MAT_BANANIUM), 200000, TRUE) + AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 75) /obj/item/clothing/shoes/clown_shoes/banana_shoes/step_action() + . = ..() if(on) - if(footstep > 1)//honks when its on - playsound(src, 'sound/items/bikehorn.ogg', 75, 1) - footstep = 0 - else - footstep++ - new/obj/item/grown/bananapeel/specialpeel(get_step(src,turn(usr.dir, 180))) //honk + GET_COMPONENT(bananium, /datum/component/material_container) bananium.use_amount_type(100, MAT_BANANIUM) if(bananium.amount(MAT_BANANIUM) < 100) on = !on flags_1 &= ~NOSLIP_1 update_icon() to_chat(loc, "You ran out of bananium!") - else - ..() /obj/item/clothing/shoes/clown_shoes/banana_shoes/attack_self(mob/user) + GET_COMPONENT(bananium, /datum/component/material_container) var/sheet_amount = bananium.retrieve_all() if(sheet_amount) to_chat(user, "You retrieve [sheet_amount] sheets of bananium from the prototype shoes.") else to_chat(user, "You cannot retrieve any bananium from the prototype shoes.") -/obj/item/clothing/shoes/clown_shoes/banana_shoes/attackby(obj/item/O, mob/user, params) - if(!bananium.get_item_material_amount(O)) - to_chat(user, "This item has no bananium!") - return - if(!user.dropItemToGround(O)) - to_chat(user, "You can't drop [O]!") - return - - var/bananium_amount = bananium.insert_item(O) - if(bananium_amount) - to_chat(user, "You insert [O] into the prototype shoes.") - qdel(O) - else - to_chat(user, "You are unable to insert more bananium!") - /obj/item/clothing/shoes/clown_shoes/banana_shoes/examine(mob/user) ..() - var/ban_amt = bananium.amount(MAT_BANANIUM) - to_chat(user, "The shoes are [on ? "enabled" : "disabled"]. There is [ban_amt ? ban_amt : "no"] bananium left.") + to_chat(user, "The shoes are [on ? "enabled" : "disabled"]") /obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click(mob/user) + GET_COMPONENT(bananium, /datum/component/material_container) if(bananium.amount(MAT_BANANIUM)) on = !on update_icon() diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index c0ac24c1cc..026b011e39 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -1,4 +1,5 @@ /obj/item/clothing/shoes/proc/step_action() //this was made to rewrite clown shoes squeaking + SendSignal(COMSIG_SHOES_STEP_ACTION) /obj/item/clothing/shoes/suicide_act(mob/user) user.visible_message("[user] is bashing [user.p_their()] own head in with [src]! Ain't that a kick in the head?") @@ -79,15 +80,11 @@ item_state = "clown_shoes" slowdown = SHOES_SLOWDOWN+1 item_color = "clown" - var/footstep = 1 //used for squeeks whilst walking pockets = /obj/item/storage/internal/pocket/shoes/clown -/obj/item/clothing/shoes/clown_shoes/step_action() - if(footstep > 1) - playsound(src, "clownstep", 50, 1) - footstep = 0 - else - footstep++ +/obj/item/clothing/shoes/clown_shoes/Initialize() + . = ..() + AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50) /obj/item/clothing/shoes/clown_shoes/jester name = "jester shoes" @@ -198,22 +195,24 @@ var/jumping = FALSE //are we mid-jump? /obj/item/clothing/shoes/bhop/ui_action_click(mob/user, action) - if(!isliving(usr)) + if(!isliving(user)) return if(jumping) return if(recharging_time > world.time) - to_chat(usr, "The boot's internal propulsion needs to recharge still!") + to_chat(user, "The boot's internal propulsion needs to recharge still!") return - var/atom/target = get_edge_target_turf(usr, usr.dir) //gets the user's direction + var/atom/target = get_edge_target_turf(user, user.dir) //gets the user's direction - jumping = TRUE - playsound(src.loc, 'sound/effects/stealthoff.ogg', 50, 1, 1) - usr.visible_message("[usr] dashes forward into the air!") - usr.throw_at(target, jumpdistance, jumpspeed, spin=0, diagonals_first = 1, callback = CALLBACK(src, .proc/hop_end)) + if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE, callback = CALLBACK(src, .proc/hop_end))) + jumping = TRUE + playsound(src, 'sound/effects/stealthoff.ogg', 50, 1, 1) + user.visible_message("[usr] dashes forward into the air!") + else + to_chat(user, "Something prevents you from dashing forward!") /obj/item/clothing/shoes/bhop/proc/hop_end() jumping = FALSE diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index 4f251d68e3..0c16a2b764 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -18,7 +18,7 @@ var/icon_state_boost = "flightpack_boost" var/item_state_boost = "flightpack_boost" actions_types = list(/datum/action/item_action/flightpack/toggle_flight, /datum/action/item_action/flightpack/engage_boosters, /datum/action/item_action/flightpack/toggle_stabilizers, /datum/action/item_action/flightpack/change_power, /datum/action/item_action/flightpack/toggle_airbrake) - armor = list(melee = 20, bullet = 20, laser = 20, energy = 10, bomb = 30, bio = 100, rad = 75, fire = 100, acid = 75) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 10, bomb = 30, bio = 100, rad = 10, fire = 50, acid = 35) w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK @@ -34,7 +34,7 @@ var/flight = FALSE var/flight_passflags = PASSTABLE var/powersetting = 1 - var/powersetting_high = 3 + var/powersetting_high = 6 var/powersetting_low = 1 var/override_safe = FALSE @@ -84,7 +84,7 @@ var/emp_disable_threshold = 3 //3 weak ion, 2 strong ion hits. var/emp_disabled = FALSE - var/crash_damage = 0 //Same thing, but for crashes. This is in addition to possible amounts of brute damage to the wearer. + var/crash_damage = 10 //Same thing, but for crashes. This is in addition to possible amounts of brute damage to the wearer. var/crash_damage_low = 1 var/crash_damage_high = 2.5 var/crash_disable_threshold = 5 @@ -102,9 +102,13 @@ var/obj/item/stock_parts/capacitor/part_cap = null var/obj/item/stock_parts/micro_laser/part_laser = null var/obj/item/stock_parts/matter_bin/part_bin = null + var/obj/item/stock_parts/cell/cell = null //Wew lad. about damn time now var/crashing = FALSE //Are we currently getting wrecked? + var/s_delay = 50 // cell replacement delay + + /obj/item/device/flightpack/proc/changeWearer(mob/changeto) if(wearer) LAZYREMOVE(wearer.user_movement_hooks, src) @@ -128,6 +132,8 @@ part_cap = new /obj/item/stock_parts/capacitor/super(src) part_laser = new /obj/item/stock_parts/micro_laser/ultra(src) part_bin = new /obj/item/stock_parts/matter_bin/super(src) + cell = new/obj/item/stock_parts/cell/high + cell.charge = 9000 ..() /obj/item/device/flightpack/proc/usermessage(message, span = "boldnotice", mob/mob_override = null) @@ -816,6 +822,22 @@ part_cap.forceMove(get_turf(src)) part_cap = I changed = TRUE + if(istype(S, /obj/item/stock_parts/cell)) + var/obj/item/stock_parts/cell/CELL = S + if(CELL.maxcharge > cell.maxcharge) + usermessage("Higher maximum capacity detected.\nUpgrading...", mob_override = user) + if (do_after(user,s_delay, target = src)) + user.transferItemToLoc(CELL, src) + CELL.charge = min(CELL.charge+cell.charge, CELL.maxcharge) + var/obj/item/stock_parts/cell/old_cell = cell + old_cell.charge = 0 + user.put_in_hands(old_cell) + old_cell.add_fingerprint(user) + old_cell.update_icon() + cell = CELL + usermessage("Upgrade complete. Maximum capacity: [round(cell.maxcharge/100)]%", mob_override = user) + else + usermessage("Procedure interrupted. Protocol terminated.", mob_override = user) if(changed) update_parts() ..() @@ -847,7 +869,7 @@ var/obj/item/device/flightpack/pack = null var/mob/living/carbon/human/wearer = null var/active = FALSE - resistance_flags = FIRE_PROOF | ACID_PROOF + resistance_flags = FIRE_PROOF /obj/item/clothing/shoes/flightshoes/Destroy() pack = null @@ -901,22 +923,28 @@ var/deployedpack = FALSE var/deployedshoes = FALSE var/locked = FALSE - resistance_flags = FIRE_PROOF | ACID_PROOF + resistance_flags = FIRE_PROOF helmettype = /obj/item/clothing/head/helmet/space/hardsuit/flightsuit jetpack = null var/flightpack var/flight = FALSE allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals, /obj/item/gun, /obj/item/reagent_containers/spray/pepper, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs) actions_types = list(/datum/action/item_action/flightsuit/toggle_helmet, /datum/action/item_action/flightsuit/toggle_boots, /datum/action/item_action/flightsuit/toggle_flightpack, /datum/action/item_action/flightsuit/lock_suit) - armor = list(melee = 20, bullet = 20, laser = 20, energy = 10, bomb = 30, bio = 100, rad = 75, fire = 100, acid = 100) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 10, bomb = 30, bio = 100, rad = 10, fire = 50, acid = 35) var/maint_panel = FALSE - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT + var/obj/item/stock_parts/cell/cell + var/s_delay = 50 + +/obj/item/clothing/suit/space/hardsuit/flightsuit/get_cell() + return cell /obj/item/clothing/suit/space/hardsuit/flightsuit/full/Initialize() . = ..() makepack() makeshoes() resync() + get_cell() /obj/item/clothing/suit/space/hardsuit/flightsuit/proc/usermessage(message, span = "boldnotice") var/mob/targ = user @@ -931,6 +959,7 @@ to_chat(user, "SUIT: [locked ? "LOCKED" : "UNLOCKED"]") to_chat(user, "FLIGHTPACK: [deployedpack ? "ENGAGED" : "DISENGAGED"] FLIGHTSHOES : [deployedshoes ? "ENGAGED" : "DISENGAGED"] HELMET : [suittoggled ? "ENGAGED" : "DISENGAGED"]") to_chat(user, "Its maintainence panel is [maint_panel ? "OPEN" : "CLOSED"]") + to_chat(user, "Current energy capacity: [DisplayPower(cell.charge)]") /obj/item/clothing/suit/space/hardsuit/flightsuit/Destroy() dropped() @@ -1223,12 +1252,12 @@ icon_state = "flighthelmet" item_state = "flighthelmet" item_color = "flight" - resistance_flags = FIRE_PROOF | ACID_PROOF - brightness_on = 7 + resistance_flags = FIRE_PROOF + brightness_on = 4 light_color = "#30ffff" - armor = list(melee = 20, bullet = 20, laser = 20, energy = 10, bomb = 30, bio = 100, rad = 75, fire = 100, acid = 100) - max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - var/list/datahuds = list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 10, bomb = 30, bio = 100, rad = 10, fire = 50, acid = 35) + max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT + var/list/datahuds = list(DATA_HUD_SECURITY_BASIC , DATA_HUD_MEDICAL_BASIC, DATA_HUD_DIAGNOSTIC) var/zoom_range = 14 var/zoom = FALSE actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/flightpack/zoom) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 59dd6e2d8d..13221350ee 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -362,7 +362,7 @@ icon_state = "heavy" item_state = "swat_suit" w_class = WEIGHT_CLASS_BULKY - gas_transfer_coefficient = 0.90 + gas_transfer_coefficient = 0.9 flags_1 = THICKMATERIAL_1 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 3 diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index c12accc8c1..5211dd7938 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -70,8 +70,8 @@ desc = "An apron-jacket used by a high class chef." icon_state = "chef" item_state = "chef" - gas_transfer_coefficient = 0.90 - permeability_coefficient = 0.50 + gas_transfer_coefficient = 0.9 + permeability_coefficient = 0.5 body_parts_covered = CHEST|GROIN|ARMS allowed = list(/obj/item/kitchen) togglename = "sleeves" diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index e0e6ee6e5a..3ea8721b7e 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -15,8 +15,8 @@ icon_state = "fire" item_state = "ro_suit" w_class = WEIGHT_CLASS_BULKY - gas_transfer_coefficient = 0.90 - permeability_coefficient = 0.50 + gas_transfer_coefficient = 0.9 + permeability_coefficient = 0.5 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/extinguisher, /obj/item/crowbar) slowdown = 1 @@ -122,8 +122,8 @@ icon_state = "rad" item_state = "rad_suit" w_class = WEIGHT_CLASS_BULKY - gas_transfer_coefficient = 0.90 - permeability_coefficient = 0.50 + gas_transfer_coefficient = 0.9 + permeability_coefficient = 0.5 flags_1 = THICKMATERIAL_1 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/device/geiger_counter) diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 19cfc834f9..5210034af9 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -76,7 +76,7 @@ icon_state = "hydroponics" item_state = "g_suit" item_color = "hydroponics" - permeability_coefficient = 0.50 + permeability_coefficient = 0.5 /obj/item/clothing/under/rank/janitor desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards." diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 9c5ab5168a..d80b7ddba3 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -1,121 +1,121 @@ -/* - * Science - */ -/obj/item/clothing/under/rank/research_director - desc = "It's a suit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." - name = "research director's vest suit" - icon_state = "director" - item_state = "lb_suit" - item_color = "director" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 35) - can_adjust = 0 - -/obj/item/clothing/under/rank/research_director/alt - desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." - name = "research director's tan suit" - icon_state = "rdwhimsy" - item_state = "rdwhimsy" - item_color = "rdwhimsy" - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0) - can_adjust = 1 - alt_covers_chest = 1 - -/obj/item/clothing/under/rank/research_director/turtleneck - desc = "A dark purple turtleneck and tan khakis, for a director with a superior sense of style." - name = "research director's turtleneck" - icon_state = "rdturtle" - item_state = "p_suit" - item_color = "rdturtle" - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0) - can_adjust = 1 - alt_covers_chest = 1 - -/obj/item/clothing/under/rank/scientist - desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist." - name = "scientist's jumpsuit" - icon_state = "toxins" - item_state = "w_suit" - item_color = "toxinswhite" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 0) - - -/obj/item/clothing/under/rank/chemist - desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it." - name = "chemist's jumpsuit" - icon_state = "chemistry" - item_state = "w_suit" - item_color = "chemistrywhite" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 65) - -/* - * Medical - */ -/obj/item/clothing/under/rank/chief_medical_officer - desc = "It's a jumpsuit worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection." - name = "chief medical officer's jumpsuit" - icon_state = "cmo" - item_state = "w_suit" - item_color = "cmo" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) - -/obj/item/clothing/under/rank/geneticist - desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." - name = "geneticist's jumpsuit" - icon_state = "genetics" - item_state = "w_suit" - item_color = "geneticswhite" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) - -/obj/item/clothing/under/rank/virologist - desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." - name = "virologist's jumpsuit" - icon_state = "virology" - item_state = "w_suit" - item_color = "virologywhite" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) - -/obj/item/clothing/under/rank/nursesuit - desc = "It's a jumpsuit commonly worn by nursing staff in the medical department." - name = "nurse's suit" - icon_state = "nursesuit" - item_state = "w_suit" - item_color = "nursesuit" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) - fitted = NO_FEMALE_UNIFORM - can_adjust = 0 - -/obj/item/clothing/under/rank/medical - desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel." - name = "medical doctor's jumpsuit" - icon_state = "medical" - item_state = "w_suit" - item_color = "medical" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) - -/obj/item/clothing/under/rank/medical/blue - name = "medical scrubs" - desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." - icon_state = "scrubsblue" - item_color = "scrubsblue" - can_adjust = 0 - -/obj/item/clothing/under/rank/medical/green - name = "medical scrubs" - desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green." - icon_state = "scrubsgreen" - item_color = "scrubsgreen" - can_adjust = 0 - -/obj/item/clothing/under/rank/medical/purple - name = "medical scrubs" - desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple." - icon_state = "scrubspurple" - item_color = "scrubspurple" - can_adjust = 0 +/* + * Science + */ +/obj/item/clothing/under/rank/research_director + desc = "It's a suit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." + name = "research director's vest suit" + icon_state = "director" + item_state = "lb_suit" + item_color = "director" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 35) + can_adjust = 0 + +/obj/item/clothing/under/rank/research_director/alt + desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." + name = "research director's tan suit" + icon_state = "rdwhimsy" + item_state = "rdwhimsy" + item_color = "rdwhimsy" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0) + can_adjust = 1 + alt_covers_chest = 1 + +/obj/item/clothing/under/rank/research_director/turtleneck + desc = "A dark purple turtleneck and tan khakis, for a director with a superior sense of style." + name = "research director's turtleneck" + icon_state = "rdturtle" + item_state = "p_suit" + item_color = "rdturtle" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0) + can_adjust = 1 + alt_covers_chest = 1 + +/obj/item/clothing/under/rank/scientist + desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist." + name = "scientist's jumpsuit" + icon_state = "toxins" + item_state = "w_suit" + item_color = "toxinswhite" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 0) + + +/obj/item/clothing/under/rank/chemist + desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it." + name = "chemist's jumpsuit" + icon_state = "chemistry" + item_state = "w_suit" + item_color = "chemistrywhite" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 65) + +/* + * Medical + */ +/obj/item/clothing/under/rank/chief_medical_officer + desc = "It's a jumpsuit worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection." + name = "chief medical officer's jumpsuit" + icon_state = "cmo" + item_state = "w_suit" + item_color = "cmo" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) + +/obj/item/clothing/under/rank/geneticist + desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." + name = "geneticist's jumpsuit" + icon_state = "genetics" + item_state = "w_suit" + item_color = "geneticswhite" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) + +/obj/item/clothing/under/rank/virologist + desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." + name = "virologist's jumpsuit" + icon_state = "virology" + item_state = "w_suit" + item_color = "virologywhite" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) + +/obj/item/clothing/under/rank/nursesuit + desc = "It's a jumpsuit commonly worn by nursing staff in the medical department." + name = "nurse's suit" + icon_state = "nursesuit" + item_state = "w_suit" + item_color = "nursesuit" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) + fitted = NO_FEMALE_UNIFORM + can_adjust = 0 + +/obj/item/clothing/under/rank/medical + desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel." + name = "medical doctor's jumpsuit" + icon_state = "medical" + item_state = "w_suit" + item_color = "medical" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) + +/obj/item/clothing/under/rank/medical/blue + name = "medical scrubs" + desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." + icon_state = "scrubsblue" + item_color = "scrubsblue" + can_adjust = 0 + +/obj/item/clothing/under/rank/medical/green + name = "medical scrubs" + desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green." + icon_state = "scrubsgreen" + item_color = "scrubsgreen" + can_adjust = 0 + +/obj/item/clothing/under/rank/medical/purple + name = "medical scrubs" + desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple." + icon_state = "scrubspurple" + item_color = "scrubspurple" + can_adjust = 0 diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 217644c4ae..65a78d0ef0 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -204,9 +204,9 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON -/datum/crafting_recipe/meteorshot - name = "Meteorshot Shell" - result = /obj/item/ammo_casing/shotgun/meteorshot +/datum/crafting_recipe/meteorslug + name = "Meteorslug Shell" + result = /obj/item/ammo_casing/shotgun/meteorslug reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /obj/item/rcd_ammo = 1, /obj/item/stock_parts/manipulator = 2) @@ -228,7 +228,7 @@ /datum/crafting_recipe/dragonsbreath name = "Dragonsbreath Shell" - result = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath + result = /obj/item/ammo_casing/shotgun/dragonsbreath reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5) tools = list(/obj/item/screwdriver) time = 5 @@ -270,17 +270,6 @@ category = CAT_WEAPONRY subcategory = CAT_AMMO -/datum/crafting_recipe/improvisedslugoverload - name = "Overload Improvised Shell" - result = /obj/item/ammo_casing/shotgun/improvised/overload - reqs = list(/obj/item/ammo_casing/shotgun/improvised = 1, - /datum/reagent/blackpowder = 10, - /datum/reagent/toxin/plasma = 20) - tools = list(/obj/item/screwdriver) - time = 5 - category = CAT_WEAPONRY - subcategory = CAT_AMMO - /datum/crafting_recipe/laserslug name = "Laser Slug Shell" result = /obj/item/ammo_casing/shotgun/laserslug diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index 93605ea78a..c0c8cf5b74 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -43,7 +43,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) configured_error_silence_time = config.error_silence_time - //Each occurence of an unique error adds to its cooldown time... + //Each occurence of a unique error adds to its cooldown time... cooldown = max(0, cooldown - (world.time - last_seen)) + configured_error_cooldown // ... which is used to silence an error if it occurs too often, too fast if(cooldown > configured_error_cooldown * configured_error_limit) @@ -88,7 +88,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) if(usrinfo) //If this info isn't null, it hasn't been added yet desclines.Add(usrinfo) if(silencing) - desclines += " (This error will now be silenced for [configured_error_silence_time / 600] minutes)" + desclines += " (This error will now be silenced for [DisplayTimeText(configured_error_silence_time)])" if(GLOB.error_cache) GLOB.error_cache.log_error(E, desclines) diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index bbc73dca66..6fee1e5c1a 100755 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -3,9 +3,7 @@ typepath = /datum/round_event/ghost_role/abductor weight = 10 max_occurrences = 1 - min_players = 20 - gamemode_blacklist = list("nuclear","wizard","revolution","abduction") /datum/round_event/ghost_role/abductor @@ -17,40 +15,17 @@ if(candidates.len < 2) return NOT_ENOUGH_PLAYERS - //Oh god why we can't have static functions - // I feel your pain, bro - var/number = SSticker.mode.abductor_teams + 1 - var/datum/game_mode/abduction/temp + var/datum/game_mode/abduction/GM if(SSticker.mode.config_tag == "abduction") - temp = SSticker.mode + GM = SSticker.mode else - temp = new + GM = new - var/agent_mind = pick_n_take(candidates) - var/scientist_mind = pick_n_take(candidates) + var/mob/living/carbon/human/agent = makeBody(pick_n_take(candidates)) + var/mob/living/carbon/human/scientist = makeBody(pick_n_take(candidates)) - var/mob/living/carbon/human/agent = makeBody(agent_mind) - var/mob/living/carbon/human/scientist = makeBody(scientist_mind) - - agent_mind = agent.mind - scientist_mind = scientist.mind - - temp.scientists.len = number - temp.agents.len = number - temp.abductors.len = 2*number - temp.team_objectives.len = number - temp.team_names.len = number - temp.scientists[number] = scientist_mind - temp.agents[number] = agent_mind - temp.abductors |= list(agent_mind,scientist_mind) - temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) - temp.post_setup_team(number) - - SSticker.mode.abductor_teams++ - - if(SSticker.mode.config_tag != "abduction") - SSticker.mode.abductors |= temp.abductors + GM.post_setup_team(GM.make_abductor_team(agent.mind, scientist.mind)) spawned_mobs += list(agent, scientist) return SUCCESSFUL_SPAWN diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index c5a9c1a142..bc2b3c2666 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -88,7 +88,7 @@ ..() if(FESTIVE_SEASON in SSevents.holidays) new tree(get_turf(src)) - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/landmark/xmastree/rdrod name = "festivus pole spawner" diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index 3d0461d3cf..cc632d9c87 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -43,7 +43,7 @@ /mob/living/simple_animal/hostile/carp/ranged/Initialize() projectiletype = pick(allowed_projectile_types) - ..() + . = ..() /mob/living/simple_animal/hostile/carp/ranged/chaos name = "chaos magicarp" diff --git a/code/modules/food_and_drinks/food/snacks_burgers.dm b/code/modules/food_and_drinks/food/snacks_burgers.dm index 31909c4728..6b50a28b63 100644 --- a/code/modules/food_and_drinks/food/snacks_burgers.dm +++ b/code/modules/food_and_drinks/food/snacks_burgers.dm @@ -176,6 +176,22 @@ color = "#DA00FFFF" bonus_reagents = list("purplecrayonpowder" = 10, "vitamin" = 5) foodtype = GRAIN | MEAT + +/obj/item/reagent_containers/food/snacks/burger/black + name = "black burger" + desc = "This is overcooked." + icon_state = "cburger" + color = "#1C1C1C" + bonus_reagents = list("blackcrayonpowder" = 10, "vitamin" = 5) + foodtype = GRAIN | MEAT + +/obj/item/reagent_containers/food/snacks/burger/white + name = "white burger" + desc = "Delicous Titanium!" + icon_state = "cburger" + color = "#FFFFFF" + bonus_reagents = list("whitecrayonpowder" = 10, "vitamin" = 5) + foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/spell name = "spell burger" @@ -251,4 +267,4 @@ icon_state = "baconburger" bonus_reagents = list("nutriment" = 8, "vitamin" = 1) tastes = list("bun" = 4, "bacon" = 2) - foodtype = GRAIN | MEAT \ No newline at end of file + foodtype = GRAIN | MEAT diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index e5c40623f0..2262c2e7f0 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -188,6 +188,24 @@ tastes = list("cobwebs" = 1) foodtype = MEAT | TOXIC +/obj/item/reagent_containers/food/snacks/spiderling + name = "spiderling" + desc = "It's slightly twitching in your hand. Ew..." + icon_state = "spiderling" + list_reagents = list("nutrient" = 1, "toxin" = 4) + filling_color = "#00800" + tastes = list("cobwebs" = 1, "guts" = 2) + foodtype = MEAT | TOXIC + +/obj/item/reagent_containers/food/snacks/spiderlollipop + name = "spider lollipop" + desc = "Still gross, but at least it has a mountain of sugar on it." + icon_state = "spiderlollipop" + list_reagents = list("nutriment" = 1, "toxin" = 1, "iron" = 10, "sugar" = 5, "omnizine" = 2) //lollipop, but vitamins = toxins + filling_color = "#00800" + tastes = list("cobwebs" = 1, "sugar" = 2) + foodtype = JUNKFOOD | SUGAR + /obj/item/reagent_containers/food/snacks/chococoin name = "chocolate coin" desc = "A completely edible but nonflippable festive coin." diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 806fbc1f90..efd877b9dc 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -158,10 +158,11 @@ for (var/I in src) var/atom/movable/O = I if (!QDELETED(O)) - if (listofitems[O.name]) - listofitems[O.name]["amount"]++ + var/md5name = md5(O.name) // This needs to happen because of a bug in a TGUI component, https://github.com/ractivejs/ractive/issues/744 + if (listofitems[md5name]) // which is fixed in a version we cannot use due to ie8 incompatibility + listofitems[md5name]["amount"]++ // The good news is, #30519 made smartfridge UIs non-auto-updating else - listofitems[O.name] = list("name" = O.name, "type" = O.type, "amount" = 1) + listofitems[md5name] = list("name" = O.name, "type" = O.type, "amount" = 1) sortList(listofitems) .["contents"] = listofitems diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm index 42e0c0c1c2..d7beebf461 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm @@ -176,6 +176,26 @@ ) result = /obj/item/reagent_containers/food/snacks/burger/purple subcategory = CAT_BURGER + +/datum/crafting_recipe/food/blackburger + name = "Black burger" + reqs = list( + /obj/item/reagent_containers/food/snacks/meat/steak/plain = 1, + /obj/item/toy/crayon/black = 1, + /obj/item/reagent_containers/food/snacks/bun = 1 + ) + result = /obj/item/reagent_containers/food/snacks/burger/black + subcategory = CAT_BURGER + +/datum/crafting_recipe/food/whiteburger + name = "White burger" + reqs = list( + /obj/item/reagent_containers/food/snacks/meat/steak/plain = 1, + /obj/item/toy/crayon/white = 1, + /obj/item/reagent_containers/food/snacks/bun = 1 + ) + result = /obj/item/reagent_containers/food/snacks/burger/white + subcategory = CAT_BURGER /datum/crafting_recipe/food/spellburger name = "Spell burger" diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index b460e62f1e..40bb994e10 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -12,6 +12,16 @@ result = /obj/item/reagent_containers/food/snacks/candiedapple subcategory = CAT_MISCFOOD +/datum/crafting_recipe/food/spiderlollipop + name = "Spider Lollipop" + reqs = list(/obj/item/stack/rods = 1, + /datum/reagent/consumable/sugar = 5, + /datum/reagent/water = 5, + /obj/item/reagent_containers/food/snacks/spiderling = 1 + ) + result = /obj/item/reagent_containers/food/snacks/spiderlollipop + subcategory = CAT_MISCFOOD + /datum/crafting_recipe/food/chococoin name = "Choco coin" reqs = list( diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 2415f08d6d..71ff26a17e 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -126,7 +126,7 @@ /obj/item/toy/foamblade, /obj/item/toy/prize/ripley, /obj/item/toy/prize/honk, - /obj/item/toy/carpplushie, + /obj/item/toy/plush/carpplushie, /obj/item/toy/redbutton, /obj/item/clothing/head/collectable/rabbitears) new won(where) diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index b8fe3e777a..c8e9235646 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -485,7 +485,6 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and begin_day += 31 begin_month-- //begins in march, ends in april -// to_chat(world, "Easter calculates to be on [begin_day] of [begin_month] ([days_early] early) to [end_day] of [end_month] ([days_extra] extra) for 20[yy]") return ..() /datum/holiday/easter/celebrate() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 52f5e4e138..4f5f9cbaf7 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -622,7 +622,7 @@ adjustHealth(round(salt * 0.25)) if (myseed) myseed.adjust_production(-round(salt/100)-prob(salt%100)) - myseed.adjust_potency(round(salt*0.50)) + myseed.adjust_potency(round(salt*0.5)) // Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer if(S.has_reagent("ash", 1)) adjustHealth(round(S.get_reagent_amount("ash") * 0.25)) diff --git a/code/modules/jobs/job_exp.dm.rej b/code/modules/jobs/job_exp.dm.rej deleted file mode 100644 index 128a479acd..0000000000 --- a/code/modules/jobs/job_exp.dm.rej +++ /dev/null @@ -1,108 +0,0 @@ -diff a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm (rejected hunks) -@@ -140,15 +140,12 @@ GLOBAL_PROTECT(exp_to_update) - //resets a client's exp to what was in the db. - /client/proc/set_exp_from_db() - if(!config.use_exp_tracking) -- return -+ return -1 - if(!SSdbcore.Connect()) - return -1 - var/datum/DBQuery/exp_read = SSdbcore.NewQuery("SELECT job, minutes FROM [format_table_name("role_time")] WHERE ckey = '[sanitizeSQL(ckey)]'") - if(!exp_read.Execute()) -- var/err = exp_read.ErrorMsg() -- log_sql("SQL ERROR during exp_update_client read. Error : \[[err]\]\n") -- message_admins("SQL ERROR during exp_update_client read. Error : \[[err]\]\n") -- return -+ return -1 - var/list/play_records = list() - while(exp_read.NextRow()) - play_records[exp_read.item[1]] = text2num(exp_read.item[2]) -@@ -172,42 +169,24 @@ GLOBAL_PROTECT(exp_to_update) - if(!set_db_player_flags()) - return -1 - -- var/datum/DBQuery/flag_read = SSdbcore.NewQuery("SELECT flags FROM [format_table_name("player")] WHERE ckey='[sanitizeSQL(ckey)]'") -- -- if(!flag_read.Execute()) -- var/err = flag_read.ErrorMsg() -- log_sql("SQL ERROR during player flags read. Error : \[[err]\]\n") -- message_admins("SQL ERROR during player flags read. Error : \[[err]\]\n") -- return -- -- var/playerflags = null -- if(flag_read.NextRow()) -- playerflags = text2num(flag_read.item[1]) -- -- if((playerflags & newflag) && !state) -+ if((prefs.db_flags & newflag) && !state) - prefs.db_flags &= ~newflag - else - prefs.db_flags |= newflag - - var/datum/DBQuery/flag_update = SSdbcore.NewQuery("UPDATE [format_table_name("player")] SET flags = '[prefs.db_flags]' WHERE ckey='[sanitizeSQL(ckey)]'") - -- - if(!flag_update.Execute()) -- var/err = flag_update.ErrorMsg() -- log_sql("SQL ERROR during exp_exempt update. Error : \[[err]\]\n") -- message_admins("SQL ERROR during exp_exempt update. Error : \[[err]\]\n") -- return -+ return -1 -+ - - /client/proc/update_exp_list(minutes, announce_changes = FALSE) - if(!config.use_exp_tracking) -- return -+ return -1 - if(!SSdbcore.Connect()) - return -1 - var/datum/DBQuery/exp_read = SSdbcore.NewQuery("SELECT job, minutes FROM [format_table_name("role_time")] WHERE ckey = '[sanitizeSQL(ckey)]'") - if(!exp_read.Execute()) -- var/err = exp_read.ErrorMsg() -- log_sql("SQL ERROR during exp_update_client read. Error : \[[err]\]\n") -- message_admins("SQL ERROR during exp_update_client read. Error : \[[err]\]\n") - return -1 - var/list/play_records = list() - while(exp_read.NextRow()) -@@ -241,9 +220,13 @@ GLOBAL_PROTECT(exp_to_update) - if(announce_changes) - to_chat(mob,"You got: [minutes] [role] EXP!") - if(mob.mind.special_role && !mob.mind.var_edited) -- play_records[mob.mind.special_role] += minutes -+ var/trackedrole = mob.mind.special_role -+ var/gangrole = lookforgangrole(mob.mind.special_role) -+ if(gangrole) -+ trackedrole = gangrole -+ play_records[trackedrole] += minutes - if(announce_changes) -- to_chat(src,"You got: [minutes] [mob.mind.special_role] EXP!") -+ to_chat(src,"You got: [minutes] [trackedrole] EXP!") - if(!rolefound) - play_records["Unknown"] += minutes - else -@@ -276,11 +259,21 @@ GLOBAL_PROTECT(exp_to_update) - var/datum/DBQuery/flags_read = SSdbcore.NewQuery("SELECT flags FROM [format_table_name("player")] WHERE ckey='[ckey]'") - - if(!flags_read.Execute()) -- var/err = flags_read.ErrorMsg() -- log_sql("SQL ERROR during player flags read. Error : \[[err]\]\n") -- message_admins("SQL ERROR during player flags read. Error : \[[err]\]\n") - return FALSE - - if(flags_read.NextRow()) - prefs.db_flags = text2num(flags_read.item[1]) -+ else if(isnull(prefs.db_flags)) -+ prefs.db_flags = 0 //This PROBABLY won't happen, but better safe than sorry. - return TRUE -+ -+//Since each gang is tracked as a different antag type, records need to be generalized or you get up to 57 different possible records -+/proc/lookforgangrole(rolecheck) -+ if(findtext(rolecheck,"Gangster")) -+ return "Gangster" -+ else if(findtext(rolecheck,"Gang Boss")) -+ return "Gang Boss" -+ else if(findtext(rolecheck,"Gang Lieutenant")) -+ return "Gang Lieutenant" -+ else -+ return FALSE -\ No newline at end of file diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index 84623873e8..67a705455c 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -1,31 +1,31 @@ -//Warden and regular officers add this result to their get_access() -/datum/job/proc/check_config_for_sec_maint() - if(config.jobs_have_maint_access & SECURITY_HAS_MAINT_ACCESS) +//Warden and regular officers add this result to their get_access() +/datum/job/proc/check_config_for_sec_maint() + if(config.jobs_have_maint_access & SECURITY_HAS_MAINT_ACCESS) return list(ACCESS_MAINT_TUNNELS) - return list() - -/* -Head of Security -*/ -/datum/job/hos - title = "Head of Security" - flag = HOS - department_head = list("Captain") - department_flag = ENGSEC - head_announce = list("Security") - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#ffdddd" - req_admin_notify = 1 - minimal_player_age = 14 + return list() + +/* +Head of Security +*/ +/datum/job/hos + title = "Head of Security" + flag = HOS + department_head = list("Captain") + department_flag = ENGSEC + head_announce = list("Security") + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the captain" + selection_color = "#ffdddd" + req_admin_notify = 1 + minimal_player_age = 14 exp_requirements = 300 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_SECURITY - - outfit = /datum/outfit/job/hos - + + outfit = /datum/outfit/job/hos + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, @@ -34,284 +34,284 @@ Head of Security ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS) - -/datum/outfit/job/hos - name = "Head of Security" - jobtype = /datum/job/hos - - id = /obj/item/card/id/silver - belt = /obj/item/device/pda/heads/hos - ears = /obj/item/device/radio/headset/heads/hos/alt - uniform = /obj/item/clothing/under/rank/head_of_security - shoes = /obj/item/clothing/shoes/jackboots - suit = /obj/item/clothing/suit/armor/hos/trenchcoat - gloves = /obj/item/clothing/gloves/color/black/hos - head = /obj/item/clothing/head/HoS/beret - glasses = /obj/item/clothing/glasses/hud/security/sunglasses - suit_store = /obj/item/gun/energy/e_gun - r_pocket = /obj/item/device/assembly/flash/handheld - l_pocket = /obj/item/restraints/handcuffs - backpack_contents = list(/obj/item/melee/baton/loaded=1) - - backpack = /obj/item/storage/backpack/security - satchel = /obj/item/storage/backpack/satchel/sec - duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security - - implants = list(/obj/item/implant/mindshield) - -/* -Warden -*/ -/datum/job/warden - title = "Warden" - flag = WARDEN - department_head = list("Head of Security") - department_flag = ENGSEC - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of security" - selection_color = "#ffeeee" - minimal_player_age = 7 + +/datum/outfit/job/hos + name = "Head of Security" + jobtype = /datum/job/hos + + id = /obj/item/card/id/silver + belt = /obj/item/device/pda/heads/hos + ears = /obj/item/device/radio/headset/heads/hos/alt + uniform = /obj/item/clothing/under/rank/head_of_security + shoes = /obj/item/clothing/shoes/jackboots + suit = /obj/item/clothing/suit/armor/hos/trenchcoat + gloves = /obj/item/clothing/gloves/color/black/hos + head = /obj/item/clothing/head/HoS/beret + glasses = /obj/item/clothing/glasses/hud/security/sunglasses + suit_store = /obj/item/gun/energy/e_gun + r_pocket = /obj/item/device/assembly/flash/handheld + l_pocket = /obj/item/restraints/handcuffs + backpack_contents = list(/obj/item/melee/baton/loaded=1) + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/sec + box = /obj/item/storage/box/security + + implants = list(/obj/item/implant/mindshield) + +/* +Warden +*/ +/datum/job/warden + title = "Warden" + flag = WARDEN + department_head = list("Head of Security") + department_flag = ENGSEC + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the head of security" + selection_color = "#ffeeee" + minimal_player_age = 7 exp_requirements = 300 exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/warden - + + outfit = /datum/outfit/job/warden + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS) //SEE /DATUM/JOB/WARDEN/GET_ACCESS() - -/datum/job/warden/get_access() - var/list/L = list() - L = ..() | check_config_for_sec_maint() - return L - -/datum/outfit/job/warden - name = "Warden" - jobtype = /datum/job/warden - - belt = /obj/item/device/pda/warden - ears = /obj/item/device/radio/headset/headset_sec/alt - uniform = /obj/item/clothing/under/rank/warden - shoes = /obj/item/clothing/shoes/jackboots - suit = /obj/item/clothing/suit/armor/vest/warden/alt - gloves = /obj/item/clothing/gloves/color/black - head = /obj/item/clothing/head/warden - glasses = /obj/item/clothing/glasses/hud/security/sunglasses - r_pocket = /obj/item/device/assembly/flash/handheld - l_pocket = /obj/item/restraints/handcuffs - suit_store = /obj/item/gun/energy/e_gun/advtaser - backpack_contents = list(/obj/item/melee/baton/loaded=1) - - backpack = /obj/item/storage/backpack/security - satchel = /obj/item/storage/backpack/satchel/sec - duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security - - implants = list(/obj/item/implant/mindshield) - - -/* -Detective -*/ -/datum/job/detective - title = "Detective" - flag = DETECTIVE - department_head = list("Head of Security") - department_flag = ENGSEC - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of security" - selection_color = "#ffeeee" - minimal_player_age = 7 + +/datum/job/warden/get_access() + var/list/L = list() + L = ..() | check_config_for_sec_maint() + return L + +/datum/outfit/job/warden + name = "Warden" + jobtype = /datum/job/warden + + belt = /obj/item/device/pda/warden + ears = /obj/item/device/radio/headset/headset_sec/alt + uniform = /obj/item/clothing/under/rank/warden + shoes = /obj/item/clothing/shoes/jackboots + suit = /obj/item/clothing/suit/armor/vest/warden/alt + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/warden + glasses = /obj/item/clothing/glasses/hud/security/sunglasses + r_pocket = /obj/item/device/assembly/flash/handheld + l_pocket = /obj/item/restraints/handcuffs + suit_store = /obj/item/gun/energy/e_gun/advtaser + backpack_contents = list(/obj/item/melee/baton/loaded=1) + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/sec + box = /obj/item/storage/box/security + + implants = list(/obj/item/implant/mindshield) + + +/* +Detective +*/ +/datum/job/detective + title = "Detective" + flag = DETECTIVE + department_head = list("Head of Security") + department_flag = ENGSEC + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the head of security" + selection_color = "#ffeeee" + minimal_player_age = 7 exp_requirements = 300 exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/detective - + + outfit = /datum/outfit/job/detective + access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS) minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS) - -/datum/outfit/job/detective - name = "Detective" - jobtype = /datum/job/detective - - belt = /obj/item/device/pda/detective - ears = /obj/item/device/radio/headset/headset_sec/alt - uniform = /obj/item/clothing/under/rank/det - shoes = /obj/item/clothing/shoes/sneakers/brown - suit = /obj/item/clothing/suit/det_suit - gloves = /obj/item/clothing/gloves/color/black - head = /obj/item/clothing/head/fedora/det_hat - l_pocket = /obj/item/toy/crayon/white - r_pocket = /obj/item/lighter - backpack_contents = list(/obj/item/storage/box/evidence=1,\ - /obj/item/device/detective_scanner=1,\ - /obj/item/melee/classic_baton=1) - mask = /obj/item/clothing/mask/cigarette - - implants = list(/obj/item/implant/mindshield) - -/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - var/obj/item/clothing/mask/cigarette/cig = H.wear_mask - cig.light("") - - if(visualsOnly) - return - -/* -Security Officer -*/ -/datum/job/officer - title = "Security Officer" - flag = OFFICER - department_head = list("Head of Security") - department_flag = ENGSEC - faction = "Station" - total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() - spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() - supervisors = "the head of security, and the head of your assigned department (if applicable)" - selection_color = "#ffeeee" - minimal_player_age = 7 + +/datum/outfit/job/detective + name = "Detective" + jobtype = /datum/job/detective + + belt = /obj/item/device/pda/detective + ears = /obj/item/device/radio/headset/headset_sec/alt + uniform = /obj/item/clothing/under/rank/det + shoes = /obj/item/clothing/shoes/sneakers/brown + suit = /obj/item/clothing/suit/det_suit + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/fedora/det_hat + l_pocket = /obj/item/toy/crayon/white + r_pocket = /obj/item/lighter + backpack_contents = list(/obj/item/storage/box/evidence=1,\ + /obj/item/device/detective_scanner=1,\ + /obj/item/melee/classic_baton=1) + mask = /obj/item/clothing/mask/cigarette + + implants = list(/obj/item/implant/mindshield) + +/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + var/obj/item/clothing/mask/cigarette/cig = H.wear_mask + cig.light("") + + if(visualsOnly) + return + +/* +Security Officer +*/ +/datum/job/officer + title = "Security Officer" + flag = OFFICER + department_head = list("Head of Security") + department_flag = ENGSEC + faction = "Station" + total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() + spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() + supervisors = "the head of security, and the head of your assigned department (if applicable)" + selection_color = "#ffeeee" + minimal_player_age = 7 exp_requirements = 300 exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/security - + + outfit = /datum/outfit/job/security + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS() - - -/datum/job/officer/get_access() - var/list/L = list() - L |= ..() | check_config_for_sec_maint() - return L - -GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY)) - -/datum/job/officer/after_spawn(mob/living/carbon/human/H, mob/M) - // Assign department security - var/department - if(M && M.client && M.client.prefs) - department = M.client.prefs.prefered_security_department - if(!LAZYLEN(GLOB.available_depts) || department == "None") - return - else if(department in GLOB.available_depts) - LAZYREMOVE(GLOB.available_depts, department) - else - department = pick_n_take(GLOB.available_depts) - var/ears = null - var/accessory = null - var/list/dep_access = null - var/destination = null - var/spawn_point = null - switch(department) - if(SEC_DEPT_SUPPLY) - ears = /obj/item/device/radio/headset/headset_sec/alt/department/supply + + +/datum/job/officer/get_access() + var/list/L = list() + L |= ..() | check_config_for_sec_maint() + return L + +GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY)) + +/datum/job/officer/after_spawn(mob/living/carbon/human/H, mob/M) + // Assign department security + var/department + if(M && M.client && M.client.prefs) + department = M.client.prefs.prefered_security_department + if(!LAZYLEN(GLOB.available_depts) || department == "None") + return + else if(department in GLOB.available_depts) + LAZYREMOVE(GLOB.available_depts, department) + else + department = pick_n_take(GLOB.available_depts) + var/ears = null + var/accessory = null + var/list/dep_access = null + var/destination = null + var/spawn_point = null + switch(department) + if(SEC_DEPT_SUPPLY) + ears = /obj/item/device/radio/headset/headset_sec/alt/department/supply dep_access = list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION) - destination = /area/security/checkpoint/supply - spawn_point = locate(/obj/effect/landmark/start/depsec/supply) in GLOB.department_security_spawns - accessory = /obj/item/clothing/accessory/armband/cargo - if(SEC_DEPT_ENGINEERING) - ears = /obj/item/device/radio/headset/headset_sec/alt/department/engi + destination = /area/security/checkpoint/supply + spawn_point = locate(/obj/effect/landmark/start/depsec/supply) in GLOB.department_security_spawns + accessory = /obj/item/clothing/accessory/armband/cargo + if(SEC_DEPT_ENGINEERING) + ears = /obj/item/device/radio/headset/headset_sec/alt/department/engi dep_access = list(ACCESS_CONSTRUCTION, ACCESS_ENGINE) - destination = /area/security/checkpoint/engineering - spawn_point = locate(/obj/effect/landmark/start/depsec/engineering) in GLOB.department_security_spawns - accessory = /obj/item/clothing/accessory/armband/engine - if(SEC_DEPT_MEDICAL) - ears = /obj/item/device/radio/headset/headset_sec/alt/department/med + destination = /area/security/checkpoint/engineering + spawn_point = locate(/obj/effect/landmark/start/depsec/engineering) in GLOB.department_security_spawns + accessory = /obj/item/clothing/accessory/armband/engine + if(SEC_DEPT_MEDICAL) + ears = /obj/item/device/radio/headset/headset_sec/alt/department/med dep_access = list(ACCESS_MEDICAL) - destination = /area/security/checkpoint/medical - spawn_point = locate(/obj/effect/landmark/start/depsec/medical) in GLOB.department_security_spawns - accessory = /obj/item/clothing/accessory/armband/medblue - if(SEC_DEPT_SCIENCE) - ears = /obj/item/device/radio/headset/headset_sec/alt/department/sci + destination = /area/security/checkpoint/medical + spawn_point = locate(/obj/effect/landmark/start/depsec/medical) in GLOB.department_security_spawns + accessory = /obj/item/clothing/accessory/armband/medblue + if(SEC_DEPT_SCIENCE) + ears = /obj/item/device/radio/headset/headset_sec/alt/department/sci dep_access = list(ACCESS_RESEARCH) - destination = /area/security/checkpoint/science - spawn_point = locate(/obj/effect/landmark/start/depsec/science) in GLOB.department_security_spawns - accessory = /obj/item/clothing/accessory/armband/science - - if(accessory) - var/obj/item/clothing/under/U = H.w_uniform - U.attach_accessory(new accessory) - if(ears) - if(H.ears) - qdel(H.ears) - H.equip_to_slot_or_del(new ears(H),slot_ears) - - var/obj/item/card/id/W = H.wear_id - W.access |= dep_access - - var/teleport = 0 - if(!config.sec_start_brig) - if(destination || spawn_point) - teleport = 1 - if(teleport) - var/turf/T - if(spawn_point) - T = get_turf(spawn_point) - H.Move(T) - else - var/safety = 0 - while(safety < 25) - T = safepick(get_area_turfs(destination)) - if(T && !H.Move(T)) - safety += 1 - continue - else - break - if(department) - to_chat(M, "You have been assigned to [department]!") - else - to_chat(M, "You have not been assigned to any department. Patrol the halls and help where needed.") - - - -/datum/outfit/job/security - name = "Security Officer" - jobtype = /datum/job/officer - - belt = /obj/item/device/pda/security - ears = /obj/item/device/radio/headset/headset_sec/alt - uniform = /obj/item/clothing/under/rank/security - gloves = /obj/item/clothing/gloves/color/black - head = /obj/item/clothing/head/helmet/sec - suit = /obj/item/clothing/suit/armor/vest/alt - shoes = /obj/item/clothing/shoes/jackboots - l_pocket = /obj/item/restraints/handcuffs - r_pocket = /obj/item/device/assembly/flash/handheld - suit_store = /obj/item/gun/energy/e_gun/advtaser - backpack_contents = list(/obj/item/melee/baton/loaded=1) - - backpack = /obj/item/storage/backpack/security - satchel = /obj/item/storage/backpack/satchel/sec - duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security - - implants = list(/obj/item/implant/mindshield) - - -/obj/item/device/radio/headset/headset_sec/alt/department/Initialize() - wires = new/datum/wires/radio(src) - secure_radio_connections = new - recalculateChannels() - ..() - -/obj/item/device/radio/headset/headset_sec/alt/department/engi - keyslot = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_eng - -/obj/item/device/radio/headset/headset_sec/alt/department/supply - keyslot = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_cargo - -/obj/item/device/radio/headset/headset_sec/alt/department/med - keyslot = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_med - -/obj/item/device/radio/headset/headset_sec/alt/department/sci - keyslot = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_sci + destination = /area/security/checkpoint/science + spawn_point = locate(/obj/effect/landmark/start/depsec/science) in GLOB.department_security_spawns + accessory = /obj/item/clothing/accessory/armband/science + + if(accessory) + var/obj/item/clothing/under/U = H.w_uniform + U.attach_accessory(new accessory) + if(ears) + if(H.ears) + qdel(H.ears) + H.equip_to_slot_or_del(new ears(H),slot_ears) + + var/obj/item/card/id/W = H.wear_id + W.access |= dep_access + + var/teleport = 0 + if(!config.sec_start_brig) + if(destination || spawn_point) + teleport = 1 + if(teleport) + var/turf/T + if(spawn_point) + T = get_turf(spawn_point) + H.Move(T) + else + var/safety = 0 + while(safety < 25) + T = safepick(get_area_turfs(destination)) + if(T && !H.Move(T)) + safety += 1 + continue + else + break + if(department) + to_chat(M, "You have been assigned to [department]!") + else + to_chat(M, "You have not been assigned to any department. Patrol the halls and help where needed.") + + + +/datum/outfit/job/security + name = "Security Officer" + jobtype = /datum/job/officer + + belt = /obj/item/device/pda/security + ears = /obj/item/device/radio/headset/headset_sec/alt + uniform = /obj/item/clothing/under/rank/security + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/helmet/sec + suit = /obj/item/clothing/suit/armor/vest/alt + shoes = /obj/item/clothing/shoes/jackboots + l_pocket = /obj/item/restraints/handcuffs + r_pocket = /obj/item/device/assembly/flash/handheld + suit_store = /obj/item/gun/energy/e_gun/advtaser + backpack_contents = list(/obj/item/melee/baton/loaded=1) + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/sec + box = /obj/item/storage/box/security + + implants = list(/obj/item/implant/mindshield) + + +/obj/item/device/radio/headset/headset_sec/alt/department/Initialize() + . = ..() + wires = new/datum/wires/radio(src) + secure_radio_connections = new + recalculateChannels() + +/obj/item/device/radio/headset/headset_sec/alt/department/engi + keyslot = new /obj/item/device/encryptionkey/headset_sec + keyslot2 = new /obj/item/device/encryptionkey/headset_eng + +/obj/item/device/radio/headset/headset_sec/alt/department/supply + keyslot = new /obj/item/device/encryptionkey/headset_sec + keyslot2 = new /obj/item/device/encryptionkey/headset_cargo + +/obj/item/device/radio/headset/headset_sec/alt/department/med + keyslot = new /obj/item/device/encryptionkey/headset_sec + keyslot2 = new /obj/item/device/encryptionkey/headset_med + +/obj/item/device/radio/headset/headset_sec/alt/department/sci + keyslot = new /obj/item/device/encryptionkey/headset_sec + keyslot2 = new /obj/item/device/encryptionkey/headset_sci diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 11eca212ae..17d626b3a0 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -14,8 +14,8 @@ name = "bookcase" icon = 'icons/obj/library.dmi' icon_state = "bookempty" - anchored = FALSE - density = TRUE + anchored = FALSE + density = TRUE opacity = 0 resistance_flags = FLAMMABLE max_integrity = 200 @@ -25,12 +25,12 @@ /obj/structure/bookcase/Initialize(mapload) - ..() + . = ..() if(!mapload) return state = 2 icon_state = "book-0" - anchored = TRUE + anchored = TRUE for(var/obj/item/I in loc) if(istype(I, /obj/item/book)) I.loc = src @@ -44,7 +44,7 @@ playsound(loc, I.usesound, 100, 1) if(do_after(user, 20*I.toolspeed, target = src)) to_chat(user, "You wrench the frame into place.") - anchored = TRUE + anchored = TRUE state = 1 if(istype(I, /obj/item/crowbar)) playsound(loc, I.usesound, 100, 1) @@ -63,7 +63,7 @@ if(istype(I, /obj/item/wrench)) playsound(loc, I.usesound, 100, 1) to_chat(user, "You unwrench the frame.") - anchored = FALSE + anchored = FALSE state = 0 if(2) @@ -317,4 +317,4 @@ to_chat(user, "Computer has been associated with this unit.") else to_chat(user, "No associated computer found. Only local scans will function properly.") - to_chat(user, "\n") + to_chat(user, "\n") \ No newline at end of file diff --git a/code/modules/library/random_books.dm b/code/modules/library/random_books.dm index 3c44dc28ea..769c9ac66b 100644 --- a/code/modules/library/random_books.dm +++ b/code/modules/library/random_books.dm @@ -1,18 +1,18 @@ /obj/item/book/manual/random/Initialize() - . = ..() + ..() var/static/banned_books = list(/obj/item/book/manual/random, /obj/item/book/manual/nuclear, /obj/item/book/manual/wiki) var/newtype = pick(subtypesof(/obj/item/book/manual) - banned_books) new newtype(loc) - qdel(src) + return INITIALIZE_HINT_QDEL /obj/item/book/random var/amount = 1 var/category = null /obj/item/book/random/Initialize() - . = ..() + ..() create_random_books(amount, src.loc, TRUE, category) - qdel(src) + return INITIALIZE_HINT_QDEL /obj/item/book/random/triple amount = 3 diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 10512aa5a2..4db42b6933 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -83,7 +83,7 @@ new /obj/item/clothing/suit/hooded/ian_costume(src) if(67 to 68) for(var/i in 1 to rand(4, 7)) - var /newitem = pick(subtypesof(/obj/item/stock_parts) - /obj/item/stock_parts/subspace) + var/newitem = pick(subtypesof(/obj/item/stock_parts) - /obj/item/stock_parts/subspace) new newitem(src) if(69 to 70) for(var/i in 1 to 5) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 89e9d6fd10..c02737a2fd 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -292,7 +292,7 @@ //ash drake /obj/item/crusher_trophy/tail_spike - desc = "A spike taken from a ash drake's tail. Suitable as a trophy for a kinetic crusher." + desc = "A spike taken from an ash drake's tail. Suitable as a trophy for a kinetic crusher." denied_type = /obj/item/crusher_trophy/tail_spike bonus_value = 5 diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 3562314458..58c971024f 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -11,7 +11,7 @@ desc = "It's watching you suspiciously." /obj/structure/closet/crate/necropolis/tendril/PopulateContents() - var/loot = rand(1,28) + var/loot = rand(1,27) switch(loot) if(1) new /obj/item/device/shared_storage/red(src) @@ -28,7 +28,10 @@ if(7) new /obj/item/pickaxe/diamond(src) if(8) - new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src) + if(prob(50)) + new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src) + else + new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) if(9) new /obj/item/organ/brain/alien(src) if(10) @@ -38,7 +41,7 @@ if(12) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker(src) if(13) - new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) + new /obj/item/jacobs_ladder(src) if(14) new /obj/item/nullrod/scythe/talking(src) if(15) @@ -46,7 +49,10 @@ if(16) new /obj/item/guardiancreator(src) if(17) - new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) + if(prob(50)) + new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) + else + new /obj/item/disk/design_disk/modkit_disc/bounty(src) if(18) new /obj/item/device/warp_cube/red(src) if(19) @@ -69,8 +75,7 @@ if(27) new /obj/item/borg/upgrade/modkit/lifesteal(src) new /obj/item/bedsheet/cult(src) - if(28) - new /obj/item/disk/design_disk/modkit_disc/bounty(src) + //KA modkit design discs /obj/item/disk/design_disk/modkit_disc @@ -331,7 +336,7 @@ if(cooldown < world.time) SSblackbox.add_details("immortality_talisman","Activated") // usage cooldown = world.time + 600 - user.visible_message("[user] vanishes from reality, leaving a a hole in [user.p_their()] place!") + user.visible_message("[user] vanishes from reality, leaving a hole in [user.p_their()] place!") var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc)) Z.name = "hole in reality" Z.desc = "It's shaped an awful lot like [user.name]." @@ -563,7 +568,28 @@ ..() +/obj/item/jacobs_ladder + name = "jacob's ladder" + desc = "A celestial ladder that violates the laws of physics." + icon = 'icons/obj/structures.dmi' + icon_state = "ladder00" +/obj/item/jacobs_ladder/attack_self(mob/user) + var/turf/T = get_turf(src) + var/ladder_x = T.x + var/ladder_y = T.y + to_chat(user, "You unfold the ladder. It extends much farther than you were expecting.") + for(var/i in 1 to world.maxz) + if(i == ZLEVEL_CENTCOM || i == ZLEVEL_TRANSIT) + continue + var/turf/T2 = locate(ladder_x, ladder_y, i) + new /obj/structure/ladder/unbreakable/jacob(T2) + qdel(src) + +/obj/structure/ladder/unbreakable/jacob + name = "jacob's ladder" + desc = "An indestructible celestial ladder that violates the laws of physics." + auto_connect = TRUE ///Bosses @@ -1263,3 +1289,5 @@ for(var/t in RANGE_TURFS(1, T)) var/obj/effect/temp_visual/hierophant/blast/B = new(t, user, friendly_fire_check) B.damage = 15 //keeps monster damage boost due to lower damage + + diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 8428036860..0927a0ba88 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -66,7 +66,6 @@ density = TRUE anchored = TRUE var/obj/machinery/mineral/CONSOLE = null - var/datum/material_container/materials var/on = FALSE var/selected_material = MAT_METAL var/selected_alloy = null @@ -75,12 +74,11 @@ /obj/machinery/mineral/processing_unit/Initialize() . = ..() proximity_monitor = new(src, 1) - materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY) + AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), INFINITY) files = new /datum/research/smelter(src) /obj/machinery/mineral/processing_unit/Destroy() CONSOLE = null - QDEL_NULL(materials) QDEL_NULL(files) return ..() @@ -89,6 +87,7 @@ process_ore(AM) /obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/ore/O) + GET_COMPONENT(materials, /datum/component/material_container) var/material_amount = materials.get_item_material_amount(O) if(!materials.has_space(material_amount)) unload_mineral(O) @@ -100,6 +99,7 @@ /obj/machinery/mineral/processing_unit/proc/get_machine_data() var/dat = "Smelter control console

" + GET_COMPONENT(materials, /datum/component/material_container) for(var/mat_id in materials.materials) var/datum/material/M = materials.materials[mat_id] dat += "[M.name]: [M.amount] cm³" @@ -165,6 +165,7 @@ continue*/ /obj/machinery/mineral/processing_unit/proc/smelt_ore() + GET_COMPONENT(materials, /datum/component/material_container) var/datum/material/mat = materials.materials[selected_material] if(mat) var/sheets_to_remove = (mat.amount >= (MINERAL_MATERIAL_AMOUNT * SMELT_AMOUNT) ) ? SMELT_AMOUNT : round(mat.amount / MINERAL_MATERIAL_AMOUNT) @@ -187,6 +188,7 @@ on = FALSE return + GET_COMPONENT(materials, /datum/component/material_container) materials.use_amount(alloy.materials, amount) generate_mineral(alloy.build_path) @@ -197,6 +199,7 @@ var/build_amount = SMELT_AMOUNT + GET_COMPONENT(materials, /datum/component/material_container) for(var/mat_id in D.materials) var/M = D.materials[mat_id] @@ -214,6 +217,7 @@ unload_mineral(O) /obj/machinery/mineral/processing_unit/on_deconstruction() + GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_all() ..() diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index abead3ab9a..38e02474f4 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -22,17 +22,15 @@ var/list/ore_values = list(MAT_GLASS = 1, MAT_METAL = 1, MAT_PLASMA = 15, MAT_SILVER = 16, MAT_GOLD = 18, MAT_TITANIUM = 30, MAT_URANIUM = 30, MAT_DIAMOND = 50, MAT_BLUESPACE = 50, MAT_BANANIUM = 60) var/message_sent = FALSE var/list/ore_buffer = list() - var/datum/material_container/materials var/datum/research/files var/obj/item/disk/design_disk/inserted_disk /obj/machinery/mineral/ore_redemption/Initialize() . = ..() - materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY) + AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY) files = new /datum/research/smelter(src) /obj/machinery/mineral/ore_redemption/Destroy() - QDEL_NULL(materials) QDEL_NULL(files) return ..() @@ -57,6 +55,7 @@ if(O && O.refined_type) points += O.points * point_upgrade + GET_COMPONENT(materials, /datum/component/material_container) var/material_amount = materials.get_item_material_amount(O) if(!material_amount) @@ -75,6 +74,7 @@ var/build_amount = 0 + GET_COMPONENT(materials, /datum/component/material_container) for(var/mat_id in D.materials) var/M = D.materials[mat_id] var/datum/material/redemption_mat = materials.materials[mat_id] @@ -110,6 +110,7 @@ var/has_minerals = FALSE + GET_COMPONENT(materials, /datum/component/material_container) for(var/mat_id in materials.materials) var/datum/material/M = materials.materials[mat_id] var/mineral_amount = M.amount / MINERAL_MATERIAL_AMOUNT @@ -148,6 +149,7 @@ /obj/machinery/mineral/ore_redemption/attackby(obj/item/W, mob/user, params) if(exchange_parts(user, W)) return + GET_COMPONENT(materials, /datum/component/material_container) if(default_pry_open(W)) materials.retrieve_all() return @@ -181,16 +183,10 @@ if(user.transferItemToLoc(W, src)) inserted_disk = W return TRUE - - if(istype(W, /obj/item/stack/sheet)) - var/obj/item/stack/sheet/S = W - var/inserted = materials.insert_stack(S, S.amount) - to_chat(user, "You add [inserted] [S] sheets to \the [src].") - return - return ..() /obj/machinery/mineral/ore_redemption/on_deconstruction() + GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_all() ..() @@ -213,6 +209,7 @@ data["claimedPoints"] = inserted_id.mining_points data["materials"] = list() + GET_COMPONENT(materials, /datum/component/material_container) for(var/mat_id in materials.materials) var/datum/material/M = materials.materials[mat_id] var/sheet_amount = M.amount ? M.amount / MINERAL_MATERIAL_AMOUNT : "0" @@ -236,6 +233,7 @@ /obj/machinery/mineral/ore_redemption/ui_act(action, params) if(..()) return + GET_COMPONENT(materials, /datum/component/material_container) switch(action) if("Eject") if(!inserted_id) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 15d05d37fe..38381ae9c5 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -67,6 +67,7 @@ possible_destinations = "mining_home;mining_away;landing_zone_dock;mining_public" no_destination_swap = 1 var/global/list/dumb_rev_heads = list() + req_access = list(ACCESS_MINING) // should slow the ashwalkers down. /obj/machinery/computer/shuttle/mining/attack_hand(mob/user) if((user.z in GLOB.station_z_levels) && user.mind && (user.mind in SSticker.mode.head_revolutionaries) && !(user.mind in dumb_rev_heads)) diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index e48db7c6fd..1a4e4c5ed1 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -1,107 +1,103 @@ -/**********************Mint**************************/ - - -/obj/machinery/mineral/mint - name = "coin press" - icon = 'icons/obj/economy.dmi' - icon_state = "coinpress0" +/**********************Mint**************************/ + + +/obj/machinery/mineral/mint + name = "coin press" + icon = 'icons/obj/economy.dmi' + icon_state = "coinpress0" density = TRUE anchored = TRUE - var/datum/material_container/materials - var/newCoins = 0 //how many coins the machine made in it's last load + var/newCoins = 0 //how many coins the machine made in it's last load var/processing = FALSE - var/chosen = MAT_METAL //which material will be used to make coins - var/coinsToProduce = 10 - speed_process = 1 - - + var/chosen = MAT_METAL //which material will be used to make coins + var/coinsToProduce = 10 + speed_process = 1 + + /obj/machinery/mineral/mint/Initialize() . = ..() - materials = new /datum/material_container(src, - list(MAT_METAL, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_DIAMOND, MAT_BANANIUM), - max_amt = MINERAL_MATERIAL_AMOUNT*50) - -/obj/machinery/mineral/mint/Destroy() - QDEL_NULL(materials) - return ..() - -/obj/machinery/mineral/mint/process() - var/turf/T = get_step(src, input_dir) - if(!T) - return - - for(var/obj/item/stack/sheet/O in T) - materials.insert_stack(O, O.amount) - -/obj/machinery/mineral/mint/attack_hand(mob/user) - var/dat = "Coin Press
" - - for(var/mat_id in materials.materials) - var/datum/material/M = materials.materials[mat_id] - if(!M.amount && chosen != mat_id) - continue - dat += "
[M.name] amount: [M.amount] cm3 " - if (chosen == mat_id) - dat += "Chosen" - else - dat += "Choose" - - var/datum/material/M = materials.materials[chosen] - - dat += "

Will produce [coinsToProduce] [lowertext(M.name)] coins if enough materials are available.
" - dat += "-10 " - dat += "-5 " - dat += "-1 " - dat += "+1 " - dat += "+5 " - dat += "+10 " - - dat += "

In total this machine produced [newCoins] coins." - dat += "
Make coins" - user << browse(dat, "window=mint") - -/obj/machinery/mineral/mint/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - src.add_fingerprint(usr) - if(processing==1) - to_chat(usr, "The machine is processing.") - return - if(href_list["choose"]) - if(materials.materials[href_list["choose"]]) - chosen = href_list["choose"] - if(href_list["chooseAmt"]) - coinsToProduce = Clamp(coinsToProduce + text2num(href_list["chooseAmt"]), 0, 1000) - if(href_list["makeCoins"]) - var/temp_coins = coinsToProduce + AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_DIAMOND, MAT_BANANIUM), MINERAL_MATERIAL_AMOUNT * 50) + +/obj/machinery/mineral/mint/process() + var/turf/T = get_step(src, input_dir) + if(!T) + return + + GET_COMPONENT(materials, /datum/component/material_container) + for(var/obj/item/stack/sheet/O in T) + materials.insert_stack(O, O.amount) + +/obj/machinery/mineral/mint/attack_hand(mob/user) + var/dat = "Coin Press
" + + GET_COMPONENT(materials, /datum/component/material_container) + for(var/mat_id in materials.materials) + var/datum/material/M = materials.materials[mat_id] + if(!M.amount && chosen != mat_id) + continue + dat += "
[M.name] amount: [M.amount] cm3 " + if (chosen == mat_id) + dat += "Chosen" + else + dat += "Choose" + + var/datum/material/M = materials.materials[chosen] + + dat += "

Will produce [coinsToProduce] [lowertext(M.name)] coins if enough materials are available.
" + dat += "-10 " + dat += "-5 " + dat += "-1 " + dat += "+1 " + dat += "+5 " + dat += "+10 " + + dat += "

In total this machine produced [newCoins] coins." + dat += "
Make coins" + user << browse(dat, "window=mint") + +/obj/machinery/mineral/mint/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + src.add_fingerprint(usr) + if(processing==1) + to_chat(usr, "The machine is processing.") + return + GET_COMPONENT(materials, /datum/component/material_container) + if(href_list["choose"]) + if(materials.materials[href_list["choose"]]) + chosen = href_list["choose"] + if(href_list["chooseAmt"]) + coinsToProduce = Clamp(coinsToProduce + text2num(href_list["chooseAmt"]), 0, 1000) + if(href_list["makeCoins"]) + var/temp_coins = coinsToProduce processing = TRUE - icon_state = "coinpress1" - var/coin_mat = MINERAL_MATERIAL_AMOUNT * 0.2 - var/datum/material/M = materials.materials[chosen] - if(!M || !M.coin_type) - updateUsrDialog() - return - - while(coinsToProduce > 0 && materials.use_amount_type(coin_mat, chosen)) - create_coins(M.coin_type) - coinsToProduce-- - newCoins++ - src.updateUsrDialog() - sleep(5) - - icon_state = "coinpress0" + icon_state = "coinpress1" + var/coin_mat = MINERAL_MATERIAL_AMOUNT * 0.2 + var/datum/material/M = materials.materials[chosen] + if(!M || !M.coin_type) + updateUsrDialog() + return + + while(coinsToProduce > 0 && materials.use_amount_type(coin_mat, chosen)) + create_coins(M.coin_type) + coinsToProduce-- + newCoins++ + src.updateUsrDialog() + sleep(5) + + icon_state = "coinpress0" processing = FALSE - coinsToProduce = temp_coins - src.updateUsrDialog() - return - -/obj/machinery/mineral/mint/proc/create_coins(P) - var/turf/T = get_step(src,output_dir) - if(T) - var/obj/item/O = new P(src) - var/obj/item/storage/bag/money/M = locate(/obj/item/storage/bag/money, T) - if(!M) - M = new /obj/item/storage/bag/money(src) - unload_mineral(M) + coinsToProduce = temp_coins + src.updateUsrDialog() + return + +/obj/machinery/mineral/mint/proc/create_coins(P) + var/turf/T = get_step(src,output_dir) + if(T) + var/obj/item/O = new P(src) + var/obj/item/storage/bag/money/M = locate(/obj/item/storage/bag/money, T) + if(!M) + M = new /obj/item/storage/bag/money(src) + unload_mineral(M) O.loc = M \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/login.dm.rej b/code/modules/mob/dead/new_player/login.dm.rej deleted file mode 100644 index b7361e13ff..0000000000 --- a/code/modules/mob/dead/new_player/login.dm.rej +++ /dev/null @@ -1,9 +0,0 @@ -diff a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm (rejected hunks) -@@ -1,5 +1,6 @@ - /mob/dead/new_player/Login() -- client.update_exp_client(0, 0) -+ if(config.use_exp_tracking) -+ client.update_exp_client(0, 0) - if(!mind) - mind = new /datum/mind(key) - mind.active = 1 diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index bf8836fb72..00f664b59c 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -329,6 +329,9 @@ if(SSshuttle.arrivals.damaged && config.arrivals_shuttle_require_safe_latejoin) src << alert("The arrivals shuttle is currently malfunctioning! You cannot join.") return FALSE + + if(config.arrivals_shuttle_require_undocked) + SSshuttle.arrivals.RequireUndocked(src) arrivals_docked = SSshuttle.arrivals.mode != SHUTTLE_CALL //Remove the player from the join queue if he was in one and reset the timer @@ -394,12 +397,7 @@ /mob/dead/new_player/proc/LateChoices() - var/mills = world.time - SSticker.round_start_time // 1/10 of a second, not real milliseconds but whatever - //var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something - var/mins = (mills % 36000) / 600 - var/hours = mills / 36000 - - var/dat = "
Round Duration: [round(hours)]h [round(mins)]m
" + var/dat = "
Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
" if(SSshuttle.emergency) switch(SSshuttle.emergency.mode) diff --git a/code/modules/mob/dead/new_player/poll.dm b/code/modules/mob/dead/new_player/poll.dm index 9ca76c6356..2e2f3189fe 100644 --- a/code/modules/mob/dead/new_player/poll.dm +++ b/code/modules/mob/dead/new_player/poll.dm @@ -417,7 +417,7 @@ to_chat(src, "Invalid vote data") return 0 - //lets add the vote, first we generate a insert statement. + //lets add the vote, first we generate an insert statement. var/sqlrowlist = "" for (var/vote in numberedvotelist) diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 4810b666e7..0a8dc6c733 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -1,100 +1,84 @@ - - //The mob should have a gender you want before running this proc. Will run fine without H -/datum/preferences/proc/random_character(gender_override) - if(gender_override) - gender = gender_override - else - gender = pick(MALE,FEMALE) - skin_tone = random_skin_tone() - hair_style = random_hair_style(gender) - facial_hair_style = random_facial_hair_style(gender) - hair_color = random_short_color() - facial_hair_color = hair_color - eye_color = random_eye_color() - if(!pref_species) - var/rando_race = pick(config.roundstart_races) - pref_species = new rando_race() - features = random_features() - age = rand(AGE_MIN,AGE_MAX) - -/datum/preferences/proc/update_preview_icon(nude = 0) - var/wide_icon = 0 - var/stamp_x = 0 - var/stamp_y = 1 - if(features["taur"] != "None") - wide_icon = 1 - // Silicons only need a very basic preview since there is no customization for them. - if(job_engsec_high) - switch(job_engsec_high) - if(AI_JF) - preview_icon = icon('icons/mob/AI.dmi', "AI", SOUTH) - preview_icon.Scale(64, 64) - return - if(CYBORG) - preview_icon = icon('icons/mob/robots.dmi', "robot", SOUTH) - preview_icon.Scale(64, 64) - return - - // Set up the dummy for its photoshoot - var/mob/living/carbon/human/dummy/mannequin = new() - copy_to(mannequin) - - // Determine what job is marked as 'High' priority, and dress them up as such. - var/datum/job/previewJob - var/highRankFlag = job_civilian_high | job_medsci_high | job_engsec_high - - if(job_civilian_low & ASSISTANT) - previewJob = SSjob.GetJob("Assistant") - else if(highRankFlag) - var/highDeptFlag - if(job_civilian_high) - highDeptFlag = CIVILIAN - else if(job_medsci_high) - highDeptFlag = MEDSCI - else if(job_engsec_high) - highDeptFlag = ENGSEC - - for(var/datum/job/job in SSjob.occupations) - if(job.flag == highRankFlag && job.department_flag == highDeptFlag) - previewJob = job - break - - if(previewJob && !nude) - mannequin.job = previewJob.title - previewJob.equip(mannequin, TRUE) - mannequin.update_body() - CHECK_TICK - preview_icon = icon('icons/effects/effects.dmi', "nothing") - preview_icon.Scale((112), (32)) - CHECK_TICK - mannequin.setDir(NORTH) - - var/icon/stamp = getFlatIcon(mannequin) - CHECK_TICK - if(wide_icon) - stamp_x = 16 - else - stamp_x = 32 - preview_icon.Blend(stamp, ICON_OVERLAY, stamp_x, stamp_y) - CHECK_TICK - mannequin.setDir(WEST) - stamp = getFlatIcon(mannequin) - CHECK_TICK - if(wide_icon) - stamp_x = 48 - else - stamp_x = 64 - preview_icon.Blend(stamp, ICON_OVERLAY, stamp_x, stamp_y) - CHECK_TICK - mannequin.setDir(SOUTH) - stamp = getFlatIcon(mannequin) - CHECK_TICK - if(wide_icon) - stamp_x = -15 - else - stamp_x = 1 - preview_icon.Blend(stamp, ICON_OVERLAY, stamp_x, stamp_y) - CHECK_TICK - preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser. - CHECK_TICK - qdel(mannequin) \ No newline at end of file +//The mob should have a gender you want before running this proc. Will run fine without H +/datum/preferences/proc/random_character(gender_override) + if(gender_override) + gender = gender_override + else + gender = pick(MALE,FEMALE) + underwear = random_underwear(gender) + undershirt = random_undershirt(gender) + socks = random_socks() + skin_tone = random_skin_tone() + hair_style = random_hair_style(gender) + facial_hair_style = random_facial_hair_style(gender) + hair_color = random_short_color() + facial_hair_color = hair_color + eye_color = random_eye_color() + if(!pref_species) + var/rando_race = pick(config.roundstart_races) + pref_species = new rando_race() + features = random_features() + age = rand(AGE_MIN,AGE_MAX) + +/datum/preferences/proc/update_preview_icon(nude = 0) + // Silicons only need a very basic preview since there is no customization for them. + if(job_engsec_high) + switch(job_engsec_high) + if(AI_JF) + preview_icon = icon('icons/mob/ai.dmi', "AI", SOUTH) + preview_icon.Scale(64, 64) + return + if(CYBORG) + preview_icon = icon('icons/mob/robots.dmi', "robot", SOUTH) + preview_icon.Scale(64, 64) + return + + // Set up the dummy for its photoshoot + var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) + copy_to(mannequin) + + // Determine what job is marked as 'High' priority, and dress them up as such. + var/datum/job/previewJob + var/highRankFlag = job_civilian_high | job_medsci_high | job_engsec_high + + if(job_civilian_low & ASSISTANT) + previewJob = SSjob.GetJob("Assistant") + else if(highRankFlag) + var/highDeptFlag + if(job_civilian_high) + highDeptFlag = CIVILIAN + else if(job_medsci_high) + highDeptFlag = MEDSCI + else if(job_engsec_high) + highDeptFlag = ENGSEC + + for(var/datum/job/job in SSjob.occupations) + if(job.flag == highRankFlag && job.department_flag == highDeptFlag) + previewJob = job + break + + if(previewJob && !nude) + mannequin.job = previewJob.title + previewJob.equip(mannequin, TRUE) + CHECK_TICK + preview_icon = icon('icons/effects/effects.dmi', "nothing") + preview_icon.Scale(48+32, 16+32) + CHECK_TICK + mannequin.setDir(NORTH) + + var/icon/stamp = getFlatIcon(mannequin) + CHECK_TICK + preview_icon.Blend(stamp, ICON_OVERLAY, 25, 17) + CHECK_TICK + mannequin.setDir(WEST) + stamp = getFlatIcon(mannequin) + CHECK_TICK + preview_icon.Blend(stamp, ICON_OVERLAY, 1, 9) + CHECK_TICK + mannequin.setDir(SOUTH) + stamp = getFlatIcon(mannequin) + CHECK_TICK + preview_icon.Blend(stamp, ICON_OVERLAY, 49, 1) + CHECK_TICK + preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser. + CHECK_TICK + unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9eb16d74e2..1022719805 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -711,9 +711,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp update_icon() /mob/dead/observer/canUseTopic(atom/movable/AM,be_close = FALSE) - if(check_rights(R_ADMIN, 0)) - return 1 - return + return IsAdminGhost(usr) /mob/dead/observer/is_literate() return 1 diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 8e919491bb..65a3fd253e 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -13,6 +13,7 @@ var/obj/item/organ/brain/brain = null //The actual brain var/datum/ai_laws/laws = new() var/force_replace_ai_name = FALSE + var/overrides_aicore_laws = FALSE // Whether the laws on the MMI, if any, override possible pre-existing laws loaded on the AI core. /obj/item/device/mmi/update_icon() if(brain) @@ -203,8 +204,9 @@ name = "Syndicate Man-Machine Interface" desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs and AIs created with it." origin_tech = "biotech=4;programming=4;syndicate=2" + overrides_aicore_laws = TRUE -/obj/item/device/mmi/syndie/New() - ..() +/obj/item/device/mmi/syndie/Initialize() + . = ..() laws = new /datum/ai_laws/syndicate_override() radio.on = 0 diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 48ce6e5e7b..170cf57d95 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -40,7 +40,7 @@ create_internal_organs() - ..() + . = ..() /mob/living/carbon/alien/create_internal_organs() internal_organs += new /obj/item/organ/brain/alien diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index 9e79ec1259..b18aaacfeb 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -8,7 +8,7 @@ /mob/living/carbon/alien/humanoid/drone/Initialize() AddAbility(new/obj/effect/proc_holder/alien/evolve(null)) - ..() + . = ..() /mob/living/carbon/alien/humanoid/drone/create_internal_organs() diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 9e3212ec6e..e93fed311c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -38,11 +38,11 @@ #define MAX_ALIEN_LEAP_DIST 7 /mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A) - if(pounce_cooldown > world.time) - to_chat(src, "You are too fatigued to pounce right now!") + if(!canmove || leaping) return - if(leaping || stat || buckled || lying) + if(pounce_cooldown > world.time) + to_chat(src, "You are too fatigued to pounce right now!") return if(!has_gravity() || !A.has_gravity()) @@ -66,6 +66,7 @@ if(!leaping) return ..() + pounce_cooldown = world.time + pounce_cooldown_time if(A) if(isliving(A)) var/mob/living/L = A @@ -83,7 +84,6 @@ Knockdown(40, 1, 1) toggle_leap(0) - pounce_cooldown = world.time + pounce_cooldown_time else if(A.density && !A.CanPass(src)) visible_message("[src] smashes into [A]!", "[src] smashes into [A]!") Knockdown(40, 1, 1) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm index 71619ff9a4..404d285b25 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm @@ -13,7 +13,7 @@ AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src)) AddAbility(new /obj/effect/proc_holder/alien/royal/praetorian/evolve()) - ..() + . = ..() /mob/living/carbon/alien/humanoid/royal/praetorian/create_internal_organs() internal_organs += new /obj/item/organ/alien/plasmavessel/large @@ -48,4 +48,4 @@ return 1 else to_chat(user, "We already have an alive queen.") - return 0 + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index 2988e9b3bf..c0577c0d61 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -8,7 +8,7 @@ /mob/living/carbon/alien/humanoid/sentinel/Initialize() AddAbility(new /obj/effect/proc_holder/alien/sneak) - ..() + . = ..() /mob/living/carbon/alien/humanoid/sentinel/create_internal_organs() internal_organs += new /obj/item/organ/alien/plasmavessel @@ -18,4 +18,4 @@ /mob/living/carbon/alien/humanoid/sentinel/movement_delay() - . = ..() + . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index ed4a20a91a..0a325521b0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -18,12 +18,13 @@ var/drooling = 0 //For Neruotoxic spit overlays bodyparts = list(/obj/item/bodypart/chest/alien, /obj/item/bodypart/head/alien, /obj/item/bodypart/l_arm/alien, /obj/item/bodypart/r_arm/alien, /obj/item/bodypart/r_leg/alien, /obj/item/bodypart/l_leg/alien) + devourable = TRUE //This is fine right now, if we're adding organ specific damage this needs to be updated /mob/living/carbon/alien/humanoid/Initialize() AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null)) - ..() + . = ..() /mob/living/carbon/alien/humanoid/movement_delay() . = ..() @@ -42,7 +43,7 @@
"} for(var/i in 1 to held_items.len) var/obj/item/I = get_item_for_held_index(i) - dat += "
[get_held_index_name(i)]:[(I && !(I.flags_1 & ABSTRACT_1)) ? I : "Empty"]" + dat += "
[get_held_index_name(i)]:[(I && !(I.flags_1 & ABSTRACT_1)) ? I : "Empty"]" dat += "
Empty Pouches" if(handcuffed) @@ -120,4 +121,4 @@ /mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath) if(breath && breath.total_moles() > 0 && !sneaking) playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, 0, -5) - ..() + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 61c78c87a8..101f1495e2 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -4,7 +4,7 @@ icon_state = "larva0" pass_flags = PASSTABLE | PASSMOB mob_size = MOB_SIZE_SMALL - density = FALSE + density = FALSE maxHealth = 25 health = 25 @@ -22,7 +22,7 @@ AddAbility(new/obj/effect/proc_holder/alien/hide(null)) AddAbility(new/obj/effect/proc_holder/alien/larva_evolve(null)) - ..() + . = ..() /mob/living/carbon/alien/larva/create_internal_organs() internal_organs += new /obj/item/organ/alien/plasmavessel/small/tiny @@ -65,4 +65,4 @@ /mob/living/carbon/alien/larva/stripPanelEquip(obj/item/what, mob/who) to_chat(src, "You don't have the dexterity to do this!") - return + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 717c5478a5..aa72ebfa9f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -297,11 +297,14 @@ /mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0) + if(I.being_removed) + to_chat(src, "You're already attempting to remove [I]!") + return + I.being_removed = TRUE breakouttime = I.breakouttime - var/displaytime = breakouttime / 600 if(!cuff_break) visible_message("[src] attempts to remove [I]!") - to_chat(src, "You attempt to remove [I]... (This will take around [displaytime] minutes and you need to stand still.)") + to_chat(src, "You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)") if(do_after(src, breakouttime, 0, target = src)) clear_cuffs(I, cuff_break) else @@ -318,6 +321,7 @@ else if(cuff_break == INSTANT_CUFFBREAK) clear_cuffs(I, cuff_break) + I.being_removed = FALSE /mob/living/carbon/proc/uncuff() if (handcuffed) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm new file mode 100644 index 0000000000..0492a0b5e6 --- /dev/null +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -0,0 +1,43 @@ + +/mob/living/carbon/human/dummy + real_name = "Test Dummy" + status_flags = GODMODE|CANPUSH + var/in_use = FALSE + +INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) + +/mob/living/carbon/human/dummy/Destroy() + in_use = FALSE + return ..() + +/mob/living/carbon/human/dummy/Life() + return + +/mob/living/carbon/human/dummy/proc/wipe_state() + QDEL_LIST(contents) + cut_overlays(TRUE) + +//Inefficient pooling/caching way. +GLOBAL_LIST_EMPTY(human_dummy_list) + +/proc/generate_or_wait_for_human_dummy(slotkey) + if(!slotkey) + return new /mob/living/carbon/human/dummy + var/mob/living/carbon/human/dummy/D = GLOB.human_dummy_list[slotkey] + if(istype(D)) + UNTIL(!D.in_use) + else + pass() + if(QDELETED(D)) + D = new + GLOB.human_dummy_list[slotkey] = D + D.in_use = TRUE + return D + +/proc/unset_busy_human_dummy(slotnumber) + if(!slotnumber) + return + var/mob/living/carbon/human/dummy/D = GLOB.human_dummy_list[slotnumber] + if(istype(D)) + D.wipe_state() + D.in_use = FALSE diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 0fd685e77c..917242609e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -5,15 +5,6 @@ icon = 'icons/mob/human.dmi' icon_state = "caucasian_m" -/mob/living/carbon/human/dummy - real_name = "Test Dummy" - status_flags = GODMODE|CANPUSH - -INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) - -/mob/living/carbon/human/dummy/Life() - return - /mob/living/carbon/human/Initialize() verbs += /mob/living/proc/mob_sleep verbs += /mob/living/proc/lay_down @@ -244,7 +235,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore return var/time_taken = I.embedded_unsafe_removal_time*I.w_class - usr.visible_message("[usr] attempts to remove [I] from their [L.name].","You attempt to remove [I] from your [L.name]... (It will take [time_taken/10] seconds.)") + usr.visible_message("[usr] attempts to remove [I] from their [L.name].","You attempt to remove [I] from your [L.name]... (It will take [DisplayTimeText(time_taken)].)") if(do_after(usr, time_taken, needhand = 1, target = src)) if(!I || !L || I.loc != src || !(I in L.embedded_objects)) return diff --git a/code/modules/mob/living/carbon/human/interactive.dm b/code/modules/mob/living/carbon/human/interactive.dm index 6add1cb80c..91921f386d 100644 --- a/code/modules/mob/living/carbon/human/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive.dm @@ -87,12 +87,16 @@ /// SNPC voice handling /mob/living/carbon/human/interactive/proc/loadVoice() - var/json_file = file("data/npc_saves/snpc.json") - if(!fexists(json_file)) - return - var/list/json = list() - json = json_decode(file2text(json_file)) - knownStrings = json["knownStrings"] + if(fexists("data/npc_saves/snpc.sav")) + var/savefile/S = new /savefile("data/npc_saves/snpc.sav") + S["knownStrings"] >> knownStrings + fdel(S) + else + var/json_file = file("data/npc_saves/snpc.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + knownStrings = json["knownStrings"] if(isnull(knownStrings)) knownStrings = list() @@ -1618,4 +1622,4 @@ TRAITS |= TRAIT_ROBUST TRAITS |= TRAIT_SMART faction += "bot_power" - . = ..() + . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 55203bf2e5..593becfd48 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -236,6 +236,10 @@ /mob/living/carbon/human/head_update(obj/item/I, forced) if((I.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || forced) update_hair() + else + var/obj/item/clothing/C = I + if(istype(C) && C.dynamic_hair_suffix) + update_hair() if(I.flags_inv & HIDEEYES || forced) update_inv_glasses() if(I.flags_inv & HIDEEARS || forced) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 821ed9d7a6..07f3acea48 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -111,6 +111,10 @@ randname += " [pick(GLOB.last_names)]" return randname + +//Called when cloning, copies some vars that should be kept +/datum/species/proc/copy_properties_from(datum/species/old_species) + return //Please override this locally if you want to define when what species qualifies for what rank if human authority is enforced. @@ -1437,7 +1441,7 @@ H.adjust_blurriness(10) if(prob(I.force + ((100 - H.health)/2)) && H != user) - SSticker.mode.remove_revolutionary(H.mind) + SSticker.mode.remove_revolutionary(H.mind, FALSE, user) if(bloody) //Apply blood if(H.wear_mask) @@ -1721,4 +1725,4 @@ #undef COLD_DAMAGE_LEVEL_1 #undef COLD_DAMAGE_LEVEL_2 -#undef COLD_DAMAGE_LEVEL_3 +#undef COLD_DAMAGE_LEVEL_3 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 18444bb366..160b0b73a1 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -2,8 +2,10 @@ name = "Abductor" id = "abductor" say_mod = "gibbers" - sexes = 0 + sexes = FALSE species_traits = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER) mutanttongue = /obj/item/organ/tongue/abductor - var/scientist = 0 // vars to not pollute spieces list with castes - var/team = 1 + var/scientist = FALSE // vars to not pollute spieces list with castes + +/datum/species/abductor/copy_properties_from(datum/species/abductor/old_species) + scientist = old_species.scientist diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm index 7c58ecbf86..dbab6b94eb 100644 --- a/code/modules/mob/living/carbon/human/species_types/angel.dm +++ b/code/modules/mob/living/carbon/human/species_types/angel.dm @@ -18,11 +18,10 @@ if(H.dna && H.dna.species &&((H.dna.features["wings"] != "Angel") && ("wings" in H.dna.species.mutant_bodyparts))) H.dna.features["wings"] = "Angel" H.update_body() - if(ishuman(H)&& !fly) + if(ishuman(H) && !fly) fly = new fly.Grant(H) - /datum/species/angel/on_species_loss(mob/living/carbon/human/H) if(fly) fly.Remove(H) @@ -66,7 +65,7 @@ /datum/action/innate/flight name = "Toggle Flight" check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_STUN - icon_icon = 'icons/mob/actions/actions_items.dmi' + icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "flight" /datum/action/innate/flight/Activate() diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 49659f0128..5df45e2755 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -159,7 +159,7 @@ name = "Plasteel Golem" id = "plasteel golem" fixed_mut_color = "bbb" - stunmod = 0.40 + stunmod = 0.4 punchdamagelow = 12 punchdamagehigh = 21 punchstunthreshold = 18 //still 40% stun chance @@ -436,6 +436,7 @@ name = "Unstable Teleport" check_flags = AB_CHECK_CONSCIOUS button_icon_state = "jaunt" + icon_icon = 'icons/mob/actions/actions_spells.dmi' var/cooldown = 150 var/last_teleport = 0 diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 3319895fe0..60f2e821f2 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -9,7 +9,6 @@ exotic_blood = "slimejelly" damage_overlay_type = "" var/datum/action/innate/regenerate_limbs/regenerate_limbs - toxic_food = NONE liked_food = MEAT /datum/species/jelly/on_species_loss(mob/living/carbon/C) @@ -60,6 +59,7 @@ name = "Regenerate Limbs" check_flags = AB_CHECK_CONSCIOUS button_icon_state = "slimeheal" + icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" /datum/action/innate/regenerate_limbs/IsAvailable() @@ -128,7 +128,7 @@ /datum/species/jelly/slime/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() if(ishuman(C)) -/* slime_split = new + /* slime_split = new slime_split.Grant(C) swap_body = new swap_body.Grant(C) */ @@ -140,6 +140,10 @@ C.faction |= "slime" +//If you're cloned you get your body pool back +/datum/species/jelly/slime/copy_properties_from(datum/species/jelly/slime/old_species) + bodies = old_species.bodies + /datum/species/jelly/slime/spec_life(mob/living/carbon/human/H) if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) if(prob(5)) @@ -154,6 +158,7 @@ name = "Split Body" check_flags = AB_CHECK_CONSCIOUS button_icon_state = "slimesplit" + icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" /datum/action/innate/split_body/IsAvailable() @@ -220,6 +225,7 @@ name = "Swap Body" check_flags = AB_CHECK_CONSCIOUS button_icon_state = "slimeswap" + icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" /datum/action/innate/swap_body/Activate() @@ -326,4 +332,4 @@ M.transfer_to(dupe) dupe.visible_message("[dupe] blinks and looks \ around.", - "...and move this one instead.") + "...and move this one instead.") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 636c2b7890..5c635fb870 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -30,7 +30,7 @@ burnmod = 1.5 blacklisted = TRUE no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store) - species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOHUNGER) + species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOHUNGER,NO_DNA_COPY,NOTRANSSTING) mutanteyes = /obj/item/organ/eyes/night_vision/nightmare var/obj/effect/proc_holder/spell/targeted/shadowwalk/shadowwalk diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index c6fba442de..45b4a28bb5 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -1,121 +1,121 @@ -/datum/species/synth - name = "Synth" //inherited from the real species, for health scanners and things - id = "synth" - say_mod = "beep boops" //inherited from a user's real species - sexes = 0 - species_traits = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //all of these + whatever we inherit from the real species - dangerous_existence = 1 - blacklisted = 1 - meat = null - damage_overlay_type = "synth" - limbs_id = "synth" - var/list/initial_species_traits = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //for getting these values back for assume_disguise() - var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off - var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged - -/datum/species/synth/military - name = "Military Synth" - id = "military_synth" - armor = 25 - punchdamagelow = 10 - punchdamagehigh = 19 - punchstunthreshold = 14 //about 50% chance to stun - disguise_fail_health = 50 - -/datum/species/synth/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) - ..() - assume_disguise(old_species, H) - -/datum/species/synth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.id == "synthflesh") - chem.reaction_mob(H, TOUCH, 2 ,0) //heal a little - H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) - return 1 - else - return ..() - - -/datum/species/synth/proc/assume_disguise(datum/species/S, mob/living/carbon/human/H) - if(S && !istype(S, type)) - name = S.name - say_mod = S.say_mod - sexes = S.sexes - species_traits = initial_species_traits.Copy() - species_traits.Add(S.species_traits) - attack_verb = S.attack_verb - attack_sound = S.attack_sound - miss_sound = S.miss_sound - meat = S.meat - mutant_bodyparts = S.mutant_bodyparts.Copy() - mutant_organs = S.mutant_organs.Copy() - default_features = S.default_features.Copy() - nojumpsuit = S.nojumpsuit - no_equip = S.no_equip.Copy() - limbs_id = S.limbs_id - use_skintones = S.use_skintones - fixed_mut_color = S.fixed_mut_color - hair_color = S.hair_color - fake_species = new S.type - else - name = initial(name) - say_mod = initial(say_mod) - species_traits = initial_species_traits.Copy() - attack_verb = initial(attack_verb) - attack_sound = initial(attack_sound) - miss_sound = initial(miss_sound) - mutant_bodyparts = list() - default_features = list() - nojumpsuit = initial(nojumpsuit) - no_equip = list() - qdel(fake_species) - fake_species = null - meat = initial(meat) - limbs_id = "synth" - use_skintones = 0 - sexes = 0 - fixed_mut_color = "" - hair_color = "" - - for(var/X in H.bodyparts) //propagates the damage_overlay changes - var/obj/item/bodypart/BP = X - BP.update_limb() - H.update_body_parts() //to update limb icon cache with the new damage overlays - -//Proc redirects: -//Passing procs onto the fake_species, to ensure we look as much like them as possible - -/datum/species/synth/handle_hair(mob/living/carbon/human/H, forced_colour) - if(fake_species) - fake_species.handle_hair(H, forced_colour) - else - return ..() - - -/datum/species/synth/handle_body(mob/living/carbon/human/H) - if(fake_species) - fake_species.handle_body(H) - else - return ..() - - -/datum/species/synth/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) - if(fake_species) - fake_species.handle_body(H,forced_colour) - else - return ..() - - -/datum/species/synth/get_spans() - if(fake_species) - return fake_species.get_spans() - return list() - - -/datum/species/synth/handle_speech(message, mob/living/carbon/human/H) - if(H.health > disguise_fail_health) - if(fake_species) - return fake_species.handle_speech(message,H) - else - return ..() - else +/datum/species/synth + name = "Synth" //inherited from the real species, for health scanners and things + id = "synth" + say_mod = "beep boops" //inherited from a user's real species + sexes = 0 + species_traits = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //all of these + whatever we inherit from the real species + dangerous_existence = 1 + blacklisted = 1 + meat = null + damage_overlay_type = "synth" + limbs_id = "synth" + var/list/initial_species_traits = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER,NO_DNA_COPY) //for getting these values back for assume_disguise() + var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off + var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged + +/datum/species/synth/military + name = "Military Synth" + id = "military_synth" + armor = 25 + punchdamagelow = 10 + punchdamagehigh = 19 + punchstunthreshold = 14 //about 50% chance to stun + disguise_fail_health = 50 + +/datum/species/synth/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) + ..() + assume_disguise(old_species, H) + +/datum/species/synth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) + if(chem.id == "synthflesh") + chem.reaction_mob(H, TOUCH, 2 ,0) //heal a little + H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + return 1 + else + return ..() + + +/datum/species/synth/proc/assume_disguise(datum/species/S, mob/living/carbon/human/H) + if(S && !istype(S, type)) + name = S.name + say_mod = S.say_mod + sexes = S.sexes + species_traits = initial_species_traits.Copy() + species_traits.Add(S.species_traits) + attack_verb = S.attack_verb + attack_sound = S.attack_sound + miss_sound = S.miss_sound + meat = S.meat + mutant_bodyparts = S.mutant_bodyparts.Copy() + mutant_organs = S.mutant_organs.Copy() + default_features = S.default_features.Copy() + nojumpsuit = S.nojumpsuit + no_equip = S.no_equip.Copy() + limbs_id = S.limbs_id + use_skintones = S.use_skintones + fixed_mut_color = S.fixed_mut_color + hair_color = S.hair_color + fake_species = new S.type + else + name = initial(name) + say_mod = initial(say_mod) + species_traits = initial_species_traits.Copy() + attack_verb = initial(attack_verb) + attack_sound = initial(attack_sound) + miss_sound = initial(miss_sound) + mutant_bodyparts = list() + default_features = list() + nojumpsuit = initial(nojumpsuit) + no_equip = list() + qdel(fake_species) + fake_species = null + meat = initial(meat) + limbs_id = "synth" + use_skintones = 0 + sexes = 0 + fixed_mut_color = "" + hair_color = "" + + for(var/X in H.bodyparts) //propagates the damage_overlay changes + var/obj/item/bodypart/BP = X + BP.update_limb() + H.update_body_parts() //to update limb icon cache with the new damage overlays + +//Proc redirects: +//Passing procs onto the fake_species, to ensure we look as much like them as possible + +/datum/species/synth/handle_hair(mob/living/carbon/human/H, forced_colour) + if(fake_species) + fake_species.handle_hair(H, forced_colour) + else + return ..() + + +/datum/species/synth/handle_body(mob/living/carbon/human/H) + if(fake_species) + fake_species.handle_body(H) + else + return ..() + + +/datum/species/synth/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) + if(fake_species) + fake_species.handle_body(H,forced_colour) + else + return ..() + + +/datum/species/synth/get_spans() + if(fake_species) + return fake_species.get_spans() + return list() + + +/datum/species/synth/handle_speech(message, mob/living/carbon/human/H) + if(H.health > disguise_fail_health) + if(fake_species) + return fake_species.handle_speech(message,H) + else + return ..() + else return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index d11f71212c..04123102c0 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -1,3 +1,5 @@ +#define REGENERATION_DELAY 60 // After taking damage, how long it takes for automatic regeneration to begin + /datum/species/zombie // 1spooky name = "High Functioning Zombie" @@ -6,7 +8,7 @@ sexes = 0 blacklisted = 1 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie - species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT) + species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT,NOTRANSSTING) mutant_organs = list(/obj/item/organ/tongue/zombie) var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg') disliked_food = NONE @@ -20,14 +22,21 @@ armor = 20 // 120 damage to KO a zombie, which kills it speedmod = 2 mutanteyes = /obj/item/organ/eyes/night_vision/zombie + var/regen_cooldown = 0 /datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount) . = min(2, amount) +/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H) + . = ..() + if(.) + regen_cooldown = world.time + REGENERATION_DELAY + /datum/species/zombie/infectious/spec_life(mob/living/carbon/C) . = ..() C.a_intent = INTENT_HARM // THE SUFFERING MUST FLOW - C.heal_overall_damage(4,4) + if(regen_cooldown < world.time) + C.heal_overall_damage(4,4) if(prob(4)) playsound(C, pick(spooks), 50, TRUE, 10) if(C.InCritical()) @@ -56,3 +65,5 @@ sexes = 0 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie mutant_organs = list(/obj/item/organ/tongue/zombie) + +#undef REGENERATION_DELAY diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 55aee04ff6..1ecbcc6b67 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -30,7 +30,7 @@ emote("collapse") Knockdown(200) to_chat(src, "You feel weak.") - if(radiation > 30 && prob((radiation - 30) * (radiation - 30) * 0.00002)) + if(radiation > 30 && prob((radiation - 30) * (radiation - 30) * 0.0002)) gorillize() return switch(radiation) diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index be716e26ba..767268f8dc 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -5,7 +5,7 @@ var/ancestor_chain = 1 var/relic_hat //Note: these two are paths var/relic_mask - var/memory_saved = 0 + var/memory_saved = FALSE var/list/pet_monkey_names = list("Pun Pun", "Bubbles", "Mojo", "George", "Darwin", "Aldo", "Caeser", "Kanzi", "Kong", "Terk", "Grodd", "Mala", "Bojangles", "Coco", "Able", "Baker", "Scatter", "Norbit", "Travis") var/list/rare_pet_monkey_names = list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky") @@ -32,25 +32,33 @@ equip_to_slot_or_del(new relic_mask, slot_wear_mask) /mob/living/carbon/monkey/punpun/Life() - if(SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) - Write_Memory(0) + if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) + Write_Memory(FALSE, FALSE) + memory_saved = TRUE ..() /mob/living/carbon/monkey/punpun/death(gibbed) - if(!memory_saved || gibbed) - Write_Memory(1,gibbed) + if(!memory_saved) + Write_Memory(TRUE, gibbed) ..() /mob/living/carbon/monkey/punpun/proc/Read_Memory() - var/json_file = file("data/npc_saves/Punpun.json") - if(!fexists(json_file)) - return - var/list/json = list() - json = json_decode(file2text(json_file)) - ancestor_name = json["ancestor_name"] - ancestor_chain = json["ancestor_chain"] - relic_hat = json["relic_hat"] - relic_mask = json["relic_hat"] + if(fexists("data/npc_saves/Punpun.sav")) //legacy compatability to convert old format to new + var/savefile/S = new /savefile("data/npc_saves/Punpun.sav") + S["ancestor_name"] >> ancestor_name + S["ancestor_chain"] >> ancestor_chain + S["relic_hat"] >> relic_hat + S["relic_mask"] >> relic_mask + fdel("data/npc_saves/Punpun.sav") + else + var/json_file = file("data/npc_saves/Punpun.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + ancestor_name = json["ancestor_name"] + ancestor_chain = json["ancestor_chain"] + relic_hat = json["relic_hat"] + relic_mask = json["relic_hat"] /mob/living/carbon/monkey/punpun/proc/Write_Memory(dead, gibbed) var/json_file = file("data/npc_saves/Punpun.json") @@ -60,14 +68,10 @@ file_data["ancestor_chain"] = null file_data["relic_hat"] = null file_data["relic_mask"] = null - if(dead) - file_data["ancestor_name"] = ancestor_name - file_data["ancestor_chain"] = ancestor_chain + 1 - file_data["relic_hat"] = head ? head.type : null - file_data["relic_mask"] = wear_mask ? wear_mask.type : null - if(!ancestor_name) - file_data["ancestor_name"] = name + else + file_data["ancestor_name"] = ancestor_name ? ancestor_name : name + file_data["ancestor_chain"] = dead ? ancestor_chain + 1 : ancestor_chain + file_data["relic_hat"] = head ? head.type : null + file_data["relic_mask"] = wear_mask ? wear_mask.type : null fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - if(!dead) - memory_saved = 1 \ No newline at end of file + WRITE_FILE(json_file, json_encode(file_data)) \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index acea72e911..649e19ba29 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -544,11 +544,14 @@ if(!force_moving) ..(pressure_difference, direction, pressure_resistance_prob_delta) +/mob/living/proc/can_resist() + return !((next_move > world.time) || incapacitated(ignore_restraints = TRUE)) + /mob/living/verb/resist() set name = "Resist" set category = "IC" - if(!isliving(src) || next_move > world.time || incapacitated(ignore_restraints = 1)) + if(!can_resist()) return changeNext_move(CLICK_CD_RESIST) @@ -709,30 +712,24 @@ floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life(). /mob/living/proc/get_temperature(datum/gas_mixture/environment) - var/loc_temp = T0C - if(istype(loc, /obj/mecha)) - var/obj/mecha/M = loc - loc_temp = M.return_temperature() - - else if(istype(loc, /obj/structure/transit_tube_pod)) - loc_temp = environment.temperature - + var/loc_temp = environment ? environment.temperature : T0C + if(isobj(loc)) + var/obj/oloc = loc + var/obj_temp = oloc.return_temperature() + if(obj_temp != null) + loc_temp = obj_temp +/* if(ismob(loc)) + var/mob/living/mloc = loc + var/mob_temp = mloc.return_temperature() + if(mloc == DEAD) + loc_temp = get_turf(loc) //wew + else + loc_temp = mob_temp +*/ +//just gunna ommit this for now, it's on the 'to figgur out' list. else if(isspaceturf(get_turf(src))) var/turf/heat_turf = get_turf(src) loc_temp = heat_turf.temperature - - else if(istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell)) - var/obj/machinery/atmospherics/components/unary/cryo_cell/C = loc - var/datum/gas_mixture/G = C.AIR1 - - if(G.total_moles() < 10) - loc_temp = environment.temperature - else - loc_temp = G.temperature - - else - loc_temp = environment.temperature - return loc_temp /mob/living/proc/get_standard_pixel_x_offset(lying = 0) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 61bc0d5d5b..3bf2223047 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -169,7 +169,7 @@ /mob/living/silicon/ai/verb/pick_icon() set category = "AI Commands" set name = "Set AI Core Display" - if(stat || aiRestorePowerRoutine) + if(incapacitated()) return //if(icon_state == initial(icon_state)) @@ -308,16 +308,15 @@ onclose(src, "airoster") /mob/living/silicon/ai/proc/ai_call_shuttle() - if(stat == DEAD) - return //won't work if dead - if(isAI(usr)) - var/mob/living/silicon/ai/AI = src - if(AI.control_disabled) - to_chat(usr, "Wireless control is disabled!") - return + if(control_disabled) + to_chat(usr, "Wireless control is disabled!") + return var/reason = input(src, "What is the nature of your emergency? ([CALL_SHUTTLE_REASON_LENGTH] characters required.)", "Confirm Shuttle Call") as null|text + if(incapacitated()) + return + if(trim(reason)) SSshuttle.requestEvac(src, reason) @@ -335,8 +334,8 @@ set name = "Toggle Floor Bolts" if(!isturf(loc)) // if their location isn't a turf return // stop - if(stat == DEAD) - return //won't work if dead + if(incapacitated()) + return anchored = !anchored // Toggles the anchor to_chat(src, "You are now [anchored ? "" : "un"]anchored.") @@ -347,21 +346,16 @@ /mob/living/silicon/ai/proc/ai_cancel_call() set category = "Malfunction" - if(stat == DEAD) - return //won't work if dead - if(isAI(usr)) - var/mob/living/silicon/ai/AI = src - if(AI.control_disabled) - to_chat(src, "Wireless control is disabled!") - return + if(control_disabled) + to_chat(src, "Wireless control is disabled!") + return SSshuttle.cancelEvac(src) - return /mob/living/silicon/ai/restrained(ignore_grab) . = 0 /mob/living/silicon/ai/Topic(href, href_list) - if(usr != src) + if(usr != src || incapacitated()) return ..() if (href_list["mach_close"]) @@ -385,11 +379,10 @@ //Carn: holopad requests if(href_list["jumptoholopad"]) var/obj/machinery/holopad/H = locate(href_list["jumptoholopad"]) - if(stat == CONSCIOUS) - if(H) - H.attack_ai(src) //may as well recycle - else - to_chat(src, "Unable to locate the holopad.") + if(H) + H.attack_ai(src) //may as well recycle + else + to_chat(src, "Unable to locate the holopad.") if(href_list["track"]) var/string = href_list["track"] trackable_mobs() @@ -434,9 +427,6 @@ if(!GLOB.cameranet.checkCameraVis(M)) to_chat(src, "Exosuit is no longer near active cameras.") return - if(lacks_power()) - to_chat(src, "You're depowered!") - return if(!isturf(loc)) to_chat(src, "You aren't in your core!") return @@ -449,8 +439,8 @@ if(!tracking) cameraFollow = null - if (!C || stat == DEAD) //C.can_use()) - return 0 + if (!C) + return FALSE if(!src.eyeobj) view_core() @@ -459,17 +449,17 @@ eyeobj.setLoc(get_turf(C)) //machine = src - return 1 + return TRUE /mob/living/silicon/ai/proc/botcall() set category = "AI Commands" set name = "Access Robot Control" set desc = "Wirelessly control various automatic robots." - if(stat == DEAD) - return //won't work if dead + if(incapacitated()) + return if(control_disabled) - to_chat(src, "Wireless communication is disabled.") + to_chat(src, "Wireless control is disabled.") return var/turf/ai_current_turf = get_turf(src) var/ai_Zlevel = ai_current_turf.z @@ -522,8 +512,6 @@ /mob/living/silicon/ai/triggerAlarm(class, area/A, O, obj/alarmsource) if(alarmsource.z != z) return - if (stat == 2) - return 1 var/list/L = alarms[class] for (var/I in L) if (I == A.name) @@ -585,8 +573,8 @@ cameraFollow = null var/cameralist[0] - if(stat == DEAD) - return //won't work if dead + if(incapacitated()) + return var/mob/living/silicon/ai/U = usr @@ -629,8 +617,8 @@ set category = "AI Commands" set name = "AI Status" - if(stat == DEAD) - return //won't work if dead + if(incapacitated()) + return var/list/ai_emotions = list("Very Happy", "Happy", "Neutral", "Unsure", "Confused", "Sad", "BSOD", "Blank", "Problems?", "Awesome", "Facepalm", "Friend Computer", "Dorfy", "Blue Glow", "Red Glow") var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions for (var/M in GLOB.ai_status_displays) //change status of displays @@ -652,8 +640,8 @@ set desc = "Change the default hologram available to AI to something else." set category = "AI Commands" - if(stat == DEAD) - return //won't work if dead + if(incapacitated()) + return var/input switch(alert("Would you like to select a hologram based on a crew member, an animal, or switch to a unique avatar?",,"Crew Member","Unique","Animal")) if("Crew Member") @@ -729,9 +717,6 @@ apc.malfvacate() /mob/living/silicon/ai/proc/toggle_camera_light() - if(stat != CONSCIOUS) - return - camera_light_on = !camera_light_on if (!camera_light_on) @@ -755,7 +740,7 @@ var/list/obj/machinery/camera/visible = list() for (var/datum/camerachunk/CC in eyeobj.visibleCameraChunks) for (var/obj/machinery/camera/C in CC.cameras) - if (!C.can_use() || get_dist(C, eyeobj) > 7) + if (!C.can_use() || get_dist(C, eyeobj) > 7 || !C.internal_light) continue visible |= C @@ -774,8 +759,8 @@ set desc = "Allows you to change settings of your radio." set category = "AI Commands" - if(stat == DEAD) - return //won't work if dead + if(incapacitated()) + return to_chat(src, "Accessing Subspace Transceiver control...") if (radio) @@ -790,8 +775,8 @@ set desc = "Modify the default radio setting for your automatic announcements." set category = "AI Commands" - if(stat == DEAD) - return //won't work if dead + if(incapacitated()) + return set_autosay() /mob/living/silicon/ai/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/device/aicard/card) @@ -818,17 +803,22 @@ /mob/living/silicon/ai/can_buckle() return 0 -/mob/living/silicon/ai/canUseTopic(atom/movable/M, be_close = 0) - if(stat) - return +/mob/living/silicon/ai/incapacitated() + if(aiRestorePowerRoutine) + return TRUE + return ..() + +/mob/living/silicon/ai/canUseTopic(atom/movable/M, be_close = FALSE) + if(control_disabled || incapacitated()) + return FALSE if(be_close && !in_range(M, src)) - return + return FALSE //stop AIs from leaving windows open and using then after they lose vision //apc_override is needed here because AIs use their own APC when powerless //get_turf_pixel() is because APCs in maint aren't actually in view of the inner camera if(M && GLOB.cameranet && !GLOB.cameranet.checkTurfVis(get_turf_pixel(M)) && !apc_override) - return - return 1 + return FALSE + return TRUE /mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) raw_message = lang_treat(speaker, message_language, raw_message, spans, message_mode) @@ -931,8 +921,10 @@ set category = "AI Commands" set name = "Deploy to Shell" - if(stat || lacks_power() || control_disabled) - to_chat(src, "Wireless networking module is offline.") + if(incapacitated()) + return + if(control_disabled) + to_chat(src, "Wireless networking module is offline.") return var/list/possible = list() diff --git a/code/modules/mob/living/silicon/ai/death.dm.rej b/code/modules/mob/living/silicon/ai/death.dm.rej deleted file mode 100644 index 40b5625e8c..0000000000 --- a/code/modules/mob/living/silicon/ai/death.dm.rej +++ /dev/null @@ -1,13 +0,0 @@ -diff a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm (rejected hunks) -@@ -35,9 +35,9 @@ - if(nuking) - set_security_level("red") - nuking = FALSE -- for(var/obj/item/weapon/pinpointer/P in GLOB.pinpointer_list) -+ for(var/obj/item/weapon/pinpointer/nuke/P in GLOB.pinpointer_list) - P.switch_mode_to(TRACK_NUKE_DISK) //Party's over, back to work, everyone -- P.nuke_warning = FALSE -+ P.alert = FALSE - - if(doomsday_device) - doomsday_device.timing = FALSE diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index ca0a2e8c1c..812e207249 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -114,9 +114,6 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) var/y1 = max(0, T.y - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - - //to_chat(world, "X1: [x1] - Y1: [y1] - X2: [x2] - Y2: [y2]") - for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) if(chunkGenerated(x, y, T.z)) @@ -161,4 +158,4 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(cameranet.chunkGenerated(x, y, z)) var/datum/camerachunk/chunk = cameranet.getCameraChunk(x, y, z) usr.client.debug_variables(chunk) -*/ \ No newline at end of file +*/ diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 2c7d81179c..a42a2f7890 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -106,8 +106,8 @@ set category = "AI Commands" set name = "Toggle Camera Acceleration" - if(usr.stat == DEAD) - return //won't work if dead + if(incapacitated()) + return acceleration = !acceleration to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].") diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 02053681ae..e148bd2763 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -18,9 +18,11 @@ return !config.silent_ai /mob/living/silicon/ai/radio(message, message_mode, list/spans, language) - if(!radio_enabled || aiRestorePowerRoutine || stat) //AI cannot speak if radio is disabled (via intellicard) or depowered. + if(incapacitated()) + return FALSE + if(!radio_enabled) //AI cannot speak if radio is disabled (via intellicard) or depowered. to_chat(src, "Your radio transmitter is offline!") - return 0 + return FALSE ..() /mob/living/silicon/ai/get_message_mode(message) @@ -71,8 +73,8 @@ set desc = "Display a list of vocal words to announce to the crew." set category = "AI Commands" - if(usr.stat == DEAD) - return //won't work if dead + if(incapacitated()) + return var/dat = "Here is a list of words you can type into the 'Announcement' button to create sentences to vocally announce to everyone on the same level at you.
\
  • You can also click on the word to preview it.
  • \ @@ -95,7 +97,7 @@ /mob/living/silicon/ai/proc/announcement() var/static/announcing_vox = 0 // Stores the time of the last announcement if(announcing_vox > world.time) - to_chat(src, "Please wait [round((announcing_vox - world.time) / 10)] seconds.") + to_chat(src, "Please wait [DisplayTimeText(announcing_vox - world.time)].") return var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", src.last_announcement) as text @@ -105,11 +107,11 @@ if(!message || announcing_vox > world.time) return - if(stat != CONSCIOUS) + if(incapacitated()) return if(control_disabled) - to_chat(src, "Wireless interface disabled, unable to interact with announcement PA.") + to_chat(src, "Wireless interface disabled, unable to interact with announcement PA.") return var/list/words = splittext(trim(message), " ") diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index b0e9d41038..f95949b824 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -1,5 +1,5 @@ /mob/living/silicon/Login() if(mind && SSticker.mode) SSticker.mode.remove_cultist(mind, 0, 0) - SSticker.mode.remove_revolutionary(mind, 0) + SSticker.mode.remove_revolutionary(mind, TRUE) ..() diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index acb74b6372..5d301776c6 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -127,11 +127,11 @@ if("buy") if(subscreen == 1) var/target = href_list["buy"] - if(available_software.Find(target)) + if(available_software.Find(target) && !software.Find(target)) var/cost = src.available_software[target] if(ram >= cost) - ram -= cost software.Add(target) + ram -= cost else temp = "Insufficient RAM available." else @@ -248,6 +248,7 @@ medHUD = !medHUD if(medHUD) add_med_hud() + else var/datum/atom_hud/med = GLOB.huds[med_hud] med.remove_hud_from(src) diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index a9a2f899fb..cf55cdd5f9 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -1,7 +1,4 @@ - -/mob/living/silicon/robot/Login() - ..() - regenerate_icons() - show_laws(0) - if(mind) - SSticker.mode.remove_revolutionary(mind) +/mob/living/silicon/robot/Login() + ..() + regenerate_icons() + show_laws(0) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 8fab4c3286..01baf578ee 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -129,6 +129,7 @@ builtInCamera = new (src) builtInCamera.c_tag = real_name builtInCamera.network = list("SS13") + builtInCamera.internal_light = FALSE if(wires.is_cut(WIRE_CAMERA)) builtInCamera.status = 0 module = new /obj/item/robot_module(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index af6f3daf92..0024772274 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -307,6 +307,7 @@ /obj/item/device/analyzer, /obj/item/device/assembly/signaler/cyborg, /obj/item/areaeditor/blueprints/cyborg, + /obj/item/device/electroadaptive_pseudocircuit, /obj/item/stack/sheet/metal/cyborg, /obj/item/stack/sheet/glass/cyborg, /obj/item/stack/sheet/rglass/cyborg, @@ -679,4 +680,4 @@ /datum/robot_energy_storage/beacon max_energy = 30 recharge_rate = 1 - name = "Marker Beacon Storage" + name = "Marker Beacon Storage" \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm.rej b/code/modules/mob/living/silicon/robot/robot_modules.dm.rej deleted file mode 100644 index b0f0812dc4..0000000000 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm.rej +++ /dev/null @@ -1,19 +0,0 @@ -diff a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm (rejected hunks) -@@ -519,7 +519,7 @@ - /obj/item/weapon/gun/ballistic/revolver/grenadelauncher/cyborg, - /obj/item/weapon/card/emag, - /obj/item/weapon/crowbar/cyborg, -- /obj/item/weapon/pinpointer/syndicate/cyborg) -+ /obj/item/weapon/pinpointer/syndicate_cyborg) - - ratvar_modules = list( - /obj/item/clockwork/slab/cyborg/security, -@@ -545,7 +545,7 @@ - /obj/item/roller/robo, - /obj/item/weapon/card/emag, - /obj/item/weapon/crowbar/cyborg, -- /obj/item/weapon/pinpointer/syndicate/cyborg, -+ /obj/item/weapon/pinpointer/syndicate_cyborg, - /obj/item/stack/medical/gauze/cyborg, - /obj/item/weapon/gun/medbeam) - ratvar_modules = list( diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index d20829084a..1afcdaaed4 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -856,6 +856,7 @@ Pass a positive integer as an argument to override a bot's default speed. bot_name = name name = paicard.pai.name faction = user.faction.Copy() + language_holder = paicard.pai.language_holder.copy(src) add_logs(user, paicard.pai, "uploaded to [bot_name],") return 1 else diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 4007822ebb..e6a4b978ca 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -432,7 +432,6 @@ return if(on) var/speed = (wires.is_cut(WIRE_MOTOR1) ? 0 : 1) + (wires.is_cut(WIRE_MOTOR2) ? 0 : 2) - //to_chat(world, "speed: [speed]") var/num_steps = 0 switch(speed) if(0) @@ -474,8 +473,6 @@ path -= next return if(isturf(next)) - //to_chat(world, "at ([x],[y]) moving to ([next.x],[next.y])") - if(bloodiness) var/obj/effect/decal/cleanable/blood/tracks/B = new(loc) if(blood_DNA && blood_DNA.len) @@ -497,7 +494,6 @@ var/moved = step_towards(src, next) // attempt to move if(cell) cell.use(1) if(moved && oldloc!=loc) // successful move - //to_chat(world, "Successful move.") blockcount = 0 path -= loc @@ -508,7 +504,6 @@ else // failed to move - //to_chat(world, "Unable to move.") blockcount++ mode = BOT_BLOCKED if(blockcount == 3) @@ -528,16 +523,13 @@ return else buzz(ANNOYED) - //to_chat(world, "Bad turf.") mode = BOT_NAV return else - //to_chat(world, "No path.") mode = BOT_NAV return if(BOT_NAV) // calculate new path - //to_chat(world, "Calc new path.") mode = BOT_WAIT_FOR_NAV spawn(0) calc_path() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 2c50c98816..772604a527 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -65,10 +65,9 @@ /mob/living/simple_animal/bot/secbot/Initialize() . = ..() icon_state = "secbot[on]" - spawn(3) - var/datum/job/detective/J = new/datum/job/detective - access_card.access += J.get_access() - prev_access = access_card.access + var/datum/job/detective/J = new/datum/job/detective + access_card.access += J.get_access() + prev_access = access_card.access //SECHUD var/datum/atom_hud/secsensor = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] @@ -225,21 +224,25 @@ Auto Patrol: []"}, playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) C.visible_message("[src] is trying to put zipties on [C]!",\ "[src] is trying to put zipties on you!") - spawn(60) - if( !Adjacent(C) || !isturf(C.loc) ) //if he's in a closet or not adjacent, we cancel cuffing. - return - if(!C.handcuffed) - C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) - C.update_handcuffed() - playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0) - back_to_idle() + addtimer(CALLBACK(src, .proc/attempt_handcuff, C), 60) + +/mob/living/simple_animal/bot/secbot/proc/attempt_handcuff(mob/living/carbon/C) + if( !Adjacent(C) || !isturf(C.loc) ) //if he's in a closet or not adjacent, we cancel cuffing. + return + if(!C.handcuffed) + C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) + C.update_handcuffed() + playsound(src, "law", 50, 0) + back_to_idle() + +/mob/living/simple_animal/bot/secbot/proc/update_onsprite() + icon_state = "secbot[on]" /mob/living/simple_animal/bot/secbot/proc/stun_attack(mob/living/carbon/C) var/judgement_criteria = judgement_criteria() playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1) icon_state = "secbot-c" - spawn(2) - icon_state = "secbot[on]" + addtimer(CALLBACK(src, .proc/update_onsprite), 2) var/threat = 5 if(ishuman(C)) C.stuttering = 5 @@ -352,15 +355,13 @@ Auto Patrol: []"}, target = null last_found = world.time frustration = 0 - spawn(0) - handle_automated_action() //ensure bot quickly responds + INVOKE_ASYNC(src, .proc/handle_automated_action) /mob/living/simple_animal/bot/secbot/proc/back_to_hunt() anchored = FALSE frustration = 0 mode = BOT_HUNT - spawn(0) - handle_automated_action() //ensure bot quickly responds + INVOKE_ASYNC(src, .proc/handle_automated_action) // look for a criminal in view of the bot /mob/living/simple_animal/bot/secbot/proc/look_for_perp() @@ -385,8 +386,7 @@ Auto Patrol: []"}, playsound(loc, pick('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg'), 50, 0) visible_message("[src] points at [C.name]!") mode = BOT_HUNT - spawn(0) - handle_automated_action() // ensure bot quickly responds to a perp + INVOKE_ASYNC(src, .proc/handle_automated_action) break else continue diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 49ef79a4d9..feb581e03b 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -30,6 +30,7 @@ var/mob/living/simple_animal/mouse/movement_target gold_core_spawnable = 2 devourable = TRUE + no_vore = FALSE /mob/living/simple_animal/pet/cat/Initialize() . = ..() @@ -84,7 +85,7 @@ var/list/family = list()//var restored from savefile, has count of each child type var/list/children = list()//Actual mob instances of children var/cats_deployed = 0 - var/memory_saved = 0 + var/memory_saved = FALSE /mob/living/simple_animal/pet/cat/Runtime/Initialize() if(prob(5)) @@ -99,6 +100,7 @@ Deploy_The_Cats() if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) Write_Memory() + memory_saved = TRUE ..() /mob/living/simple_animal/pet/cat/Runtime/make_babies() @@ -109,21 +111,26 @@ /mob/living/simple_animal/pet/cat/Runtime/death() if(!memory_saved) - Write_Memory(1) + Write_Memory(TRUE) ..() /mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory() - var/json_file = file("data/npc_saves/Runtime.json") - if(!fexists(json_file)) - return - var/list/json = list() - json = json_decode(file2text(json_file)) - family = json["family"] + if(fexists("data/npc_saves/Runtime.sav")) //legacy compatability to convert old format to new + var/savefile/S = new /savefile("data/npc_saves/Runtime.sav") + S["family"] >> family + fdel("data/npc_saves/Runtime.sav") + else + var/json_file = file("data/npc_saves/Runtime.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + family = json["family"] if(isnull(family)) family = list() /mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead) var/json_file = file("data/npc_saves/Runtime.json") + var/list/file_data = list() family = list() if(!dead) for(var/mob/living/simple_animal/pet/cat/kitten/C in children) @@ -133,9 +140,9 @@ family[C.type] += 1 else family[C.type] = 1 + file_data["family"] = family fdel(json_file) - WRITE_FILE(json_file, json_encode(family)) - memory_saved = 1 + WRITE_FILE(json_file, json_encode(file_data)) /mob/living/simple_animal/pet/cat/Runtime/proc/Deploy_The_Cats() cats_deployed = 1 diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 31c080c66c..b9b526514b 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -13,6 +13,7 @@ speak_chance = 1 turns_per_move = 10 devourable = TRUE + no_vore = FALSE //Corgis and pugs are now under one dog subtype @@ -291,7 +292,7 @@ gold_core_spawnable = 0 var/age = 0 var/record_age = 1 - var/memory_saved = 0 + var/memory_saved = FALSE var/saved_head //path /mob/living/simple_animal/pet/dog/corgi/Ian/Initialize() @@ -307,7 +308,7 @@ P.real_name = "Ian" P.gender = MALE P.desc = "It's the HoP's beloved corgi puppy." - Write_Memory(0) + Write_Memory(FALSE) qdel(src) else if(age == record_age) icon_state = "old_corgi" @@ -317,24 +318,31 @@ turns_per_move = 20 /mob/living/simple_animal/pet/dog/corgi/Ian/Life() - if(SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) - Write_Memory(0) + if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) + Write_Memory(FALSE) + memory_saved = TRUE ..() /mob/living/simple_animal/pet/dog/corgi/Ian/death() if(!memory_saved) - Write_Memory(1) + Write_Memory(TRUE) ..() /mob/living/simple_animal/pet/dog/corgi/Ian/proc/Read_Memory() - var/json_file = file("data/npc_saves/Ian.json") - if(!fexists(json_file)) - return - var/list/json = list() - json = json_decode(file2text(json_file)) - age = json["age"] - record_age = json["record_age"] - saved_head = json["saved_head"] + if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new + var/savefile/S = new /savefile("data/npc_saves/Ian.sav") + S["age"] >> age + S["record_age"] >> record_age + S["saved_head"] >> saved_head + fdel("data/npc_saves/Ian.sav") + else + var/json_file = file("data/npc_saves/Ian.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + age = json["age"] + record_age = json["record_age"] + saved_head = json["saved_head"] if(isnull(age)) age = 0 if(isnull(record_age)) @@ -349,14 +357,18 @@ file_data["age"] = age + 1 if((age + 1) > record_age) file_data["record_age"] = record_age + 1 + else + file_data["record_age"] = record_age if(inventory_head) file_data["saved_head"] = inventory_head.type + else + file_data["saved_head"] = null else file_data["age"] = 0 + file_data["record_age"] = record_age file_data["saved_head"] = null fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) - memory_saved = 1 /mob/living/simple_animal/pet/dog/corgi/Ian/Life() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index d223984cf5..c29236c2fc 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -29,6 +29,7 @@ blood_volume = BLOOD_VOLUME_NORMAL var/obj/item/udder/udder = null devourable = TRUE + no_vore = FALSE /mob/living/simple_animal/hostile/retaliate/goat/Initialize() udder = new() @@ -119,6 +120,7 @@ gold_core_spawnable = 2 blood_volume = BLOOD_VOLUME_NORMAL devourable = TRUE + no_vore = FALSE /mob/living/simple_animal/cow/Initialize() udder = new() @@ -251,6 +253,7 @@ gold_core_spawnable = 2 var/static/chicken_count = 0 devourable = TRUE + no_vore = FALSE /mob/living/simple_animal/chicken/Initialize() . = ..() @@ -275,7 +278,6 @@ user.drop_item() qdel(O) eggsleft += rand(1, 4) - //to_chat(world, eggsleft) else to_chat(user, "[name] doesn't seem hungry!") else diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 22f2041d18..e7d6bfbf64 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -21,6 +21,7 @@ devourable = TRUE var/mob/living/simple_animal/mouse/movement_target var/turns_since_scan = 0 + no_vore = FALSE /mob/living/simple_animal/pet/fox/Life() //MICE! diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 6983bed378..1a7ed0261f 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -28,6 +28,7 @@ /mob/living/simple_animal/mouse/Initialize() . = ..() + AddComponent(/datum/component/squeak, list('sound/effects/mousesqueek.ogg'=1), 100) if(!body_color) body_color = pick( list("brown","gray","white") ) icon_state = "mouse_[body_color]" @@ -58,7 +59,6 @@ if(!stat) var/mob/M = AM to_chat(M, "[icon2html(src, M)] Squeek!") - playsound(src, 'sound/effects/mousesqueek.ogg', 100, 1) ..() /mob/living/simple_animal/mouse/handle_automated_action() diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm index 1fa0fd53b8..6833ea83a6 100644 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm @@ -13,6 +13,7 @@ speak_chance = 1 turns_per_move = 10 icon = 'icons/mob/penguins.dmi' + no_vore = FALSE /mob/living/simple_animal/pet/penguin/emperor name = "Emperor penguin" diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index d8a2985594..144f7081e0 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -159,7 +159,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5) stat(null, "Summoner Health: [resulthealth]%") if(cooldown >= world.time) - stat(null, "Manifest/Recall Cooldown Remaining: [max(round((cooldown - world.time)*0.1, 0.1), 0)] seconds") + stat(null, "Manifest/Recall Cooldown Remaining: [DisplayTimeText(cooldown - world.time)]") /mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range . = ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm index 9632ce3ff9..45d8c17d0c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -30,7 +30,7 @@ ..() if(statpanel("Status")) if(stealthcooldown >= world.time) - stat(null, "Stealth Cooldown Remaining: [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds") + stat(null, "Stealth Cooldown Remaining: [DisplayTimeText(stealthcooldown - world.time)]") /mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget() . = ..() @@ -79,7 +79,7 @@ updatestealthalert() toggle = TRUE else if(!forced) - to_chat(src, "You cannot yet enter stealth, wait another [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds!") + to_chat(src, "You cannot yet enter stealth, wait another [DisplayTimeText(stealthcooldown - world.time)]!") /mob/living/simple_animal/hostile/guardian/assassin/proc/updatestealthalert() if(stealthcooldown <= world.time) diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm index 45c093bbf2..c21b1474d8 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -14,7 +14,7 @@ ..() if(statpanel("Status")) if(bomb_cooldown >= world.time) - stat(null, "Bomb Cooldown Remaining: [max(round((bomb_cooldown - world.time)*0.1, 0.1), 0)] seconds") + stat(null, "Bomb Cooldown Remaining: [DisplayTimeText(bomb_cooldown - world.time)]") /mob/living/simple_animal/hostile/guardian/bomb/AttackingTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 4b5f7c2de5..db1581d8cb 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -24,11 +24,11 @@ ..() if(statpanel("Status")) if(beacon_cooldown >= world.time) - stat(null, "Beacon Cooldown Remaining: [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds") + stat(null, "Beacon Cooldown Remaining: [DisplayTimeText(beacon_cooldown - world.time)]") /mob/living/simple_animal/hostile/guardian/healer/AttackingTarget() . = ..() - if(toggle && iscarbon(target)) + if(. && toggle && iscarbon(target)) var/mob/living/carbon/C = target C.adjustBruteLoss(-5) C.adjustFireLoss(-5) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index e06de7b762..fa4cefd839 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -35,6 +35,8 @@ gold_core_spawnable = 0 death_sound = 'sound/voice/hiss6.ogg' deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..." + devourable = TRUE + no_vore = FALSE /mob/living/simple_animal/hostile/alien/drone name = "alien drone" diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 1c92b6233d..6b08d041c0 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -36,6 +36,8 @@ faction = list("russian") gold_core_spawnable = 1 + devourable = TRUE + no_vore = FALSE //SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!! /mob/living/simple_animal/hostile/bear/Hudson diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index dea21157c6..f2d29d3660 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -128,11 +128,12 @@ if(istype(target, /obj/machinery/hydroponics)) var/obj/machinery/hydroponics/Hydro = target pollinate(Hydro) - else if(target == beehome) - var/obj/structure/beebox/BB = target - loc = BB - target = null - wanted_objects -= typecacheof(/obj/structure/beebox) //so we don't attack beeboxes when not going home + else if(istype(target, /obj/structure/beebox)) + if(target == beehome) + var/obj/structure/beebox/BB = target + forceMove(BB) + target = null + wanted_objects -= typecacheof(/obj/structure/beebox) //so we don't attack beeboxes when not going home return //no don't attack the goddamm box else . = ..() @@ -186,7 +187,7 @@ if(loc == beehome) idle = min(100, ++idle) if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM)) - loc = get_turf(beehome) + forceMove(get_turf(beehome)) else idle = max(0, --idle) if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME)) diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 9a8592e48c..fde10031d1 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -17,6 +17,7 @@ maxHealth = 25 health = 25 devourable = TRUE + no_vore = FALSE harm_intent_damage = 8 obj_damage = 50 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 564280df02..7e8bd6d2c8 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -15,8 +15,6 @@ if(L.reagents) L.reagents.add_reagent(poison_type, poison_per_bite) - - //basic spider mob, these generally guard nests /mob/living/simple_animal/hostile/poison/giant_spider name = "giant spider" @@ -104,6 +102,64 @@ poison_per_bite = 5 move_to_delay = 5 +//vipers are the rare variant of the hunter, no IMMEDIATE damage but so much poison medical care will be needed fast. +/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper + name = "viper" + desc = "Furry and black, it makes you shudder to look at it. This one has effervescent purple eyes." + icon_state = "viper" + icon_living = "viper" + icon_dead = "viper_dead" + maxHealth = 40 + health = 40 + melee_damage_lower = 1 + melee_damage_upper = 1 + poison_per_bite = 12 + move_to_delay = 4 + poison_type = "venom" //all in venom, glass cannon. you bite 5 times and they are DEFINITELY dead, but 40 health and you are extremely obvious. Ambush, maybe? + speed = 1 + +//tarantulas are really tanky, regenerating (maybe), hulky monster but are also extremely slow, so. +/mob/living/simple_animal/hostile/poison/giant_spider/tarantula + name = "tarantula" + desc = "Furry and black, it makes you shudder to look at it. This one has abyssal red eyes." + icon_state = "tarantula" + icon_living = "tarantula" + icon_dead = "tarantula_dead" + maxHealth = 300 // woah nelly + health = 300 + melee_damage_lower = 35 + melee_damage_upper = 40 + poison_per_bite = 0 + move_to_delay = 8 + speed = 7 + status_flags = NONE + mob_size = MOB_SIZE_LARGE + +/mob/living/simple_animal/hostile/poison/giant_spider/tarantula/movement_delay() + var/turf/T = get_turf(src) + if(locate(/obj/structure/spider/stickyweb) in T) + speed = 2 + else + speed = 7 + . = ..() + +//midwives are the queen of the spiders, can send messages to all them and web faster. That rare round where you get a queen spider and turn your 'for honor' players into 'r6siege' players will be a fun one. +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife + name = "midwife" + desc = "Furry and black, it makes you shudder to look at it. This one has scintillating green eyes." + icon_state = "midwife" + icon_living = "midwife" + icon_dead = "midwife_dead" + maxHealth = 40 + health = 40 + var/datum/action/innate/spider/comm/letmetalkpls + +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize() + . = ..() + letmetalkpls = new + letmetalkpls.Grant(src) + + /mob/living/simple_animal/hostile/poison/giant_spider/ice //spiders dont usually like tempatures of 140 kelvin who knew name = "giant ice spider" atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) @@ -296,6 +352,39 @@ busy = SPIDER_IDLE stop_automated_movement = FALSE +/mob/living/simple_animal/hostile/poison/giant_spider/Login() + . = ..() + GLOB.spidermobs[src] = TRUE + +/mob/living/simple_animal/hostile/poison/giant_spider/Destroy() + GLOB.spidermobs -= src + return ..() + +/datum/action/innate/spider/comm + name = "Command" + button_icon_state = "cult_comms" + +/datum/action/innate/spider/comm/IsAvailable() + if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife)) + return FALSE + return TRUE + +/datum/action/innate/spider/comm/Trigger() + var/input = stripped_input(usr, "Input a message for your legions to follow.", "Command", "") + if(QDELETED(src) || !input || !IsAvailable()) + return FALSE + spider_command(usr, input) + return TRUE + +/datum/action/innate/spider/comm/proc/spider_command(mob/living/user, message) + if(!message) + return + var/my_message + my_message = "COMMAND FROM SPIDER QUEEN: [message]" + for(var/mob/living/simple_animal/hostile/poison/giant_spider/M in GLOB.spidermobs) + to_chat(M, my_message) + log_talk(user, "SPIDERCOMMAND: [key_name(user)] : [message]",LOGSAY) + /mob/living/simple_animal/hostile/poison/giant_spider/handle_temperature_damage() if(bodytemperature < minbodytemp) adjustBruteLoss(20) diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index b697473787..e0afdefd6b 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -22,7 +22,7 @@ melee_damage_upper = 18 damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 1.5, CLONE = 0, STAMINA = 0, OXY = 1.5) obj_damage = 20 - environment_smash = 2 + environment_smash = ENVIRONMENT_SMASH_WALLS attacktext = "pummels" attack_sound = 'sound/weapons/punch1.ogg' dextrous = TRUE @@ -32,7 +32,11 @@ stat_attack = UNCONSCIOUS minbodytemp = 270 maxbodytemp = 350 + unique_name = TRUE var/list/gorilla_overlays[GORILLA_TOTAL_LAYERS] + var/oogas = 0 + devourable = TRUE + no_vore = FALSE // Gorillas like to dismember limbs from unconcious mobs. // Returns null when the target is not an unconcious carbon mob; a list of limbs (possibly empty) otherwise. @@ -49,6 +53,8 @@ return parts /mob/living/simple_animal/hostile/gorilla/AttackingTarget() + if(client) + oogaooga() var/list/parts = target_bodyparts(target) if(parts) if(!parts.len) @@ -61,7 +67,7 @@ var/mob/living/L = target if(prob(80)) var/atom/throw_target = get_edge_target_turf(L, dir) - L.throw_at(throw_target, rand(1,2), 7, src) + L.throw_at(throw_target, rand(1,2), 7, src) else L.Knockdown(20) visible_message("[src] knocks [L] down!") @@ -70,8 +76,30 @@ var/list/parts = target_bodyparts(target) return ..() && !istype(the_target, /mob/living/carbon/monkey) && (!parts || parts.len > 3) +/mob/living/simple_animal/hostile/gorilla/CanSmashTurfs(turf/T) + return iswallturf(T) + +/mob/living/simple_animal/hostile/gorilla/gib(no_brain) + if(!no_brain) + var/mob/living/brain/B = new(drop_location()) + B.name = real_name + B.real_name = real_name + if(mind) + mind.transfer_to(B) + ..() + /mob/living/simple_animal/hostile/gorilla/handle_automated_speech(override) if(speak_chance && (override || prob(speak_chance))) playsound(src, "sound/creatures/gorilla.ogg", 200) ..() +/mob/living/simple_animal/hostile/gorilla/can_use_guns(obj/item/G) + to_chat(src, "Your meaty finger is much too large for the trigger guard!") + return FALSE + + +/mob/living/simple_animal/hostile/gorilla/proc/oogaooga() + oogas++ + if(oogas >= rand(2,6)) + playsound(src, "sound/creatures/gorilla.ogg", 200) + oogas = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 866f9c995a..86fe54aaeb 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -228,6 +228,9 @@ if(!target || !CanAttack(target)) LoseTarget() return 0 + if(ismob(target.loc)) + LoseTarget() + return 0 if(target in possible_targets) if(target.z != z) LoseTarget() @@ -366,23 +369,26 @@ P.original = targeted_atom P.fire() return P - + +/mob/living/simple_animal/hostile/proc/CanSmashTurfs(turf/T) + return iswallturf(T) || ismineralturf(T) /mob/living/simple_animal/hostile/proc/DestroySurroundings() if(environment_smash) EscapeConfinement() for(var/dir in GLOB.cardinals) var/turf/T = get_step(targets_from, dir) - if(iswallturf(T) || ismineralturf(T)) + if(CanSmashTurfs(T)) if(T.Adjacent(targets_from)) T.attack_animal(src) for(var/a in T) var/atom/A = a if(!A.Adjacent(targets_from)) continue - if(is_type_in_typecache(A, environment_target_typecache)) + if(is_type_in_typecache(A, environment_target_typecache) && !A.IsObscured()) A.attack_animal(src) + /mob/living/simple_animal/hostile/proc/EscapeConfinement() if(buckled) buckled.attack_animal(src) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 480408eab4..f3a398d5d9 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -250,7 +250,7 @@ Difficulty: Very Hard use_power = NO_POWER_USE var/memory_saved = FALSE var/list/stored_items = list() - var/static/list/blacklist = typecacheof(list(/obj/item/spellbook)) + var/list/blacklist = list() /obj/machinery/smartfridge/black_box/update_icon() return @@ -258,7 +258,8 @@ Difficulty: Very Hard /obj/machinery/smartfridge/black_box/accept_check(obj/item/O) if(!istype(O)) return FALSE - if(is_type_in_typecache(O, blacklist)) + if(blacklist[O]) + visible_message("[src] ripples as it rejects [O]. The device will not accept items that have been removed from it.") return FALSE return TRUE @@ -275,6 +276,7 @@ Difficulty: Very Hard ..() if(!memory_saved && SSticker.current_state == GAME_STATE_FINISHED) WriteMemory() + memory_saved = TRUE /obj/machinery/smartfridge/black_box/proc/WriteMemory() var/json_file = file("data/npc_saves/Blackbox.json") @@ -286,15 +288,18 @@ Difficulty: Very Hard file_data["data"] = stored_items fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) - memory_saved = TRUE /obj/machinery/smartfridge/black_box/proc/ReadMemory() - var/json_file = file("data/npc_saves/Blackbox.json") - if(!fexists(json_file)) - return - var/list/json = list() - json = json_decode(file2text(json_file)) - stored_items = json["data"] + if(fexists("data/npc_saves/Blackbox.sav")) //legacy compatability to convert old format to new + var/savefile/S = new /savefile("data/npc_saves/Blackbox.sav") + S["stored_items"] >> stored_items + fdel("data/npc_saves/Blackbox.sav") + else + var/json_file = file("data/npc_saves/Blackbox.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + stored_items = json["data"] if(isnull(stored_items)) stored_items = list() @@ -304,7 +309,8 @@ Difficulty: Very Hard //in it's own proc to avoid issues with items that nolonger exist in the code base. //try catch doesn't always prevent byond runtimes from halting a proc, /obj/machinery/smartfridge/black_box/proc/create_item(item_type) - new item_type(src) + var/obj/O = new item_type(src) + blacklist[O] = TRUE /obj/machinery/smartfridge/black_box/Destroy(force = FALSE) if(force) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index f5e097841a..d1ddfa9a00 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -60,6 +60,7 @@ Difficulty: Medium score_type = DRAKE_SCORE deathmessage = "collapses into a pile of bones, its flesh sloughing away." death_sound = 'sound/magic/demon_dies.ogg' + no_vore = FALSE /mob/living/simple_animal/hostile/megafauna/dragon/Initialize() . = ..() @@ -352,9 +353,9 @@ Difficulty: Medium /obj/effect/temp_visual/dragon_flight/proc/flight(negative) if(negative) - animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT*0.10, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) + animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT*0.1, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) else - animate(src, pixel_x = DRAKE_SWOOP_HEIGHT*0.10, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) + animate(src, pixel_x = DRAKE_SWOOP_HEIGHT*0.1, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) sleep(3) icon_state = "swoop" if(negative) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm new file mode 100644 index 0000000000..898a2ad734 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm @@ -0,0 +1,50 @@ +/mob/living/simple_animal/hostile/megafauna/dragon + vore_active = TRUE + +/mob/living/simple_animal/hostile/megafauna/dragon/Initialize() + // Create and register 'stomachs' + var/datum/belly/megafauna/dragon/maw/maw = new(src) + var/datum/belly/megafauna/dragon/gullet/gullet = new(src) + var/datum/belly/megafauna/dragon/gut/gut = new(src) + for(var/datum/belly/X in list(maw, gullet, gut)) + vore_organs[X.name] = X + // Connect 'stomachs' together + maw.transferlocation = gullet + gullet.transferlocation = gut + vore_selected = maw.name // NPC eats into maw + return ..() + +/datum/belly/megafauna/dragon + human_prey_swallow_time = 50 // maybe enough to switch targets if distracted + nonhuman_prey_swallow_time = 50 + +/datum/belly/megafauna/dragon/maw + name = "maw" + inside_flavor = "The maw of the dreaded Ash drake closes around you, engulfing you into a swelteringly hot, disgusting enviroment. The acidic saliva tingles over your form while that tongue pushes you further back...towards the dark gullet beyond." + vore_verb = "scoop" + vore_sound = 'sound/vore/pred/taurswallow.ogg' + swallow_time = 20 + escapechance = 25 + // From above, will transfer into gullet + transferchance = 25 + autotransferchance = 66 + autotransferwait = 200 + +/datum/belly/megafauna/dragon/gullet + name = "gullet" + inside_flavor = "A ripple of muscle and arching of the tongue pushes you down like any other food. No choice in the matter, you're simply consumed. The dark ambiance of the outside world is replaced with working, wet flesh. Your only light being what you brought with you." + swallow_time = 60 // costs extra time to eat directly to here + escapechance = 5 + // From above, will transfer into gut + transferchance = 25 + autotransferchance = 50 + autotransferwait = 200 + +/datum/belly/megafauna/dragon/gut + name = "stomach" + vore_capacity = 5 //I doubt this many people will actually last in the gut, but... + inside_flavor = "With a rush of burning ichor greeting you, you're introduced to the Drake's stomach. Wrinkled walls greedily grind against you, acidic slimes working into your body as you become fuel and nutriton for a superior predator. All that's left is your body's willingness to resist your destiny." + digest_mode = DM_DRAGON + digest_burn = 5 + swallow_time = 100 // costs extra time to eat directly to here + escapechance = 0 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index c4618db620..5f45d47494 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -60,7 +60,7 @@ else var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) if(C && crusher_loot) - if(C.total_damage >= maxHealth * 0.60) //if you do at least 60% of its health with the crusher, you'll get the item + if(C.total_damage >= maxHealth * 0.6) //if you do at least 60% of its health with the crusher, you'll get the item spawn_crusher_loot() if(!admin_spawned) SSblackbox.set_details("megafauna_kills","[initial(name)]") @@ -89,11 +89,15 @@ . = ..() if(. && isliving(target)) var/mob/living/L = target - if(L.stat != DEAD) - if(!client && ranged && ranged_cooldown <= world.time) - OpenFire() + if(L.stat >= SOFT_CRIT) + if(vore_active == TRUE && L.devourable == TRUE) + dragon_feeding(src,L) + else if(L.stat == DEAD) + devour(L) else - devour(L) + if(L.stat != DEAD) + if(!client && ranged && ranged_cooldown <= world.time) + OpenFire() /mob/living/simple_animal/hostile/megafauna/proc/devour(mob/living/L) if(!L) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index de995f951a..af283b9139 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -31,6 +31,7 @@ var/pre_attack = 0 var/pre_attack_icon = "Goliath_preattack" loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) + no_vore = FALSE /mob/living/simple_animal/hostile/asteroid/goliath/Life() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index ba2a0f3702..8c5be75684 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -60,7 +60,7 @@ cap_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) UpdateMushroomCap() health = maxHealth - ..() + . = ..() /mob/living/simple_animal/hostile/mushroom/adjustHealth(amount, updating_health = TRUE, forced = FALSE) //Possibility to flee from a fight just to make it more visually interesting if(!retreat_distance && prob(33)) diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm index fd66b8d0ae..44a0a06cdc 100644 --- a/code/modules/mob/living/simple_animal/hostile/stickman.dm +++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm @@ -38,7 +38,7 @@ minimum_distance = 5 icon_state = "stickmanranged" icon_living = "stickmanranged" - casingtype = /obj/item/ammo_casing/c45nostamina + casingtype = /obj/item/ammo_casing/c45/nostamina projectilesound = 'sound/misc/bang.ogg' loot = list(/obj/item/gun/ballistic/automatic/pistol/stickman) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 7cadba01d9..11331e7ab7 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -95,7 +95,7 @@ minimum_distance = 5 icon_state = "syndicateranged" icon_living = "syndicateranged" - casingtype = /obj/item/ammo_casing/c45nostamina + casingtype = /obj/item/ammo_casing/c45/nostamina projectilesound = 'sound/weapons/gunshot_smg.ogg' loot = list(/obj/effect/gibspawner/human) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 467bd13c65..6357f83286 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -60,6 +60,7 @@ movement_type = FLYING gold_core_spawnable = 2 devourable = TRUE + no_vore = FALSE var/parrot_damage_upper = 10 var/parrot_state = PARROT_WANDER //Hunt for a perch when created @@ -296,7 +297,7 @@ else parrot_state |= PARROT_FLEE //Otherwise, fly like a bat out of hell! drop_held_item(0) - if(!stat && M.a_intent == INTENT_HELP) + if(stat != DEAD && M.a_intent == INTENT_HELP) handle_automated_speech(1) //assured speak/emote return @@ -872,7 +873,7 @@ speak = list("Poly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE") gold_core_spawnable = 0 speak_chance = 3 - var/memory_saved = 0 + var/memory_saved = FALSE var/rounds_survived = 0 var/longest_survival = 0 var/longest_deathstreak = 0 @@ -903,50 +904,62 @@ rounds_survived = max(++rounds_survived,1) if(rounds_survived > longest_survival) longest_survival = rounds_survived - Write_Memory() + Write_Memory(FALSE) + memory_saved = TRUE ..() /mob/living/simple_animal/parrot/Poly/death(gibbed) if(!memory_saved) - var/go_ghost = 0 - if(rounds_survived == longest_survival || rounds_survived == longest_deathstreak || prob(0.666)) - go_ghost = 1 - rounds_survived = min(--rounds_survived,0) - if(rounds_survived < longest_deathstreak) - longest_deathstreak = rounds_survived - Write_Memory() - if(go_ghost) - var/mob/living/simple_animal/parrot/Poly/ghost/G = new(loc) - if(mind) - mind.transfer_to(G) - else - G.key = key + Write_Memory(TRUE) + if(rounds_survived == longest_survival || rounds_survived == longest_deathstreak || prob(0.666)) + var/mob/living/simple_animal/parrot/Poly/ghost/G = new(loc) + if(mind) + mind.transfer_to(G) + else + G.key = key ..(gibbed) /mob/living/simple_animal/parrot/Poly/proc/Read_Memory() - var/json_file = file("data/npc_saves/Poly.json") - if(!fexists(json_file)) - return - var/list/json = list() - json = json_decode(file2text(json_file)) - speech_buffer = json["phrases"] - rounds_survived = json["roundssurvived"] - longest_survival = json["longestsurvival"] - longest_deathstreak = json["longestdeathstreak"] + if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new + var/savefile/S = new /savefile("data/npc_saves/Poly.sav") + S["phrases"] >> speech_buffer + S["roundssurvived"] >> rounds_survived + S["longestsurvival"] >> longest_survival + S["longestdeathstreak"] >> longest_deathstreak + fdel("data/npc_saves/Poly.sav") + else + var/json_file = file("data/npc_saves/Poly.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + speech_buffer = json["phrases"] + rounds_survived = json["roundssurvived"] + longest_survival = json["longestsurvival"] + longest_deathstreak = json["longestdeathstreak"] if(!islist(speech_buffer)) speech_buffer = list() -/mob/living/simple_animal/parrot/Poly/proc/Write_Memory() +/mob/living/simple_animal/parrot/Poly/proc/Write_Memory(dead) var/json_file = file("data/npc_saves/Poly.json") var/list/file_data = list() if(islist(speech_buffer)) file_data["phrases"] = speech_buffer - file_data["roundssurvived"] = rounds_survived - file_data["longestsurvival"] = longest_survival - file_data["longestdeathstreak"] = longest_deathstreak + if(dead) + file_data["roundssurvived"] = min(rounds_survived - 1, 0) + file_data["longestsurvival"] = longest_survival + if(rounds_survived - 1 < longest_deathstreak) + file_data["longestdeathstreak"] = rounds_survived - 1 + else + file_data["longestdeathstreak"] = longest_deathstreak + else + file_data["roundssurvived"] = rounds_survived + 1 + if(rounds_survived + 1 > longest_survival) + file_data["longestsurvival"] = rounds_survived + 1 + else + file_data["longestsurvival"] = longest_survival + file_data["longestdeathstreak"] = longest_deathstreak fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) - memory_saved = 1 /mob/living/simple_animal/parrot/Poly/ghost name = "The Ghost of Poly" @@ -958,8 +971,8 @@ butcher_results = list(/obj/item/ectoplasm = 1) /mob/living/simple_animal/parrot/Poly/ghost/Initialize() - memory_saved = 1 //At this point nothing is saved - ..() + memory_saved = TRUE //At this point nothing is saved + . = ..() /mob/living/simple_animal/parrot/Poly/ghost/handle_automated_speech() if(ismob(loc)) @@ -983,4 +996,4 @@ loc = H H.ContractDisease(P) parrot_interest = null - H.visible_message("[src] dive bombs into [H]'s chest and vanishes!", "[src] dive bombs into your chest, vanishing! This can't be good!") + H.visible_message("[src] dive bombs into [H]'s chest and vanishes!", "[src] dive bombs into your chest, vanishing! This can't be good!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index aa95d182cb..144fec4a4a 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -85,6 +85,8 @@ //domestication var/tame = 0 + no_vore = TRUE + /mob/living/simple_animal/Initialize() . = ..() GLOB.simple_animals += src @@ -95,6 +97,9 @@ real_name = name if(!loc) stack_trace("Simple animal being instantiated in nullspace") + if(vore_active) + init_belly() + verbs |= /mob/living/proc/animal_nom /mob/living/simple_animal/Login() @@ -228,7 +233,6 @@ if( abs(areatemp - bodytemperature) > 40 ) var/diff = areatemp - bodytemperature diff = diff / 5 - //to_chat(world, "changed from [bodytemperature] by [diff] to [bodytemperature + diff]") bodytemperature += diff if(!environment_is_safe(environment)) diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm index 45320ecc3e..2eca841c17 100644 --- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm +++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm @@ -2,3 +2,101 @@ // List of targets excluded (for now) from being eaten by this mob. var/list/prey_exclusions = list() devourable = FALSE //insurance because who knows. + var/vore_active = FALSE // If vore behavior is enabled for this mob + + var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB) + var/vore_digest_chance = 25 // Chance to switch to digest mode if resisted + var/vore_escape_chance = 25 // Chance of resisting out of mob + + var/vore_stomach_name // The name for the first belly if not "stomach" + var/vore_stomach_flavor // The flavortext for the first belly if not the default + + var/vore_fullness = 0 // How "full" the belly is (controls icons) + + +// Release belly contents beforey being gc'd! +/mob/living/simple_animal/Destroy() + for(var/I in vore_organs) + var/datum/belly/B = vore_organs[I] + B.release_all_contents() // When your stomach is empty + prey_excludes.Cut() + . = ..() + + +// Update fullness based on size & quantity of belly contents +/mob/living/simple_animal/proc/update_fullness(var/atom/movable/M) + var/new_fullness = 0 + for(var/I in vore_organs) + var/datum/belly/B = vore_organs[I] + if (!(M in B.internal_contents)) + return FALSE // Nothing's inside + new_fullness += M + + vore_fullness = new_fullness + + +/mob/living/simple_animal/proc/swallow_check() + for(var/I in vore_organs) + var/datum/belly/B = vore_organs[I] + if(vore_active) + update_fullness() + if(!vore_fullness) + // Nothing + return + else + addtimer(CALLBACK(src, .proc/swallow_mob), B.swallow_time) + +/mob/living/simple_animal/proc/swallow_mob() + for(var/I in vore_organs) + var/datum/belly/B = vore_organs[I] + for(var/mob/living/M in B.internal_contents) + B.transfer_contents(M, B.transferlocation) + + +/mob/living/simple_animal/death() + for(var/I in vore_organs) + var/datum/belly/B = vore_organs[I] + B.release_all_contents() // When your stomach is empty + ..() // then you have my permission to die. + +// Simple animals have only one belly. This creates it (if it isn't already set up) +/mob/living/simple_animal/proc/init_belly() + if(vore_organs.len) + return + if(no_vore) //If it can't vore, let's not give it a stomach. + return + + var/datum/belly/B = new /datum/belly(src) + B.immutable = TRUE + B.name = vore_stomach_name ? vore_stomach_name : "stomach" + B.inside_flavor = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." + B.digest_mode = vore_default_mode + B.escapable = vore_escape_chance > 0 + B.escapechance = vore_escape_chance + B.digestchance = vore_digest_chance + B.human_prey_swallow_time = swallowTime + B.nonhuman_prey_swallow_time = swallowTime + B.vore_verb = "swallow" + // TODO - Customizable per mob + B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace + "The insides knead at you gently for a moment.", + "The guts glorp wetly around you as some air shifts.", + "The predator takes a deep breath and sighs, shifting you somewhat.", + "The stomach squeezes you tight for a moment, then relaxes harmlessly.", + "The predator's calm breathing and thumping heartbeat pulses around you.", + "The warm walls kneads harmlessly against you.", + "The liquids churn around you, though there doesn't seem to be much effect.", + "The sound of bodily movements drown out everything for a moment.", + "The predator's movements gently force you into a different position.") + B.emote_lists[DM_DIGEST] = list( + "The burning acids eat away at your form.", + "The muscular stomach flesh grinds harshly against you.", + "The caustic air stings your chest when you try to breathe.", + "The slimy guts squeeze inward to help the digestive juices soften you up.", + "The onslaught against your body doesn't seem to be letting up; you're food now.", + "The predator's body ripples and crushes against you as digestive enzymes pull you apart.", + "The juices pooling beneath you sizzle against your sore skin.", + "The churning walls slowly pulverize you into meaty nutrients.", + "The stomach glorps and gurgles as it tries to work you into slop.") + src.vore_organs[B.name] = B + src.vore_selected = B.name diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index d795f4ff9e..3396d157de 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -225,7 +225,9 @@ var/mob/living/L = mob switch(L.incorporeal_move) if(INCORPOREAL_MOVE_BASIC) - L.loc = get_step(L, direct) + var/T = get_step(L,direct) + if(T) + L.loc = T L.setDir(direct) if(INCORPOREAL_MOVE_SHADOW) if(prob(50)) @@ -254,31 +256,36 @@ return else return - L.loc = locate(locx,locy,mobloc.z) - var/limit = 2//For only two trailing shadows. - for(var/turf/T in getline(mobloc, L.loc)) - new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir) - limit-- - if(limit<=0) - break + var/target = locate(locx,locy,mobloc.z) + if(target) + L.loc = target + var/limit = 2//For only two trailing shadows. + for(var/turf/T in getline(mobloc, L.loc)) + new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir) + limit-- + if(limit<=0) + break else new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir) - L.loc = get_step(L, direct) + var/T = get_step(L,direct) + if(T) + L.loc = T L.setDir(direct) if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles. var/turf/open/floor/stepTurf = get_step(L, direct) - for(var/obj/effect/decal/cleanable/salt/S in stepTurf) - to_chat(L, "[S] bars your passage!") - if(isrevenant(L)) - var/mob/living/simple_animal/revenant/R = L - R.reveal(20) - R.stun(20) - return - if(stepTurf.flags_1 & NOJAUNT_1) - to_chat(L, "Holy energies block your path.") - else - L.loc = get_step(L, direct) - L.setDir(direct) + if(stepTurf) + for(var/obj/effect/decal/cleanable/salt/S in stepTurf) + to_chat(L, "[S] bars your passage!") + if(isrevenant(L)) + var/mob/living/simple_animal/revenant/R = L + R.reveal(20) + R.stun(20) + return + if(stepTurf.flags_1 & NOJAUNT_1) + to_chat(L, "Holy energies block your path.") + else + L.loc = get_step(L, direct) + L.setDir(direct) return TRUE diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index 4a0532104a..8e86acb965 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -44,7 +44,7 @@ //var/valid_z_levels = (GetConnectedZlevels(T.z) & using_map.station_levels) for(var/obj/machinery/power/supermatter_shard/S in GLOB.machines) // Delaminating, not within coverage, not on a tile. - if(!((S.z in GLOB.station_z_levels) || S.z == ZLEVEL_MINING || S.z == T.z) || !istype(S.loc, /turf/)) + if(!((S.z in GLOB.station_z_levels) || S.z == ZLEVEL_MINING || S.z == T.z || !isturf(S.loc))) continue supermatters.Add(S) diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm index 9ad64cc55e..7d0d2d8cef 100644 --- a/code/modules/paperwork/paper_premade.dm +++ b/code/modules/paperwork/paper_premade.dm @@ -47,7 +47,7 @@ /obj/item/paper/fluff/jobs/toxins/chemical_info name = "paper- 'Chemical Information'" - info = "Known Onboard Toxins:
    \n\tGrade A Semi-Liquid Plasma:
    \n\t\tHighly poisonous. You cannot sustain concentrations above 15 units.
    \n\t\tA gas mask fails to filter plasma after 50 units.
    \n\t\tWill attempt to diffuse like a gas.
    \n\t\tFiltered by scrubbers.
    \n\t\tThere is a bottled version which is very different
    \n\t\t\tfrom the version found in canisters!
    \n
    \n\t\tWARNING: Highly Flammable. Keep away from heat sources
    \n\t\texcept in a enclosed fire area!
    \n\t\tWARNING: It is a crime to use this without authorization.
    \nKnown Onboard Anti-Toxin:
    \n\tAnti-Toxin Type 01P: Works against Grade A Plasma.
    \n\t\tBest if injected directly into bloodstream.
    \n\t\tA full injection is in every regular Med-Kit.
    \n\t\tSpecial toxin Kits hold around 7.
    \n
    \nKnown Onboard Chemicals (other):
    \n\tRejuvenation T#001:
    \n\t\tEven 1 unit injected directly into the bloodstream
    \n\t\t\twill cure unconscious and sleep toxins.
    \n\t\tIf administered to a dying patient it will prevent
    \n\t\t\tfurther damage for about units*3 seconds.
    \n\t\t\tit will not cure them or allow them to be cured.
    \n\t\tIt can be administeredd to a non-dying patient
    \n\t\t\tbut the chemicals disappear just as fast.
    \n\tMorphine T#054:
    \n\t\t5 units wilkl induce precisely 1 minute of sleep.
    \n\t\t\tThe effect are cumulative.
    \n\t\tWARNING: It is a crime to use this without authorization" + info = "Known Onboard Toxins:
    \n\tGrade A Semi-Liquid Plasma:
    \n\t\tHighly poisonous. You cannot sustain concentrations above 15 units.
    \n\t\tA gas mask fails to filter plasma after 50 units.
    \n\t\tWill attempt to diffuse like a gas.
    \n\t\tFiltered by scrubbers.
    \n\t\tThere is a bottled version which is very different
    \n\t\t\tfrom the version found in canisters!
    \n
    \n\t\tWARNING: Highly Flammable. Keep away from heat sources
    \n\t\texcept in an enclosed fire area!
    \n\t\tWARNING: It is a crime to use this without authorization.
    \nKnown Onboard Anti-Toxin:
    \n\tAnti-Toxin Type 01P: Works against Grade A Plasma.
    \n\t\tBest if injected directly into bloodstream.
    \n\t\tA full injection is in every regular Med-Kit.
    \n\t\tSpecial toxin Kits hold around 7.
    \n
    \nKnown Onboard Chemicals (other):
    \n\tRejuvenation T#001:
    \n\t\tEven 1 unit injected directly into the bloodstream
    \n\t\t\twill cure unconscious and sleep toxins.
    \n\t\tIf administered to a dying patient it will prevent
    \n\t\t\tfurther damage for about units*3 seconds.
    \n\t\t\tit will not cure them or allow them to be cured.
    \n\t\tIt can be administered to a non-dying patient
    \n\t\t\tbut the chemicals disappear just as fast.
    \n\tMorphine T#054:
    \n\t\t5 units will induce precisely 1 minute of sleep.
    \n\t\t\tThe effect are cumulative.
    \n\t\tWARNING: It is a crime to use this without authorization" /* * Stations diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 1545bfd452..4d9fc45b1a 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -546,6 +546,35 @@ to_chat(user, "You place the power control board inside the frame.") qdel(W) + else if(istype(W, /obj/item/device/electroadaptive_pseudocircuit) && opened) + var/obj/item/device/electroadaptive_pseudocircuit/P = W + if(!has_electronics) + if(stat & BROKEN) + to_chat(user, "[src]'s frame is too damaged to support a circuit.") + return + if(!P.adapt_circuit(user, 50)) + return + user.visible_message("[user] fabricates a circuit and places it into [src].", \ + "You adapt a power control board and click it into place in [src]'s guts.") + has_electronics = TRUE + locked = TRUE + else if(!cell) + if(stat & MAINT) + to_chat(user, "There's no connector for a power cell.") + return + if(!P.adapt_circuit(user, 500)) + return + var/obj/item/stock_parts/cell/crap/empty/C = new(src) + C.forceMove(src) + cell = C + chargecount = 0 + user.visible_message("[user] fabricates a weak power cell and places it into [src].", \ + "Your [P.name] whirrs with strain as you create a weak power cell and place it into [src]!") + update_icon() + else + to_chat(user, "[src] has both electronics and a cell.") + return + else if (istype(W, /obj/item/weldingtool) && opened && has_electronics==0 && !terminal) var/obj/item/weldingtool/WT = W if (WT.get_fuel() < 3) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index b5eef4260e..6aeaff9477 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -82,24 +82,16 @@ return if(powernet) - //to_chat(world, "cold_circ and hot_circ pass") - var/datum/gas_mixture/cold_air = cold_circ.return_transfer_air() var/datum/gas_mixture/hot_air = hot_circ.return_transfer_air() - //to_chat(world, "hot_air = [hot_air]; cold_air = [cold_air];") - if(cold_air && hot_air) - //to_chat(world, "hot_air = [hot_air] temperature = [hot_air.temperature]; cold_air = [cold_air] temperature = [hot_air.temperature];") - - //to_chat(world, "coldair and hotair pass") var/cold_air_heat_capacity = cold_air.heat_capacity() var/hot_air_heat_capacity = hot_air.heat_capacity() var/delta_temperature = hot_air.temperature - cold_air.temperature - //to_chat(world, "delta_temperature = [delta_temperature]; cold_air_heat_capacity = [cold_air_heat_capacity]; hot_air_heat_capacity = [hot_air_heat_capacity]") if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0) var/efficiency = 0.65 @@ -109,13 +101,9 @@ var/heat = energy_transfer*(1-efficiency) lastgen += energy_transfer*efficiency - //to_chat(world, "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];") - hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity - //to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]") - //add_avail(lastgen) This is done in process now // update icon overlays only if displayed level has changed diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index e5e65beb6e..382853066d 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -204,7 +204,7 @@ /obj/machinery/particle_accelerator/control_box/proc/toggle_power() active = !active investigate_log("turned [active?"ON":"OFF"] by [usr ? key_name(usr) : "outside forces"]", INVESTIGATE_SINGULO) - message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name_admin(usr) : "outside forces"](?) (FLW) in ([x],[y],[z] - JMP)",0,1) + message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name_admin(usr) : "outside forces"](?) (FLW) in ([x],[y],[z] - JMP)",0,1) log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? "[key_name(usr)]" : "outside forces"] in ([x],[y],[z])") if(active) use_power = ACTIVE_POWER_USE diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 65cce2b7c7..848d690853 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -1,100 +1,126 @@ +// .357 (Syndie Revolver) + /obj/item/ammo_casing/a357 + name = ".357 bullet casing" desc = "A .357 bullet casing." caliber = "357" - projectile_type = /obj/item/projectile/bullet + projectile_type = /obj/item/projectile/bullet/a357 + +// 7.62 (Nagant Rifle) /obj/item/ammo_casing/a762 + name = "7.62 bullet casing" desc = "A 7.62 bullet casing." icon_state = "762-casing" caliber = "a762" - projectile_type = /obj/item/projectile/bullet + projectile_type = /obj/item/projectile/bullet/a762 /obj/item/ammo_casing/a762/enchanted - projectile_type = /obj/item/projectile/bullet/weakbullet3 + projectile_type = /obj/item/projectile/bullet/a762_enchanted -/obj/item/ammo_casing/a50 - desc = "A .50AE bullet casing." - caliber = ".50" - projectile_type = /obj/item/projectile/bullet - -/obj/item/ammo_casing/c38 - desc = "A .38 bullet casing." - caliber = "38" - projectile_type = /obj/item/projectile/bullet/weakbullet2 - -/obj/item/ammo_casing/c10mm - desc = "A 10mm bullet casing." - caliber = "10mm" - projectile_type = /obj/item/projectile/bullet/midbullet3 - -/obj/item/ammo_casing/c10mm/ap - projectile_type = /obj/item/projectile/bullet/midbullet3/ap - -/obj/item/ammo_casing/c10mm/fire - projectile_type = /obj/item/projectile/bullet/midbullet3/fire - -/obj/item/ammo_casing/c10mm/hp - projectile_type = /obj/item/projectile/bullet/midbullet3/hp - -/obj/item/ammo_casing/c9mm - desc = "A 9mm bullet casing." - caliber = "9mm" - projectile_type = /obj/item/projectile/bullet/weakbullet3 - -/obj/item/ammo_casing/c9mmap - desc = "A 9mm bullet casing." - caliber = "9mm" - projectile_type =/obj/item/projectile/bullet/armourpiercing - -/obj/item/ammo_casing/c9mmtox - desc = "A 9mm bullet casing." - caliber = "9mm" - projectile_type = /obj/item/projectile/bullet/toxinbullet - -/obj/item/ammo_casing/c9mminc - desc = "A 9mm bullet casing." - caliber = "9mm" - projectile_type = /obj/item/projectile/bullet/incendiary/firebullet - -/obj/item/ammo_casing/c46x30mm - desc = "A 4.6x30mm bullet casing." - caliber = "4.6x30mm" - projectile_type = /obj/item/projectile/bullet/weakbullet3 - -/obj/item/ammo_casing/c46x30mmap - desc = "A 4.6x30mm bullet casing." - caliber = "4.6x30mm" - projectile_type =/obj/item/projectile/bullet/armourpiercing - -/obj/item/ammo_casing/c46x30mmtox - desc = "A 4.6x30mm bullet casing." - caliber = "4.6x30mm" - projectile_type = /obj/item/projectile/bullet/toxinbullet - -/obj/item/ammo_casing/c46x30mminc - desc = "A 4.6x30mm bullet casing." - caliber = "4.6x30mm" - projectile_type = /obj/item/projectile/bullet/incendiary/firebullet - -/obj/item/ammo_casing/c45 - desc = "A .45 bullet casing." - caliber = ".45" - projectile_type = /obj/item/projectile/bullet/midbullet - -/obj/item/ammo_casing/c45nostamina - desc = "A .45 bullet casing." - caliber = ".45" - projectile_type = /obj/item/projectile/bullet/midbullet3 +// 7.62x38mmR (Nagant Revolver) /obj/item/ammo_casing/n762 + name = "7.62x38mmR bullet casing" desc = "A 7.62x38mmR bullet casing." caliber = "n762" - projectile_type = /obj/item/projectile/bullet + projectile_type = /obj/item/projectile/bullet/n762 + +// .50AE (Desert Eagle) + +/obj/item/ammo_casing/a50AE + name = ".50AE bullet casing" + desc = "A .50AE bullet casing." + caliber = ".50" + projectile_type = /obj/item/projectile/bullet/a50AE + +// .38 (Detective's Gun) + +/obj/item/ammo_casing/c38 + name = ".38 bullet casing" + desc = "A .38 bullet casing." + caliber = "38" + projectile_type = /obj/item/projectile/bullet/c38 + +// 10mm (Stechkin) + +/obj/item/ammo_casing/c10mm + name = ".10mm bullet casing" + desc = "A 10mm bullet casing." + caliber = "10mm" + projectile_type = /obj/item/projectile/bullet/c10mm + +/obj/item/ammo_casing/c10mm/ap + name = ".10mm armor-piercing bullet casing" + desc = "A 10mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/c10mm_ap + +/obj/item/ammo_casing/c10mm/hp + name = ".10mm hollow-point bullet casing" + desc = "A 10mm hollow-point bullet casing." + projectile_type = /obj/item/projectile/bullet/c10mm_hp + +/obj/item/ammo_casing/c10mm/fire + name = ".10mm incendiary bullet casing" + desc = "A 10mm incendiary bullet casing." + projectile_type = /obj/item/projectile/bullet/incendiary/c10mm + +// 9mm (Stechkin APS) + +/obj/item/ammo_casing/c9mm + name = "9mm bullet casing" + desc = "A 9mm bullet casing." + caliber = "9mm" + projectile_type = /obj/item/projectile/bullet/c9mm + +/obj/item/ammo_casing/c9mm/ap + name = "9mm armor-piercing bullet casing" + desc = "A 9mm armor-piercing bullet casing." + projectile_type =/obj/item/projectile/bullet/c9mm_ap + +/obj/item/ammo_casing/c9mm/inc + name = "9mm incendiary bullet casing" + desc = "A 9mm incendiary bullet casing." + projectile_type = /obj/item/projectile/bullet/incendiary/c9mm + +// 4.6x30mm (Autorifles) + +/obj/item/ammo_casing/c46x30mm + name = "4.6x30mm bullet casing" + desc = "A 4.6x30mm bullet casing." + caliber = "4.6x30mm" + projectile_type = /obj/item/projectile/bullet/c46x30mm + +/obj/item/ammo_casing/c46x30mm/ap + name = "4.6x30mm armor-piercing bullet casing" + desc = "A 4.6x30mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/c46x30mm_ap + +/obj/item/ammo_casing/c46x30mm/inc + name = "4.6x30mm incendiary bullet casing" + desc = "A 4.6x30mm incendiary bullet casing." + projectile_type = /obj/item/projectile/bullet/incendiary/c46x30mm + +// .45 (M1911) + +/obj/item/ammo_casing/c45 + name = ".45 bullet casing" + desc = "A .45 bullet casing." + caliber = ".45" + projectile_type = /obj/item/projectile/bullet/c45 + +/obj/item/ammo_casing/c45/nostamina + projectile_type = /obj/item/projectile/bullet/c45_nostamina + +// 5.56mm (M-90gl Carbine) /obj/item/ammo_casing/a556 + name = "5.56mm bullet casing" desc = "A 5.56mm bullet casing." caliber = "a556" - projectile_type = /obj/item/projectile/bullet/heavybullet + projectile_type = /obj/item/projectile/bullet/a556 + +// 40mm (Grenade Launcher) /obj/item/ammo_casing/a40mm name = "40mm HE shell" @@ -103,148 +129,93 @@ icon_state = "40mmHE" projectile_type = /obj/item/projectile/bullet/a40mm +// .50 (Sniper) - -/////SNIPER ROUNDS - -/obj/item/ammo_casing/point50 +/obj/item/ammo_casing/p50 + name = ".50 bullet casing" desc = "A .50 bullet casing." caliber = ".50" - projectile_type = /obj/item/projectile/bullet/sniper + projectile_type = /obj/item/projectile/bullet/p50 icon_state = ".50" -/obj/item/ammo_casing/soporific +/obj/item/ammo_casing/p50/soporific + name = ".50 soporific bullet casing" desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell." - caliber = ".50" - projectile_type = /obj/item/projectile/bullet/sniper/soporific + projectile_type = /obj/item/projectile/bullet/p50/soporific icon_state = "sleeper" -/obj/item/ammo_casing/haemorrhage - desc = "A .50 bullet casing, specialised in causing massive bloodloss." - caliber = ".50" - projectile_type = /obj/item/projectile/bullet/sniper/haemorrhage - icon_state = ".50" - -/obj/item/ammo_casing/penetrator +/obj/item/ammo_casing/p50/penetrator + name = ".50 penetrator round bullet casing" desc = "A .50 caliber penetrator round casing." - caliber = ".50" - projectile_type = /obj/item/projectile/bullet/sniper/penetrator - icon_state = ".50" + projectile_type = /obj/item/projectile/bullet/p50/penetrator -/obj/item/ammo_casing/point50/gang - desc = "A black market .50 bullet casing." - projectile_type = /obj/item/projectile/bullet/sniper/gang - -/obj/item/ammo_casing/point50/gang/sleeper - desc = "Am illegally modified tranquilizer round." - projectile_type = /obj/item/projectile/bullet/sniper/gang/sleeper - icon_state = "sleeper" - -/// SAW ROUNDS +// 1.95x129mm (SAW) /obj/item/ammo_casing/mm195x129 + name = "1.95x129mm bullet casing" desc = "A 1.95x129mm bullet casing." icon_state = "762-casing" caliber = "mm195129" - projectile_type = /obj/item/projectile/bullet/saw - -/obj/item/ammo_casing/mm195x129/bleeding - desc = "A 1.95x129mm bullet casing with specialized inner-casing, that when it makes contact with a target, releases tiny shrapnel to induce internal bleeding." - icon_state = "762-casing" - projectile_type = /obj/item/projectile/bullet/saw/bleeding - -/obj/item/ammo_casing/mm195x129/hollow - desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets." - projectile_type = /obj/item/projectile/bullet/saw/hollow + projectile_type = /obj/item/projectile/bullet/mm195x129 /obj/item/ammo_casing/mm195x129/ap + name = "1.95x129mm armor-piercing bullet casing" desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." - projectile_type = /obj/item/projectile/bullet/saw/ap + projectile_type = /obj/item/projectile/bullet/mm195x129_ap + +/obj/item/ammo_casing/mm195x129/hollow + name = "1.95x129mm hollow-point bullet casing" + desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets." + projectile_type = /obj/item/projectile/bullet/mm195x129_hp /obj/item/ammo_casing/mm195x129/incen + name = "1.95x129mm incendiary bullet casing" desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. " - projectile_type = /obj/item/projectile/bullet/saw/incen + projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129 - - - -//SHOTGUN ROUNDS +// Shotgun /obj/item/ammo_casing/shotgun name = "shotgun slug" desc = "A 12 gauge lead slug." icon_state = "blshell" caliber = "shotgun" - projectile_type = /obj/item/projectile/bullet + projectile_type = /obj/item/projectile/bullet/shotgun_slug materials = list(MAT_METAL=4000) - -/obj/item/ammo_casing/shotgun/buckshot - name = "buckshot shell" - desc = "A 12 gauge buckshot shell." - icon_state = "gshell" - projectile_type = /obj/item/projectile/bullet/pellet - pellets = 6 - variance = 25 - -/obj/item/ammo_casing/shotgun/rubbershot - name = "rubber shot" - desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance." - icon_state = "bshell" - projectile_type = /obj/item/projectile/bullet/rpellet - pellets = 6 - variance = 25 - materials = list(MAT_METAL=4000) - - /obj/item/ammo_casing/shotgun/beanbag name = "beanbag slug" desc = "A weak beanbag slug for riot control." icon_state = "bshell" - projectile_type = /obj/item/projectile/bullet/weakbullet + projectile_type = /obj/item/projectile/bullet/shotgun_beanbag materials = list(MAT_METAL=250) +/obj/item/ammo_casing/shotgun/incendiary + name = "incendiary slug" + desc = "An incendiary-coated shotgun slug." + icon_state = "ishell" + projectile_type = /obj/item/projectile/bullet/incendiary/shotgun -/obj/item/ammo_casing/shotgun/improvised - name = "improvised shell" - desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards." - icon_state = "improvshell" - projectile_type = /obj/item/projectile/bullet/pellet/weak - materials = list(MAT_METAL=250) - pellets = 10 - variance = 25 - - -/obj/item/ammo_casing/shotgun/improvised/overload - name = "overloaded improvised shell" - desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards. This one has been packed with even more \ - propellant. It's like playing russian roulette, with a shotgun." - icon_state = "improvshell" - projectile_type = /obj/item/projectile/bullet/pellet/overload - materials = list(MAT_METAL=250) +/obj/item/ammo_casing/shotgun/dragonsbreath + name = "dragonsbreath shell" + desc = "A shotgun shell which fires a spread of incendiary pellets." + icon_state = "ishell2" + projectile_type = /obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath pellets = 4 - variance = 40 - + variance = 35 /obj/item/ammo_casing/shotgun/stunslug name = "taser slug" desc = "A stunning taser slug." icon_state = "stunshell" - projectile_type = /obj/item/projectile/bullet/stunshot + projectile_type = /obj/item/projectile/bullet/shotgun_stunslug materials = list(MAT_METAL=250) - -/obj/item/ammo_casing/shotgun/meteorshot - name = "meteorshot shell" +/obj/item/ammo_casing/shotgun/meteorslug + name = "meteorslug shell" desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired." icon_state = "mshell" - projectile_type = /obj/item/projectile/bullet/meteorshot - -/obj/item/ammo_casing/shotgun/breaching - name = "breaching shell" - desc = "An economic version of the meteorshot, utilizing similar technologies. Great for busting down doors." - icon_state = "mshell" - projectile_type = /obj/item/projectile/bullet/meteorshot/weak + projectile_type = /obj/item/projectile/bullet/shotgun_meteorslug /obj/item/ammo_casing/shotgun/pulseslug name = "pulse slug" @@ -252,27 +223,39 @@ energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \ would have difficulty with." icon_state = "pshell" - projectile_type = /obj/item/projectile/beam/pulse/shot - -/obj/item/ammo_casing/shotgun/incendiary - name = "incendiary slug" - desc = "An incendiary-coated shotgun slug." - icon_state = "ishell" - projectile_type = /obj/item/projectile/bullet/incendiary/shell + projectile_type = /obj/item/projectile/beam/pulse/shotgun /obj/item/ammo_casing/shotgun/frag12 name = "FRAG-12 slug" desc = "A high explosive breaching round for a 12 gauge shotgun." icon_state = "heshell" - projectile_type = /obj/item/projectile/bullet/frag12 + projectile_type = /obj/item/projectile/bullet/shotgun_frag12 -/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath - name = "dragonsbreath shell" - desc = "A shotgun shell which fires a spread of incendiary pellets." - icon_state = "ishell2" - projectile_type = /obj/item/projectile/bullet/incendiary/shell/dragonsbreath - pellets = 4 - variance = 35 +/obj/item/ammo_casing/shotgun/buckshot + name = "buckshot shell" + desc = "A 12 gauge buckshot shell." + icon_state = "gshell" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun_buckshot + pellets = 6 + variance = 25 + +/obj/item/ammo_casing/shotgun/rubbershot + name = "rubber shot" + desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance." + icon_state = "bshell" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun_rubbershot + pellets = 6 + variance = 25 + materials = list(MAT_METAL=4000) + +/obj/item/ammo_casing/shotgun/improvised + name = "improvised shell" + desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards." + icon_state = "improvshell" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun_improvised + materials = list(MAT_METAL=250) + pellets = 10 + variance = 25 /obj/item/ammo_casing/shotgun/ion name = "ion shell" @@ -319,4 +302,4 @@ reagents.add_reagent("spore", 6) reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT reagents.add_reagent("coniine", 6) - reagents.add_reagent("sodium_thiopental", 6) + reagents.add_reagent("sodium_thiopental", 6) \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm index fa9c2ae5b0..11fd12da70 100644 --- a/code/modules/projectiles/ammunition/special.dm +++ b/code/modules/projectiles/ammunition/special.dm @@ -85,7 +85,7 @@ ..() /obj/item/ammo_casing/energy/c3dbullet - projectile_type = /obj/item/projectile/bullet/midbullet3 + projectile_type = /obj/item/projectile/bullet/c3d select_name = "spraydown" fire_sound = 'sound/weapons/gunshot_smg.ogg' e_cost = 20 diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm index 525466be28..5ffe1b475a 100644 --- a/code/modules/projectiles/boxes_magazines/external_mag.dm +++ b/code/modules/projectiles/boxes_magazines/external_mag.dm @@ -1,6 +1,4 @@ - - ///////////EXTERNAL MAGAZINES//////////////// /obj/item/ammo_box/magazine/m10mm @@ -72,25 +70,16 @@ /obj/item/ammo_box/magazine/wt550m9/wtap name = "wt550 magazine (Armour Piercing 4.6x30mm)" icon_state = "46x30mmtA-20" - ammo_type = /obj/item/ammo_casing/c46x30mmap + ammo_type = /obj/item/ammo_casing/c46x30mm/ap /obj/item/ammo_box/magazine/wt550m9/wtap/update_icon() ..() icon_state = "46x30mmtA-[round(ammo_count(),4)]" -/obj/item/ammo_box/magazine/wt550m9/wttx - name = "wt550 magazine (Toxin Tipped 4.6x30mm)" - icon_state = "46x30mmtT-20" - ammo_type = /obj/item/ammo_casing/c46x30mmtox - -/obj/item/ammo_box/magazine/wt550m9/wttx/update_icon() - ..() - icon_state = "46x30mmtT-[round(ammo_count(),4)]" - /obj/item/ammo_box/magazine/wt550m9/wtic name = "wt550 magazine (Incindiary 4.6x30mm)" icon_state = "46x30mmtI-20" - ammo_type = /obj/item/ammo_casing/c46x30mminc + ammo_type = /obj/item/ammo_casing/c46x30mm/inc /obj/item/ammo_box/magazine/wt550m9/wtic/update_icon() ..() @@ -120,15 +109,11 @@ /obj/item/ammo_box/magazine/smgm9mm/ap name = "SMG magazine (Armour Piercing 9mm)" - ammo_type = /obj/item/ammo_casing/c9mmap - -/obj/item/ammo_box/magazine/smgm9mm/toxin - name = "SMG magazine (Toxin Tipped 9mm)" - ammo_type = /obj/item/ammo_casing/c9mmtox + ammo_type = /obj/item/ammo_casing/c9mm/ap /obj/item/ammo_box/magazine/smgm9mm/fire name = "SMG Magazine (Incindiary 9mm)" - ammo_type = /obj/item/ammo_casing/c9mminc + ammo_type = /obj/item/ammo_casing/c9mm/inc /obj/item/ammo_box/magazine/pistolm9mm name = "pistol magazine (9mm)" @@ -145,7 +130,7 @@ name = "SMG magazine (.45)" icon_state = "c20r45-24" origin_tech = "combat=2" - ammo_type = /obj/item/ammo_casing/c45nostamina + ammo_type = /obj/item/ammo_casing/c45/nostamina caliber = ".45" max_ammo = 24 @@ -164,7 +149,7 @@ name = "handgun magazine (.50ae)" icon_state = "50ae" origin_tech = "combat=2" - ammo_type = /obj/item/ammo_casing/a50 + ammo_type = /obj/item/ammo_casing/a50AE caliber = ".50" max_ammo = 7 multiple_sprites = 1 @@ -212,17 +197,17 @@ /obj/item/ammo_box/magazine/m12g/dragon name = "shotgun magazine (12g dragon's breath)" icon_state = "m12gf" - ammo_type = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath + ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath /obj/item/ammo_box/magazine/m12g/bioterror name = "shotgun magazine (12g bioterror)" icon_state = "m12gt" ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror -/obj/item/ammo_box/magazine/m12g/breach - name = "shotgun magazine (12g breacher slugs)" +/obj/item/ammo_box/magazine/m12g/meteor + name = "shotgun magazine (12g meteor slugs)" icon_state = "m12gbc" - ammo_type = /obj/item/ammo_casing/shotgun/breaching + ammo_type = /obj/item/ammo_casing/shotgun/meteorslug //// SNIPER MAGAZINES @@ -231,7 +216,7 @@ name = "sniper rounds (.50)" icon_state = ".50mag" origin_tech = "combat=6;syndicate=2" - ammo_type = /obj/item/ammo_casing/point50 + ammo_type = /obj/item/ammo_casing/p50 max_ammo = 6 caliber = ".50" @@ -246,37 +231,17 @@ desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..." icon_state = "soporific" origin_tech = "combat=6;syndicate=3" - ammo_type = /obj/item/ammo_casing/soporific + ammo_type = /obj/item/ammo_casing/p50/soporific max_ammo = 3 caliber = ".50" -/obj/item/ammo_box/magazine/sniper_rounds/haemorrhage - name = "sniper rounds (Bleed)" - desc = "Haemorrhage sniper rounds, leaves your target in a pool of crimson pain" - icon_state = "haemorrhage" - ammo_type = /obj/item/ammo_casing/haemorrhage - max_ammo = 5 - caliber = ".50" - /obj/item/ammo_box/magazine/sniper_rounds/penetrator name = "sniper rounds (penetrator)" desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it." - ammo_type = /obj/item/ammo_casing/penetrator + ammo_type = /obj/item/ammo_casing/p50/penetrator origin_tech = "combat=6;syndicate=3" max_ammo = 5 -/obj/item/ammo_box/magazine/sniper_rounds/gang - name = "black market sniper rounds (.50)" - icon_state = ".50mag" - origin_tech = "combat=6" - ammo_type = /obj/item/ammo_casing/point50/gang - -/obj/item/ammo_box/magazine/sniper_rounds/gang/sleeper - name = "illegally modified tranquilizer round" - icon_state = "soporific" - origin_tech = "combat=6" - ammo_type = /obj/item/ammo_casing/point50/gang/sleeper - //// SAW MAGAZINES /obj/item/ammo_box/magazine/mm195x129 @@ -287,11 +252,6 @@ caliber = "mm195129" max_ammo = 50 -/obj/item/ammo_box/magazine/mm195x129/bleeding - name = "box magazine (Bleeding 1.95x129mm)" - origin_tech = "combat=3" - ammo_type = /obj/item/ammo_casing/mm195x129/bleeding - /obj/item/ammo_box/magazine/mm195x129/hollow name = "box magazine (Hollow-Point 1.95x129mm)" origin_tech = "combat=3" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 1c076d6776..e5767e48ba 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -21,9 +21,9 @@ attack_verb = list("struck", "hit", "bashed") var/fire_sound = "gunshot" - var/suppressed = 0 //whether or not a message is displayed when fired - var/can_suppress = 0 - var/can_unsuppress = 1 + var/suppressed = null //whether or not a message is displayed when fired + var/can_suppress = FALSE + var/can_unsuppress = TRUE var/recoil = 0 //boom boom shake the room var/clumsy_check = 1 var/obj/item/ammo_casing/chambered = null diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index d65364c062..58ff061e9d 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -4,10 +4,10 @@ icon_state = "pistol" origin_tech = "combat=2;materials=2" w_class = WEIGHT_CLASS_NORMAL - var/spawnwithmagazine = 1 + var/spawnwithmagazine = TRUE var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info var/obj/item/ammo_box/magazine/magazine - var/casing_ejector = 1 //whether the gun ejects the chambered casing + var/casing_ejector = TRUE //whether the gun ejects the chambered casing /obj/item/gun/ballistic/Initialize() . = ..() @@ -70,24 +70,23 @@ to_chat(user, "There's already a magazine in \the [src].") if(istype(A, /obj/item/suppressor)) var/obj/item/suppressor/S = A - if(can_suppress) - if(!suppressed) - if(!user.transferItemToLoc(A, src)) - return - to_chat(user, "You screw [S] onto [src].") - suppressed = A - S.oldsound = fire_sound - S.initial_w_class = w_class - fire_sound = 'sound/weapons/gunshot_silenced.ogg' - w_class = WEIGHT_CLASS_NORMAL //so pistols do not fit in pockets when suppressed - update_icon() - return - else - to_chat(user, "[src] already has a suppressor!") - return - else + if(!can_suppress) to_chat(user, "You can't seem to figure out how to fit [S] on [src]!") return + if(!user.is_holding(src)) + to_chat(user, "You need be holding [src] to fit [S] to it!") + return + if(suppressed) + to_chat(user, "[src] already has a suppressor!") + return + if(user.transferItemToLoc(A, src)) + to_chat(user, "You screw [S] onto [src].") + suppressed = A + S.oldsound = fire_sound + fire_sound = 'sound/weapons/gunshot_silenced.ogg' + w_class += A.w_class //so pistols do not fit in pockets when suppressed + update_icon() + return return 0 /obj/item/gun/ballistic/attack_hand(mob/user) @@ -100,8 +99,8 @@ to_chat(user, "You unscrew [suppressed] from [src].") user.put_in_hands(suppressed) fire_sound = S.oldsound - w_class = S.initial_w_class - suppressed = 0 + w_class -= S.w_class + suppressed = null update_icon() return ..() @@ -137,13 +136,27 @@ boolets += magazine.ammo_count() return boolets +#define BRAINS_BLOWN_THROW_RANGE 3 +#define BRAINS_BLOWN_THROW_SPEED 1 /obj/item/gun/ballistic/suicide_act(mob/user) - if (chambered && chambered.BB && can_trigger_gun(user) && !chambered.BB.nodamage) + var/obj/item/organ/brain/B = user.getorganslot("brain") + if (B && chambered && chambered.BB && can_trigger_gun(user) && !chambered.BB.nodamage) user.visible_message("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!") sleep(25) if(user.is_holding(src)) + var/turf/T = get_turf(user) process_fire(user, user, 0, zone_override = "head") user.visible_message("[user] blows [user.p_their()] brain[user.p_s()] out with [src]!") + var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE) + B.Remove(user) + B.forceMove(T) + var/datum/dna/user_dna + if(iscarbon(user)) + var/mob/living/carbon/C = user + user_dna = C.dna + B.add_blood(user_dna) + var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, /proc/spawn_atom_to_turf, /obj/effect/gibspawner/generic, B, 1, FALSE, list(user_dna)) + B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner) return(BRUTELOSS) else user.visible_message("[user] panics and starts choking to death!") @@ -152,8 +165,8 @@ user.visible_message("[user] is pretending to blow [user.p_their()] brain[user.p_s()] out with [src]! It looks like [user.p_theyre()] trying to commit suicide!
    ") playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1) return (OXYLOSS) - - +#undef BRAINS_BLOWN_THROW_SPEED +#undef BRAINS_BLOWN_THROW_RANGE /obj/item/gun/ballistic/proc/sawoff(mob/user) if(sawn_state == SAWN_OFF) @@ -195,9 +208,8 @@ desc = "A universal syndicate small-arms suppressor for maximum espionage." icon = 'icons/obj/guns/projectile.dmi' icon_state = "suppressor" - w_class = WEIGHT_CLASS_SMALL + w_class = WEIGHT_CLASS_TINY var/oldsound = null - var/initial_w_class = null /obj/item/suppressor/specialoffer diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 5388bf8e0a..7fc37b8c56 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -3,7 +3,7 @@ w_class = WEIGHT_CLASS_NORMAL var/alarmed = 0 var/select = 1 - can_suppress = 1 + can_suppress = TRUE burst_size = 3 fire_delay = 2 actions_types = list(/datum/action/item_action/toggle_firemode) @@ -119,7 +119,7 @@ item_state = "arg" mag_type = /obj/item/ammo_box/magazine/wt550m9 fire_delay = 2 - can_suppress = 0 + can_suppress = FALSE burst_size = 0 actions_types = list() @@ -143,7 +143,7 @@ origin_tech = "combat=5;materials=2;syndicate=6" mag_type = /obj/item/ammo_box/magazine/m556 fire_sound = 'sound/weapons/gunshot_smg.ogg' - can_suppress = 0 + can_suppress = FALSE var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel burst_size = 3 fire_delay = 2 @@ -217,7 +217,7 @@ origin_tech = "combat=5;materials=1;syndicate=3" mag_type = /obj/item/ammo_box/magazine/tommygunm45 fire_sound = 'sound/weapons/gunshot_smg.ogg' - can_suppress = 0 + can_suppress = FALSE burst_size = 4 fire_delay = 1 @@ -230,7 +230,7 @@ origin_tech = "combat=6;engineering=4" mag_type = /obj/item/ammo_box/magazine/m556 fire_sound = 'sound/weapons/gunshot_smg.ogg' - can_suppress = 0 + can_suppress = FALSE burst_size = 3 fire_delay = 1 @@ -246,7 +246,7 @@ origin_tech = "combat=6;materials=4;syndicate=6" mag_type = /obj/item/ammo_box/magazine/m12g fire_sound = 'sound/weapons/gunshot.ogg' - can_suppress = 0 + can_suppress = FALSE burst_size = 1 fire_delay = 0 pin = /obj/item/device/firing_pin/implant/pindicate @@ -286,7 +286,7 @@ weapon_weight = WEAPON_HEAVY fire_sound = 'sound/weapons/gunshot_smg.ogg' var/cover_open = FALSE - can_suppress = 0 + can_suppress = FALSE burst_size = 3 fire_delay = 1 pin = /obj/item/device/firing_pin/implant/pindicate @@ -362,8 +362,8 @@ fire_delay = 40 burst_size = 1 origin_tech = "combat=7" - can_unsuppress = 1 - can_suppress = 1 + can_unsuppress = TRUE + can_suppress = TRUE w_class = WEIGHT_CLASS_NORMAL zoomable = TRUE zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. @@ -384,11 +384,6 @@ pin = /obj/item/device/firing_pin/implant/pindicate origin_tech = "combat=7;syndicate=6" -/obj/item/gun/ballistic/automatic/sniper_rifle/gang - name = "black market sniper rifle" - desc = "A long ranged weapon that does significant damage. It is well worn from years of service." - mag_type = /obj/item/ammo_box/magazine/sniper_rounds/gang - // Old Semi-Auto Rifle // /obj/item/gun/ballistic/automatic/surplus @@ -401,8 +396,8 @@ mag_type = /obj/item/ammo_box/magazine/m10mm/rifle fire_delay = 30 burst_size = 1 - can_unsuppress = 1 - can_suppress = 1 + can_unsuppress = TRUE + can_suppress = TRUE w_class = WEIGHT_CLASS_HUGE slot_flags = SLOT_BACK actions_types = list() @@ -423,11 +418,11 @@ item_state = "arg" mag_type = /obj/item/ammo_box/magazine/recharge fire_delay = 2 - can_suppress = 0 + can_suppress = FALSE burst_size = 0 actions_types = list() fire_sound = 'sound/weapons/laser.ogg' - casing_ejector = 0 + casing_ejector = FALSE /obj/item/gun/ballistic/automatic/laser/update_icon() ..() diff --git a/code/modules/projectiles/guns/ballistic/laser_gatling.dm b/code/modules/projectiles/guns/ballistic/laser_gatling.dm index b73c1b7242..9621c5294d 100644 --- a/code/modules/projectiles/guns/ballistic/laser_gatling.dm +++ b/code/modules/projectiles/guns/ballistic/laser_gatling.dm @@ -109,12 +109,12 @@ weapon_weight = WEAPON_HEAVY fire_sound = 'sound/weapons/laser.ogg' mag_type = /obj/item/ammo_box/magazine/internal/minigun - casing_ejector = 0 + casing_ejector = FALSE flags_2 = SLOWS_WHILE_IN_HAND_2 var/obj/item/minigunpack/ammo_pack /obj/item/gun/ballistic/minigun/Initialize() - if(istype(loc, /obj/item/minigunpack)) //We should spawn inside a ammo pack so let's use that one. + if(istype(loc, /obj/item/minigunpack)) //We should spawn inside an ammo pack so let's use that one. ammo_pack = loc else return INITIALIZE_HINT_QDEL //No pack, no gun diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 6d700e4307..a32d78bb2e 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -40,7 +40,7 @@ burst_size = 1 fire_delay = 0 actions_types = list() - casing_ejector = 0 + casing_ejector = FALSE /obj/item/gun/ballistic/automatic/gyropistol/update_icon() ..() @@ -54,14 +54,14 @@ w_class = WEIGHT_CLASS_BULKY origin_tech = "combat=4;engineering=4" force = 10 - can_suppress = 0 + can_suppress = FALSE mag_type = /obj/item/ammo_box/magazine/internal/speargun fire_sound = 'sound/weapons/grenadelaunch.ogg' burst_size = 1 fire_delay = 0 select = 0 actions_types = list() - casing_ejector = 0 + casing_ejector = FALSE /obj/item/gun/ballistic/automatic/speargun/update_icon() return @@ -84,12 +84,12 @@ mag_type = /obj/item/ammo_box/magazine/internal/rocketlauncher fire_sound = 'sound/weapons/rocketlaunch.ogg' w_class = WEIGHT_CLASS_BULKY - can_suppress = 0 + can_suppress = FALSE burst_size = 1 fire_delay = 0 select = 0 actions_types = list() - casing_ejector = 0 + casing_ejector = FALSE weapon_weight = WEAPON_HEAVY /obj/item/gun/ballistic/automatic/atlauncher/attack_self() diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index c460a24fcf..06bb452b0b 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -5,7 +5,7 @@ w_class = WEIGHT_CLASS_SMALL origin_tech = "combat=3;materials=2;syndicate=4" mag_type = /obj/item/ammo_box/magazine/m10mm - can_suppress = 1 + can_suppress = TRUE burst_size = 1 fire_delay = 0 actions_types = list() @@ -21,7 +21,7 @@ icon_state = "m1911" w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/m45 - can_suppress = 0 + can_suppress = FALSE /obj/item/gun/ballistic/automatic/pistol/deagle name = "desert eagle" @@ -29,7 +29,7 @@ icon_state = "deagle" force = 14 mag_type = /obj/item/ammo_box/magazine/m50 - can_suppress = 0 + can_suppress = FALSE /obj/item/gun/ballistic/automatic/pistol/deagle/update_icon() ..() @@ -57,7 +57,7 @@ w_class = WEIGHT_CLASS_SMALL origin_tech = "combat=3;materials=2;syndicate=3" mag_type = /obj/item/ammo_box/magazine/pistolm9mm - can_suppress = 0 + can_suppress = FALSE burst_size = 3 fire_delay = 2 actions_types = list(/datum/action/item_action/toggle_firemode) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index d31f661336..44bada2771 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -4,7 +4,7 @@ icon_state = "revolver" mag_type = /obj/item/ammo_box/magazine/internal/cylinder origin_tech = "combat=3;materials=2" - casing_ejector = 0 + casing_ejector = FALSE /obj/item/gun/ballistic/revolver/Initialize() . = ..() @@ -159,7 +159,7 @@ desc = "An old model of revolver that originated in Russia. Able to be suppressed. Uses 7.62x38mmR ammo." icon_state = "nagant" origin_tech = "combat=3" - can_suppress = 1 + can_suppress = TRUE mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev762 @@ -270,7 +270,7 @@ "Dark Red Finish" = "dshotgun-d", "Ash" = "dshotgun-f", "Faded Grey" = "dshotgun-g", - "Maple" = "dshotgun-1", + "Maple" = "dshotgun-l", "Rosewood" = "dshotgun-p" ) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 9e220b12b8..71bdce7f28 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -9,7 +9,7 @@ slot_flags = SLOT_BACK origin_tech = "combat=4;materials=2" mag_type = /obj/item/ammo_box/magazine/internal/shot - casing_ejector = 0 + casing_ejector = FALSE var/recentpump = 0 // to prevent spammage weapon_weight = WEAPON_MEDIUM diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 3ddd6375b2..c251a791d0 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -12,7 +12,7 @@ can_suppress = TRUE clumsy_check = 0 needs_permit = 0 - casing_ejector = 0 + casing_ejector = FALSE /obj/item/gun/ballistic/automatic/toy/unrestricted pin = /obj/item/device/firing_pin @@ -55,7 +55,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/toy clumsy_check = 0 needs_permit = 0 - casing_ejector = 0 + casing_ejector = FALSE can_suppress = FALSE /obj/item/gun/ballistic/shotgun/toy/process_chamber(empty_chamber = 0) @@ -84,7 +84,7 @@ can_suppress = TRUE needs_permit = 0 mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot - casing_ejector = 0 + casing_ejector = FALSE /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted //Use this for actual toys pin = /obj/item/device/firing_pin @@ -100,7 +100,7 @@ can_suppress = FALSE needs_permit = 0 mag_type = /obj/item/ammo_box/magazine/toy/m762/riot - casing_ejector = 0 + casing_ejector = FALSE /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted //Use this for actual toys pin = /obj/item/device/firing_pin diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/beam_rifle.dm index 32f366f136..93e8ab6799 100644 --- a/code/modules/projectiles/guns/beam_rifle.dm +++ b/code/modules/projectiles/guns/beam_rifle.dm @@ -35,10 +35,10 @@ canMouseDown = TRUE pin = null var/aiming = FALSE - var/aiming_time = 7 - var/aiming_time_fire_threshold = 2 - var/aiming_time_left = 7 - var/aiming_time_increase_user_movement = 3 + var/aiming_time = 12 + var/aiming_time_fire_threshold = 5 + var/aiming_time_left = 12 + var/aiming_time_increase_user_movement = 6 var/scoped_slow = 1 var/aiming_time_increase_angle_multiplier = 0.3 @@ -63,6 +63,8 @@ var/projectile_setting_pierce = TRUE var/delay = 65 var/lastfire = 0 + + var/lastprocess = 0 //ZOOMING var/zoom_current_view_increase = 0 @@ -246,9 +248,9 @@ return check_user() handle_zooming() - if(aiming_time_left > 0) - aiming_time_left-- - aiming_beam(TRUE) + aiming_time_left = min(0, aiming_time_left - (world.time - lastprocess)) + aiming_beam(TRUE) + lastprocess = world.time /obj/item/gun/energy/beam_rifle/proc/check_user(automatic_cleanup = TRUE) if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it! @@ -678,7 +680,7 @@ pixel_x = pixel_x_offset pixel_y = pixel_y_offset else - animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags_1 = ANIMATION_END_NOW) + animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags = ANIMATION_END_NOW) old_pixel_x = pixel_x_offset old_pixel_y = pixel_y_offset if(can_hit_target(original, permutated)) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 0eb6a7137d..96777a050a 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -534,7 +534,7 @@ /obj/item/borg/upgrade/modkit/tracer/adjustable name = "adjustable tracer bolts" - desc = "Causes kinetic accelerator bolts to have a adjustable-colored tracer trail and explosion. Use in-hand to change color." + desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color." /obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user) bolt_color = input(user,"Choose Color") as color diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index fa7540315e..9e91275c4f 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -90,7 +90,7 @@ w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=2000) origin_tech = "combat=4;magnets=4;syndicate=5" - suppressed = 1 + suppressed = TRUE ammo_type = list(/obj/item/ammo_casing/energy/bolt) weapon_weight = WEAPON_LIGHT unique_rename = 0 @@ -115,7 +115,7 @@ w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=4000) origin_tech = "combat=4;magnets=4;syndicate=2" - suppressed = 0 + suppressed = null ammo_type = list(/obj/item/ammo_casing/energy/bolt/large) pin = null diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index 0d0cbeae10..f79b59fe7d 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -76,8 +76,8 @@ w_class = WEIGHT_CLASS_SMALL origin_tech = "combat=2;syndicate=2;biotech=3" force = 2 //Also very weak because it's smaller - suppressed = 1 //Softer fire sound - can_unsuppress = 0 //Permanently silenced + suppressed = TRUE //Softer fire sound + can_unsuppress = FALSE //Permanently silenced /obj/item/gun/syringe/dna name = "modified syringe gun" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 527d02e52a..e18ac0ab5c 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -13,7 +13,7 @@ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF var/def_zone = "" //Aiming at var/mob/firer = null//Who shot it - var/suppressed = 0 //Attack message + var/suppressed = FALSE //Attack message var/yo = null var/xo = null var/current = null @@ -324,7 +324,6 @@ //Split Y+Pixel_Y up into list(Y, Pixel_Y) var/list/screen_loc_Y = splittext(screen_loc_params[2],":") - // to_chat(world, "X: [screen_loc_X[1]] PixelX: [screen_loc_X[2]] / Y: [screen_loc_Y[1]] PixelY: [screen_loc_Y[2]]") var/x = text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32 var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32 @@ -333,9 +332,7 @@ var/ox = round(screenview/2) - user.client.pixel_x //"origin" x var/oy = round(screenview/2) - user.client.pixel_y //"origin" y - // to_chat(world, "Pixel position: [x] [y]") angle = Atan2(y - oy, x - ox) - // to_chat(world, "Angle: [angle]") return list(angle, p_x, p_y) /obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it. diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 844a8a4662..d1d7b50cf5 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -77,7 +77,7 @@ if(isturf(target) || istype(target, /obj/structure/)) target.ex_act(EXPLODE_HEAVY) -/obj/item/projectile/beam/pulse/shot +/obj/item/projectile/beam/pulse/shotgun damage = 40 /obj/item/projectile/beam/pulse/heavy diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index d11fa850c2..6f4ae50243 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -3,105 +3,238 @@ icon_state = "bullet" damage = 60 damage_type = BRUTE - nodamage = 0 + nodamage = FALSE flag = "bullet" hitsound_wall = "ricochet" impact_effect_type = /obj/effect/temp_visual/impact_effect -/obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage - damage = 5 - stamina = 80 - -/obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down - damage = 15 - knockdown = 30 - stamina = 50 - -/obj/item/projectile/bullet/weakbullet3 - damage = 20 - -/obj/item/projectile/bullet/toxinbullet - damage = 15 - damage_type = TOX - -/obj/item/projectile/bullet/incendiary/firebullet - damage = 10 - -/obj/item/projectile/bullet/armourpiercing - damage = 15 - armour_penetration = 40 - -/obj/item/projectile/bullet/pellet - name = "pellet" - damage = 12.5 - /obj/item/projectile/bullet/pellet/Range() ..() damage += -0.75 if(damage < 0) qdel(src) -/obj/item/projectile/bullet/pellet/weak - damage = 6 - -/obj/item/projectile/bullet/pellet/weak/New() - range = rand(1, 8) - ..() - -/obj/item/projectile/bullet/pellet/weak/on_range() - do_sparks(1, TRUE, src) - ..() - -/obj/item/projectile/bullet/pellet/overload - damage = 3 - -/obj/item/projectile/bullet/pellet/overload/New() - range = rand(1, 10) - ..() - -/obj/item/projectile/bullet/pellet/overload/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, 0, 0, 2) - -/obj/item/projectile/bullet/pellet/overload/on_range() - explosion(src, 0, 0, 2) - do_sparks(3, TRUE, src) - ..() - -/obj/item/projectile/bullet/midbullet +/obj/item/projectile/bullet/incendiary damage = 20 - stamina = 65 //two round bursts from the c20r knocks people down + var/fire_stacks = 4 +/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/M = target + M.adjust_fire_stacks(fire_stacks) + M.IgniteMob() -/obj/item/projectile/bullet/midbullet2 - damage = 25 +/obj/item/projectile/bullet/incendiary/Move() + . = ..() + var/turf/location = get_turf(src) + if(location) + new /obj/effect/hotspot(location) + location.hotspot_expose(700, 50, 1) -/obj/item/projectile/bullet/midbullet3 +// .357 (Syndie Revolver) + +/obj/item/projectile/bullet/a357 + name = ".357 bullet" + damage = 60 + +// 7.62 (Nagant Rifle) + +/obj/item/projectile/bullet/a762 + name = "7.62 bullet" + damage = 60 + +/obj/item/projectile/bullet/a762_enchanted + name = "enchanted 7.62 bullet" + damage = 5 + stamina = 80 + +// 7.62x38mmR (Nagant Revolver) + +/obj/item/projectile/bullet/n762 + name = "7.62x38mmR bullet" + damage = 60 + +// .50AE (Desert Eagle) + +/obj/item/projectile/bullet/a50AE + name = ".50AE bullet" + damage = 60 + +// .38 (Detective's Gun) + +/obj/item/projectile/bullet/c38 + name = ".38 bullet" + damage = 15 + knockdown = 30 + stamina = 50 + +// 10mm (Stechkin) + +/obj/item/projectile/bullet/c10mm + name = "10mm bullet" damage = 30 -/obj/item/projectile/bullet/midbullet3/hp - damage = 40 - armour_penetration = -50 - -/obj/item/projectile/bullet/midbullet3/ap +/obj/item/projectile/bullet/c10mm_ap + name = "10mm armor-piercing bullet" damage = 27 armour_penetration = 40 -/obj/item/projectile/bullet/midbullet3/fire/on_hit(atom/target, blocked = FALSE) - if(..(target, blocked)) - var/mob/living/M = target - M.adjust_fire_stacks(1) - M.IgniteMob() +/obj/item/projectile/bullet/c10mm_hp + name = "10mm hollow-point bullet" + damage = 40 + armour_penetration = -50 -/obj/item/projectile/bullet/heavybullet +/obj/item/projectile/bullet/incendiary/c10mm + name = "10mm incendiary bullet" + damage = 15 + fire_stacks = 2 + +// 9mm (Stechkin APS) + +/obj/item/projectile/bullet/c9mm + name = "9mm bullet" + damage = 20 + +/obj/item/projectile/bullet/c9mm_ap + name = "9mm armor-piercing bullet" + damage = 15 + armour_penetration = 40 + +/obj/item/projectile/bullet/incendiary/c9mm + name = "9mm incendiary bullet" + damage = 10 + fire_stacks = 1 + +// 4.6x30mm (Autorifles) + +/obj/item/projectile/bullet/c46x30mm + desc = "4.6x30mm bullet" + damage = 20 + +/obj/item/projectile/bullet/c46x30mm_ap + name = "4.6x30mm armor-piercing bullet" + damage = 15 + armour_penetration = 40 + +/obj/item/projectile/bullet/incendiary/c46x30mm + name = "4.6x30mm incendiary bullet" + damage = 10 + fire_stacks = 1 + +// .45 (M1911) + +/obj/item/projectile/bullet/c45 + name = ".45 bullet" + damage = 20 + stamina = 65 + +/obj/item/projectile/bullet/c45_nostamina + name = ".45 bullet" + damage = 20 + +// 5.56mm (M-90gl Carbine) + +/obj/item/projectile/bullet/a556 + name = "5.56mm bullet" damage = 35 -/obj/item/projectile/bullet/rpellet - damage = 3 - stamina = 25 +// 40mm (Grenade Launcher -/obj/item/projectile/bullet/stunshot //taser slugs for shotguns, nothing special - name = "stunshot" +/obj/item/projectile/bullet/a40mm + name ="40mm grenade" + desc = "USE A WEEL GUN" + icon_state= "bolter" + damage = 60 + +/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 0, 2, 1, 0, flame_range = 3) + return TRUE + +// .50 (Sniper) + +/obj/item/projectile/bullet/p50 + name =".50 bullet" + speed = 0 //360 alwaysscope. + damage = 70 + knockdown = 100 + dismemberment = 50 + armour_penetration = 50 + var/breakthings = TRUE + +/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0) + if((blocked != 100) && (!ismob(target) && breakthings)) + target.ex_act(rand(1,2)) + return ..() + +/obj/item/projectile/bullet/p50/soporific + name =".50 soporific bullet" + armour_penetration = 0 + nodamage = TRUE + dismemberment = 0 + knockdown = 0 + breakthings = FALSE + +/obj/item/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && isliving(target)) + var/mob/living/L = target + L.Sleeping(400) + return ..() + +/obj/item/projectile/bullet/p50/penetrator + name =".50 penetrator bullet" + icon_state = "gauss" + name = "penetrator round" + damage = 60 + forcedodge = TRUE + dismemberment = 0 //It goes through you cleanly. + knockdown = 0 + breakthings = FALSE + +// 1.95x129mm (SAW) + +/obj/item/projectile/bullet/mm195x129 + name = "1.95x129mm bullet" + damage = 45 + armour_penetration = 5 + +/obj/item/projectile/bullet/mm195x129_ap + name = "1.95x129mm armor-piercing bullet" + damage = 40 + armour_penetration = 75 + +/obj/item/projectile/bullet/mm195x129_hp + name = "1.95x129mm hollow-point bullet" + damage = 60 + armour_penetration = -60 + +/obj/item/projectile/bullet/incendiary/mm195x129 + name = "1.95x129mm incendiary bullet" + damage = 15 + fire_stacks = 3 + +// Shotgun + +/obj/item/projectile/bullet/shotgun_slug + name = "12g shotgun slug" + damage = 60 + +/obj/item/projectile/bullet/shotgun_beanbag + name = "beanbag slug" + damage = 5 + stamina = 80 + +/obj/item/projectile/bullet/incendiary/shotgun + name = "incendiary slug" + damage = 20 + +/obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath + name = "dragonsbreath pellet" + damage = 5 + +/obj/item/projectile/bullet/shotgun_stunslug + name = "stunslug" damage = 5 knockdown = 100 stutter = 5 @@ -110,47 +243,90 @@ icon_state = "spark" color = "#FFFF00" -/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE) - . = ..() - if(iscarbon(target)) - var/mob/living/carbon/M = target - M.adjust_fire_stacks(4) - M.IgniteMob() - - -/obj/item/projectile/bullet/incendiary/shell - name = "incendiary slug" - damage = 20 - -/obj/item/projectile/bullet/incendiary/shell/Move() - ..() - var/turf/location = get_turf(src) - if(location) - new /obj/effect/hotspot(location) - location.hotspot_expose(700, 50, 1) - -/obj/item/projectile/bullet/incendiary/shell/dragonsbreath - name = "dragonsbreath round" - damage = 5 - - -/obj/item/projectile/bullet/meteorshot - name = "meteor" +/obj/item/projectile/bullet/shotgun_meteorslug + name = "meteorslug" icon = 'icons/obj/meteor.dmi' icon_state = "dust" - damage = 30 - knockdown = 160 + damage = 20 + knockdown = 80 hitsound = 'sound/effects/meteorimpact.ogg' -/obj/item/projectile/bullet/meteorshot/weak - damage = 10 - knockdown = 80 +/obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE) + . = ..() + if(ismovableatom(target)) + var/atom/movable/M = target + var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) + M.throw_at(throw_target, 3, 2) + +/obj/item/projectile/bullet/shotgun_meteorslug/Initialize() + . = ..() + SpinAnimation() + +/obj/item/projectile/bullet/shotgun_frag12 + name ="frag12 slug" + damage = 25 + knockdown = 50 + +/obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 0, 1) + return TRUE + +/obj/item/projectile/bullet/pellet/shotgun_buckshot + name = "buckshot pellet" + damage = 12.5 + +/obj/item/projectile/bullet/pellet/shotgun_rubbershot + damage = 3 + stamina = 25 + +/obj/item/projectile/bullet/pellet/shotgun_improvised + damage = 6 + +/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize() + . = ..() + range = rand(1, 8) + +/obj/item/projectile/bullet/pellet/shotgun_improvised/on_range() + do_sparks(1, TRUE, src) + ..() + +// Scattershot + +/obj/item/projectile/bullet/scattershot + damage = 20 + stamina = 65 + +// LMD (exosuits) + +/obj/item/projectile/bullet/lmg + damage = 20 + +// Turrets + +/obj/item/projectile/bullet/manned_turret + damage = 20 + +/obj/item/projectile/bullet/syndicate_turret + damage = 20 + +// FNX-99 (Mechs) + +/obj/item/projectile/bullet/incendiary/fnx99 + damage = 20 + +// C3D (Borgs) + +/obj/item/projectile/bullet/c3d + damage = 20 + +// Honker /obj/item/projectile/bullet/honker damage = 0 knockdown = 60 - forcedodge = 1 - nodamage = 1 + forcedodge = TRUE + nodamage = TRUE hitsound = 'sound/items/bikehorn.ogg' icon = 'icons/obj/hydroponics/harvest.dmi' icon_state = "banana" @@ -160,17 +336,7 @@ ..() SpinAnimation() -/obj/item/projectile/bullet/meteorshot/on_hit(atom/target, blocked = FALSE) - . = ..() - if(ismovableatom(target)) - var/atom/movable/M = target - var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) - M.throw_at(throw_target, 3, 2) - -/obj/item/projectile/bullet/meteorshot/New() - ..() - SpinAnimation() - +// Mime /obj/item/projectile/bullet/mime damage = 20 @@ -181,6 +347,7 @@ var/mob/living/carbon/M = target M.silent = max(M.silent, 10) +// Darts /obj/item/projectile/bullet/dart name = "dart" @@ -210,7 +377,7 @@ ..(target, blocked) reagents.set_reacting(TRUE) reagents.handle_reactions() - return 1 + return TRUE /obj/item/projectile/bullet/dart/metalfoam/New() ..() @@ -223,18 +390,7 @@ name = "syringe" icon_state = "syringeproj" -/obj/item/projectile/bullet/neurotoxin - name = "neurotoxin spit" - icon_state = "neurotoxin" - damage = 5 - damage_type = TOX - knockdown = 100 - -/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE) - if(isalien(target)) - knockdown = 0 - nodamage = 1 - . = ..() // Execute the rest of the code. +// DNA injector /obj/item/projectile/bullet/dnainjector name = "\improper DNA injector" @@ -261,121 +417,3 @@ QDEL_NULL(injector) return ..() -//// SNIPER BULLETS - -/obj/item/projectile/bullet/sniper - speed = 0 //360 alwaysscope. - damage = 70 - knockdown = 100 - dismemberment = 50 - armour_penetration = 50 - var/breakthings = TRUE - -/obj/item/projectile/bullet/sniper/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && (!ismob(target) && breakthings)) - target.ex_act(rand(1,2)) - return ..() - -/obj/item/projectile/bullet/sniper/gang - damage = 55 - knockdown = 20 - dismemberment = 15 - armour_penetration = 25 - -/obj/item/projectile/bullet/sniper/gang/sleeper - nodamage = 1 - knockdown = 0 - dismemberment = 0 - breakthings = FALSE - -/obj/item/projectile/bullet/sniper/gang/sleeper/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && isliving(target)) - var/mob/living/L = target - L.blur_eyes(8) - if(L.staminaloss >= 40) - L.Sleeping(400) - else - L.adjustStaminaLoss(55) - return 1 - -/obj/item/projectile/bullet/sniper/soporific - armour_penetration = 0 - nodamage = 1 - dismemberment = 0 - knockdown = 0 - breakthings = FALSE - -/obj/item/projectile/bullet/sniper/soporific/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && isliving(target)) - var/mob/living/L = target - L.Sleeping(400) - return ..() - - -/obj/item/projectile/bullet/sniper/haemorrhage - armour_penetration = 15 - damage = 15 - dismemberment = 0 - knockdown = 0 - breakthings = FALSE - -/obj/item/projectile/bullet/sniper/haemorrhage/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && iscarbon(target)) - var/mob/living/carbon/C = target - C.bleed(100) - return ..() - - -/obj/item/projectile/bullet/sniper/penetrator - icon_state = "gauss" - name = "penetrator round" - damage = 60 - forcedodge = 1 - dismemberment = 0 //It goes through you cleanly. - knockdown = 0 - breakthings = FALSE - - - -//// SAW BULLETS - - -/obj/item/projectile/bullet/saw - damage = 45 - armour_penetration = 5 - -/obj/item/projectile/bullet/saw/bleeding - damage = 20 - armour_penetration = 0 - -/obj/item/projectile/bullet/saw/bleeding/on_hit(atom/target, blocked = FALSE) - . = ..() - if((blocked != 100) && iscarbon(target)) - var/mob/living/carbon/C = target - C.bleed(35) - -/obj/item/projectile/bullet/saw/hollow - damage = 60 - armour_penetration = -60 - -/obj/item/projectile/bullet/saw/ap - damage = 40 - armour_penetration = 75 - -/obj/item/projectile/bullet/saw/incen - damage = 7 - armour_penetration = 0 - -/obj/item/projectile/bullet/saw/incen/Move() - ..() - var/turf/location = get_turf(src) - if(location) - new /obj/effect/hotspot(location) - location.hotspot_expose(700, 50, 1) - -/obj/item/projectile/bullet/saw/incen/on_hit(atom/target, blocked = FALSE) - . = ..() - if(iscarbon(target)) - var/mob/living/carbon/M = target - M.adjust_fire_stacks(3) - M.IgniteMob() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index f9f7686a46..79a3d51eec 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -32,17 +32,6 @@ explosion(target, -1, 0, 2) return 1 -/obj/item/projectile/bullet/a40mm - name ="40mm grenade" - desc = "USE A WEEL GUN" - icon_state= "bolter" - damage = 60 - -/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 0, 2, 1, 0, flame_range = 3) - return 1 - /obj/item/projectile/bullet/a84mm name ="anti-armour rocket" desc = "USE A WEEL GUN" @@ -184,16 +173,6 @@ qdel(src) gun.create_portal(src, get_turf(src)) -/obj/item/projectile/bullet/frag12 - name ="explosive slug" - damage = 25 - knockdown = 50 - -/obj/item/projectile/bullet/frag12/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 0, 1) - return 1 - /obj/item/projectile/plasma name = "plasma blast" icon_state = "plasmacutter" @@ -616,3 +595,19 @@ /obj/item/projectile/hallucination/death/hal_apply_effect() new /datum/hallucination/death(hal_target, TRUE) + +// Neurotoxin + +/obj/item/projectile/bullet/neurotoxin + name = "neurotoxin spit" + icon_state = "neurotoxin" + damage = 5 + damage_type = TOX + knockdown = 100 + +/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE) + if(isalien(target)) + knockdown = 0 + nodamage = TRUE + return ..() + diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6ef7d778b6..9bcd909faf 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -566,6 +566,8 @@ my_atom.on_reagent_change() if(!no_react) handle_reactions() + if(isliving(my_atom)) + R.on_mob_add(my_atom) return TRUE else @@ -669,7 +671,6 @@ for(var/reagent in cached_reagents) var/datum/reagent/R = reagent if(R.id == reagent_id) - //to_chat(world, "proffering a data-carrying reagent ([reagent_id])") return R.data /datum/reagents/proc/set_data(reagent_id, new_data) @@ -677,7 +678,6 @@ for(var/reagent in cached_reagents) var/datum/reagent/R = reagent if(R.id == reagent_id) - //to_chat(world, "reagent data set ([reagent_id])") R.data = new_data /datum/reagents/proc/copy_data(datum/reagent/current_reagent) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 538ae996ea..ec4a1f58f8 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -112,8 +112,8 @@ data["maxEnergy"] = cell.maxcharge * powerefficiency data["isBeakerLoaded"] = beaker ? 1 : 0 - var beakerContents[0] - var beakerCurrentVolume = 0 + var/beakerContents[0] + var/beakerCurrentVolume = 0 if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) for(var/datum/reagent/R in beaker.reagents.reagent_list) beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list... @@ -129,7 +129,7 @@ data["beakerMaxVolume"] = null data["beakerTransferAmounts"] = null - var chemicals[0] + var/chemicals[0] var/is_hallucinating = FALSE if(user.hallucinating()) is_hallucinating = TRUE diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index ce1f469f8d..abe58cb79d 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -10,11 +10,11 @@ circuit = /obj/item/circuitboard/machine/chem_heater var/obj/item/reagent_containers/beaker = null var/target_temperature = 300 - var/heater_coefficient = 0.10 + var/heater_coefficient = 0.1 var/on = FALSE /obj/machinery/chem_heater/RefreshParts() - heater_coefficient = 0.10 + heater_coefficient = 0.1 for(var/obj/item/stock_parts/micro_laser/M in component_parts) heater_coefficient *= M.rating diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 802e4c70ca..c6a01bc45f 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -133,13 +133,13 @@ data["pillBotMaxContent"] = bottle.storage_slots - var beakerContents[0] + var/beakerContents[0] if(beaker) for(var/datum/reagent/R in beaker.reagents.reagent_list) beakerContents.Add(list(list("name" = R.name, "id" = R.id, "volume" = R.volume))) // list in a list because Byond merges the first list... data["beakerContents"] = beakerContents - var bufferContents[0] + var/bufferContents[0] if(reagents.total_volume) for(var/datum/reagent/N in reagents.reagent_list) bufferContents.Add(list(list("name" = N.name, "id" = N.id, "volume" = N.volume))) // ^ diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index bc98badc51..342e2154f8 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -58,6 +58,10 @@ holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. return +// Called when this reagent is first added to a mob +/datum/reagent/proc/on_mob_add(mob/M) + return + // Called when this reagent is removed while inside a mob /datum/reagent/proc/on_mob_delete(mob/M) return diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 5e3bf0f749..c114f7017b 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -69,7 +69,7 @@ All effects don't start immediately, but rather get worse over time; the rate is for(var/s in C.surgeries) var/datum/surgery/S = s - S.success_multiplier = max(0.10*power_multiplier, S.success_multiplier) + S.success_multiplier = max(0.1*power_multiplier, S.success_multiplier) // +10% success propability on each step, useful while operating in less-than-perfect conditions return ..() @@ -470,6 +470,13 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Bloody Mary" glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." +/datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/M) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(C.blood_volume < BLOOD_VOLUME_NORMAL) + C.blood_volume = min(BLOOD_VOLUME_NORMAL, C.blood_volume + 3) //Bloody Mary quickly restores blood loss. + ..() + /datum/reagent/consumable/ethanol/brave_bull name = "Brave Bull" id = "bravebull" @@ -480,16 +487,18 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bravebullglass" glass_name = "Brave Bull" glass_desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up." + var/tough_text -/datum/reagent/consumable/ethanol/brave_bull/on_mob_life(mob/living/M) - if(M.maxHealth == initial(M.maxHealth)) //Brave Bull makes you sturdier, and thus capable of withstanding a tiny bit more punishment. - M.maxHealth += 5 - M.health += 5 - return ..() +/datum/reagent/consumable/ethanol/brave_bull/on_mob_add(mob/living/M) + tough_text = pick("brawny", "tenacious", "tough", "hardy", "sturdy") //Tuff stuff + to_chat(M, "You feel [tough_text]!") + M.maxHealth += 10 //Brave Bull makes you sturdier, and thus capable of withstanding a tiny bit more punishment. + M.health += 10 /datum/reagent/consumable/ethanol/brave_bull/on_mob_delete(mob/living/M) - if(M.maxHealth != initial(M.maxHealth)) - M.maxHealth = initial(M.maxHealth) + to_chat(M, "You no longer feel [tough_text].") + M.maxHealth -= 10 + M.health = min(M.health - 10, M.maxHealth) //This can indeed crit you if you're alive solely based on alchol ingestion /datum/reagent/consumable/ethanol/tequila_sunrise name = "Tequila Sunrise" @@ -501,6 +510,23 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "tequilasunriseglass" glass_name = "tequila Sunrise" glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." + var/obj/effect/light_holder + +/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_add(mob/living/M) + to_chat(M, "You feel gentle warmth spread through your body!") + light_holder = new(M) + light_holder.set_light(3, 0.7, "#FFCC00") //Tequila Sunrise makes you radiate dim light, like a sunrise! + +/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_life(mob/living/M) + if(QDELETED(light_holder)) + M.reagents.del_reagent("tequilasunrise") //If we lost our light object somehow, remove the reagent + else if(light_holder.loc != M) + light_holder.forceMove(M) + return ..() + +/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_delete(mob/living/M) + to_chat(M, "The warmth in your body fades.") + QDEL_NULL(light_holder) /datum/reagent/consumable/ethanol/toxins_special name = "Toxins Special" @@ -556,6 +582,21 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "manlydorfglass" glass_name = "The Manly Dorf" glass_desc = "A manly concoction made from Ale and Beer. Intended for true men only." + var/dorf_mode + +/datum/reagent/consumable/ethanol/manly_dorf/on_mob_add(mob/living/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.dna.check_mutation(DWARFISM)) + to_chat(H, "Now THAT is MANLY!") + boozepwr = 5 //We've had worse in the mines + dorf_mode = TRUE + +/datum/reagent/consumable/ethanol/manly_dorf/on_mob_life(mob/living/M) + if(dorf_mode) + M.adjustBruteLoss(-2) + M.adjustFireLoss(-2) + return ..() /datum/reagent/consumable/ethanol/longislandicedtea name = "Long Island Iced Tea" @@ -592,6 +633,9 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Kahlua, Irish Cream, and cognac. You will get bombed." shot_glass_icon_state = "b52glass" +/datum/reagent/consumable/ethanol/b52/on_mob_add(mob/living/M) + playsound(M, 'sound/effects/explosion_distant.ogg', 100, FALSE) + /datum/reagent/consumable/ethanol/irishcoffee name = "Irish Coffee" id = "irishcoffee" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 57a7f3445d..ab9d95582b 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -353,7 +353,7 @@ var/mob/living/carbon/C = M for(var/s in C.surgeries) var/datum/surgery/S = s - S.success_multiplier = max(0.10, S.success_multiplier) + S.success_multiplier = max(0.1, S.success_multiplier) // +10% success propability on each step, useful while operating in less-than-perfect conditions if(show_message) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index ffc24882fd..6e02cc5696 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -112,7 +112,7 @@ /datum/reagent/water name = "Water" id = "water" - description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." + description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen." color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha) taste_description = "water" var/cooling_temperature = 2 @@ -160,8 +160,8 @@ cube.Expand() // Dehydrated carp - else if(istype(O, /obj/item/toy/carpplushie/dehy_carp)) - var/obj/item/toy/carpplushie/dehy_carp/dehy = O + else if(istype(O, /obj/item/toy/plush/carpplushie/dehy_carp)) + var/obj/item/toy/plush/carpplushie/dehy_carp/dehy = O dehy.Swell() // Makes a carp else if(istype(O, /obj/item/stack/sheet/hairlesshide)) @@ -797,7 +797,7 @@ var/mob/living/carbon/C = M for(var/s in C.surgeries) var/datum/surgery/S = s - S.success_multiplier = max(0.20, S.success_multiplier) + S.success_multiplier = max(0.2, S.success_multiplier) // +20% success propability on each step, useful while operating in less-than-perfect conditions ..() @@ -1081,7 +1081,7 @@ /datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. name = "Foaming agent" id = "foaming_agent" - description = "A agent that yields metallic foam when mixed with light metal and a strong acid." + description = "An agent that yields metallic foam when mixed with light metal and a strong acid." reagent_state = SOLID color = "#664B63" // rgb: 102, 75, 99 taste_description = "metal" @@ -1089,7 +1089,7 @@ /datum/reagent/smart_foaming_agent //Smart foaming agent. Functions similarly to metal foam, but conforms to walls. name = "Smart foaming agent" id = "smart_foaming_agent" - description = "A agent that yields metallic foam which conforms to area boundaries when mixed with light metal and a strong acid." + description = "An agent that yields metallic foam which conforms to area boundaries when mixed with light metal and a strong acid." reagent_state = SOLID color = "#664B63" // rgb: 102, 75, 99 taste_description = "metal" @@ -1576,13 +1576,13 @@ /datum/reagent/magillitis name = "Magillitis" id = "magillitis" - description = "An experimental serum which causes rapid muscular growth in basic primates. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." + description = "An experimental serum which causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." reagent_state = LIQUID color = "#00f041" /datum/reagent/magillitis/on_mob_life(mob/living/carbon/M) ..() - if(ismonkey(M) && current_cycle >= 10) + if((ismonkey(M) || ishuman(M)) && current_cycle >= 10) return M.gorillize() /datum/reagent/growthserum diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index d0dadc271e..fd7d5750f1 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -831,7 +831,7 @@ /datum/reagent/toxin/acid/fluacid name = "Fluorosulfuric acid" id = "facid" - description = "Fluorosulfuric acid is a an extremely corrosive chemical substance." + description = "Fluorosulfuric acid is an extremely corrosive chemical substance." color = "#5050FF" toxpwr = 2 acidpwr = 42.0 diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index ba106e8cd3..9321595a8d 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -13,6 +13,14 @@ /obj/item/reagent_containers/pill/patch/afterattack(obj/target, mob/user , proximity) return // thanks inheritance again +/obj/item/reagent_containers/pill/patch/attack(mob/living/L, mob/user) + if(ishuman(L)) + var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) + if(affecting.status != BODYPART_ORGANIC) + to_chat(user, "Medicine won't work on a robotic limb!") + return + ..() + /obj/item/reagent_containers/pill/patch/canconsume(mob/eater, mob/user) if(!iscarbon(eater)) return 0 diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 1364766f44..67d15f7240 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -175,4 +175,5 @@ desc = "A dispenser of low-potency virus mutagenic." icon_state = "virus_food" anchored = TRUE + density = FALSE reagent_id = "virusfood" \ No newline at end of file diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index 9015320c56..acb89f4bee 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -97,7 +97,7 @@ return null // merge two holder objects -// used when a a holder meets a stuck holder +// used when a holder meets a stuck holder /obj/structure/disposalholder/proc/merge(obj/structure/disposalholder/other) for(var/atom/movable/AM in other) AM.loc = src // move everything in other holder to this one diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index ad2345afe5..f9a2c0d63c 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -11,7 +11,6 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). container_type = OPENCONTAINER_1 circuit = /obj/item/circuitboard/machine/circuit_imprinter - var/datum/material_container/materials var/efficiency_coeff var/list/categories = list( @@ -29,20 +28,18 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). ) /obj/machinery/r_n_d/circuit_imprinter/Initialize() - materials = new(src, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE)) + AddComponent(/datum/component/material_container, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE), + FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready)) create_reagents(0) return ..() -/obj/machinery/r_n_d/circuit_imprinter/Destroy() - QDEL_NULL(materials) - return ..() - /obj/machinery/r_n_d/circuit_imprinter/RefreshParts() reagents.maximum_volume = 0 for(var/obj/item/reagent_containers/glass/G in component_parts) reagents.maximum_volume += G.volume G.reagents.trans_to(src, G.reagents.total_volume) + GET_COMPONENT(materials, /datum/component/material_container) materials.max_amount = 0 for(var/obj/item/stock_parts/matter_bin/M in component_parts) materials.max_amount += M.rating * 75000 @@ -59,6 +56,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). /obj/machinery/r_n_d/circuit_imprinter/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material var/list/all_materials = being_built.reagents_list + being_built.materials + GET_COMPONENT(materials, /datum/component/material_container) var/A = materials.amount(M) if(!A) A = reagents.get_reagent_amount(M) @@ -69,6 +67,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). /obj/machinery/r_n_d/circuit_imprinter/on_deconstruction() for(var/obj/item/reagent_containers/glass/G in component_parts) reagents.trans_to(G, G.reagents.maximum_volume) + GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_all() ..() @@ -77,52 +76,20 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). linked_console.linked_imprinter = null ..() -/obj/machinery/r_n_d/circuit_imprinter/Insert_Item(obj/item/O, mob/user) - - if(istype(O, /obj/item/stack/sheet)) - . = 1 - if(!is_insertion_ready(user)) +/obj/machinery/r_n_d/circuit_imprinter/ComponentActivated(datum/component/C) + ..() + if(istype(C, /datum/component/material_container)) + var/datum/component/material_container/M = C + if(!M.last_insert_success) return - var/sheet_material = materials.get_item_material_amount(O) - if(!sheet_material) - return - - if(!materials.has_space(sheet_material)) - to_chat(user, "The [src.name]'s material bin is full! Please remove material before adding more.") - return 1 - - var/obj/item/stack/sheet/stack = O - var/amount = round(input("How many sheets do you want to add?") as num)//No decimals - if(!in_range(src, stack) || !user.Adjacent(src)) - return - var/amount_inserted = materials.insert_stack(O,amount) - if(!amount_inserted) - return 1 + var/lit = M.last_inserted_type + var/stack_name + if(ispath(lit, /obj/item/ore/bluespace_crystal)) + stack_name = "bluespace" + use_power(MINERAL_MATERIAL_AMOUNT / 10) else - use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount_inserted/10))) - to_chat(user, "You add [amount_inserted] sheets to the [src.name].") - updateUsrDialog() - - else if(istype(O, /obj/item/ore/bluespace_crystal)) //Bluespace crystals can be either a stack or an item - . = 1 - if(!is_insertion_ready(user)) - return - var/bs_material = materials.get_item_material_amount(O) - if(!bs_material) - return - - if(!materials.has_space(bs_material)) - to_chat(user, "The [src.name]'s material bin is full! Please remove material before adding more.") - return 1 - - materials.insert_item(O) - use_power(MINERAL_MATERIAL_AMOUNT/10) - to_chat(user, "You add [O] to the [src.name].") - qdel(O) - updateUsrDialog() - - else if(user.a_intent != INTENT_HARM) - to_chat(user, "You cannot insert this item into the [name]!") - return 1 - else - return 0 \ No newline at end of file + var/obj/item/stack/S = lit + stack_name = initial(S.name) + use_power(max(1000, (MINERAL_MATERIAL_AMOUNT * M.last_amount_inserted / 10))) + add_overlay("protolathe_[stack_name]") + addtimer(CALLBACK(src, /atom/proc/cut_overlay, "protolathe_[stack_name]"), 10) diff --git a/code/modules/research/designs/AI_module_designs.dm b/code/modules/research/designs/AI_module_designs.dm index 66a892754d..acce047aad 100644 --- a/code/modules/research/designs/AI_module_designs.dm +++ b/code/modules/research/designs/AI_module_designs.dm @@ -104,7 +104,7 @@ /datum/design/board/asimov name = "Core Module Design (Asimov)" - desc = "Allows for the construction of a Asimov AI Core Module." + desc = "Allows for the construction of an Asimov AI Core Module." id = "asimov_module" req_tech = list("programming" = 3, "materials" = 5) materials = list(MAT_GLASS = 1000, MAT_DIAMOND = 100) diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index a03b8c8127..89adfe8edc 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -203,13 +203,6 @@ materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_GLASS = 1000) build_path = /obj/item/ammo_box/magazine/wt550m9/wtic -/datum/design/mag_oldsmg/tx_mag - name = "WT-550 Auto Gun Uranium Magazine (4.6x30mm TX)" - desc = "A 20 round uranium tipped magazine for the out of date security WT-550 Auto Rifle" - id = "mag_oldsmg_tx" - materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_URANIUM = 2000) - build_path = /obj/item/ammo_box/magazine/wt550m9/wttx - /datum/design/stunshell name = "Stun Shell" desc = "A stunning shell for a shotgun." diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index cbbb73652b..4d8938b1b8 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -418,8 +418,9 @@ if(exp == SCANTYPE_OBLITERATE) visible_message("[exp_on] activates the crushing mechanism, [exp_on] is destroyed!") if(linked_console.linked_lathe) + GET_COMPONENT_FROM(linked_materials, /datum/component/material_container, linked_console.linked_lathe) for(var/material in exp_on.materials) - linked_console.linked_lathe.materials.insert_amount( min((linked_console.linked_lathe.materials.max_amount - linked_console.linked_lathe.materials.total_amount), (exp_on.materials[material])), material) + linked_materials.insert_amount( min((linked_materials.max_amount - linked_materials.total_amount), (exp_on.materials[material])), material) if(prob(EFFECT_PROB_LOW) && criticalReaction) visible_message("[src]'s crushing mechanism slowly and smoothly descends, flattening the [exp_on]!") new /obj/item/stack/sheet/plasteel(get_turf(pick(oview(1,src)))) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 7a18a5e630..88c902a70d 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -14,7 +14,6 @@ Note: Must be placed west/left of and R&D console to function. container_type = OPENCONTAINER_1 circuit = /obj/item/circuitboard/machine/protolathe - var/datum/material_container/materials var/efficiency_coeff var/list/categories = list( @@ -34,11 +33,9 @@ Note: Must be placed west/left of and R&D console to function. /obj/machinery/r_n_d/protolathe/Initialize() create_reagents(0) - materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE)) - return ..() - -/obj/machinery/r_n_d/protolathe/Destroy() - QDEL_NULL(materials) + AddComponent(/datum/component/material_container, + list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), + FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready)) return ..() /obj/machinery/r_n_d/protolathe/RefreshParts() @@ -47,6 +44,7 @@ Note: Must be placed west/left of and R&D console to function. reagents.maximum_volume += G.volume G.reagents.trans_to(src, G.reagents.total_volume) + GET_COMPONENT(materials, /datum/component/material_container) materials.max_amount = 0 for(var/obj/item/stock_parts/matter_bin/M in component_parts) materials.max_amount += M.rating * 75000 @@ -59,6 +57,7 @@ Note: Must be placed west/left of and R&D console to function. /obj/machinery/r_n_d/protolathe/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material var/list/all_materials = being_built.reagents_list + being_built.materials + GET_COMPONENT(materials, /datum/component/material_container) var/A = materials.amount(M) if(!A) A = reagents.get_reagent_amount(M) @@ -69,6 +68,7 @@ Note: Must be placed west/left of and R&D console to function. /obj/machinery/r_n_d/protolathe/on_deconstruction() for(var/obj/item/reagent_containers/glass/G in component_parts) reagents.trans_to(G, G.reagents.maximum_volume) + GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_all() ..() @@ -77,63 +77,20 @@ Note: Must be placed west/left of and R&D console to function. linked_console.linked_lathe = null ..() -/obj/machinery/r_n_d/protolathe/Insert_Item(obj/item/O, mob/user) - - if(istype(O, /obj/item/stack/sheet)) - . = 1 - if(!is_insertion_ready(user)) +/obj/machinery/r_n_d/protolathe/ComponentActivated(datum/component/C) + ..() + if(istype(C, /datum/component/material_container)) + var/datum/component/material_container/M = C + if(!M.last_insert_success) return - var/sheet_material = materials.get_item_material_amount(O) - if(!sheet_material) - return - - if(!materials.has_space(sheet_material)) - to_chat(user, "The [src.name]'s material bin is full! Please remove material before adding more.") - return 1 - - var/obj/item/stack/sheet/stack = O - var/amount = round(input("How many sheets do you want to add?") as num)//No decimals - if(!in_range(src, stack) || !user.Adjacent(src)) - return - var/amount_inserted = materials.insert_stack(O,amount) - if(!amount_inserted) - return 1 + var/lit = M.last_inserted_type + var/stack_name + if(ispath(lit, /obj/item/ore/bluespace_crystal)) + stack_name = "bluespace" + use_power(MINERAL_MATERIAL_AMOUNT / 10) else - var/stack_name = stack.name - busy = TRUE - use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount_inserted/10))) - to_chat(user, "You add [amount_inserted] sheets to the [src.name].") - add_overlay("protolathe_[stack_name]") - sleep(10) - cut_overlay("protolathe_[stack_name]") - busy = FALSE - updateUsrDialog() - - else if(istype(O, /obj/item/ore/bluespace_crystal)) //Bluespace crystals can be either a stack or an item - . = 1 - if(!is_insertion_ready(user)) - return - var/bs_material = materials.get_item_material_amount(O) - if(!bs_material) - return - - if(!materials.has_space(bs_material)) - to_chat(user, "The [src.name]'s material bin is full! Please remove material before adding more.") - return 1 - - materials.insert_item(O) - busy = TRUE - use_power(MINERAL_MATERIAL_AMOUNT/10) - to_chat(user, "You add [O] to the [src.name].") - qdel(O) - add_overlay("protolathe_bluespace") - sleep(10) - cut_overlay("protolathe_bluespace") - busy = FALSE - updateUsrDialog() - - else if(user.a_intent != INTENT_HARM) - to_chat(user, "You cannot insert this item into the [name]!") - return 1 - else - return 0 + var/obj/item/stack/S = lit + stack_name = initial(S.name) + use_power(max(1000, (MINERAL_MATERIAL_AMOUNT * M.last_amount_inserted / 10))) + add_overlay("protolathe_[stack_name]") + addtimer(CALLBACK(src, /atom/proc/cut_overlay, "protolathe_[stack_name]"), 10) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 2f60e280ec..ee2cba39fd 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -169,6 +169,15 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(href_list["menu"]) //Switches menu screens. Converts a sent text string into a number. Saves a LOT of code. var/temp_screen = text2num(href_list["menu"]) screen = temp_screen + + + var/datum/component/material_container/linked_materials + if(linked_lathe) + linked_materials = linked_lathe.GetComponent(/datum/component/material_container) + + var/datum/component/material_container/imprinter_materials + if(linked_imprinter) + imprinter_materials = linked_imprinter.GetComponent(/datum/component/material_container) if(href_list["category"]) selected_category = href_list["category"] @@ -315,7 +324,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any. for(var/material in linked_destroy.loaded_item.materials) - linked_lathe.materials.insert_amount(min((linked_lathe.materials.max_amount - linked_lathe.materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material) + linked_materials.insert_amount(min((linked_materials.max_amount - linked_materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material) SSblackbox.add_details("item_deconstructed","[linked_destroy.loaded_item.type]") linked_destroy.loaded_item = null for(var/obj/I in linked_destroy.contents) @@ -421,7 +430,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, for(var/MAT in being_built.materials) efficient_mats[MAT] = being_built.materials[MAT]*coeff - if(!linked_lathe.materials.has_materials(efficient_mats, amount)) + if(!linked_materials.has_materials(efficient_mats, amount)) linked_lathe.say("Not enough materials to complete prototype.") enough_materials = 0 g2g = 0 @@ -433,7 +442,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, g2g = 0 if(enough_materials) - linked_lathe.materials.use_amount(efficient_mats, amount) + linked_materials.use_amount(efficient_mats, amount) for(var/R in being_built.reagents_list) linked_lathe.reagents.remove_reagent(R, being_built.reagents_list[R]*coeff) @@ -497,7 +506,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, for(var/MAT in being_built.materials) efficient_mats[MAT] = being_built.materials[MAT]/coeff - if(!linked_imprinter.materials.has_materials(efficient_mats)) + if(!imprinter_materials.has_materials(efficient_mats)) linked_imprinter.say("Not enough materials to complete prototype.") enough_materials = 0 g2g = 0 @@ -509,7 +518,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, g2g = 0 if(enough_materials) - linked_imprinter.materials.use_amount(efficient_mats) + imprinter_materials.use_amount(efficient_mats) for(var/R in being_built.reagents_list) linked_imprinter.reagents.remove_reagent(R, being_built.reagents_list[R]/coeff) @@ -536,7 +545,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, linked_lathe.reagents.clear_reagents() else if(href_list["ejectsheet"] && linked_lathe) //Causes the protolathe to eject a sheet of material - linked_lathe.materials.retrieve_sheets(text2num(href_list["eject_amt"]), href_list["ejectsheet"]) + linked_materials.retrieve_sheets(text2num(href_list["eject_amt"]), href_list["ejectsheet"]) //Circuit Imprinter Materials else if(href_list["disposeI"] && linked_imprinter) //Causes the circuit imprinter to dispose of a single reagent (all of it) @@ -546,7 +555,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, linked_imprinter.reagents.clear_reagents() else if(href_list["imprinter_ejectsheet"] && linked_imprinter) //Causes the imprinter to eject a sheet of material - linked_imprinter.materials.retrieve_sheets(text2num(href_list["eject_amt"]), href_list["imprinter_ejectsheet"]) + imprinter_materials.retrieve_sheets(text2num(href_list["eject_amt"]), href_list["imprinter_ejectsheet"]) else if(href_list["find_device"]) //The R&D console looks for devices nearby to link up with. @@ -634,6 +643,14 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(linked_imprinter == null) screen = 4.0 + + var/datum/component/material_container/linked_materials + if(linked_lathe) + linked_materials = linked_lathe.GetComponent(/datum/component/material_container) + + var/datum/component/material_container/imprinter_materials + if(linked_imprinter) + imprinter_materials = linked_imprinter.GetComponent(/datum/component/material_container) switch(screen) //////////////////////R&D CONSOLE SCREENS////////////////// @@ -823,7 +840,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Material Storage" dat += "Chemical Storage
    " dat += "

    Protolathe Menu:


    " - dat += "Material Amount: [linked_lathe.materials.total_amount] / [linked_lathe.materials.max_amount]
    " + dat += "Material Amount: [linked_materials.total_amount] / [linked_materials.max_amount]
    " dat += "Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]
    " dat += "\ @@ -841,7 +858,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Main Menu" dat += "Protolathe Menu" dat += "

    Browsing [selected_category]:


    " - dat += "Material Amount: [linked_lathe.materials.total_amount] / [linked_lathe.materials.max_amount]
    " + dat += "Material Amount: [linked_materials.total_amount] / [linked_materials.max_amount]
    " dat += "Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]
    " var/coeff = linked_lathe.efficiency_coeff @@ -879,7 +896,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Main Menu" dat += "Protolathe Menu" dat += "

    Search results:


    " - dat += "Material Amount: [linked_lathe.materials.total_amount] / [linked_lathe.materials.max_amount]
    " + dat += "Material Amount: [linked_materials.total_amount] / [linked_materials.max_amount]
    " dat += "Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]
    " var/coeff = linked_lathe.efficiency_coeff @@ -916,8 +933,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(!linked_lathe) dat += "ERROR: Protolathe connection failed." else - for(var/mat_id in linked_lathe.materials.materials) - var/datum/material/M = linked_lathe.materials.materials[mat_id] + for(var/mat_id in linked_materials.materials) + var/datum/material/M = linked_materials.materials[mat_id] dat += "* [M.amount] of [M.name]: " if(M.amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " @@ -944,7 +961,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Material Storage" dat += "Chemical Storage
    " dat += "

    Circuit Imprinter Menu:


    " - dat += "Material Amount: [linked_imprinter.materials.total_amount]
    " + dat += "Material Amount: [imprinter_materials.total_amount]
    " dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
    " dat += "\ @@ -961,7 +978,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Main Menu" dat += "Circuit Imprinter Menu" dat += "

    Browsing [selected_category]:


    " - dat += "Material Amount: [linked_imprinter.materials.total_amount]
    " + dat += "Material Amount: [imprinter_materials.total_amount]
    " dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
    " var/coeff = linked_imprinter.efficiency_coeff @@ -991,7 +1008,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Main Menu" dat += "Circuit Imprinter Menu" dat += "

    Search results:


    " - dat += "Material Amount: [linked_imprinter.materials.total_amount]
    " + dat += "Material Amount: [imprinter_materials.total_amount]
    " dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
    " var/coeff = linked_imprinter.efficiency_coeff @@ -1028,8 +1045,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(!linked_imprinter) dat += "ERROR: Protolathe connection failed." else - for(var/mat_id in linked_imprinter.materials.materials) - var/datum/material/M = linked_imprinter.materials.materials[mat_id] + for(var/mat_id in imprinter_materials.materials) + var/datum/material/M = imprinter_materials.materials[mat_id] dat += "* [M.amount] of [M.name]: " if(M.amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index f22961ae15..4e160ad140 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -84,7 +84,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi /obj/item/stock_parts/console_screen name = "console screen" - desc = "Used in the construction of computers and other devices with a interactive console." + desc = "Used in the construction of computers and other devices with an interactive console." icon_state = "screen" origin_tech = "materials=1" materials = list(MAT_GLASS=200) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 47d6d40901..0b3c930962 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -168,7 +168,7 @@ var/sentience_type = SENTIENCE_ORGANIC /obj/item/slimepotion/sentience/afterattack(mob/living/M, mob/user) - if(being_used || !ismob(M)) + if(being_used || !ismob(M) || !user.Adjacent(M)) return if(!isanimal(M) || M.ckey) //only works on animals that aren't player controlled to_chat(user, "[M] is already too intelligent for this to work!") @@ -429,8 +429,8 @@ icon_state = "golem" item_state = "golem" w_class = WEIGHT_CLASS_BULKY - gas_transfer_coefficient = 0.90 - permeability_coefficient = 0.50 + gas_transfer_coefficient = 0.9 + permeability_coefficient = 0.5 body_parts_covered = FULL_BODY flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/modules/ruins/spaceruin_code/oldstation.dm b/code/modules/ruins/spaceruin_code/oldstation.dm index 807922c0d5..192552d71b 100644 --- a/code/modules/ruins/spaceruin_code/oldstation.dm +++ b/code/modules/ruins/spaceruin_code/oldstation.dm @@ -11,14 +11,14 @@ /obj/item/paper/fluff/ruins/oldstation/protosuit name = "B01-RIG Hardsuit Report" info = "*Prototype Hardsuit*

    The B01-RIG Hardsuit is a prototype powered exoskeleton. Based off of a recovered pre-void war era united earth government powered military \ - exosuit, the RIG Hardsuit is a breakthrough in Hardsuit technology, and is the first post-void war era Hardsuit that can be safely used by a operator.

    The B01 however suffers \ + exosuit, the RIG Hardsuit is a breakthrough in Hardsuit technology, and is the first post-void war era Hardsuit that can be safely used by an operator.

    The B01 however suffers \ a myriad of constraints. It is slow and bulky to move around, it lacks any significant armor plating against direct attacks and its internal heads up display is unfinished, \ resulting in the user being unable to see long distances.

    The B01 is unlikely to see any form of mass production, but will serve as a base for future Hardsuit developments." /obj/item/paper/fluff/ruins/oldstation/protohealth name = "Health Analyser Report" - info = "*Health Analyser*

    The portable Health Analyser is essentially a handheld varient of a health analyser. Years of research have concluded with this device which is \ - capable of diagnosing even the most critical, obscure or technical injuries any humanoid entity is suffering in a easy to understand format that even a non-trained health professional \ + info = "*Health Analyser*

    The portable Health Analyser is essentially a handheld variant of a health analyser. Years of research have concluded with this device which is \ + capable of diagnosing even the most critical, obscure or technical injuries any humanoid entity is suffering in an easy to understand format that even a non-trained health professional \ can understand.

    The health analyser is expected to go into full production as standard issue medical kit." /obj/item/paper/fluff/ruins/oldstation/protogun @@ -26,8 +26,8 @@ info = "*K14-Multiphase Energy Gun*

    The K14 Prototype Energy Gun is the first Energy Rifle that has been successfully been able to not only hold a larger ammo charge \ than other gun models, but is capable of swapping between different energy projectile types on command with no incidents.

    The weapon still suffers several drawbacks, its alternative, \ non laser fire mode, can only fire one round before exhausting the energy cell, the weapon also remains prohibitively expensive, nonetheless NT Market Research fully believe this weapon \ - will form the backbone of our Energy weapon cataloge.

    The K14 is expected to undergo revision to fix the ammo issues, the K15 is expected to replace the 'stun' setting with a \ - 'disable' setting in a attempt to bypass the ammo issues." + will form the backbone of our Energy weapon catalogue.

    The K14 is expected to undergo revision to fix the ammo issues, the K15 is expected to replace the 'stun' setting with a \ + 'disable' setting in an attempt to bypass the ammo issues." /obj/item/paper/fluff/ruins/oldstation/protosing name = "Singularity Generator" diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index e83061b232..1fa3e89d3a 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -41,6 +41,7 @@ GLOBAL_VAR_INIT(security_level, 0) if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) SSshuttle.emergency.modTimer(2) GLOB.security_level = SEC_LEVEL_BLUE + sound_to_playing_players('sound/misc/voybluealert.ogg') for(var/obj/machinery/firealarm/FA in GLOB.machines) if(FA.z in GLOB.station_z_levels) FA.update_icon() @@ -60,7 +61,7 @@ GLOBAL_VAR_INIT(security_level, 0) var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) if(CC) CC.post_status("alert", "redalert")*/ - + sound_to_playing_players('sound/misc/voyalert.ogg') for(var/obj/machinery/firealarm/FA in GLOB.machines) if(FA.z in GLOB.station_z_levels) FA.update_icon() @@ -74,6 +75,7 @@ GLOBAL_VAR_INIT(security_level, 0) else if(GLOB.security_level == SEC_LEVEL_BLUE) SSshuttle.emergency.modTimer(0.5) GLOB.security_level = SEC_LEVEL_DELTA + sound_to_playing_players('sound/misc/deltakalaxon.ogg') for(var/obj/machinery/firealarm/FA in GLOB.machines) if(FA.z in GLOB.station_z_levels) FA.update_icon() diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 8bc90cf787..c3549abc4d 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -144,8 +144,8 @@ var/time = TIME_LEFT message_admins("[key_name_admin(user.client)] \ - (?) \ - (FLW) \ + (?) \ + (FLW) \ has emagged the emergency shuttle [time] seconds before launch.", 0, 1) log_game("[key_name(user)] has emagged the emergency shuttle in \ [COORD(src)] [time] seconds before launch.") @@ -262,7 +262,7 @@ if(shuttle_areas[get_area(player)]) has_people = TRUE var/location = get_turf(player.mind.current) - if(!(player.mind.special_role == "traitor" || player.mind.special_role == "Syndicate") && !istype(location, /turf/open/floor/plasteel/shuttle/red) && !istype(location, /turf/open/floor/mineral/plastitanium/brig)) + if(!(player.mind.special_role == "traitor" || player.mind.special_role == "Syndicate" || player.mind.special_role == "blood brother") && !istype(location, /turf/open/floor/plasteel/shuttle/red) && !istype(location, /turf/open/floor/mineral/plastitanium/brig)) return FALSE return has_people diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm index dce6f509ff..5b27e562f3 100644 --- a/code/modules/shuttle/ferry.dm +++ b/code/modules/shuttle/ferry.dm @@ -30,4 +30,4 @@ return last_request = world.time to_chat(usr, "Your request has been recieved by CentCom.") - to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to CentCom.") + to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to CentCom.") diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 77eec512d8..b527894d0a 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -64,13 +64,6 @@ All ShuttleMove procs go here // Called on the new turf after everything has been moved /turf/proc/afterShuttleMove(turf/oldT) - if(SSlighting.initialized && FALSE) - var/atom/movable/lighting_object/old_obj = lighting_object - var/atom/movable/lighting_object/new_obj = oldT.lighting_object - if(old_obj) - old_obj.update() - if(new_obj) - new_obj.update() return TRUE ///////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 6da68f695a..99d707d289 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -534,7 +534,7 @@ var/list/new_turfs = return_ordered_turfs(new_dock.x, new_dock.y, new_dock.z, new_dock.dir) /**************************************************************************************************************/ - var/area/underlying_old_area = locate("[underlying_area_type]") + var/area/underlying_old_area = locate(underlying_area_type) in GLOB.sortedAreas if(!underlying_old_area) underlying_old_area = new underlying_area_type(null) diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index b21df4000c..1c3d416fd0 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -20,7 +20,7 @@ if(href_list["move"]) var/obj/item/circuitboard/computer/syndicate_shuttle/board = circuit if(board.challenge && world.time < SYNDICATE_CHALLENGE_TIMER) - to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [round(((SYNDICATE_CHALLENGE_TIMER - world.time) / 10) / 60)] more minutes to allow them to prepare.") + to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [DisplayTimeText(SYNDICATE_CHALLENGE_TIMER - world.time)] more to allow them to prepare.") return 0 board.moved = TRUE ..() diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm index 71a0d89f16..4e5c0605e2 100644 --- a/code/modules/spells/spell_types/mime.dm +++ b/code/modules/spells/spell_types/mime.dm @@ -1,140 +1,280 @@ -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall - name = "Invisible Wall" - desc = "The mime's performance transmutates into physical reality." - school = "mime" - panel = "Mime" - summon_type = list(/obj/effect/forcefield/mime) - invocation_type = "emote" - invocation_emote_self = "You form a wall in front of yourself." - summon_lifespan = 300 - charge_max = 300 - clothes_req = 0 - range = 0 - cast_sound = null - human_req = 1 - - action_icon_state = "mime" - action_background_icon_state = "bg_mime" - -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click() - if(usr && usr.mind) - if(!usr.mind.miming) - to_chat(usr, "You must dedicate yourself to silence first.") - return - invocation = "[usr.real_name] looks as if a wall is in front of [usr.p_them()]." - else - invocation_type ="none" - ..() - - -/obj/effect/proc_holder/spell/targeted/mime/speak - name = "Speech" - desc = "Make or break a vow of silence." - school = "mime" - panel = "Mime" - clothes_req = 0 - human_req = 1 - charge_max = 3000 - range = -1 - include_user = 1 - - action_icon_state = "mime" - action_background_icon_state = "bg_mime" - -/obj/effect/proc_holder/spell/targeted/mime/speak/Click() - if(!usr) - return - if(!ishuman(usr)) - return - var/mob/living/carbon/human/H = usr - if(H.mind.miming) - still_recharging_msg = "You can't break your vow of silence that fast!" - else - still_recharging_msg = "You'll have to wait before you can give your vow of silence again!" - ..() - -/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr) - for(var/mob/living/carbon/human/H in targets) - H.mind.miming=!H.mind.miming - if(H.mind.miming) - to_chat(H, "You make a vow of silence.") - else - to_chat(H, "You break your vow of silence.") - -// These spells can only be gotten from the "Guide for Advanced Mimery series" for Mime Traitors. - -/obj/effect/proc_holder/spell/targeted/forcewall/mime - name = "Invisible Blockade" - desc = "Form an invisible three tile wide blockade." - wall_type = /obj/effect/forcefield/mime/advanced - invocation_type = "emote" - invocation_emote_self = "You form a blockade in front of yourself." - charge_max = 600 - sound = null - clothes_req = 0 - range = -1 - include_user = 1 - - action_icon_state = "mime" - action_background_icon_state = "bg_mime" - -/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click() - if(usr && usr.mind) - if(!usr.mind.miming) - to_chat(usr, "You must dedicate yourself to silence first.") - return - invocation = "[usr.real_name] looks as if a blockade is in front of [usr.p_them()]." - else - invocation_type ="none" - ..() - -/obj/effect/proc_holder/spell/aimed/finger_guns - name = "Finger Guns" - desc = "Shoot a mimed bullet from your fingers that stuns and does some damage." - school = "mime" - panel = "Mime" - charge_max = 300 - clothes_req = 0 - invocation_type = "emote" - invocation_emote_self = "You fire your finger gun!" - range = 20 - projectile_type = /obj/item/projectile/bullet/weakbullet2 - projectile_amount = 3 - sound = null - active_msg = "You draw your fingers!" - deactive_msg = "You put your fingers at ease. Another time." - active = FALSE - - action_icon_state = "mime" - action_background_icon_state = "bg_mime" - base_icon_state = "mime" - - -/obj/effect/proc_holder/spell/aimed/finger_guns/Click() - var/mob/living/carbon/human/owner = usr - if(owner.incapacitated()) - to_chat(owner, "You can't properly point your fingers while incapacitated.") - return - if(usr && usr.mind) - if(!usr.mind.miming) - to_chat(usr, "You must dedicate yourself to silence first.") - return - invocation = "[usr.real_name] fires [usr.p_their()] finger gun!" - else - invocation_type ="none" - ..() - - -/obj/item/spellbook/oneuse/mimery_blockade - spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime - spellname = "" - name = "Guide to Advanced Mimery Vol 1" - desc = "The pages don't make any sound when turned." - icon_state ="bookmime" - -/obj/item/spellbook/oneuse/mimery_guns - spell = /obj/effect/proc_holder/spell/aimed/finger_guns - spellname = "" - name = "Guide to Advanced Mimery Vol 2" - desc = "There aren't any words written..." - icon_state ="bookmime" +/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall + name = "Invisible Wall" + desc = "The mime's performance transmutates into physical reality." + school = "mime" + panel = "Mime" + summon_type = list(/obj/effect/forcefield/mime) + invocation_type = "emote" + invocation_emote_self = "You form a wall in front of yourself." + summon_lifespan = 300 + charge_max = 300 + clothes_req = 0 + range = 0 + cast_sound = null + human_req = 1 + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + +/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click() + if(usr && usr.mind) + if(!usr.mind.miming) + to_chat(usr, "You must dedicate yourself to silence first.") + return + invocation = "[usr.real_name] looks as if a wall is in front of [usr.p_them()]." + else + invocation_type ="none" + ..() + + +/obj/effect/proc_holder/spell/targeted/mime/speak + name = "Speech" + desc = "Make or break a vow of silence." + school = "mime" + panel = "Mime" + clothes_req = 0 + human_req = 1 + charge_max = 3000 + range = -1 + include_user = 1 + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + +/obj/effect/proc_holder/spell/targeted/mime/speak/Click() + if(!usr) + return + if(!ishuman(usr)) + return + var/mob/living/carbon/human/H = usr + if(H.mind.miming) + still_recharging_msg = "You can't break your vow of silence that fast!" + else + still_recharging_msg = "You'll have to wait before you can give your vow of silence again!" + ..() + +/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr) + for(var/mob/living/carbon/human/H in targets) + H.mind.miming=!H.mind.miming + if(H.mind.miming) + to_chat(H, "You make a vow of silence.") + else + to_chat(H, "You break your vow of silence.") + +// These spells can only be gotten from the "Guide for Advanced Mimery series" for Mime Traitors. + +/obj/effect/proc_holder/spell/targeted/forcewall/mime + name = "Invisible Blockade" + desc = "Form an invisible three tile wide blockade." + wall_type = /obj/effect/forcefield/mime/advanced + invocation_type = "emote" + invocation_emote_self = "You form a blockade in front of yourself." + charge_max = 600 + sound = null + clothes_req = 0 + range = -1 + include_user = 1 + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + +/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click() + if(usr && usr.mind) + if(!usr.mind.miming) + to_chat(usr, "You must dedicate yourself to silence first.") + return + invocation = "[usr.real_name] looks as if a blockade is in front of [usr.p_them()]." + else + invocation_type ="none" + ..() + +/obj/effect/proc_holder/spell/aimed/finger_guns + name = "Finger Guns" + desc = "Shoot a mimed bullet from your fingers that stuns and does some damage." + school = "mime" + panel = "Mime" + charge_max = 300 + clothes_req = 0 + invocation_type = "emote" + invocation_emote_self = "You fire your finger gun!" + range = 20 + projectile_type = /obj/item/projectile/bullet/mime + projectile_amount = 3 + sound = null + active_msg = "You draw your fingers!" + deactive_msg = "You put your fingers at ease. Another time." + active = FALSE + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + base_icon_state = "mime" + + +/obj/effect/proc_holder/spell/aimed/finger_guns/Click() + var/mob/living/carbon/human/owner = usr + if(owner.incapacitated()) + to_chat(owner, "You can't properly point your fingers while incapacitated.") + return + if(usr && usr.mind) + if(!usr.mind.miming) + to_chat(usr, "You must dedicate yourself to silence first.") + return + invocation = "[usr.real_name] fires [usr.p_their()] finger gun!" + else + invocation_type ="none" + ..() + + +/obj/item/spellbook/oneuse/mimery_blockade + spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime + spellname = "" + name = "Guide to Advanced Mimery Vol 1" + desc = "The pages don't make any sound when turned." + icon_state ="bookmime" + +/obj/item/spellbook/oneuse/mimery_guns + spell = /obj/effect/proc_holder/spell/aimed/finger_guns + spellname = "" + name = "Guide to Advanced Mimery Vol 2" + desc = "There aren't any words written..." + icon_state ="bookmime" +/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall + name = "Invisible Wall" + desc = "The mime's performance transmutates into physical reality." + school = "mime" + panel = "Mime" + summon_type = list(/obj/effect/forcefield/mime) + invocation_type = "emote" + invocation_emote_self = "You form a wall in front of yourself." + summon_lifespan = 300 + charge_max = 300 + clothes_req = 0 + range = 0 + cast_sound = null + human_req = 1 + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + +/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click() + if(usr && usr.mind) + if(!usr.mind.miming) + to_chat(usr, "You must dedicate yourself to silence first.") + return + invocation = "[usr.real_name] looks as if a wall is in front of [usr.p_them()]." + else + invocation_type ="none" + ..() + + +/obj/effect/proc_holder/spell/targeted/mime/speak + name = "Speech" + desc = "Make or break a vow of silence." + school = "mime" + panel = "Mime" + clothes_req = 0 + human_req = 1 + charge_max = 3000 + range = -1 + include_user = 1 + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + +/obj/effect/proc_holder/spell/targeted/mime/speak/Click() + if(!usr) + return + if(!ishuman(usr)) + return + var/mob/living/carbon/human/H = usr + if(H.mind.miming) + still_recharging_msg = "You can't break your vow of silence that fast!" + else + still_recharging_msg = "You'll have to wait before you can give your vow of silence again!" + ..() + +/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr) + for(var/mob/living/carbon/human/H in targets) + H.mind.miming=!H.mind.miming + if(H.mind.miming) + to_chat(H, "You make a vow of silence.") + else + to_chat(H, "You break your vow of silence.") + +// These spells can only be gotten from the "Guide for Advanced Mimery series" for Mime Traitors. + +/obj/effect/proc_holder/spell/targeted/forcewall/mime + name = "Invisible Blockade" + desc = "Form an invisible three tile wide blockade." + wall_type = /obj/effect/forcefield/mime/advanced + invocation_type = "emote" + invocation_emote_self = "You form a blockade in front of yourself." + charge_max = 600 + sound = null + clothes_req = 0 + range = -1 + include_user = 1 + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + +/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click() + if(usr && usr.mind) + if(!usr.mind.miming) + to_chat(usr, "You must dedicate yourself to silence first.") + return + invocation = "[usr.real_name] looks as if a blockade is in front of [usr.p_them()]." + else + invocation_type ="none" + ..() + +/obj/effect/proc_holder/spell/aimed/finger_guns + name = "Finger Guns" + desc = "Shoot a mimed bullet from your fingers that stuns and does some damage." + school = "mime" + panel = "Mime" + charge_max = 300 + clothes_req = 0 + invocation_type = "emote" + invocation_emote_self = "You fire your finger gun!" + range = 20 + projectile_type = /obj/item/projectile/bullet/mime + projectile_amount = 3 + sound = null + active_msg = "You draw your fingers!" + deactive_msg = "You put your fingers at ease. Another time." + active = FALSE + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + base_icon_state = "mime" + + +/obj/effect/proc_holder/spell/aimed/finger_guns/Click() + var/mob/living/carbon/human/owner = usr + if(owner.incapacitated()) + to_chat(owner, "You can't properly point your fingers while incapacitated.") + return + if(usr && usr.mind) + if(!usr.mind.miming) + to_chat(usr, "You must dedicate yourself to silence first.") + return + invocation = "[usr.real_name] fires [usr.p_their()] finger gun!" + else + invocation_type ="none" + ..() + + +/obj/item/spellbook/oneuse/mimery_blockade + spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime + spellname = "" + name = "Guide to Advanced Mimery Vol 1" + desc = "The pages don't make any sound when turned." + icon_state ="bookmime" + +/obj/item/spellbook/oneuse/mimery_guns + spell = /obj/effect/proc_holder/spell/aimed/finger_guns + spellname = "" + name = "Guide to Advanced Mimery Vol 2" + desc = "There aren't any words written..." + icon_state ="bookmime" diff --git a/code/modules/stock_market/computer.dm b/code/modules/stock_market/computer.dm index d693b86527..90ad08c4bb 100644 --- a/code/modules/stock_market/computer.dm +++ b/code/modules/stock_market/computer.dm @@ -82,7 +82,7 @@ a.updated { mystocks = S.shareholders[logged_in] dat += "
    [S.name] ([S.short_name])[S.bankrupt ? " BANKRUPT" : null]
    " if (S.last_unification) - dat += "Unified shares [(world.time - S.last_unification) / 600] minutes ago.
    " + dat += "Unified shares [DisplayTimeText(world.time - S.last_unification)] ago.
    " dat += "Current value per share: [S.current_value] | View history

    " dat += "You currently own [mystocks] shares in this company. There are [S.available_shares] purchasable shares on the market currently.
    " if (S.bankrupt) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index bdd385bcac..7fd09d69c2 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -61,7 +61,7 @@ else cooldown = revive_cost + world.time reviving = FALSE - to_chat(owner, "Your reviver implant shuts down and starts recharging. It will be ready again in [revive_cost/10] seconds.") + to_chat(owner, "Your reviver implant shuts down and starts recharging. It will be ready again in [DisplayTimeText(revive_cost)].") return if(cooldown > world.time) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 26c2239bb6..f8a310c8f7 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -27,7 +27,7 @@ else if(C.ears && (C.ears.flags_2 & HEALS_EARS_2)) deaf = max(deaf - 1, 1) - ear_damage = max(ear_damage - 0.10, 0) + ear_damage = max(ear_damage - 0.1, 0) // if higher than UNHEALING_EAR_DAMAGE, no natural healing occurs. if(ear_damage < UNHEALING_EAR_DAMAGE) ear_damage = max(ear_damage - 0.05, 0) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index f8388a5dab..d1699cb257 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -50,11 +50,11 @@ return S /obj/item/organ/heart/on_life() - if(owner.client) + if(owner.client && beating) var/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE) - var/sound/fastbeat = sound('sound/health/fastbeat.ogg', repeat = TRUE) var/mob/living/carbon/H = owner + if(H.health <= HEALTH_THRESHOLD_CRIT && beat != BEAT_SLOW) beat = BEAT_SLOW H.playsound_local(get_turf(H), slowbeat,40,0, channel = CHANNEL_HEARTBEAT) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index b69c1f4c5c..5e67e73a8a 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -85,10 +85,9 @@ var/obj/item/organ/tongue/T = H.getorganslot("tongue") if(!T || T.type != type) continue - else if(H.dna && H.dna.species.id == "abductor" && user.dna && user.dna.species.id == "abductor") - var/datum/species/abductor/Ayy = user.dna.species - var/datum/species/abductor/Byy = H.dna.species - if(Ayy.team != Byy.team) + if(H.dna && H.dna.species.id == "abductor" && user.dna && user.dna.species.id == "abductor") + var/datum/antagonist/abductor/A = user.mind.has_antag_datum(ANTAG_DATUM_ABDUCTOR) + if(!A || !(H.mind in A.team.members)) continue to_chat(H, rendered) for(var/mob/M in GLOB.dead_mob_list) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 8f32aa89eb..eed05c6161 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -91,7 +91,7 @@ . = ..() if(!IsAvailable()) if(world.time < cords.next_command) - to_chat(owner, "You must wait [(cords.next_command - world.time)/10] seconds before Speaking again.") + to_chat(owner, "You must wait [DisplayTimeText(cords.next_command - world.time)] before Speaking again.") return var/command = input(owner, "Speak with the Voice of God", "Command") if(QDELETED(src) || QDELETED(owner)) @@ -102,7 +102,7 @@ /obj/item/organ/vocal_cords/colossus/can_speak_with() if(world.time < next_command) - to_chat(owner, "You must wait [(next_command - world.time)/10] seconds before Speaking again.") + to_chat(owner, "You must wait [DisplayTimeText(next_command - world.time)] before Speaking again.") return FALSE if(!owner) return FALSE diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 1f57ac93ce..38720f81a0 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -165,7 +165,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/nukeoffer/sniper name = "Sniper bundle" desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, a hollow-point \ - haemorrhage magazine, a soporific knockout magazine, a free surplus supressor, and a worn out suit and tie." + a soporific knockout magazine, a free surplus supressor, and a worn out suit and tie." item = /obj/item/storage/briefcase/sniperbundle cost = 20 // normally 26 @@ -449,11 +449,11 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/ammo_box/magazine/m12g/dragon include_modes = list(/datum/game_mode/nuclear) -/datum/uplink_item/ammo/shotgun/breach - name = "12g Breaching Shells" - desc = "An economic variant of the CMC meteorshot slugs, not as effective for knocking \ - down targets, but still great for blasting airlocks off their frames." - item = /obj/item/ammo_box/magazine/m12g/breach +/datum/uplink_item/ammo/shotgun/meteor + name = "12g Meteorslug Shells" + desc = "An alternative 8-round meteorslug magazine for use in the Bulldog shotgun. \ + Great for blasting airlocks off their frames." + item = /obj/item/ammo_box/magazine/m12g/meteor include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/shotgun/bag @@ -488,12 +488,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. By the time you need to use this, you'll already be on a pile of corpses." item = /obj/item/ammo_box/magazine/mm195x129 -/datum/uplink_item/ammo/machinegun/bleeding - name = "1.95x129mm (Bleeding) Box Magazine" - desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \ - to induce internal bleeding on targets." - item = /obj/item/ammo_box/magazine/mm195x129/bleeding - /datum/uplink_item/ammo/machinegun/hollow name = "1.95x129mm (Hollow-Point) Box Magazine" desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ @@ -527,12 +521,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/ammo_box/magazine/sniper_rounds/soporific cost = 6 -/datum/uplink_item/ammo/sniper/haemorrhage - name = ".50 Haemorrhage Magazine" - desc = "A 5-round magazine of haemorrhage ammo designed for use with .50 sniper rifles; causes heavy bleeding \ - in the target." - item = /obj/item/ammo_box/magazine/sniper_rounds/haemorrhage - /datum/uplink_item/ammo/sniper/penetrator name = ".50 Penetrator Magazine" desc = "A 5-round magazine of penetrator ammo designed for use with .50 sniper rifles. \ @@ -710,7 +698,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. name = "Dehydrated Space Carp" desc = "Looks like a plush toy carp, but just add water and it becomes a real-life space carp! Activate in \ your hand before use so it knows not to kill you." - item = /obj/item/toy/carpplushie/dehy_carp + item = /obj/item/toy/plush/carpplushie/dehy_carp cost = 1 /datum/uplink_item/stealthy_weapons/soap_clusterbang @@ -1313,7 +1301,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/role_restricted/magillitis_serum name = "Magillitis Serum Autoinjector" - desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in basic primates." + desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." item = /obj/item/reagent_containers/hypospray/magillitis cost = 15 restricted_roles = list("Geneticist", "Chief Medical Officer") diff --git a/code/modules/uplink/uplink_item_cit.dm b/code/modules/uplink/uplink_item_cit.dm index 68000d6d5c..c9bb091303 100644 --- a/code/modules/uplink/uplink_item_cit.dm +++ b/code/modules/uplink/uplink_item_cit.dm @@ -28,3 +28,15 @@ /obj/item/storage/box/syndie_kit/holoparasite/PopulateContents() new /obj/item/guardiancreator/tech/choose/traitor(src) new /obj/item/paper/guides/antag/guardian(src) + +/datum/uplink_item/dangerous/antitank + name = "Anti Tank Pistol" + desc = "Essentially amounting to a sniper rifle with no stock and barrel (or indeed, any rifling at all),\ + this extremely dubious pistol is guaranteed to dislocate your wrists and hit the broad side of a barn!\ + Uses sniper ammo.\ + Bullets tend to veer off-course. We are not responsible for any unintentional damage or injury resulting from inaacuracy." + item = /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate + refundable = TRUE + cost = 14 + surplus = 25 + include_modes = list(/datum/game_mode/nuclear) diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm index f1e4274ce9..4262d9fecd 100644 --- a/code/modules/vore/eating/belly_vr.dm +++ b/code/modules/vore/eating/belly_vr.dm @@ -13,22 +13,33 @@ var/inside_flavor // Flavor text description of inside sight/sound/smells/feels. var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone var/vore_verb = "ingest" // Verb for eating with this in messages - var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human - var/nonhuman_prey_swallow_time = 60 // Time in deciseconds to swallow anything else - var/emoteTime = 300 // How long between stomach emotes at prey + var/human_prey_swallow_time = 10 SECONDS // Time in deciseconds to swallow /mob/living/carbon/human + var/nonhuman_prey_swallow_time = 5 SECONDS // Time in deciseconds to swallow anything else + var/emoteTime = 30 SECONDS // How long between stomach emotes at prey var/digest_brute = 0 // Brute damage per tick in digestion mode var/digest_burn = 1 // Burn damage per tick in digestion mode var/digest_tickrate = 9 // Modulus this of air controller tick number to iterate gurgles on var/immutable = FALSE // Prevents this belly from being deleted - var/escapable = TRUE // Belly can be resisted out of at any time - var/escapetime = 200 // Deciseconds, how long to escape this belly - var/escapechance = 45 // % Chance of prey beginning to escape if prey struggles. - var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest. + var/escapable = FALSE // Belly can be resisted out of at any time + var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly + var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles +// var/silenced = FALSE // Will the heartbeat/fleshy internal loop play? + var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles. + + var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off. + var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting + var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location + var/autotransferwait = 10 // Time between trying to transfer. + var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone. + + var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest. var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes - var/tmp/mob/living/owner // The mob whose belly this is. - var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly! - var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages) - var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote + var/tmp/mob/living/owner // The mob whose belly this is. + var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly! + var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages) + var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote + var/swallow_time = 10 SECONDS // for mob transfering automation + var/vore_capacity = 1 // The capacity (in people) this person can hold // Don't forget to watch your commas at the end of each line if you change these. var/list/struggle_messages_outside = list( @@ -125,7 +136,7 @@ M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner. M << sound(null, repeat = 0, wait = 0, volume = 80, channel = CHANNEL_PREYLOOP) - src.internal_contents.Add(M) // Remove from the belly contents + src.internal_contents.Remove(M) // Remove from the belly contents var/datum/belly/B = check_belly(owner) if(B) B.internal_contents.Add(M) @@ -143,10 +154,46 @@ prey.forceMove(owner) internal_contents.Add(prey) + +// var/datum/belly/B = check_belly(owner) +// if(B.silenced == FALSE) //this needs more testing later prey << sound('sound/vore/prey/loop.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_PREYLOOP) + // Handle prey messages if(inside_flavor) - prey << "[inside_flavor]" + to_chat(prey, "[src.inside_flavor]") + if(isliving(prey)) + var/mob/living/M = prey + if(can_taste && M.get_taste_message(0)) + to_chat(owner, "[M] tastes of [M.get_taste_message(0)].") + + // Setup the autotransfer checks if needed + if(transferlocation && autotransferchance > 0) + addtimer(CALLBACK(src, /datum/belly/.proc/check_autotransfer, prey), autotransferwait) + +/datum/belly/proc/check_autotransfer(var/mob/prey) + // Some sanity checks + if(transferlocation && (autotransferchance > 0) && (prey in internal_contents)) + if(prob(autotransferchance)) + // Double check transferlocation isn't insane + if(verify_transferlocation()) + transfer_contents(prey, transferlocation) + else + // Didn't transfer, so wait before retrying + addtimer(CALLBACK(src, /datum/belly/.proc/check_autotransfer, prey), autotransferwait) + +/datum/belly/proc/verify_transferlocation() + for(var/I in owner.vore_organs) + var/datum/belly/B = owner.vore_organs[I] + if(B == transferlocation) + return TRUE + + for(var/I in owner.vore_organs) + var/datum/belly/B = owner.vore_organs[I] + if(B.name == transferlocation.name) + transferlocation = B + return TRUE + return FALSE // Get the line that should show up in Examine message if the owner of this belly // is examined. By making this a proc, we not only take advantage of polymorphism, @@ -158,6 +205,8 @@ var/raw_message = pick(examine_messages) formatted_message = replacetext(raw_message,"%belly",lowertext(name)) + formatted_message = replacetext(formatted_message,"%pred",owner) + formatted_message = replacetext(formatted_message,"%prey",english_list(internal_contents)) return("[formatted_message]
    ") @@ -226,8 +275,8 @@ internal_contents.Remove(M) M << sound(null, repeat = 0, wait = 0, volume = 80, channel = CHANNEL_PREYLOOP) // If digested prey is also a pred... anyone inside their bellies gets moved up. - if (is_vore_predator(M)) - for (var/bellytype in M.vore_organs) + if(is_vore_predator(M)) + for(var/bellytype in M.vore_organs) var/datum/belly/belly = M.vore_organs[bellytype] for (var/obj/thing in belly.internal_contents) thing.loc = owner @@ -237,7 +286,7 @@ internal_contents.Add(subprey) to_chat(subprey, "As [M] melts away around you, you find yourself in [owner]'s [name]") - //Drop all items into the belly. + //Drop all items into the belly/floor. for(var/obj/item/W in M) if(!M.dropItemToGround(W)) qdel(W) @@ -312,12 +361,39 @@ to_chat(owner, "The attempt to escape from your [name] has failed!/span>") return + else if(prob(transferchance) && istype(transferlocation)) //Next, let's have it see if they end up getting into an even bigger mess then when they started. + var/location_ok = verify_transferlocation() + + if(!location_ok) + to_chat(owner, "Something went wrong with your belly transfer settings.") + transferlocation = null + return + + to_chat(R, "Your attempt to escape [name] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!") + to_chat(owner, "Someone slid into your [transferlocation] due to their struggling inside your [name]!") + transfer_contents(R, transferlocation) + return + + else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.) + to_chat(R, "In response to your struggling, \the [name] begins to get more active...") + to_chat(owner, "You feel your [name] beginning to become active!") + digest_mode = DM_DIGEST + return else //Nothing interesting happened. to_chat(R, "But make no progress in escaping [owner]'s [name].") to_chat(owner, "But appears to be unable to make any progress in escaping your [name].") return - else + +//Transfers contents from one belly to another +/datum/belly/proc/transfer_contents(var/atom/movable/content, var/datum/belly/target, silent = 0) + if(!(content in internal_contents)) return + internal_contents.Remove(content) + // Re-use nom_mob + target.nom_mob(content, target.owner) + if(!silent) + for(var/mob/hearer in range(1,owner)) + hearer << sound(target.vore_sound,volume=80) // Belly copies and then returns the copy // Needs to be updated for any var changes @@ -336,8 +412,15 @@ dupe.digest_burn = digest_burn dupe.digest_tickrate = digest_tickrate dupe.immutable = immutable + dupe.can_taste = can_taste dupe.escapable = escapable dupe.escapetime = escapetime + dupe.digestchance = digestchance + dupe.escapechance = escapechance + dupe.transferchance = transferchance + dupe.transferlocation = transferlocation + dupe.autotransferchance = autotransferchance + dupe.autotransferwait = autotransferwait //// Object-holding variables //struggle_messages_outside - strings diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 19d07e6fb6..ba5fa1e295 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -21,7 +21,7 @@ //////////////////////////// DM_DIGEST //////////////////////////// if(digest_mode == DM_DIGEST) for (var/mob/living/M in internal_contents) - if(prob(15)) + if(prob(25)) M.stop_sound_channel(CHANNEL_PRED) playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED) M.stop_sound_channel(CHANNEL_PRED) @@ -62,14 +62,14 @@ // Deal digestion damage (and feed the pred) if(!(M.status_flags & GODMODE)) - M.adjustFireLoss(1) + M.adjustFireLoss(digest_burn) owner.nutrition += 1 return ///////////////////////////// DM_HEAL ///////////////////////////// if(digest_mode == DM_HEAL) for (var/mob/living/M in internal_contents) - if(prob(15)) + if(prob(25)) M.stop_sound_channel(CHANNEL_PRED) playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED) M.stop_sound_channel(CHANNEL_PRED) @@ -91,3 +91,53 @@ playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED) M.stop_sound_channel(CHANNEL_PRED) M.playsound_local(get_turf(M), null, 45, S = prey_gurgle) + + +//////////////////////////DM_DRAGON ///////////////////////////////////// +//because dragons need snowflake guts + if(digest_mode == DM_DRAGON) + for (var/mob/living/M in internal_contents) + if(prob(25)) + M.stop_sound_channel(CHANNEL_PRED) + playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED) + M.stop_sound_channel(CHANNEL_PRED) + M.playsound_local(get_turf(M), null, 45, S = prey_gurgle) + + //No digestion protection for megafauna. + + //Person just died in guts! + if(M.stat == DEAD) + var/digest_alert_owner = pick(digest_messages_owner) + var/digest_alert_prey = pick(digest_messages_prey) + + //Replace placeholder vars + digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner) + digest_alert_owner = replacetext(digest_alert_owner,"%prey",M) + digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name)) + + digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner) + digest_alert_prey = replacetext(digest_alert_prey,"%prey",M) + digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name)) + + //Send messages + to_chat(owner, "[digest_alert_owner]") + to_chat(M, "[digest_alert_prey]") + M.visible_message("You watch as [owner]'s guts loudly rumble as it finishes off a meal.") + + M.stop_sound_channel(CHANNEL_PRED) + playsound(get_turf(owner),"death_pred",45,0,-6,0,channel=CHANNEL_PRED) + M.stop_sound_channel(CHANNEL_PRED) + M.playsound_local(get_turf(M), null, 45, S = prey_digest) + M.spill_organs(FALSE,TRUE,TRUE) + M << sound(null, repeat = 0, wait = 0, volume = 80, channel = CHANNEL_PREYLOOP) + digestion_death(M) + owner.update_icons() + continue + + + // Deal digestion damage (and feed the pred) + if(!(M.status_flags & GODMODE)) + M.adjustFireLoss(digest_burn) + M.adjustToxLoss(4) // something something plasma based acids + M.adjustCloneLoss(3) // eventually this'll kill you if you're healing everything else, you nerds. + return \ No newline at end of file diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 98db33a763..d50cdebf45 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -5,14 +5,20 @@ var/list/vore_organs = list() // List of vore containers inside a mob var/devourable = FALSE // Can the mob be vored at all? // var/feeding = FALSE // Are we going to feed someone else? - + var/vore_taste = null // What the character tastes like + var/no_vore = FALSE // If the character/mob can vore. + var/openpanel = 0 // Is the vore panel open? // // Hook for generic creation of stuff on new creatures // /hook/living_new/proc/vore_setup(mob/living/M) - M.verbs += /mob/living/proc/insidePanel M.verbs += /mob/living/proc/escapeOOC + M.verbs += /mob/living/proc/lick + if(M.no_vore) //If the mob isn's supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach. + M << "The creature that you are can not eat others." + return TRUE + M.verbs += /mob/living/proc/insidePanel //Tries to load prefs if a client is present otherwise gives freebie stomach if(!M.vore_organs || !M.vore_organs.len) @@ -32,7 +38,8 @@ var/datum/belly/B = new /datum/belly(M) B.immutable = TRUE B.name = "Stomach" - B.inside_flavor = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]." + B.inside_flavor = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]" + B.can_taste = TRUE M.vore_organs[B.name] = B M.vore_selected = B.name @@ -114,6 +121,42 @@ var/belly = input("Choose Belly") in pred.vore_organs return perform_the_nom(user, prey, pred, belly) +//Dragon noms need to be faster +/mob/living/proc/dragon_feeding(var/mob/living/user, var/mob/living/prey) + var/belly = user.vore_selected + return perform_dragon(user, prey, user, belly) + +/mob/living/proc/perform_dragon(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly, swallow_time = 20) + //Sanity + if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs)) + return + + // The belly selected at the time of noms + var/datum/belly/belly_target = pred.vore_organs[belly] + var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)" + var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)" + + // Prepare messages + if(user == pred) //Feeding someone to yourself + attempt_msg = text("[] starts to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) + success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) + + // Announce that we start the attempt! + user.visible_message(attempt_msg) + + if(!do_mob(src, user, swallow_time)) // one second should be good enough, right? + return FALSE // Prey escaped (or user disabled) before timer expired. + + // If we got this far, nom successful! Announce it! + user.visible_message(success_msg) + playsound(user, belly_target.vore_sound, 100, 1) + + // Actually shove prey into the belly. + belly_target.nom_mob(prey, user) + if (pred == user) + message_admins("[key_name(pred)] ate [key_name(prey)].") + log_attack("[key_name(pred)] ate [key_name(prey)]") + return TRUE // // Master vore proc that actually does vore procedures // @@ -243,6 +286,7 @@ if(M.loc != src) B.internal_contents.Remove(M) + // OOC Escape code for pref-breaking or AFK preds // /mob/living/proc/escapeOOC() @@ -302,6 +346,7 @@ P.digestable = src.digestable P.devourable = src.devourable P.belly_prefs = src.vore_organs + P.vore_taste = src.vore_taste return TRUE @@ -318,9 +363,48 @@ src.digestable = P.digestable src.devourable = P.devourable src.vore_organs = list() + src.vore_taste = P.vore_taste for(var/I in P.belly_prefs) var/datum/belly/Bp = P.belly_prefs[I] src.vore_organs[Bp.name] = Bp.copy(src) return TRUE +// +// Clearly super important. Obviously. +// +/mob/living/proc/lick(var/mob/living/tasted in oview(1)) + set name = "Lick Someone" + set category = "Vore" + set desc = "Lick someone nearby!" + + if(!istype(tasted)) + return + + if(src == stat) + return + + src.setClickCooldown(50) + + src.visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!") + + +/mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace) + if(!vore_taste && !allow_generic) + return FALSE + + var/taste_message = "" + if(vore_taste && (vore_taste != "")) + taste_message += "[vore_taste]" + else + if(ishuman(src)) + taste_message += "normal, like a critter should" + else + taste_message += "a plain old normal [src]" + +/* if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.touching.reagent_list.len) //Just the first one otherwise I'll go insane. + var/datum/reagent/R = H.touching.reagent_list[1] + taste_message += " You also get the flavor of [R.taste_description] from something on them"*/ + return taste_message \ No newline at end of file diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index 33417331f5..f8e30b6353 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -1,19 +1,9 @@ ///////////////////// Simple Animal ///////////////////// /mob/living/simple_animal - var/isPredator = 0 //Are they capable of performing and pre-defined vore actions for their species? - var/swallowTime = 30 //How long it takes to eat its prey in 1/10 of a second. The default is 3 seconds. + var/isPredator = FALSE //Are they capable of performing and pre-defined vore actions for their species? + var/swallowTime = 5 SECONDS //How long it takes to eat its prey in 1/10 of a second. The default is 5 seconds. var/list/prey_excludes = list() //For excluding people from being eaten. -// -// Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs. -/* -/mob/living/proc/animal_nom(var/mob/living/T in oview(1)) - set name = "Animal Nom" - set category = "Vore" - set desc = "Since you can't grab, you get a verb!" - - feed_grabbed_to_self(src,T) -*/ // // Simple proc for animals to have their digestion toggled on/off externally // @@ -25,15 +15,30 @@ var/datum/belly/B = vore_organs[vore_selected] if(faction != usr.faction) - usr << "This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you." + to_chat(usr,"This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you.") return if(B.digest_mode == "Hold") var/confirm = alert(usr, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will disable itself after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel") if(confirm == "Enable") B.digest_mode = "Digest" - spawn(12000) //12000=20 minutes - if(src) B.digest_mode = "Hold" + sleep(20 MINUTES) //12000=20 minutes + B.digest_mode = "Hold" else var/confirm = alert(usr, "This mob is currently set to digest all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel") if(confirm == "Disable") - B.digest_mode = "Hold" \ No newline at end of file + B.digest_mode = "Hold" + +// +// Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs. +// +/mob/living/proc/animal_nom(var/mob/living/T in oview(1)) + set name = "Animal Nom" + set category = "Vore" + set desc = "Since you can't grab, you get a verb!" + + if (stat != CONSCIOUS) + return + if (T.devourable == FALSE) + to_chat(usr, "You can't eat this!") + return + return feed_grabbed_to_self(src,T) \ No newline at end of file diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index 1111a7d418..f6d886e93f 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -41,6 +41,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE var/digestable = TRUE var/devourable = FALSE var/list/belly_prefs = list() + var/vore_taste //Mechanically required var/path @@ -101,6 +102,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE S["digestable"] >> digestable S["devourable"] >> devourable S["belly_prefs"] >> belly_prefs + S["vore_taste"] >> vore_taste if(isnull(digestable)) digestable = TRUE @@ -118,8 +120,23 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE if(!S) return FALSE S.cd = "/character[slot]" - S["digestable"] << digestable - S["devourable"] << devourable - S["belly_prefs"] << belly_prefs + WRITE_FILE(S["digestable"], digestable) + WRITE_FILE(S["devourable"], devourable) + WRITE_FILE(S["belly_prefs"], belly_prefs) + WRITE_FILE(S["vore_taste"], vore_taste) return TRUE + +#ifdef TESTING +//DEBUG +//Some crude tools for testing savefiles +//path is the savefile path +/client/verb/vore_savefile_export(path as text) + var/savefile/S = new /savefile(path) + S.ExportText("/",file("[path].txt")) +//path is the savefile path +/client/verb/vore_savefile_import(path as text) + var/savefile/S = new /savefile(path) + S.ImportText("/",file("[path].txt")) + +#endif \ No newline at end of file diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 4afb33b2ac..0f01a4c9e3 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -2,6 +2,12 @@ // Vore management panel for players // +#define BELLIES_MAX 20 +#define BELLIES_NAME_MIN 2 +#define BELLIES_NAME_MAX 12 +#define BELLIES_DESC_MAX 1024 +#define FLAVOR_MAX 40 + /mob/living/proc/insidePanel() set name = "Vore Panel" set category = "Vore" @@ -21,9 +27,15 @@ // /datum/vore_look var/datum/belly/selected + var/show_interacts = TRUE var/datum/browser/popup var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action. +/datum/vore_look/Destroy() + loop = null + selected = null + return QDEL_HINT_HARDDEL + /datum/vore_look/Topic(href,href_list[]) if (vp_interact(href, href_list)) popup.set_content(gen_vui(usr)) @@ -55,6 +67,8 @@ continue //Anything else dat += "[O]" + //Zero-width space, for wrapping + dat += "​" else dat += "You aren't inside anyone." @@ -79,7 +93,7 @@ dat += " ([B.internal_contents.len])" - if(user.vore_organs.len < 10) + if(user.vore_organs.len < BELLIES_MAX) dat += "
  • New+
  • " dat += "" dat += "
    " @@ -93,6 +107,8 @@ for(var/O in selected.internal_contents) dat += "[O]" + //Zero-width space, for wrapping + dat += "​" //If there's more than one thing, add an [All] button if(selected.internal_contents.len > 1) dat += "\[All\]" @@ -119,9 +135,44 @@ dat += "
    Set Vore Sound" dat += "Test" + // //Belly silence + // dat += "
    Belly Silence ([selected.silenced ? "Silenced" : "Noisy"])" + //Belly messages dat += "
    Belly Messages" + //Can belly taste? + dat += "
    Can Taste:" + dat += " [selected.can_taste ? "Yes" : "No"]" + + //Belly escapability + dat += "
    Belly Interactions ([selected.escapable ? "On" : "Off"])" + if(selected.escapable) + dat += "[show_interacts ? "Hide" : "Show"]" + + if(show_interacts && selected.escapable) + dat += "
    " + dat += "Interaction Settings ?" + dat += "
    Set Belly Escape Chance" + dat += " [selected.escapechance]%" + + dat += "
    Set Belly Escape Time" + dat += " [selected.escapetime/10]s" + + //Special
    here to add a gap + dat += "
    " + dat += "
    Set Belly Transfer Chance" + dat += " [selected.transferchance]%" + + dat += "
    Set Belly Transfer Location" + dat += " [selected.transferlocation ? selected.transferlocation : "Disabled"]" + + //Special
    here to add a gap + dat += "
    " + dat += "
    Set Belly Digest Chance" + dat += " [selected.digestchance]%" + dat += "
    " + //Delete button dat += "
    Delete Belly" @@ -130,7 +181,9 @@ //Under the last HR, save and stuff. dat += "Save Prefs" dat += "Refresh" + dat += "Set Flavor" + dat += "
    " switch(user.digestable) if(TRUE) dat += "Toggle Digestable (Currently: ON)" @@ -151,12 +204,26 @@ for(var/H in href_list) if(href_list["close"]) - del(src) // Cleanup + qdel(src) // Cleanup return + if(href_list["show_int"]) + show_interacts = !show_interacts + return TRUE //Force update + + if(href_list["int_help"]) + to_chat(usr,"These control how your belly responds to someone using 'resist' while inside you. The percent chance to trigger each is listed below, \ + and you can change them to whatever you see fit. Setting them to 0% will disable the possibility of that interaction. \ + These only function as long as interactions are turned on in general. Keep in mind, the 'belly mode' interactions (digest) \ + will affect all prey in that belly, if one resists and triggers digestion. If multiple trigger at the same time, \ + only the first in the order of 'Escape > Transfer > Digest' will occur.") + return TRUE //Force update + if(href_list["outsidepick"]) - var/tgt = locate(href_list["outsidepick"]) + var/atom/movable/tgt = locate(href_list["outsidepick"]) var/datum/belly/OB = locate(href_list["outsidebelly"]) + if(!(tgt in OB.internal_contents)) //Aren't here anymore, need to update menu. + return TRUE var/intent = "Examine" if(istype(tgt,/mob/living)) @@ -184,7 +251,7 @@ if("Devour") //Eat the inside mob if(!user.vore_selected) to_chat(user, "Pick a belly on yourself first!") - return TRUE + return var/datum/belly/TB = user.vore_organs[user.vore_selected] to_chat(user, "You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") @@ -202,6 +269,9 @@ else if(istype(tgt,/obj/item)) var/obj/item/T = tgt + if(!(tgt in OB.internal_contents)) + //Doesn't exist anymore, update. + return TRUE intent = alert("What do you want to do to that?","Query","Examine","Use Hand") switch(intent) if("Examine") @@ -210,7 +280,7 @@ if("Use Hand") if(user.stat) to_chat(user, "You can't do that in your state!") - return TRUE + return user.ClickOn(T) sleep(5) //Seems to exit too fast for the panel to update @@ -223,40 +293,38 @@ intent = alert("Eject all, Move all?","Query","Eject all","Cancel","Move all") switch(intent) if("Cancel") - return 1 + return if("Eject all") if(user.stat) to_chat(user, "You can't do that in your state!") - return TRUE + return selected.release_all_contents() - playsound(user, 'sound/vore/pred/escape.ogg', volume=80) - user.loc << "Everything is released from [user]!" + playsound(user, 'sound/vore/pred/escape.ogg', vol=80) + to_chat(user.loc,"Everything is released from [user]!") if("Move all") if(user.stat) to_chat(user, "You can't do that in your state!") - return TRUE + return var/choice = input("Move all where?","Select Belly") in user.vore_organs + "Cancel - Don't Move" if(choice == "Cancel - Don't Move") - return TRUE + return else var/datum/belly/B = user.vore_organs[choice] for(var/atom/movable/tgt in selected.internal_contents) - selected.internal_contents -= tgt - B.internal_contents += tgt - to_chat(tgt, "You're squished from [user]'s [selected] to their [B]!") + selected.transfer_contents(tgt, B, 1) for(var/mob/hearer in range(1,user)) hearer << sound('sound/vore/pred/stomachmove.ogg',volume=80) - return TRUE - var/atom/movable/tgt = locate(href_list["insidepick"]) + if(!(tgt in selected.internal_contents)) //Old menu, needs updating because they aren't really there. + return TRUE//Forces update intent = "Examine" intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move") switch(intent) @@ -266,7 +334,7 @@ if("Eject") if(user.stat) to_chat(user, "You can't do that in your state!") - return TRUE + return FALSE selected.release_specific_contents(tgt) playsound(user, 'sound/effects/splat.ogg', 50, 1) @@ -275,28 +343,28 @@ if("Move") if(user.stat) to_chat(user, "You can't do that in your state!") - return TRUE + return FALSE var/choice = input("Move [tgt] where?","Select Belly") in user.vore_organs + "Cancel - Don't Move" if(choice == "Cancel - Don't Move") - return TRUE + return else var/datum/belly/B = user.vore_organs[choice] - selected.internal_contents -= tgt - B.internal_contents += tgt - - to_chat(tgt, "You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(B.name)]!") + if (!(tgt in selected.internal_contents)) + return FALSE + to_chat(tgt, "You're moved from [user]'s [lowertext(selected.name)] to their [lowertext(B.name)]!") for(var/mob/hearer in range(1,user)) hearer << sound('sound/vore/pred/stomachmove.ogg',volume=80) + selected.transfer_contents(tgt, B) if(href_list["newbelly"]) - if(user.vore_organs.len >= 10) + if(user.vore_organs.len >= BELLIES_MAX) return TRUE var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null) - if(length(new_name) > 12 || length(new_name) < 2) + if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN) to_chat(usr, "Entered belly name is too long.") return FALSE if(new_name in user.vore_organs) @@ -313,10 +381,13 @@ selected = locate(href_list["bellypick"]) user.vore_selected = selected.name + //// + //Please keep these the same order they are on the panel UI for ease of coding + //// if(href_list["b_name"]) var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null) - if(length(new_name) > 12 || length(new_name) < 2) + if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN) to_chat(usr, "Entered belly name length invalid (must be longer than 2, shorter than 12).") return FALSE if(new_name in user.vore_organs) @@ -344,14 +415,16 @@ if(href_list["b_desc"]) var/new_desc = html_encode(input(usr,"Belly Description (1024 char limit):","New Description",selected.inside_flavor) as message|null) - new_desc = readd_quotes(new_desc) + if(new_desc) + new_desc = readd_quotes(new_desc) + if(length(new_desc) > BELLIES_DESC_MAX) + to_chat(usr, "Entered belly desc too long. [BELLIES_DESC_MAX] character limit.") + return FALSE - if(length(new_desc) > 1024) - to_chat(usr, "Entered belly desc too long. 1024 character limit.") + selected.inside_flavor = new_desc + else //Returned null return FALSE - selected.inside_flavor = new_desc - if(href_list["b_msgs"]) var/list/messages = list( "Digest Message (to prey)", @@ -389,7 +462,7 @@ selected.set_messages(new_message,"smi") if("Examine Message (when full)") - var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging'). Do not use %pred or %prey in this type."+help,"Examine Message (when full)",selected.get_messages("em")) as message + var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging'). "+help,"Examine Message (when full)",selected.get_messages("em")) as message if(new_message) selected.set_messages(new_message,"em") @@ -402,13 +475,13 @@ selected.struggle_messages_inside = initial(selected.struggle_messages_inside) if("Cancel - No Changes") - return TRUE + return if(href_list["b_verb"]) var/new_verb = html_encode(input(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb") as text|null) - if(length(new_verb) > 12 || length(new_verb) < 2) - to_chat(usr, "Entered verb length invalid (must be longer than 2, shorter than 12).") + if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN) + to_chat(usr, "Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).") return FALSE selected.vore_verb = new_verb @@ -417,20 +490,90 @@ var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") in GLOB.pred_vore_sounds + "Cancel - No Changes" if(choice == "Cancel") - return 1 + return selected.vore_sound = GLOB.pred_vore_sounds[choice] if(href_list["b_soundtest"]) user << selected.vore_sound +/* + if(href_list["silenced"]) + if(selected.silenced == FALSE) + selected.silenced = TRUE + to_chat(usr,"The [selected.name] is now silenced, it will not play the internal loop to prey within it.") + else if(selected.silenced == TRUE) + selected.silenced = FALSE + to_chat(usr,"The [selected.name] will play the internal loop to prey within it.") +*/ + if(href_list["b_tastes"]) + selected.can_taste = !selected.can_taste + + if(href_list["b_escapable"]) + if(selected.escapable == FALSE) //Possibly escapable and special interactions. + selected.escapable = TRUE + to_chat(usr,"Prey now have special interactions with your [selected.name] depending on your settings.") + else if(selected.escapable == TRUE) //Never escapable. + selected.escapable = FALSE + to_chat(usr,"Prey will not be able to have special interactions with your [selected.name].") + show_interacts = FALSE //Force the hiding of the panel + else + to_chat(usr,"Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.") //If they somehow have a varable that's not 0 or 1 + selected.escapable = FALSE + show_interacts = FALSE //Force the hiding of the panel + + if(href_list["b_escapechance"]) + var/escape_chance_input = input(user, "Set prey escape chance on resist (as %)", "Prey Escape Chance") as num|null + if(!isnull(escape_chance_input)) //These have to be 'null' because both cancel and 0 are valid, separate options + selected.escapechance = sanitize_integer(escape_chance_input, 0, 100, initial(selected.escapechance)) + + if(href_list["b_escapetime"]) + var/escape_time_input = input(user, "Set number of seconds for prey to escape on resist (1-60)", "Prey Escape Time") as num|null + if(!isnull(escape_time_input)) + selected.escapetime = sanitize_integer(escape_time_input*10, 10, 600, initial(selected.escapetime)) + + if(href_list["b_transferchance"]) + var/transfer_chance_input = input(user, "Set belly transfer chance on resist (as %). You must also set the location for this to have any effect.", "Prey Escape Time") as num|null + if(!isnull(transfer_chance_input)) + selected.transferchance = sanitize_integer(transfer_chance_input, 0, 100, initial(selected.transferchance)) + + if(href_list["b_transferlocation"]) + var/choice = input("Where do you want your [selected.name] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected.name) + + if(!choice) //They cancelled, no changes + return + else if(choice == "None - Remove") + selected.transferlocation = null + else + selected.transferlocation = user.vore_organs[choice] + + if(href_list["b_digestchance"]) + var/digest_chance_input = input(user, "Set belly digest mode chance on resist (as %)", "Prey Digest Chance") as num|null + if(!isnull(digest_chance_input)) + selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(selected.digestchance)) if(href_list["b_del"]) + var/dest_for = FALSE //Check to see if it's the destination of another vore organ. + for(var/I in user.vore_organs) + var/datum/belly/B = user.vore_organs[I] + if(B.transferlocation == selected) + dest_for = B.name + break + + if(dest_for) + alert("This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it.","Error") + return TRUE + else if(selected.internal_contents.len) + alert("Can't delete bellies with contents!","Error") + return TRUE if(selected.internal_contents.len) to_chat(usr, "Can't delete bellies with contents!") + return else if(selected.immutable) to_chat(usr, "This belly is marked as undeletable.") + return else if(user.vore_organs.len == 1) to_chat(usr, "You must have at least one belly.") + return else var/alert = alert("Are you sure you want to delete [selected]?","Confirmation","Delete","Cancel") if(alert == "Delete" && !selected.internal_contents.len) @@ -438,6 +581,7 @@ user.vore_organs.Remove(selected) selected = user.vore_organs[1] user.vore_selected = user.vore_organs[1] + to_chat(usr,"Note: If you had this organ selected as a transfer location, please remove the transfer location by selecting Cancel - None - Remove on this stomach.") if(href_list["saveprefs"]) if(user.save_vore_prefs()) @@ -447,12 +591,23 @@ to_chat(user, "ERROR: Belly Preferences were not saved!") log_admin("Could not save vore prefs on USER: [user].") + if(href_list["setflavor"]) + var/new_flavor = html_encode(input(usr,"What your character tastes like (40ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",user.vore_taste) as text|null) + + if(new_flavor) + new_flavor = readd_quotes(new_flavor) + if(length(new_flavor) > FLAVOR_MAX) + alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error") + return FALSE + user.vore_taste = new_flavor + else //Returned null + return FALSE if(href_list["toggledg"]) var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") switch(choice) if("Cancel") - return 1 + return if("Allow Digestion") user.digestable = TRUE if("Prevent Digestion") @@ -465,7 +620,7 @@ var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment") switch(choice) if("Cancel") - return 1 + return if("Allow Devourment") user.devourable = TRUE if("Prevent Devourment") @@ -475,4 +630,4 @@ user.client.prefs_vr.devourable = user.devourable //Refresh when interacted with, returning 1 makes vore_look.Topic update - return 1 + return TRUE diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 1b6e486984..8db4e492e4 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -49,6 +49,16 @@ infection = new() infection.Insert(target) + +/obj/item/zombie_hand/suicide_act(mob/user) + user.visible_message("[user] is ripping [user.p_their()] brains out! It looks like [user.p_theyre()] trying to commit suicide!") + if(isliving(user)) + var/mob/living/L = user + var/obj/item/bodypart/O = L.get_bodypart("head") + if(O) + O.dismember() + return (BRUTELOSS) + /obj/item/zombie_hand/proc/check_feast(mob/living/target, mob/living/user) if(target.stat == DEAD) var/hp_gained = target.maxHealth diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index addcfc6dec..d089204fc8 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -48,6 +48,8 @@ if(timer_id) return + if(owner.suiciding) + return if(owner.stat != DEAD && !converts_living) return if(!iszombie(owner)) diff --git a/config/config.txt b/config/config.txt index 652651e425..80a587885b 100644 --- a/config/config.txt +++ b/config/config.txt @@ -145,8 +145,8 @@ CHECK_RANDOMIZER ## IPINTEL: ## This allows you to detect likely proxies by checking ips against getipintel.net -## Rating to warn at: (0.90 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning -#IPINTEL_RATING_BAD 0.90 +## Rating to warn at: (0.9 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning +#IPINTEL_RATING_BAD 0.9 ## Contact email, (required to use the service, leaving blank or default disables IPINTEL) #IPINTEL_EMAIL ch@nge.me ## How long to save good matches (ipintel rate limits to 15 per minute and 500 per day. so this shouldn't be too low, getipintel.net suggests 6 hours, time is in hours) (Your ip will get banned if you go over 500 a day too many times) @@ -317,7 +317,7 @@ CLIENT_ERROR_VERSION 511 CLIENT_ERROR_MESSAGE Your version of byond is not supported. Please upgrade. ## TOPIC RATE LIMITING -## This allows you to limit how many topic calls (clicking on a interface window) the client can do in any given game second and/or game minute. +## This allows you to limit how many topic calls (clicking on an interface window) the client can do in any given game second and/or game minute. ## Admins are exempt from these limits. ## Hitting the minute limit notifies admins. ## Set to 0 or comment out to disable. @@ -326,13 +326,13 @@ SECOND_TOPIC_LIMIT 10 MINUTE_TOPIC_LIMIT 100 ##Error handling related options -## The "cooldown" time for each occurence of an unique error +## The "cooldown" time for each occurence of a unique error #ERROR_COOLDOWN 600 ## How many occurences before the next will silence them #ERROR_LIMIT 90 -## How long an unique error will be silenced for +## How long a unique error will be silenced for #ERROR_SILENCE_TIME 6000 -##How long to wait between messaging admins about occurences of an unique error +##How long to wait between messaging admins about occurences of a unique error #ERROR_MSG_DELAY 50 ## Send a message to IRC when starting a new game diff --git a/config/config.txt.rej b/config/config.txt.rej deleted file mode 100644 index fee79cf699..0000000000 --- a/config/config.txt.rej +++ /dev/null @@ -1,25 +0,0 @@ -diff a/config/config.txt b/config/config.txt (rejected hunks) -@@ -32,17 +32,17 @@ BAN_LEGACY_SYSTEM - ## Uncomment this to have the job system use the player's account creation date, rather than the when they first joined the server for job timers. - #USE_ACCOUNT_AGE_FOR_JOBS - --##Unhash this to track player playtime in the database. Requires database to be enabled. -+## Unhash this to track player playtime in the database. Requires database to be enabled. - #USE_EXP_TRACKING --##Unhash this to enable playtime requirements for head jobs. -+## Unhash this to enable playtime requirements for head jobs. - #USE_EXP_RESTRICTIONS_HEADS --##Unhash this to override head jobs' playtime requirements with this number of hours. -+## Unhash this to override head jobs' playtime requirements with this number of hours. - #USE_EXP_RESTRICTIONS_HEADS_HOURS 15 --##Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime. -+## Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime. - #USE_EXP_RESTRICTIONS_HEADS_DEPARTMENT --##Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist. -+## Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist. - #USE_EXP_RESTRICTIONS_OTHER --##Allows admins to bypass job playtime requirements. -+## Allows admins to bypass job playtime requirements. - #USE_EXP_RESTRICTIONS_ADMIN_BYPASS - - diff --git a/config/game_options.txt b/config/game_options.txt index 2f2f22165d..bd46eeecad 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -77,11 +77,11 @@ ALERT_DELTA Destruction of the station is imminent. All crew are instructed to o ## Set to 0 to disable that mode. PROBABILITY TRAITOR 5 +PROBABILITY TRAITORBRO 2 PROBABILITY TRAITORCHAN 4 PROBABILITY INTERNAL_AFFAIRS 3 PROBABILITY NUCLEAR 2 PROBABILITY REVOLUTION 2 -PROBABILITY GANG 2 PROBABILITY CULT 2 PROBABILITY CHANGELING 2 PROBABILITY WIZARD 4 @@ -98,16 +98,19 @@ PROBABILITY DEVIL_AGENTS 0 ## You probably want to keep sandbox off by default for secret and random. PROBABILITY SANDBOX 0 +## Percent weight reductions for three of the most recent modes + +REPEATED_MODE_ADJUST 45 30 10 ## Toggles for continuous modes. ## Modes that aren't continuous will end the instant all antagonists are dead. CONTINUOUS TRAITOR +CONTINUOUS TRAITORBRO CONTINUOUS TRAITORCHAN CONTINUOUS INTERNAL_AFFAIRS #CONTINUOUS NUCLEAR #CONTINUOUS REVOLUTION -CONTINUOUS GANG CONTINUOUS CULT CONTINUOUS CLOCKWORK_CULT CONTINUOUS CHANGELING @@ -129,11 +132,11 @@ CONTINUOUS SECRET_EXTENDED ## In modes that are continuous, if all antagonists should die then a new set of antagonists will be created. MIDROUND_ANTAG TRAITOR +#MIDROUND_ANTAG TRAITORBRO MIDROUND_ANTAG TRAITORCHAN MIDROUND_ANTAG INTERNAL_AFFAIRS #MIDROUND_ANTAG NUCLEAR #MIDROUND_ANTAG REVOLUTION -#MIDROUND_ANTAG GANG MIDROUND_ANTAG CULT MIDROUND_ANTAG CLOCKWORK_CULT MIDROUND_ANTAG CHANGELING @@ -153,6 +156,9 @@ MIDROUND_ANTAG ABDUCTION #MIN_POP TRAITOR 0 #MAX_POP TRAITOR -1 +#MIN_POP TRAITORBRO 0 +#MAX_POP TRAITORBRO -1 + #MIN_POP TRAITORCHAN 15 #MAX_POP TRAITORCHAN -1 @@ -165,9 +171,6 @@ MIDROUND_ANTAG ABDUCTION #MIN_POP REVOLUTION 20 #MAX_POP REVOLUTION -1 -#MIN_POP GANG 20 -#MAX_POP GANG -1 - #MIN_POP CULT 24 #MAX_POP CULT -1 @@ -208,6 +211,7 @@ SHUTTLE_REFUEL_DELAY 12000 ## Used as (Antagonists = Population / Coeff) ## Set to 0 to disable scaling and use default numbers instead. TRAITOR_SCALING_COEFF 6 +BROTHER_SCALING_COEFF 6 CHANGELING_SCALING_COEFF 6 ## Variables calculate how number of open security officer positions will scale to population. @@ -218,6 +222,7 @@ SECURITY_SCALING_COEFF 8 ## The number of objectives traitors get. ## Not including escaping/hijacking. TRAITOR_OBJECTIVES_AMOUNT 2 +BROTHER_OBJECTIVES_AMOUNT 2 ## Uncomment to prohibit jobs that start with loyalty ## implants from being most antagonists. @@ -484,6 +489,9 @@ Space_Budget 16 ## Must be at least 30 to not break parallax I recommended at least 55 to be visually/aurally appropriate ARRIVALS_SHUTTLE_DOCK_WINDOW 55 +## Uncomment to require the arrivals shuttle to be in flight (if it can fly) before late join players can join +#ARRIVALS_SHUTTLE_REQUIRE_UNDOCKED + ## Uncomment to prevent late join players from spawning if the arrivals shuttle is depressurized #ARRIVALS_SHUTTLE_REQUIRE_SAFE_LATEJOIN diff --git a/html/ban.png b/html/ban.png new file mode 100644 index 0000000000..54f68f4770 Binary files /dev/null and b/html/ban.png differ diff --git a/html/changelog.css b/html/changelog.css index b83a8d4f56..031c1e42c0 100644 --- a/html/changelog.css +++ b/html/changelog.css @@ -20,6 +20,11 @@ a img {border:none;} .imagedel {background-image:url(image-minus.png)} .spellcheck {background-image:url(spell-check.png)} .experiment {background-image:url(burn-exclamation.png)} +.refactor {background-image:url(burn-exclamation.png)} +.code_imp {background-image:url(coding.png)} +.config {background-image:url(chrome_wrench.png)} +.admin {background-image:url(ban.png)} +.server {background-image:url(hard-hat-exclamation.png)} .balance {background-image:url(scales.png)} .sansserif {font-family:Tahoma,sans-serif;font-size:12px;} .commit {margin-bottom:20px;font-size:100%;font-weight:normal;} diff --git a/html/changelogs/AutoChangeLog-pr-2484.yml b/html/changelogs/AutoChangeLog-pr-2484.yml deleted file mode 100644 index f7d8732121..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2484.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - spellcheck: "fixed inconsistent grammar between machines that derive from /obj/machinery/chem_dispenser" - - spellcheck: "touched up some chat messages to include references to objects instead of \"that\" or \"the machine\" etc., also removed references to beakers being loaded in machines that can accept any container" diff --git a/html/changelogs/AutoChangeLog-pr-2539.yml b/html/changelogs/AutoChangeLog-pr-2539.yml deleted file mode 100644 index 3401e4c4c9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2539.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - tweak: "All power systems will now report their wattage values in Watts, Kilowatts, Megawatts, and Gigawatts. Gone are the days of seeing 48760 W total load when working with an APC!" diff --git a/html/changelogs/AutoChangeLog-pr-2583.yml b/html/changelogs/AutoChangeLog-pr-2583.yml new file mode 100644 index 0000000000..fff14dec8e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2583.yml @@ -0,0 +1,8 @@ +author: "deathride58" +delete-after: True +changes: + - rscadd: "Firing most guns will now cause your screen to shake subtly." + - rscadd: "Being hit by melee weapons with a force over 10 will now cause subtle screenshake" + - rscadd: "Hitting someone with a melee weapon with a force over 10 will now cause subtle screenshake" + - rscadd: "Hitting an object with a melee weapon with a force over 20 will now cause subtle screenshake" + - rscadd: "Added two options to the Game Settings menu: Screen Shake and Damage Screen Shake. Screen Shake controls (most) screenshake in the game, and allows you to set the percentage of screenshake from most sources, or simply turn it off entirely. Damage Screen Shake controls the screenshake when you get hit by weapons, and has three settings, on, off, and only when down. The defaults are 100%, and only when down, respectively." diff --git a/html/changelogs/AutoChangeLog-pr-2599.yml b/html/changelogs/AutoChangeLog-pr-2599.yml deleted file mode 100644 index 1a184bb194..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2599.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Pubby" -delete-after: True -changes: - - bugfix: "Escape pods and PubbyStation's monastery shuttle are back in commission" diff --git a/html/changelogs/AutoChangeLog-pr-2615.yml b/html/changelogs/AutoChangeLog-pr-2615.yml deleted file mode 100644 index 8ea320ce6c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2615.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Stands now check if their user got queue deleted somehow" diff --git a/html/changelogs/AutoChangeLog-pr-2699.yml b/html/changelogs/AutoChangeLog-pr-2699.yml deleted file mode 100644 index 6b0a665b67..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2699.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Mechs now can be connected to atmos ports" diff --git a/html/changelogs/AutoChangeLog-pr-2701.yml b/html/changelogs/AutoChangeLog-pr-2701.yml deleted file mode 100644 index 8ad7c8ac56..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2701.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BeeSting12" -delete-after: True -changes: - - balance: "The stetchkin APS pistol is smaller." - - rscadd: "The 9mm pistol magazines can be purchased from nuke op uplinks at two telecrystals each." diff --git a/html/changelogs/AutoChangeLog-pr-2703.yml b/html/changelogs/AutoChangeLog-pr-2703.yml deleted file mode 100644 index f507d35652..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2703.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - bugfix: "The Orion Trail machines are no longer on hardcore mode and you can now restart after losing." diff --git a/html/changelogs/AutoChangeLog-pr-2709.yml b/html/changelogs/AutoChangeLog-pr-2709.yml deleted file mode 100644 index 15a73203fb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2709.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kor" -delete-after: True -changes: - - rscadd: "Added Nightmares. They're admin only currently, so as usual, make sure to beg admins to be one." diff --git a/html/changelogs/AutoChangeLog-pr-2710.yml b/html/changelogs/AutoChangeLog-pr-2710.yml deleted file mode 100644 index 3ff0987838..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2710.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "VexingRaven" -delete-after: True -changes: - - bugfix: "Changeling Augmented Eyesight ability now grants flash protection when toggled off" - - bugfix: "Changeling Augmented Eyesight ability can now be toggled properly" - - bugfix: "Changeling Augmented Eyesight ability is properly removed when readapting" diff --git a/html/changelogs/AutoChangeLog-pr-2717.yml b/html/changelogs/AutoChangeLog-pr-2717.yml deleted file mode 100644 index 59473e3f39..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2717.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jay" -delete-after: True -changes: - - rscadd: "SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS" diff --git a/html/changelogs/AutoChangeLog-pr-2739.yml b/html/changelogs/AutoChangeLog-pr-2739.yml deleted file mode 100644 index 62b91671d4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2739.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Lordpidey" -delete-after: True -changes: - - bugfix: "Centcom roundstart threat reports are fixed, and can now be used to narrow down the types of threats facing the station." diff --git a/html/changelogs/AutoChangeLog-pr-2740.yml b/html/changelogs/AutoChangeLog-pr-2740.yml deleted file mode 100644 index bb5531fcf8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2740.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "VexingRaven" -delete-after: True -changes: - - bugfix: "The syndicate have once again stocked the toy C20r and L6 Saw with riot darts." diff --git a/html/changelogs/AutoChangeLog-pr-2754.yml b/html/changelogs/AutoChangeLog-pr-2754.yml deleted file mode 100644 index 2de36c6227..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2754.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Holding a potted plant will no longer put you above objects on walls." diff --git a/html/changelogs/AutoChangeLog-pr-2759.yml b/html/changelogs/AutoChangeLog-pr-2759.yml deleted file mode 100644 index 829515f4fa..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2759.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - rscadd: "Added inhands for a few weapons" - - rscadd: "sweaters and some vg clothes" - - rscadd: "icon_override now works. Use that instead of putting shit in uniform.dmi for snowflake clothes" - - rscadd: "AK-47s FOR EVERYONE!! button for Admins to use." - - rscadd: "Plasma Rifle Gunlocker, for mapping memes. Unbreakable and emags don't work, they only unlock during Red or Delta security alerts. Mainly designed for Anti-Xenomorph or Blob duty." diff --git a/html/changelogs/AutoChangeLog-pr-2760.yml b/html/changelogs/AutoChangeLog-pr-2760.yml deleted file mode 100644 index 5b85e77b64..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2760.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fun Police" -delete-after: True -changes: - - rscdel: "Removed some of the free lag." diff --git a/html/changelogs/AutoChangeLog-pr-2766.yml b/html/changelogs/AutoChangeLog-pr-2766.yml deleted file mode 100644 index a289ab49d4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2766.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kor" -delete-after: True -changes: - - bugfix: "It is possible to multitool the cargo computer circuitboard for contraband again" diff --git a/html/changelogs/AutoChangeLog-pr-2780.yml b/html/changelogs/AutoChangeLog-pr-2780.yml deleted file mode 100644 index c4436213cb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2780.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Prevents dead monkeys from fleeing their attackers or escaping His Grace only to be eaten again" diff --git a/html/changelogs/AutoChangeLog-pr-2782.yml b/html/changelogs/AutoChangeLog-pr-2782.yml deleted file mode 100644 index 4dbe69d9b5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2782.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Evidence bags will no longer show ghosts of items such as primed flashbangs after the flashbang inside explodes" diff --git a/html/changelogs/AutoChangeLog-pr-2783.yml b/html/changelogs/AutoChangeLog-pr-2783.yml deleted file mode 100644 index 1a585894a1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2783.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Ninja adrenaline boost removes stamina damage" diff --git a/html/changelogs/AutoChangeLog-pr-2784.yml b/html/changelogs/AutoChangeLog-pr-2784.yml deleted file mode 100644 index 63f59afadd..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2784.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - rscadd: "Due to budget cuts, airlocks that control access to non-functional maint rooms and other abandoned areas now have a chance to spawn welded, bolted, screwdrivered, or flat out replaced by a wall at roundstart." diff --git a/html/changelogs/AutoChangeLog-pr-2786.yml b/html/changelogs/AutoChangeLog-pr-2786.yml deleted file mode 100644 index 758a493466..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2786.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Basilman" -delete-after: True -changes: - - rscadd: "Gondolas are now procedural generated." diff --git a/html/changelogs/AutoChangeLog-pr-2789.yml b/html/changelogs/AutoChangeLog-pr-2789.yml deleted file mode 100644 index b988853fde..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2789.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "The doomsday device will again periodically announce the time until its activation" diff --git a/html/changelogs/AutoChangeLog-pr-2791.yml b/html/changelogs/AutoChangeLog-pr-2791.yml deleted file mode 100644 index a802189796..0000000000 --- a/html/changelogs/AutoChangeLog-pr-2791.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - rscdel: "Corgis can no longer be targeted by facehuggers" diff --git a/html/changelogs/AutoChangeLog-pr-2907.yml b/html/changelogs/AutoChangeLog-pr-2907.yml new file mode 100644 index 0000000000..352432595c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2907.yml @@ -0,0 +1,8 @@ +author: "Toriate" +delete-after: True +changes: + - rscadd: "Adds Spinfusors, ordered from cargo, security locked crate" + - rscadd: "Adds the X9 Assault Rifle, adminspawn only" + - rscadd: "Adds the Magpistol, made in science, non-lethal by default, unlocked slightly later than the AEG" + - rscadd: "Adds the Foam Force Magpistol and Magfoam, made in autolathes" + - soundadd: "adds the Magpistol's firing sound" diff --git a/html/changelogs/AutoChangeLog-pr-2909.yml b/html/changelogs/AutoChangeLog-pr-2909.yml new file mode 100644 index 0000000000..65e957021b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2909.yml @@ -0,0 +1,7 @@ +author: "Poojawa" +delete-after: True +changes: + - tweak: "Flightsuits require power cells now to function" + - tweak: "Flightsuit HUDs reduced to AI standards rather than full advanced." + - tweak: "Suits will heavily drain while in gravity, but not much without it." + - tweak: "Swap batteries via clicking on your suit with one." diff --git a/html/changelogs/AutoChangeLog-pr-2918.yml b/html/changelogs/AutoChangeLog-pr-2918.yml new file mode 100644 index 0000000000..3f67bc015e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2918.yml @@ -0,0 +1,4 @@ +author: "JJRcop" +delete-after: True +changes: + - rscadd: "Suiciding with a ballistic gun now actually blows your brain out." diff --git a/html/changelogs/AutoChangeLog-pr-2923.yml b/html/changelogs/AutoChangeLog-pr-2923.yml new file mode 100644 index 0000000000..6ab464e82c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2923.yml @@ -0,0 +1,4 @@ +author: "Improvedname" +delete-after: True +changes: + - tweak: "You can now rename holy weapons" diff --git a/html/changelogs/AutoChangeLog-pr-2577.yml b/html/changelogs/AutoChangeLog-pr-2929.yml similarity index 53% rename from html/changelogs/AutoChangeLog-pr-2577.yml rename to html/changelogs/AutoChangeLog-pr-2929.yml index 6aed6839d7..884f951047 100644 --- a/html/changelogs/AutoChangeLog-pr-2577.yml +++ b/html/changelogs/AutoChangeLog-pr-2929.yml @@ -1,4 +1,4 @@ author: "More Robust Than You" delete-after: True changes: - - rscdel: "Finally fucking removed gangs" + - rscadd: "Implant Chairs now also support organs" diff --git a/html/changelogs/AutoChangeLog-pr-2939.yml b/html/changelogs/AutoChangeLog-pr-2939.yml new file mode 100644 index 0000000000..74e3dbb015 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2939.yml @@ -0,0 +1,4 @@ +author: "Pubby" +delete-after: True +changes: + - rscadd: "Bluespace pipes to atmospherics, which create a single pipenet with all bluespace pipes in existence." diff --git a/html/changelogs/AutoChangeLog-pr-2940.yml b/html/changelogs/AutoChangeLog-pr-2940.yml new file mode 100644 index 0000000000..4dc6c53428 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2940.yml @@ -0,0 +1,5 @@ +author: "ShizCalev" +delete-after: True +changes: + - bugfix: "You now have to be holding a weapon to affix a suppressor to it." + - balance: "Attaching a suppressor to a weapon will now make it slightly larger, as is logical." diff --git a/html/changelogs/AutoChangeLog-pr-2942.yml b/html/changelogs/AutoChangeLog-pr-2942.yml new file mode 100644 index 0000000000..eccae81d90 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2942.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - bugfix: "Fixed jump boots breaking if used when you can't jump, such as when inside a sleeper." diff --git a/html/changelogs/AutoChangeLog-pr-2947.yml b/html/changelogs/AutoChangeLog-pr-2947.yml new file mode 100644 index 0000000000..d7aa9b5576 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2947.yml @@ -0,0 +1,4 @@ +author: "Improvedname" +delete-after: True +changes: + - rscadd: "Adds racial equality to color burgers" diff --git a/html/changelogs/AutoChangeLog-pr-2953.yml b/html/changelogs/AutoChangeLog-pr-2953.yml new file mode 100644 index 0000000000..db1399b5b0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2953.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - bugfix: "Syndicate MMIs will now properly transfer their laws to newly-constructed AIs" diff --git a/html/chrome-wrench.png b/html/chrome-wrench.png new file mode 100644 index 0000000000..a64f202074 Binary files /dev/null and b/html/chrome-wrench.png differ diff --git a/html/coding.png b/html/coding.png new file mode 100644 index 0000000000..887d6b5068 Binary files /dev/null and b/html/coding.png differ diff --git a/html/create_object.html b/html/create_object.html index 44bf7667aa..619da3ec47 100644 --- a/html/create_object.html +++ b/html/create_object.html @@ -26,7 +26,8 @@ - + /* hreftokenfield */ + Type
    Offset: diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 8dbe11a55d..038514d22a 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/inhands/equipment/instruments_lefthand.dmi b/icons/mob/inhands/equipment/instruments_lefthand.dmi index 11ae1895d1..55f690e445 100644 Binary files a/icons/mob/inhands/equipment/instruments_lefthand.dmi and b/icons/mob/inhands/equipment/instruments_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/instruments_righthand.dmi b/icons/mob/inhands/equipment/instruments_righthand.dmi index fcf891a581..1878fdefe3 100644 Binary files a/icons/mob/inhands/equipment/instruments_righthand.dmi and b/icons/mob/inhands/equipment/instruments_righthand.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 70f994cdbe..92a74b0afa 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi index e7c2d4025d..fb43ae85ec 100644 Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index f7c8e1b8dc..13141a4d4e 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/atmospherics/pipes/bluespace.dmi b/icons/obj/atmospherics/pipes/bluespace.dmi new file mode 100644 index 0000000000..866e6f9b84 Binary files /dev/null and b/icons/obj/atmospherics/pipes/bluespace.dmi differ diff --git a/icons/obj/atmospherics/pipes/pipe_item.dmi b/icons/obj/atmospherics/pipes/pipe_item.dmi index 7503e09e88..7b9185aba0 100644 Binary files a/icons/obj/atmospherics/pipes/pipe_item.dmi and b/icons/obj/atmospherics/pipes/pipe_item.dmi differ diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi index b61ea963da..993c037a05 100644 Binary files a/icons/obj/clothing/cloaks.dmi and b/icons/obj/clothing/cloaks.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 752a0a00ec..dfb51a9caa 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index b30a9895c1..53930d778c 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/doors/airlocks/abductor/abductor_airlock.dmi b/icons/obj/doors/airlocks/abductor/abductor_airlock.dmi index d0ef3d2462..58be8d778e 100644 Binary files a/icons/obj/doors/airlocks/abductor/abductor_airlock.dmi and b/icons/obj/doors/airlocks/abductor/abductor_airlock.dmi differ diff --git a/icons/obj/doors/airlocks/centcom/centcom.dmi b/icons/obj/doors/airlocks/centcom/centcom.dmi index ee263cf1b7..c034f8e282 100644 Binary files a/icons/obj/doors/airlocks/centcom/centcom.dmi and b/icons/obj/doors/airlocks/centcom/centcom.dmi differ diff --git a/icons/obj/doors/airlocks/centcom/overlays.dmi b/icons/obj/doors/airlocks/centcom/overlays.dmi index 7650312e8f..7ec3486053 100644 Binary files a/icons/obj/doors/airlocks/centcom/overlays.dmi and b/icons/obj/doors/airlocks/centcom/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/clockwork/overlays.dmi b/icons/obj/doors/airlocks/clockwork/overlays.dmi index b46cc5b191..b34b73fb4e 100644 Binary files a/icons/obj/doors/airlocks/clockwork/overlays.dmi and b/icons/obj/doors/airlocks/clockwork/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi b/icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi index 2da7c0e4e0..cad0fe0ed0 100644 Binary files a/icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi and b/icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi differ diff --git a/icons/obj/doors/airlocks/cult/runed/cult.dmi b/icons/obj/doors/airlocks/cult/runed/cult.dmi index cbb125b112..1ed0d58dc4 100644 Binary files a/icons/obj/doors/airlocks/cult/runed/cult.dmi and b/icons/obj/doors/airlocks/cult/runed/cult.dmi differ diff --git a/icons/obj/doors/airlocks/cult/runed/overlays.dmi b/icons/obj/doors/airlocks/cult/runed/overlays.dmi index a8d6e7dfff..19920538d9 100644 Binary files a/icons/obj/doors/airlocks/cult/runed/overlays.dmi and b/icons/obj/doors/airlocks/cult/runed/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/cult/unruned/cult.dmi b/icons/obj/doors/airlocks/cult/unruned/cult.dmi index b57167633a..83c052c413 100644 Binary files a/icons/obj/doors/airlocks/cult/unruned/cult.dmi and b/icons/obj/doors/airlocks/cult/unruned/cult.dmi differ diff --git a/icons/obj/doors/airlocks/cult/unruned/overlays.dmi b/icons/obj/doors/airlocks/cult/unruned/overlays.dmi index bfbbccf5d7..5fb77f2676 100644 Binary files a/icons/obj/doors/airlocks/cult/unruned/overlays.dmi and b/icons/obj/doors/airlocks/cult/unruned/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/external/external.dmi b/icons/obj/doors/airlocks/external/external.dmi index 4b0461ed59..12b3f26d1e 100644 Binary files a/icons/obj/doors/airlocks/external/external.dmi and b/icons/obj/doors/airlocks/external/external.dmi differ diff --git a/icons/obj/doors/airlocks/external/overlays.dmi b/icons/obj/doors/airlocks/external/overlays.dmi index 5bfa24a6be..1dde58ab5a 100644 Binary files a/icons/obj/doors/airlocks/external/overlays.dmi and b/icons/obj/doors/airlocks/external/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/glass_large/glass_large.dmi b/icons/obj/doors/airlocks/glass_large/glass_large.dmi index 91ae217562..9dbcb9d0f1 100644 Binary files a/icons/obj/doors/airlocks/glass_large/glass_large.dmi and b/icons/obj/doors/airlocks/glass_large/glass_large.dmi differ diff --git a/icons/obj/doors/airlocks/glass_large/overlays.dmi b/icons/obj/doors/airlocks/glass_large/overlays.dmi index 8d9b561ca3..f85a73d8e7 100644 Binary files a/icons/obj/doors/airlocks/glass_large/overlays.dmi and b/icons/obj/doors/airlocks/glass_large/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/hatch/centcom.dmi b/icons/obj/doors/airlocks/hatch/centcom.dmi index b83f0e29a6..bf48f8bdd6 100644 Binary files a/icons/obj/doors/airlocks/hatch/centcom.dmi and b/icons/obj/doors/airlocks/hatch/centcom.dmi differ diff --git a/icons/obj/doors/airlocks/hatch/maintenance.dmi b/icons/obj/doors/airlocks/hatch/maintenance.dmi index 99f66007bd..ab5a192647 100644 Binary files a/icons/obj/doors/airlocks/hatch/maintenance.dmi and b/icons/obj/doors/airlocks/hatch/maintenance.dmi differ diff --git a/icons/obj/doors/airlocks/hatch/overlays.dmi b/icons/obj/doors/airlocks/hatch/overlays.dmi index 45f18136da..e41af3e44c 100644 Binary files a/icons/obj/doors/airlocks/hatch/overlays.dmi and b/icons/obj/doors/airlocks/hatch/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/highsec/highsec.dmi b/icons/obj/doors/airlocks/highsec/highsec.dmi index 566270b827..a43dce6a62 100644 Binary files a/icons/obj/doors/airlocks/highsec/highsec.dmi and b/icons/obj/doors/airlocks/highsec/highsec.dmi differ diff --git a/icons/obj/doors/airlocks/highsec/overlays.dmi b/icons/obj/doors/airlocks/highsec/overlays.dmi index 48248f3299..2a6868c34b 100644 Binary files a/icons/obj/doors/airlocks/highsec/overlays.dmi and b/icons/obj/doors/airlocks/highsec/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/shuttle/overlays.dmi b/icons/obj/doors/airlocks/shuttle/overlays.dmi index ccdcb15a64..50b2e25d8f 100644 Binary files a/icons/obj/doors/airlocks/shuttle/overlays.dmi and b/icons/obj/doors/airlocks/shuttle/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/shuttle/shuttle.dmi b/icons/obj/doors/airlocks/shuttle/shuttle.dmi index 2b897ebedc..0e05597163 100644 Binary files a/icons/obj/doors/airlocks/shuttle/shuttle.dmi and b/icons/obj/doors/airlocks/shuttle/shuttle.dmi differ diff --git a/icons/obj/doors/airlocks/station/atmos.dmi b/icons/obj/doors/airlocks/station/atmos.dmi index 21fe5d2aab..896eb91b22 100644 Binary files a/icons/obj/doors/airlocks/station/atmos.dmi and b/icons/obj/doors/airlocks/station/atmos.dmi differ diff --git a/icons/obj/doors/airlocks/station/bananium.dmi b/icons/obj/doors/airlocks/station/bananium.dmi index 2183a376f6..76aab35068 100644 Binary files a/icons/obj/doors/airlocks/station/bananium.dmi and b/icons/obj/doors/airlocks/station/bananium.dmi differ diff --git a/icons/obj/doors/airlocks/station/command.dmi b/icons/obj/doors/airlocks/station/command.dmi index 90b3e4238d..d29c1fd0b3 100644 Binary files a/icons/obj/doors/airlocks/station/command.dmi and b/icons/obj/doors/airlocks/station/command.dmi differ diff --git a/icons/obj/doors/airlocks/station/diamond.dmi b/icons/obj/doors/airlocks/station/diamond.dmi index a701df40d3..1c30830644 100644 Binary files a/icons/obj/doors/airlocks/station/diamond.dmi and b/icons/obj/doors/airlocks/station/diamond.dmi differ diff --git a/icons/obj/doors/airlocks/station/engineering.dmi b/icons/obj/doors/airlocks/station/engineering.dmi index 816a84538c..8fe1bf98d1 100644 Binary files a/icons/obj/doors/airlocks/station/engineering.dmi and b/icons/obj/doors/airlocks/station/engineering.dmi differ diff --git a/icons/obj/doors/airlocks/station/freezer.dmi b/icons/obj/doors/airlocks/station/freezer.dmi index 5aacef29f7..f2f741347b 100644 Binary files a/icons/obj/doors/airlocks/station/freezer.dmi and b/icons/obj/doors/airlocks/station/freezer.dmi differ diff --git a/icons/obj/doors/airlocks/station/gold.dmi b/icons/obj/doors/airlocks/station/gold.dmi index 40ce583de5..490eefeeb9 100644 Binary files a/icons/obj/doors/airlocks/station/gold.dmi and b/icons/obj/doors/airlocks/station/gold.dmi differ diff --git a/icons/obj/doors/airlocks/station/maintenance.dmi b/icons/obj/doors/airlocks/station/maintenance.dmi index 4b046afd7b..38d1b7142f 100644 Binary files a/icons/obj/doors/airlocks/station/maintenance.dmi and b/icons/obj/doors/airlocks/station/maintenance.dmi differ diff --git a/icons/obj/doors/airlocks/station/maintenanceexternal.dmi b/icons/obj/doors/airlocks/station/maintenanceexternal.dmi index 4323cf944e..a380d89584 100644 Binary files a/icons/obj/doors/airlocks/station/maintenanceexternal.dmi and b/icons/obj/doors/airlocks/station/maintenanceexternal.dmi differ diff --git a/icons/obj/doors/airlocks/station/medical.dmi b/icons/obj/doors/airlocks/station/medical.dmi index f7cb5be24e..bd354690c5 100644 Binary files a/icons/obj/doors/airlocks/station/medical.dmi and b/icons/obj/doors/airlocks/station/medical.dmi differ diff --git a/icons/obj/doors/airlocks/station/mining.dmi b/icons/obj/doors/airlocks/station/mining.dmi index 23dee39ef6..07e8fc32e2 100644 Binary files a/icons/obj/doors/airlocks/station/mining.dmi and b/icons/obj/doors/airlocks/station/mining.dmi differ diff --git a/icons/obj/doors/airlocks/station/overlays.dmi b/icons/obj/doors/airlocks/station/overlays.dmi index a489f40be9..b1e4f9aeab 100644 Binary files a/icons/obj/doors/airlocks/station/overlays.dmi and b/icons/obj/doors/airlocks/station/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/station/plasma.dmi b/icons/obj/doors/airlocks/station/plasma.dmi index eae1601ed3..99d44ef862 100644 Binary files a/icons/obj/doors/airlocks/station/plasma.dmi and b/icons/obj/doors/airlocks/station/plasma.dmi differ diff --git a/icons/obj/doors/airlocks/station/public.dmi b/icons/obj/doors/airlocks/station/public.dmi index 0449817360..efb4600adb 100644 Binary files a/icons/obj/doors/airlocks/station/public.dmi and b/icons/obj/doors/airlocks/station/public.dmi differ diff --git a/icons/obj/doors/airlocks/station/research.dmi b/icons/obj/doors/airlocks/station/research.dmi index e2a834d133..0f49927db0 100644 Binary files a/icons/obj/doors/airlocks/station/research.dmi and b/icons/obj/doors/airlocks/station/research.dmi differ diff --git a/icons/obj/doors/airlocks/station/sandstone.dmi b/icons/obj/doors/airlocks/station/sandstone.dmi index ccedcac9d4..ef61df4c5c 100644 Binary files a/icons/obj/doors/airlocks/station/sandstone.dmi and b/icons/obj/doors/airlocks/station/sandstone.dmi differ diff --git a/icons/obj/doors/airlocks/station/science.dmi b/icons/obj/doors/airlocks/station/science.dmi index a3aa87c5a6..53a9f42c06 100644 Binary files a/icons/obj/doors/airlocks/station/science.dmi and b/icons/obj/doors/airlocks/station/science.dmi differ diff --git a/icons/obj/doors/airlocks/station/security.dmi b/icons/obj/doors/airlocks/station/security.dmi index c6f01195ab..fd330c30f5 100644 Binary files a/icons/obj/doors/airlocks/station/security.dmi and b/icons/obj/doors/airlocks/station/security.dmi differ diff --git a/icons/obj/doors/airlocks/station/silver.dmi b/icons/obj/doors/airlocks/station/silver.dmi index d3308eb8cd..e7e6672fbf 100644 Binary files a/icons/obj/doors/airlocks/station/silver.dmi and b/icons/obj/doors/airlocks/station/silver.dmi differ diff --git a/icons/obj/doors/airlocks/station/uranium.dmi b/icons/obj/doors/airlocks/station/uranium.dmi index eda814f97e..ac8c6d0611 100644 Binary files a/icons/obj/doors/airlocks/station/uranium.dmi and b/icons/obj/doors/airlocks/station/uranium.dmi differ diff --git a/icons/obj/doors/airlocks/station/virology.dmi b/icons/obj/doors/airlocks/station/virology.dmi index 79ac14dffc..b90e9cf29c 100644 Binary files a/icons/obj/doors/airlocks/station/virology.dmi and b/icons/obj/doors/airlocks/station/virology.dmi differ diff --git a/icons/obj/doors/airlocks/station/wood.dmi b/icons/obj/doors/airlocks/station/wood.dmi index ae34e82743..7b7df10329 100644 Binary files a/icons/obj/doors/airlocks/station/wood.dmi and b/icons/obj/doors/airlocks/station/wood.dmi differ diff --git a/icons/obj/doors/airlocks/station2/glass.dmi b/icons/obj/doors/airlocks/station2/glass.dmi index 69f97ceb2a..94d7ed7429 100644 Binary files a/icons/obj/doors/airlocks/station2/glass.dmi and b/icons/obj/doors/airlocks/station2/glass.dmi differ diff --git a/icons/obj/doors/airlocks/station2/overlays.dmi b/icons/obj/doors/airlocks/station2/overlays.dmi index d265abd26e..4cb389cbf2 100644 Binary files a/icons/obj/doors/airlocks/station2/overlays.dmi and b/icons/obj/doors/airlocks/station2/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/survival/survival.dmi b/icons/obj/doors/airlocks/survival/survival.dmi index f96d174c47..b796b4c8e0 100644 Binary files a/icons/obj/doors/airlocks/survival/survival.dmi and b/icons/obj/doors/airlocks/survival/survival.dmi differ diff --git a/icons/obj/doors/airlocks/survival/survival_overlays.dmi b/icons/obj/doors/airlocks/survival/survival_overlays.dmi index e8bede8217..94c1a9fa34 100644 Binary files a/icons/obj/doors/airlocks/survival/survival_overlays.dmi and b/icons/obj/doors/airlocks/survival/survival_overlays.dmi differ diff --git a/icons/obj/doors/airlocks/vault/overlays.dmi b/icons/obj/doors/airlocks/vault/overlays.dmi index db39b53fb6..f18346acf6 100644 Binary files a/icons/obj/doors/airlocks/vault/overlays.dmi and b/icons/obj/doors/airlocks/vault/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/vault/vault.dmi b/icons/obj/doors/airlocks/vault/vault.dmi index 8281d3cd5a..d2ef5d4e46 100644 Binary files a/icons/obj/doors/airlocks/vault/vault.dmi and b/icons/obj/doors/airlocks/vault/vault.dmi differ diff --git a/icons/obj/doors/doorint.dmi b/icons/obj/doors/doorint.dmi index e48b91da16..2abe5c7956 100644 Binary files a/icons/obj/doors/doorint.dmi and b/icons/obj/doors/doorint.dmi differ diff --git a/icons/obj/guns/cit_guns.dmi b/icons/obj/guns/cit_guns.dmi index e1b2e8ac1a..2db84677d2 100644 Binary files a/icons/obj/guns/cit_guns.dmi and b/icons/obj/guns/cit_guns.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 87b2b46a2b..422554715a 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index d2d93afac0..c24f7c4c16 100644 Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi new file mode 100644 index 0000000000..f0eb817549 Binary files /dev/null and b/icons/obj/plushes.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 3e156064b3..6fdb531956 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/structures_spawners.dmi b/icons/obj/structures_spawners.dmi index 5d71b4fd44..cdf2191191 100644 Binary files a/icons/obj/structures_spawners.dmi and b/icons/obj/structures_spawners.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index f2176c395d..d5cae1db93 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index a0521414f1..33dc1e2e9e 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/modular_citadel/README.md b/modular_citadel/README.md new file mode 100644 index 0000000000..dfae177607 --- /dev/null +++ b/modular_citadel/README.md @@ -0,0 +1,3 @@ +Hooray modularity! +Things that modify core files without directly touching said core files go here. This is similar to how Hippie handles things. +This stops dreammaker from throwing errors and warnings if you try to compile these files while they're inside code/citadel/. diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm new file mode 100644 index 0000000000..2d0110c4e7 --- /dev/null +++ b/modular_citadel/cit_screenshake.dm @@ -0,0 +1,69 @@ +//we vlambeer now + +/obj/proc/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit + if(!M || !M.client || duration <= 0) + return + var/client/C = M.client + if (C.prefs.screenshake==0) + return + var/oldx = C.pixel_x + var/oldy = C.pixel_y + var/clientscreenshake = (C.prefs.screenshake * 0.01) + var/max = (strength*clientscreenshake) * world.icon_size + var/min = -((strength*clientscreenshake) * world.icon_size) + + for(var/i in 0 to duration-1) + if (i == 0) + animate(C, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1) + else + animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1) + animate(pixel_x=oldx, pixel_y=oldy, time=1) + +/obj/item/gun/energy + ..() + recoil = 0.1 + +/obj/item/gun/energy/kinetic_accelerator + ..() + recoil = 0.5 + +/obj/item/gun/ballistic + ..() + recoil = 0.25 + +/obj/item/gun/ballistic/shotgun + ..() + recoil = 1 + +/obj/item/gun/ballistic/revolver + ..() + recoil = 0.5 + +/obj/item/gun/ballistic/revolver/doublebarrel + ..() + recoil = 1 + +/obj/item/gun/syringe + ..() + recoil = 0.1 + +/obj/item/pneumatic_cannon/fire_items(turf/target, mob/user) + . = ..() + shake_camera(user, (pressureSetting * 0.75 + 1), (pressureSetting * 0.75)) + +/obj/item/attack(mob/living/M, mob/living/user) + . = ..() + if(force && force >=15) + shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01)) + if(M.client) + switch (M.client.prefs.damagescreenshake) + if (1) + shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) + if (2) + if (M.IsKnockdown()) + shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) + +/obj/item/attack_obj(obj/O, mob/living/user) + . = ..() + if(force && force >= 20) + shake_camera(user, ((force - 15) * 0.01 + 1), ((force - 15) * 0.01)) diff --git a/sound/items/toysqueak1.ogg b/sound/items/toysqueak1.ogg new file mode 100644 index 0000000000..e64a6fb179 Binary files /dev/null and b/sound/items/toysqueak1.ogg differ diff --git a/sound/items/toysqueak2.ogg b/sound/items/toysqueak2.ogg new file mode 100644 index 0000000000..fddf1edfb9 Binary files /dev/null and b/sound/items/toysqueak2.ogg differ diff --git a/sound/items/toysqueak3.ogg b/sound/items/toysqueak3.ogg new file mode 100644 index 0000000000..338f4d8aa9 Binary files /dev/null and b/sound/items/toysqueak3.ogg differ diff --git a/sound/weapons/magpistol.ogg b/sound/weapons/magpistol.ogg new file mode 100644 index 0000000000..c130714962 Binary files /dev/null and b/sound/weapons/magpistol.ogg differ diff --git a/strings/tips.txt b/strings/tips.txt index 0d1922b835..51e1210e03 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -73,8 +73,8 @@ As the Warden, if a prisoner's crimes are heinous enough you can put them in per As the Warden, you can implant criminals you suspect might re-offend with devices that will track their location and allow you to remotely inject them with disabling chemicals. As the Warden, you can use handcuffs on orange prisoner shoes to turn them into cuffed shoes, forcing prisoners to walk and potentially thwarting an escape. As a Security Officer, communicate and coordinate with your fellow officers using the security channel (:s) to avoid confusion. -As a Security Officer, your sechuds or HUDsunglasses can not only see crewmates' job assignments and criminal status, but also if they are loyalty implanted. Use this to your advantage in a revolution to definitively tell who is on your side! -As a Security Officer, loyalty implants can only prevent someone from being turned into a cultist: unlike revolutionaries, it will not de-cult them if they have already been converted. +As a Security Officer, your sechuds or HUDsunglasses can not only see crewmates' job assignments and criminal status, but also if they are mindshield implanted. Use this to your advantage in a revolution to definitively tell who is on your side! +As a Security Officer, mindshield implants can only prevent someone from being turned into a cultist: unlike revolutionaries, it will not de-cult them if they have already been converted. As a Security Officer, examining someone while wearing sechuds or HUDsunglasses will let you set their arrest level, which will cause Beepsky and other security bots to chase after them. As a Security Officer, implanting a gang member the first time will deconvert them, but destroy the implant. You must implant them a second time to protect them from further conversion attempts. Keep in mind that gang members have ways to destroy implants in people! As the Detective, people leave fingerprints everywhere and on everything. With the exception of white latex, gloves will hide them. All is not lost, however, as gloves leave fibers specific to their kind such as black or nitrile, pointing to a general department. @@ -145,8 +145,8 @@ As the Blob, removing strong blobs, resource nodes, factories, and nodes will gi As the Blob, talking will send a message to all other overminds and all Blobbernauts, allowing you to direct attacks and coordinate. As a Blobbernaut, you can communicate with overminds and other Blobbernauts via :b. As a Blobbernaut, your HUD shows your health and the core health of the overmind that created you. -As a Revolutionary, you cannot convert a head of staff or someone who has a loyalty implant, such as a security officer or those they implant. Implants can however be surgically removed, and do not carry over with cloning. Take control of medbay to keep control of conversions! -As a Revolutionary, cargo can be your best friend or your worst nightmare. In the best case scenario you will be able to order a limitless amount of guns and armor, in the worst case scenario security will take control and order a limitless number of loyalty implants to turn your fellow revolutionaries against you. +As a Revolutionary, you cannot convert a head of staff or someone who has a mindshield implant, such as a security officer or those they implant. Implants can however be surgically removed, and do not carry over with cloning. Take control of medbay to keep control of conversions! +As a Revolutionary, cargo can be your best friend or your worst nightmare. In the best case scenario you will be able to order a limitless amount of guns and armor, in the worst case scenario security will take control and order a limitless number of mindshield implants to turn your fellow revolutionaries against you. As a Revolutionary, your main power comes from how quickly you spread. Convert people as fast as you can and overwhelm the heads of staff before security can arm up. As a Changeling, the Extract DNA sting counts for your genome absorb objective, but does not let you respec your powers. As a Changeling, you can absorb someone by strangling them and using the Absorb verb; this gives you the ability to rechoose your powers, the DNA of whoever you absorbed, the memory of the absorbed, and some samples of things the absorbed said. @@ -181,7 +181,7 @@ As a Wizard, the fireball spell performs very poorly at close range, as it can e As a Wizard, summoning guns will turn a large portion of the crew against themselves, but will also give everyone anything from a pea shooter to a BFG 9000. Use at your own risk! As a Wizard, the staff of chaos can fire any type of bolts from the magical wands. This can range from bolts of instant death to healing or reviving someone. As a Wizard, most spells become unusable if you are not wearing your robe, hat, and sandals. -As a Gangster, you can destroy loyalty implants with an implant breaker, letting you reconvert that person. +As a Gangster, you can destroy mindshield implants with an implant breaker, letting you reconvert that person. As a Gangster, your influence is based on how many areas you have tagged and how many people are wearing your gang's outfit; more areas and more people wearing the outfit will give you more influence. As a Gangster, your gang outfits are very robust, giving moderate resistances to most direct damage at the cost of stealth. As a Gang Boss, don't wait too long to promote lieutenants! If you get caught by security or enemy gangsters, hopefully you have a backup. diff --git a/tgstation.dme b/tgstation.dme index 730fc7ac51..a6f3c9a851 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -272,7 +272,6 @@ #include "code\datums\hud.dm" #include "code\datums\map_config.dm" #include "code\datums\martial.dm" -#include "code\datums\material_container.dm" #include "code\datums\mind.dm" #include "code\datums\mutable_appearance.dm" #include "code\datums\mutations.dm" @@ -286,15 +285,19 @@ #include "code\datums\spawners_menu.dm" #include "code\datums\verbs.dm" #include "code\datums\antagonists\antag_datum.dm" +#include "code\datums\antagonists\datum_abductor.dm" +#include "code\datums\antagonists\datum_brother.dm" #include "code\datums\antagonists\datum_clockcult.dm" #include "code\datums\antagonists\datum_cult.dm" #include "code\datums\antagonists\datum_internal_affairs.dm" #include "code\datums\antagonists\datum_traitor.dm" #include "code\datums\antagonists\devil.dm" #include "code\datums\antagonists\ninja.dm" +#include "code\datums\components\_component.dm" #include "code\datums\components\archaeology.dm" -#include "code\datums\components\component.dm" +#include "code\datums\components\material_container.dm" #include "code\datums\components\slippery.dm" +#include "code\datums\components\squeek.dm" #include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_MobProcs.dm" #include "code\datums\diseases\anxiety.dm" @@ -366,7 +369,11 @@ #include "code\datums\status_effects\neutral.dm" #include "code\datums\status_effects\status_effect.dm" #include "code\datums\weather\weather.dm" -#include "code\datums\weather\weather_types.dm" +#include "code\datums\weather\weather_types\acid_rain.dm" +#include "code\datums\weather\weather_types\advanced_darkness.dm" +#include "code\datums\weather\weather_types\ash_storm.dm" +#include "code\datums\weather\weather_types\floor_is_lava.dm" +#include "code\datums\weather\weather_types\radiation_storm.dm" #include "code\datums\wires\airalarm.dm" #include "code\datums\wires\airlock.dm" #include "code\datums\wires\apc.dm" @@ -412,10 +419,10 @@ #include "code\game\gamemodes\antag_spawner_cit.dm" #include "code\game\gamemodes\cit_objectives.dm" #include "code\game\gamemodes\events.dm" -#include "code\game\gamemodes\factions.dm" #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\objective_items.dm" +#include "code\game\gamemodes\objective_team.dm" #include "code\game\gamemodes\blob\blob.dm" #include "code\game\gamemodes\blob\blob_finish.dm" #include "code\game\gamemodes\blob\blob_report.dm" @@ -428,6 +435,7 @@ #include "code\game\gamemodes\blob\blobs\node.dm" #include "code\game\gamemodes\blob\blobs\resource.dm" #include "code\game\gamemodes\blob\blobs\shield.dm" +#include "code\game\gamemodes\brother\traitor_bro.dm" #include "code\game\gamemodes\changeling\cellular_emporium.dm" #include "code\game\gamemodes\changeling\changeling.dm" #include "code\game\gamemodes\changeling\changeling_power.dm" @@ -801,6 +809,7 @@ #include "code\game\objects\items\paint.dm" #include "code\game\objects\items\paiwire.dm" #include "code\game\objects\items\pinpointer.dm" +#include "code\game\objects\items\plushes.dm" #include "code\game\objects\items\pneumaticCannon.dm" #include "code\game\objects\items\powerfist.dm" #include "code\game\objects\items\RCD.dm" @@ -832,6 +841,7 @@ #include "code\game\objects\items\devices\camera_bug.dm" #include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\doorCharge.dm" +#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm" #include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\forcefieldprojector.dm" #include "code\game\objects\items\devices\geiger_counter.dm" @@ -1153,6 +1163,7 @@ #include "code\modules\atmospherics\machinery\other\meter.dm" #include "code\modules\atmospherics\machinery\other\miner.dm" #include "code\modules\atmospherics\machinery\other\zvent.dm" +#include "code\modules\atmospherics\machinery\pipes\bluespace_pipe.dm" #include "code\modules\atmospherics\machinery\pipes\manifold.dm" #include "code\modules\atmospherics\machinery\pipes\manifold4w.dm" #include "code\modules\atmospherics\machinery\pipes\pipes.dm" @@ -1651,6 +1662,7 @@ #include "code\modules\mob\living\carbon\alien\special\facehugger.dm" #include "code\modules\mob\living\carbon\human\damage_procs.dm" #include "code\modules\mob\living\carbon\human\death.dm" +#include "code\modules\mob\living\carbon\human\dummy.dm" #include "code\modules\mob\living\carbon\human\emote.dm" #include "code\modules\mob\living\carbon\human\examine.dm" #include "code\modules\mob\living\carbon\human\examine_vr.dm" @@ -1825,6 +1837,7 @@ #include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon_vore.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" @@ -2272,6 +2285,7 @@ #include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" +#include "modular_citadel\cit_screenshake.dm" #include "interface\interface.dm" #include "interface\menu.dm" #include "interface\stylesheet.dm" diff --git a/tools/CreditsTool/CreditsTool.csproj b/tools/CreditsTool/CreditsTool.csproj new file mode 100644 index 0000000000..68187a0815 --- /dev/null +++ b/tools/CreditsTool/CreditsTool.csproj @@ -0,0 +1,47 @@ + + + + + Debug + AnyCPU + {BA95D3D9-1940-4183-8563-BE617D752D0B} + Exe + CreditsTool + CreditsTool + v4.6.1 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/CreditsTool/CreditsTool.exe b/tools/CreditsTool/CreditsTool.exe new file mode 100644 index 0000000000..da0187aaf7 Binary files /dev/null and b/tools/CreditsTool/CreditsTool.exe differ diff --git a/tools/CreditsTool/Program.cs b/tools/CreditsTool/Program.cs new file mode 100644 index 0000000000..d5dd162412 --- /dev/null +++ b/tools/CreditsTool/Program.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Net; +using System.Web.Script.Serialization; + +namespace CreditsTool +{ + class Program + { + const string ConfigPath = "remappings.txt"; + const string OutputLocation = "./credit_pngs"; + const int world_icon_size = 32; + //this downloads all the user images of contributors of a passed github repository + //usage ./CreditsTool [authToken (helps with github rate limiter)] + static void Main(string[] args) + { + if (args.Length < 2) + { + Console.WriteLine("Usage: ./CreditsTool.exe [authToken]"); + return; + } + + if (Directory.Exists(OutputLocation)) + { + Console.WriteLine(String.Format("Aborted: {0} exists!", OutputLocation)); + return; + } + Directory.CreateDirectory(OutputLocation); + + string repoOwner = args[0], + repoName = args[1], + authToken = args.Length > 2 ? args[2] : null; + + Console.WriteLine("Querying contributors API..."); + + var FirstResponse = GetPageResponse(repoOwner, repoName, authToken, 1); + + Console.WriteLine("Collecting avatar URLs..."); + + var LoginAvatars = new Dictionary(); + //now list the things we want: avatar urls and logins + foreach (var I in LoadPages(FirstResponse, repoOwner, repoName, authToken)) { + var avurl = (string)I["avatar_url"]; + LoginAvatars.Add((string)I["login"], String.Format("{0}{1}s={2}", avurl, avurl.Contains("?") ? "&" : "?", world_icon_size)); + } + + Console.WriteLine(String.Format("Collected info for {0} contributors.", LoginAvatars.Count)); + + Console.WriteLine("Remapping github logins..."); + + var remaps = LoadConfig(); + + Console.WriteLine(String.Format("Downloading and converting avatars to {0} (this will take a while)...", OutputLocation)); + + using (var client = new WebClient()) + { + var count = 0; + foreach (var I in LoginAvatars) + { + var writtenFilename = I.Key; + if (remaps.TryGetValue(writtenFilename, out string tmp)) + { + if (tmp == "__REMOVE__") + continue; + writtenFilename = tmp; + } + using (var stream = new MemoryStream(client.DownloadData(I.Value))) + using (var originalBMP = new Bitmap(stream)) + { + if (originalBMP.Width == world_icon_size && originalBMP.Height == world_icon_size) //no need to resize + SaveBMP(originalBMP, writtenFilename); + else + using (var resizedBMP = new Bitmap(originalBMP, new Size(world_icon_size, world_icon_size))) + SaveBMP(resizedBMP, writtenFilename); + } + Console.WriteLine(String.Format("Done {0}.png! {1}%", writtenFilename, (int)((((float)(count + 1)) / LoginAvatars.Count) * 100))); + ++count; + } + } + } + + static void SaveBMP(Bitmap bmp, string writtenFilename) + { + bmp.Save(String.Format("{0}{1}{2}.png", OutputLocation, Path.DirectorySeparatorChar, writtenFilename), ImageFormat.Png); + } + + static IDictionary LoadConfig() + { + var result = new Dictionary(); + if (File.Exists(ConfigPath)) + foreach (var I in File.ReadAllLines(ConfigPath)) + if (!String.IsNullOrWhiteSpace(I) && I[0] != '#') + { + var splits = new List(I.Split(' ')); + if (splits.Count >= 1 && !String.IsNullOrEmpty(splits[1])) + { + var key = splits[0]; + splits.RemoveAt(0); + result.Add(key, String.Join(" ", splits)); + } + } + return result; + } + + static IEnumerable> LoadPages(WebResponse firstResponse, string repoOwner, string repoName, string authToken) + { + int numPages = GetNumPagesOfContributors(firstResponse); + Console.WriteLine(String.Format("Downloading {0} pages of contributor info...", numPages)); + //load and combine json for all pages + var jss = new JavaScriptSerializer(); + using (var sr = new StreamReader(firstResponse.GetResponseStream())) + foreach (var J in jss.Deserialize>>(sr.ReadToEnd())) + yield return J; + + //skip the first + for (var I = 2; I <= numPages; ++I) + using (var sr = new StreamReader(GetPageResponse(repoOwner, repoName, authToken, I).GetResponseStream())) + foreach (var J in jss.Deserialize>>(sr.ReadToEnd())) + yield return J; + } + + static int GetNumPagesOfContributors(WebResponse response) + { + var splits = response.Headers["Link"].Split(','); + foreach (var I in splits) + if (I.Contains("rel=\"last\"")) //our boy + { + var pagestrIndex = I.IndexOf("&page=") + 6; + var closingIndex = I.IndexOf('>', pagestrIndex + 1); + var thedroidswerelookingfor = I.Substring(pagestrIndex, closingIndex - pagestrIndex); + return Convert.ToInt32(thedroidswerelookingfor); + } + return 1; + } + + static WebResponse GetPageResponse(string repoOwner, string repoName, string authToken, int pageNumber) + { + HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(String.Format("https://api.github.com/repos/{0}/{1}/contributors?per_page=100&page={2}", repoOwner, repoName, pageNumber)); + httpWebRequest.Method = WebRequestMethods.Http.Get; + httpWebRequest.Accept = "application/json"; + httpWebRequest.UserAgent = "tgstation-13-credits-tool"; + if (authToken != null) + httpWebRequest.Headers.Add(String.Format("Authorization: token {0}", authToken)); + return httpWebRequest.GetResponse(); + } + } +} diff --git a/tools/CreditsTool/UpdateCreditsDMI.sh b/tools/CreditsTool/UpdateCreditsDMI.sh new file mode 100644 index 0000000000..89d24e1e8f --- /dev/null +++ b/tools/CreditsTool/UpdateCreditsDMI.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +#If you hit github's rate limit, add a 3rd parameter here that is a github personal access token +./CreditsTool tgstation tgstation + +rm ../../icons/credits.dmi + +for filename in credit_pngs/*.png; do + realname=$(basename "$filename") + java -jar ../dmitool/dmitool.jar import ../../icons/credits.dmi "${realname%.*}" "$filename" +done + +rm -rf credit_pngs diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php index dde21e4f43..4e20a7e902 100644 --- a/tools/WebhookProcessor/github_webhook_processor.php +++ b/tools/WebhookProcessor/github_webhook_processor.php @@ -15,10 +15,8 @@ */ -//CONFIG START (all defaults are random examples, do change them) -//Use single quotes for config options that are strings. +//CONFIGS ARE IN SECRET.PHP, THESE ARE JUST DEFAULTS! -//These are all default settings that are described in secret.php $hookSecret = '08ajh0qj93209qj90jfq932j32r'; $apiKey = '209ab8d879c0f987d06a09b9d879c0f987d06a09b9d8787d0a089c'; $repoOwnerAndName = "tgstation/tgstation"; @@ -33,6 +31,7 @@ $maintainer_team_id = 133041; $validation = "org"; $validation_count = 1; $tracked_branch = 'master'; +$require_changelogs = false; require_once 'secret.php'; @@ -43,6 +42,7 @@ set_error_handler(function($severity, $message, $file, $line) { set_exception_handler(function($e) { header('HTTP/1.1 500 Internal Server Error'); echo "Error on line {$e->getLine()}: " . htmlSpecialChars($e->getMessage()); + file_put_contents('htwebhookerror.log', "Error on line {$e->getLine()}: " . $e->getMessage(), FILE_APPEND); die(); }); $rawPost = NULL; @@ -96,6 +96,16 @@ switch (strtolower($_SERVER['HTTP_X_GITHUB_EVENT'])) { case 'pull_request': handle_pr($payload); break; + case 'pull_request_review': + if($payload['action'] == 'submitted'){ + $lower_state = strtolower($payload['review']['state']); + if(($lower_state == 'approved' || $lower_state == 'changes_requested') && is_maintainer($payload, $payload['review']['user']['login'])){ + $lower_association = strtolower($payload['review']['author_association']); + if($lower_association == 'member' || $lower_association == 'contributor' || $lower_association == 'owner') + remove_ready_for_review($payload); + } + } + break; default: header('HTTP/1.0 404 Not Found'); echo "Event:$_SERVER[HTTP_X_GITHUB_EVENT] Payload:\n"; @@ -103,36 +113,87 @@ switch (strtolower($_SERVER['HTTP_X_GITHUB_EVENT'])) { die(); } -//rip bs-12 -function tag_pr($payload, $opened) { +function apisend($url, $method = 'GET', $content = NULL) { global $apiKey; - - //We need to reget the pull_request part of the payload to actually see the mergeable field populated - //http://stackoverflow.com/questions/30619549/why-does-github-api-return-an-unknown-mergeable-state-in-a-pull-request + if (is_array($content)) + $content = json_encode($content); + $scontext = array('http' => array( - 'method' => 'GET', + 'method' => $method, 'header' => "Content-type: application/json\r\n". 'Authorization: token ' . $apiKey, 'ignore_errors' => true, 'user_agent' => 'tgstation13.org-Github-Automation-Tools' )); + if ($content) + $scontext['http']['content'] = $content; + + return file_get_contents($url, false, stream_context_create($scontext)); +} +function validate_user($payload) { + global $validation, $validation_count; + $query = array(); + if (empty($validation)) + $validation = 'org'; + switch (strtolower($validation)) { + case 'disable': + return TRUE; + case 'repo': + $query['repo'] = $payload['pull_request']['base']['repo']['full_name']; + break; + default: + $query['user'] = $payload['pull_request']['base']['repo']['owner']['login']; + break; + } + $query['author'] = $payload['pull_request']['user']['login']; + $query['is'] = 'merged'; + $querystring = ''; + foreach($query as $key => $value) + $querystring .= ($querystring == '' ? '' : '+') . urlencode($key) . ':' . urlencode($value); + $res = apisend('https://api.github.com/search/issues?q='.$querystring); + $res = json_decode($res, TRUE); + return $res['total_count'] >= (int)$validation_count; + +} +function get_labels($payload){ + $url = $payload['pull_request']['issue_url'] . '/labels'; + $existing_labels = json_decode(apisend($url), true); + $existing = array(); + foreach($existing_labels as $label) + $existing[] = $label['name']; + return $existing; +} + +function check_tag_and_replace($payload, $title_tag, $label, &$array_to_add_label_to){ + $title = $payload['pull_request']['title']; + if(stripos($title, $title_tag) !== FALSE){ + $array_to_add_label_to[] = $label; + $title = trim(str_ireplace($title_tag, '', $title)); + apisend($payload['pull_request']['url'], 'PATCH', array('title' => $title)); + return true; + } + return false; +} + +//rip bs-12 +function tag_pr($payload, $opened) { + //get the mergeable state $url = $payload['pull_request']['url']; - $payload['pull_request'] = json_decode(file_get_contents($url, false, stream_context_create($scontext)), true); + $payload['pull_request'] = json_decode(apisend($url), TRUE); if($payload['pull_request']['mergeable'] == null) { //STILL not ready. Give it a bit, then try one more time sleep(10); - $payload['pull_request'] = json_decode(file_get_contents($url, false, stream_context_create($scontext)), true); + $payload['pull_request'] = json_decode(apisend($url), TRUE); } $tags = array(); $title = $payload['pull_request']['title']; if($opened) { //you only have one shot on these ones so as to not annoy maintainers - $tags = checkchangelog($payload, true, false); + $tags = checkchangelog($payload, false); - $lowertitle = strtolower($title); - if(strpos($lowertitle, 'refactor') !== FALSE) + if(strpos(strtolower($title), 'refactor') !== FALSE) $tags[] = 'Refactor'; if(strpos(strtolower($title), 'revert') !== FALSE || strpos(strtolower($title), 'removes') !== FALSE) @@ -148,7 +209,7 @@ function tag_pr($payload, $opened) { $tags[] = 'Merge Conflict'; $treetags = array('_maps' => 'Map Edit', 'tools' => 'Tools', 'SQL' => 'SQL'); - $addonlytags = array('icons' => 'Sprites', 'sounds' => 'Sound'); + $addonlytags = array('icons' => 'Sprites', 'sounds' => 'Sound', 'config' => 'Config Update'); foreach($treetags as $tree => $tag) if(has_tree_been_edited($payload, $tree)) $tags[] = $tag; @@ -158,21 +219,14 @@ function tag_pr($payload, $opened) { if(has_tree_been_edited($payload, $tree)) $tags[] = $tag; - //only maintners should be able to remove these - if(strpos($lowertitle, '[dnm]') !== FALSE) - $tags[] = 'Do Not Merge'; - - if(strpos($lowertitle, '[wip]') !== FALSE) - $tags[] = 'Work In Progress'; + check_tag_and_replace($payload, '[dnm]', 'Do Not Merge', $tags); + if(!check_tag_and_replace($payload, '[wip]', 'Work In Progress', $tags)) + check_tag_and_replace($payload, '[ready]', 'Work In Progress', $remove); $url = $payload['pull_request']['issue_url'] . '/labels'; - $existing_labels = file_get_contents($url, false, stream_context_create($scontext)); - $existing_labels = json_decode($existing_labels, true); + $existing = get_labels($payload); - $existing = array(); - foreach($existing_labels as $label) - $existing[] = $label['name']; $tags = array_merge($tags, $existing); $tags = array_unique($tags); $tags = array_diff($tags, $remove); @@ -181,27 +235,153 @@ function tag_pr($payload, $opened) { foreach($tags as $t) $final[] = $t; - $scontext['http']['method'] = 'PUT'; - $scontext['http']['content'] = json_encode($final); - echo file_get_contents($url, false, stream_context_create($scontext)); + echo apisend($url, 'PUT', $final); + + return $final; +} + +function remove_ready_for_review($payload, $labels = null){ + if($labels == null) + $labels = get_labels($payload); + $index = array_search('Ready for Review', $labels); + if($index !== FALSE) + unset($labels[$index]); + $url = $payload['pull_request']['issue_url'] . '/labels'; + apisend($url, 'PUT', $labels); +} + +function dismiss_review($payload, $id, $reason){ + $content = array('message' => $reason); + apisend($payload['pull_request']['url'] . '/reviews/' . $id . '/dismissals', 'PUT', $content); +} + +function get_reviews($payload){ + return json_decode(apisend($payload['pull_request']['url'] . '/reviews'), true); +} + +function check_ready_for_review($payload, $labels = null){ + $r4rlabel = 'Ready for Review'; + $labels_which_should_not_be_ready = array('Do Not Merge', 'Work In Progress', 'Merge Conflict'); + $has_label_already = false; + $should_not_have_label = false; + if($labels == null) + $labels = get_labels($payload); + //if the label is already there we may need to remove it + foreach($labels as $L){ + if(in_array($L, $labels_which_should_not_be_ready)) + $should_not_have_label = true; + if($L == $r4rlabel) + $has_label_already = true; + } + + if($has_label_already && $should_not_have_label){ + remove_ready_for_review($payload, $labels, $r4rlabel); + return; + } + + //find all reviews to see if changes were requested at some point + $reviews = get_reviews($payload); + + $reviews_ids_with_changes_requested = array(); + $dismissed_an_approved_review = false; + + foreach($reviews as $R){ + $lower_association = strtolower($R['author_association']); + if($lower_association == 'member' || $lower_association == 'contributor' || $lower_association == 'owner'){ + $lower_state = strtolower($R['state']); + if($lower_state == 'changes_requested') + $reviews_ids_with_changes_requested[] = $R['id']; + else if ($lower_state == 'approved'){ + dismiss_review($payload, $R['id'], 'Out of date review'); + $dismissed_an_approved_review = true; + } + } + } + + if(!$dismissed_an_approved_review && count($reviews_ids_with_changes_requested) == 0){ + if($has_label_already) + remove_ready_for_review($payload, $labels); + return; //no need to be here + } + + if(count($reviews_ids_with_changes_requested) > 0){ + //now get the review comments for the offending reviews + + $review_comments = json_decode(apisend($payload['pull_request']['review_comments_url']), true); + + foreach($review_comments as $C){ + //make sure they are part of an offending review + if(!in_array($C['pull_request_review_id'], $reviews_ids_with_changes_requested)) + continue; + + //review comments which are outdated have a null position + if($C['position'] !== null){ + if($has_label_already) + remove_ready_for_review($payload, $labels); + return; //no need to tag + } + } + } + + //finally, add it if necessary + if(!$has_label_already){ + $labels[] = $r4rlabel; + $url = $payload['pull_request']['issue_url'] . '/labels'; + apisend($url, 'PUT', $labels); + } +} + +function check_dismiss_changelog_review($payload){ + global $require_changelog; + global $no_changelog; + + if(!$require_changelog) + return; + + if(!$no_changelog) + checkchangelog($payload, false); + + $review_message = 'Your changelog for this PR is either malformed or non-existent. Please create one to document your changes.'; + + $reviews = get_reviews($payload); + if($no_changelog){ + //check and see if we've already have this review + foreach($reviews as $R) + if($R['body'] == $review_message && strtolower($R['state']) == 'changes_requested') + return; + //otherwise make it ourself + apisend($payload['pull_request']['url'] . '/reviews', 'POST', array('body' => $review_message, 'event' => 'REQUEST_CHANGES')); + } + else + //kill previous reviews + foreach($reviews as $R) + if($R['body'] == $review_message && strtolower($R['state']) == 'changes_requested') + dismiss_review($payload, $R['id'], 'Changelog added/fixed.'); } function handle_pr($payload) { + global $no_changelog; $action = 'opened'; + $validated = validate_user($payload); switch ($payload["action"]) { case 'opened': tag_pr($payload, true); + if($no_changelog) + check_dismiss_changelog_review($payload); if(get_pr_code_friendliness($payload) < 0){ $balances = pr_balances(); $author = $payload['pull_request']['user']['login']; - if(isset($balances[$author]) && $balances[$author] < 0) + if(isset($balances[$author]) && $balances[$author] < 0 && !is_maintainer($payload, $author)) create_comment($payload, 'You currently have a negative Fix/Feature pull request delta of ' . $balances[$author] . '. Maintainers may close this PR at will. Fixing issues or improving the codebase will improve this score.'); } break; case 'edited': + check_dismiss_changelog_review($payload); case 'synchronize': - tag_pr($payload, false); + $labels = tag_pr($payload, false); + if($payload['action'] == 'synchronize') + check_ready_for_review($payload, $labels); return; case 'reopened': $action = $payload['action']; @@ -213,7 +393,7 @@ function handle_pr($payload) { else { $action = 'merged'; auto_update($payload); - checkchangelog($payload, true, true); + checkchangelog($payload, true); update_pr_balance($payload); $validated = TRUE; //pr merged events always get announced. } @@ -226,7 +406,11 @@ function handle_pr($payload) { echo "PR Announcement Halted; Secret tag detected.\n"; return; } - + if (!$validated) { + echo "PR Announcement Halted; User not validated.\n"; + return; + } + $msg = '['.$payload['pull_request']['base']['repo']['full_name'].'] Pull Request '.$action.' by '.htmlSpecialChars($payload['sender']['login']).': '.htmlSpecialChars('#'.$payload['pull_request']['number'].' '.$payload['pull_request']['user']['login'].' - '.$payload['pull_request']['title']).''; sendtoallservers('?announce='.urlencode($msg), $payload); } @@ -306,7 +490,7 @@ function is_maintainer($payload, $author){ global $maintainer_team_id; $repo_is_org = $payload['pull_request']['base']['repo']['owner']['type'] == 'Organization'; if($maintainer_team_id == null || !$repo_is_org) { - $collaburl = $payload['pull_request']['base']['repo']['collaborators_url'] . '/' . $author . '/permissions'; + $collaburl = str_replace('{/collaborator}', '/' . $author, $payload['pull_request']['base']['repo']['collaborators_url']) . '/permission'; $perms = json_decode(apisend($collaburl), true); $permlevel = $perms['permission']; return $permlevel == 'admin' || $permlevel == 'write'; @@ -314,7 +498,7 @@ function is_maintainer($payload, $author){ else { $check_url = 'https://api.github.com/teams/' . $maintainer_team_id . '/memberships/' . $author; $result = json_decode(apisend($check_url), true); - return isset($result['state']); //this field won't be here if they aren't a member + return isset($result['state']) && $result['state'] == 'active'; } } @@ -325,17 +509,17 @@ function update_pr_balance($payload) { if(!$trackPRBalance) return; $author = $payload['pull_request']['user']['login']; - if(is_maintainer($payload, $author)) //immune - return; $balances = pr_balances(); if(!isset($balances[$author])) $balances[$author] = $startingPRBalance; $friendliness = get_pr_code_friendliness($payload, $balances[$author]); $balances[$author] += $friendliness; - if($balances[$author] < 0 && $friendliness < 0) - create_comment($payload, 'Your Fix/Feature pull request delta is currently below zero (' . $balances[$author] . '). Maintainers may close future Feature/Tweak/Balance PRs. Fixing issues or helping to improve the codebase will raise this score.'); - else if($balances[$author] >= 0 && ($balances[$author] - $friendliness) < 0) - create_comment($payload, 'Your Fix/Feature pull request delta is now above zero (' . $balances[$author] . '). Feel free to make Feature/Tweak/Balance PRs.'); + if(!is_maintainer($payload, $author)){ //immune + if($balances[$author] < 0 && $friendliness < 0) + create_comment($payload, 'Your Fix/Feature pull request delta is currently below zero (' . $balances[$author] . '). Maintainers may close future Feature/Tweak/Balance PRs. Fixing issues or helping to improve the codebase will raise this score.'); + else if($balances[$author] >= 0 && ($balances[$author] - $friendliness) < 0) + create_comment($payload, 'Your Fix/Feature pull request delta is now above zero (' . $balances[$author] . '). Feel free to make Feature/Tweak/Balance PRs.'); + } $balances_file = fopen(pr_balance_json_path(), 'w'); fwrite($balances_file, json_encode($balances)); fclose($balances_file); @@ -372,10 +556,9 @@ function has_tree_been_edited($payload, $tree){ return $github_diff !== FALSE && strpos($github_diff, 'diff --git a/' . $tree) !== FALSE; } -function checkchangelog($payload, $merge = false, $compile = true) { - global $apiKey; - if (!$merge) - return; +$no_changelog = false; +function checkchangelog($payload, $compile = true) { + global $no_changelog; if (!isset($payload['pull_request']) || !isset($payload['pull_request']['body'])) { return; } @@ -449,10 +632,6 @@ function checkchangelog($payload, $merge = false, $compile = true) { $currentchangelogblock[] = array('type' => 'bugfix', 'body' => $item); } break; - case 'wip': - if($item != 'added a few works in progress') - $currentchangelogblock[] = array('type' => 'wip', 'body' => $item); - break; case 'rsctweak': case 'tweaks': case 'tweak': @@ -510,11 +689,6 @@ function checkchangelog($payload, $merge = false, $compile = true) { $currentchangelogblock[] = array('type' => 'spellcheck', 'body' => $item); } break; - case 'experimental': - case 'experiment': - if($item != 'added an experimental thingy') - $currentchangelogblock[] = array('type' => 'experiment', 'body' => $item); - break; case 'balance': case 'rebalance': if($item != 'rebalanced something'){ @@ -525,6 +699,35 @@ function checkchangelog($payload, $merge = false, $compile = true) { case 'tgs': $currentchangelogblock[] = array('type' => 'tgs', 'body' => $item); break; + case 'code_imp': + case 'code': + if($item != 'changed some code'){ + $tags[] = 'Code Improvement'; + $currentchangelogblock[] = array('type' => 'code_imp', 'body' => $item); + } + break; + case 'refactor': + if($item != 'refactored some code'){ + $tags[] = 'Refactor'; + $currentchangelogblock[] = array('type' => 'refactor', 'body' => $item); + } + break; + case 'config': + if($item != 'changed some config setting'){ + $tags[] = 'Config Update'; + $currentchangelogblock[] = array('type' => 'config', 'body' => $item); + } + break; + case 'admin': + if($item != 'messed with admin stuff'){ + $tags[] = 'Administration'; + $currentchangelogblock[] = array('type' => 'admin', 'body' => $item); + } + break; + case 'server': + if($item != 'something server ops should know') + $currentchangelogblock[] = array('type' => 'server', 'body' => $item); + break; default: //we add it to the last changelog entry as a separate line if (count($currentchangelogblock) > 0) @@ -533,7 +736,10 @@ function checkchangelog($payload, $merge = false, $compile = true) { } } - if (!count($changelogbody) || !$compile) + if(!count($changelogbody)) + $no_changelog = true; + + if ($no_changelog || !$compile) return $tags; $file = 'author: "'.trim(str_replace(array("\\", '"'), array("\\\\", "\\\""), $username)).'"'."\n"; @@ -550,17 +756,9 @@ function checkchangelog($payload, $merge = false, $compile = true) { 'message' => 'Automatic changelog generation for PR #'.$payload['pull_request']['number'].' [ci skip]', 'content' => base64_encode($file) ); - $scontext = array('http' => array( - 'method' => 'PUT', - 'header' => - "Content-type: application/json\r\n". - 'Authorization: token ' . $apiKey, - 'content' => json_encode($content), - 'ignore_errors' => true, - 'user_agent' => 'tgstation13.org-Github-Automation-Tools' - )); + $filename = '/html/changelogs/AutoChangeLog-pr-'.$payload['pull_request']['number'].'.yml'; - echo file_get_contents($payload['pull_request']['base']['repo']['url'].'/contents'.$filename, false, stream_context_create($scontext)); + echo apisend($payload['pull_request']['base']['repo']['url'].'/contents'.$filename, 'PUT', $content); } function sendtoallservers($str, $payload = null) { diff --git a/tools/WebhookProcessor/secret.php b/tools/WebhookProcessor/secret.php index abea10564f..93c9b318f6 100644 --- a/tools/WebhookProcessor/secret.php +++ b/tools/WebhookProcessor/secret.php @@ -8,6 +8,7 @@ $hookSecret = '08ajh0qj93209qj90jfq932j32r'; //Api key for pushing changelogs. +//This requires the public_repo (or repo for private repositories) and read:org permissions $apiKey = '209ab8d879c0f987d06a09b9d879c0f987d06a09b9d8787d0a089c'; //Used to prevent potential RCEs @@ -47,3 +48,6 @@ $validation = "org"; //how many merged prs must they have under the rules above to have their pr announced to the game servers. $validation_count = 1; + +//enforce changelogs on PRs +$require_changelogs = false; diff --git a/tools/ss13_genchangelog.py b/tools/ss13_genchangelog.py index c4e22014df..c7a31325b1 100644 --- a/tools/ss13_genchangelog.py +++ b/tools/ss13_genchangelog.py @@ -57,7 +57,12 @@ validPrefixes = [ 'spellcheck', 'experiment', 'tgs', - 'balance' + 'balance', + 'code_imp', + 'refactor', + 'config', + 'admin', + 'server' ] def dictToTuples(inp): diff --git a/tools/travis/before_build_byond.sh b/tools/travis/before_build_byond.sh index af7dc3cc66..8cfe0a1cf6 100755 --- a/tools/travis/before_build_byond.sh +++ b/tools/travis/before_build_byond.sh @@ -5,6 +5,10 @@ set -e if [ "$BUILD_TOOLS" = true ]; then exit 0 fi; +echo "Combining maps for building" +if [ "$DM_MAPFILE" = "loadallmaps" ]; then + python tools/travis/template_dm_generator.py +fi; if [ -d "$HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin" ]; then diff --git a/tools/travis/before_build_tools.sh b/tools/travis/before_build_tools.sh index 50167e1262..2329de82b2 100755 --- a/tools/travis/before_build_tools.sh +++ b/tools/travis/before_build_tools.sh @@ -5,6 +5,3 @@ if [ "$BUILD_TOOLS" = true ]; then cd tgui && source ~/.nvm/nvm.sh && npm install && cd .. fi; -if [ "$DM_MAPFILE" = "loadallmaps" ]; then - python tools/travis/template_dm_generator.py -fi; diff --git a/tools/travis/build_tools.sh b/tools/travis/build_tools.sh index 6aba5da538..2e9810b470 100755 --- a/tools/travis/build_tools.sh +++ b/tools/travis/build_tools.sh @@ -7,5 +7,6 @@ if [ "$BUILD_TOOLS" = true ]; then md5sum -c - <<< "49bc6b1b9ed56c83cceb6674bd97cb34 *html/changelogs/example.yml"; cd tgui && source ~/.nvm/nvm.sh && gulp && cd ..; + php5.6 -l tools/WebhookProcessor/github_webhook_processor.php; python tools/ss13_genchangelog.py html/changelog.html html/changelogs; fi;