diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 07b64fd6ff0..2d65dfae755 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -68,6 +68,11 @@ /icons/ @ShizCalev /sound/ @ShizCalev +# Qustinnus +/code/datums/components/mood.dm @Qustinnus +/code/datums/mood_events/ @Qustinnus +/code/__DEFINES/mobs.dm @Qustinnus + # Multiple Owners /code/__DEFINES/components.dm @Cyberboss @ninjanomnom diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index c73cd97a9ae..81a0cf3d028 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -22630,6 +22630,9 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/shuttle/mining/common{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bgj" = ( @@ -32254,6 +32257,20 @@ /obj/machinery/vending/coffee, /turf/open/floor/plasteel/white, /area/science/research) +"bEy" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) "bEz" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -43602,7 +43619,7 @@ /area/hallway/secondary/entry) "clC" = ( /obj/structure/cable, -/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "clD" = ( @@ -43619,21 +43636,9 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) -"clF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_smes) "clG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "clI" = ( @@ -43870,23 +43875,21 @@ brightness = 3; dir = 8 }, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/power/smes/engineering, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "cmz" = ( /obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/machinery/power/terminal{ - dir = 8 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -43901,8 +43904,6 @@ /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "cmA" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -43913,6 +43914,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "cmC" = ( @@ -44095,8 +44100,15 @@ /area/maintenance/solars/starboard/aft) "cnm" = ( /obj/structure/cable, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) @@ -44107,9 +44119,15 @@ /area/engine/engine_smes) "cnp" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) @@ -44313,8 +44331,8 @@ "cov" = ( /obj/structure/window/reinforced, /obj/structure/cable, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) @@ -44340,17 +44358,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) -"coy" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_smes) "coz" = ( /obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -44528,7 +44535,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/engine_smes) "cpn" = ( @@ -44536,8 +44545,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, /turf/open/floor/plasteel, /area/engine/engine_smes) @@ -47139,7 +47148,8 @@ height = 22; id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; - width = 35 + width = 35; + roundstart_template = /datum/map_template/shuttle/mining_common/meta }, /turf/open/space/basic, /area/space) @@ -50426,6 +50436,21 @@ }, /turf/closed/wall, /area/maintenance/starboard) +"gEP" = ( +/obj/structure/cable, +/obj/machinery/power/smes/engineering, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) "gES" = ( /obj/item/radio/intercom{ pixel_x = 28; @@ -50963,6 +50988,17 @@ }, /turf/closed/wall/r_wall, /area/science/mixing/chamber) +"kEm" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) "kGA" = ( /obj/structure/chair/office/light{ dir = 4 @@ -51575,6 +51611,24 @@ }, /turf/open/space/basic, /area/space) +"oYX" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) "pgP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -52361,13 +52415,16 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/power/smes/engineering, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) @@ -75057,7 +75114,7 @@ ckw clC cmy cnm -cnm +gEP cov cpj cpS @@ -75826,10 +75883,10 @@ aaa cjJ ckw clG -cmA -mRd -cmA -coz +oYX +bEy +oYX +kEm cpn gps hGE @@ -76082,11 +76139,11 @@ bLv aaa cjJ ckw -clF +clC vnY cnp -cnp -coy +gEP +coz cpm gFg cjJ diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 6f08cf975b7..27531838ff7 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1569,7 +1569,8 @@ height = 22; id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Fore"; - width = 35 + width = 35; + roundstart_template = /datum/map_template/shuttle/mining_common/meta }, /turf/open/space/basic, /area/space) @@ -32679,7 +32680,8 @@ maxHealth = 200; melee_damage_lower = 20; melee_damage_upper = 20; - name = "Lia" + name = "Lia"; + random_color = FALSE }, /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) @@ -69958,8 +69960,6 @@ pixel_x = 26 }, /obj/effect/turf_decal/bot, -/obj/item/twohanded/rcl/pre_loaded, -/obj/item/twohanded/rcl/pre_loaded, /turf/open/floor/plasteel, /area/engine/storage) "czA" = ( @@ -70448,6 +70448,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/twohanded/rcl/pre_loaded, /turf/open/floor/plasteel, /area/crew_quarters/locker) "cAr" = ( @@ -74116,7 +74117,7 @@ /obj/item/reagent_containers/food/drinks/beer{ desc = "Whatever it is, it reeks of foul, putrid froth."; icon_state = "beer"; - list_reagents = list("bacchus_blessing" = 15); + list_reagents = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 15); name = "Delta-Down"; pixel_x = 5; pixel_y = 5 @@ -116756,6 +116757,14 @@ /obj/machinery/door/poddoor/incinerator_toxmix, /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) +"sDV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/computer/shuttle/mining/common{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "sJw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -149638,7 +149647,7 @@ aec aaO aeR aft -aeb +sDV agj aaO aej diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm index 6619d75e2ec..19fb34449b1 100644 --- a/_maps/map_files/Donutstation/Donutstation.dmm +++ b/_maps/map_files/Donutstation/Donutstation.dmm @@ -7853,6 +7853,7 @@ /obj/item/stack/pipe_cleaner_coil/random, /obj/item/stack/pipe_cleaner_coil/random, /obj/item/stack/pipe_cleaner_coil/random, +/obj/item/twohanded/rcl/pre_loaded, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aur" = ( @@ -48510,8 +48511,6 @@ /obj/item/storage/box/lights/mixed, /obj/item/clothing/glasses/meson, /obj/item/clothing/glasses/meson, -/obj/item/twohanded/rcl/pre_loaded, -/obj/item/twohanded/rcl/pre_loaded, /obj/item/crowbar/large, /turf/open/floor/plasteel, /area/engine/engineering) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 4270e4718b4..a2f581c4218 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -7364,7 +7364,6 @@ codes_txt = "patrol;next_patrol=14.8-Dorms-Lockers"; location = "14.5-Recreation" }, -/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aoY" = ( @@ -7889,6 +7888,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aqh" = ( @@ -7896,7 +7896,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aqi" = ( @@ -8511,12 +8510,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "arD" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable, /turf/open/floor/plating, /area/crew_quarters/dorms) "arE" = ( @@ -9205,6 +9204,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "asY" = ( @@ -9212,7 +9212,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "asZ" = ( @@ -9699,13 +9698,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aui" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "auj" = ( @@ -10155,6 +10154,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "avm" = ( @@ -10164,7 +10164,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "avn" = ( @@ -11197,16 +11196,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) -"axG" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "axI" = ( /obj/machinery/door/airlock{ id_tag = "Cabin5"; @@ -11672,6 +11661,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "ayO" = ( @@ -11681,7 +11671,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "ayP" = ( @@ -12321,6 +12310,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aAg" = ( @@ -15295,8 +15285,6 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/obj/item/twohanded/rcl/pre_loaded, -/obj/item/twohanded/rcl/pre_loaded, /turf/open/floor/plasteel{ dir = 1 }, @@ -26624,7 +26612,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/obj/structure/grille, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -32174,6 +32161,7 @@ dir = 8; pixel_x = 24 }, +/obj/item/twohanded/rcl/pre_loaded, /turf/open/floor/plasteel, /area/storage/art) "brg" = ( @@ -51315,16 +51303,10 @@ /area/medical/chemistry) "chd" = ( /obj/item/reagent_containers/glass/beaker/large, -/obj/item/reagent_containers/glass/beaker/large, /obj/item/reagent_containers/glass/beaker{ pixel_x = 8; pixel_y = 2 }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/dropper, /obj/item/reagent_containers/dropper, /obj/structure/table/glass, /obj/effect/turf_decal/tile/yellow{ @@ -54347,22 +54329,21 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "cnI" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 2 - }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, /obj/structure/cable, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, /area/medical/chemistry) "cnJ" = ( -/obj/machinery/disposal/bin{ - pixel_x = 5 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 +/obj/structure/table/glass, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 }, +/obj/item/reagent_containers/glass/beaker/large, /turf/open/floor/plasteel/white, /area/medical/chemistry) "cnK" = ( @@ -70053,6 +70034,15 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/construction/mining/aux_base) +"cWS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/computer/shuttle/mining/common{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "cXc" = ( /obj/machinery/light/small{ dir = 8 @@ -75569,7 +75559,8 @@ height = 22; id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; - width = 35 + width = 35; + roundstart_template = /datum/map_template/shuttle/mining_common/meta }, /turf/open/space/basic, /area/space) @@ -85774,7 +85765,7 @@ aaa aaa aVs bKS -aWT +cWS aVs aVs aVs @@ -112458,7 +112449,7 @@ asX auh avl asX -axG +aBz ayN aAf aBz diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index a6dd3eeff65..59d14030d77 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -333,6 +333,9 @@ c_tag = "Labor Camp Central"; network = list("labor") }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, /turf/open/floor/plasteel, /area/mine/laborcamp) "bc" = ( @@ -363,9 +366,6 @@ /turf/open/floor/plating, /area/mine/eva) "bh" = ( -/obj/machinery/computer/secure_data{ - dir = 1 - }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "bi" = ( @@ -490,9 +490,8 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/mine/eva) "bw" = ( -/obj/machinery/computer/security/labor{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "bx" = ( @@ -506,25 +505,33 @@ /area/mine/laborcamp) "by" = ( /obj/structure/cable, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"bA" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Labor Camp Backroom"; - req_access_txt = "2" - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"bB" = ( /obj/machinery/power/apc{ dir = 1; name = "Labor Camp APC"; pixel_y = 23 }, -/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, /turf/open/floor/plasteel, /area/mine/laborcamp) +"bB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/closet/secure_closet/labor_camp_security, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "bC" = ( /obj/machinery/airalarm{ pixel_y = 23 @@ -601,21 +608,18 @@ /turf/open/floor/plasteel, /area/mine/eva) "bL" = ( -/obj/machinery/door/airlock/security/glass{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/highsecurity{ name = "Labor Camp Monitoring"; req_access_txt = "2" }, -/obj/structure/cable, /turf/open/floor/plasteel, /area/mine/laborcamp) "bM" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Labor Camp Maintenance"; - req_access_txt = "2" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/laborcamp) +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "bN" = ( /obj/structure/sign/warning/docking, /obj/effect/spawner/structure/window/reinforced, @@ -735,16 +739,26 @@ /turf/closed/wall, /area/mine/laborcamp/security) "cb" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/machinery/light/small{ +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ dir = 8 }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "cc" = ( -/obj/structure/chair/office, -/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, /mob/living/simple_animal/bot/secbot/beepsky{ desc = "Powered by the tears and sweat of laborers."; name = "Prison Ofitser" @@ -752,41 +766,42 @@ /turf/open/floor/plasteel, /area/mine/laborcamp/security) "cd" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, /obj/machinery/power/apc{ dir = 4; name = "Labor Camp Security APC"; pixel_x = 24 }, -/obj/machinery/camera{ - c_tag = "Labor Camp Monitoring"; - network = list("labor") - }, /obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "cf" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/laborcamp) +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "cg" = ( -/obj/machinery/light/small{ +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/turf/open/floor/plating, -/area/mine/laborcamp) +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "ch" = ( -/turf/open/floor/plating, -/area/mine/laborcamp) -"ci" = ( -/obj/machinery/computer/prisoner{ - dir = 1 - }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "cj" = ( @@ -871,30 +886,24 @@ /obj/structure/ore_box, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"cz" = ( -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/obj/machinery/power/terminal{ +"cB" = ( +/obj/structure/chair/office{ dir = 4 }, -/turf/open/floor/plating, -/area/mine/laborcamp) -"cA" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, /obj/structure/cable, -/turf/open/floor/plating, -/area/mine/laborcamp) -"cB" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/mine/laborcamp) +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "cC" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/mine/laborcamp) +/obj/machinery/computer/security/labor{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "cD" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -917,8 +926,10 @@ /turf/open/floor/plasteel, /area/mine/production) "cG" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/mine/laborcamp/security) "cH" = ( /obj/effect/turf_decal/tile/purple{ @@ -1202,6 +1213,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/mine/production) "du" = ( @@ -1558,13 +1570,6 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/mine/living_quarters) -"el" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Processing Area"; - req_access_txt = "48" - }, -/turf/open/floor/plasteel, -/area/mine/production) "em" = ( /obj/machinery/light{ dir = 4 @@ -1649,10 +1654,6 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "ex" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station Bridge"; - req_access_txt = "48" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -1660,6 +1661,9 @@ dir = 4 }, /obj/structure/cable, +/obj/machinery/door/airlock/glass{ + name = "Mining Station Bridge" + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "ey" = ( @@ -1689,10 +1693,6 @@ /turf/open/floor/plasteel, /area/mine/production) "eA" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station Bridge"; - req_access_txt = "48" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -1700,6 +1700,9 @@ dir = 4 }, /obj/structure/cable, +/obj/machinery/door/airlock/glass{ + name = "Mining Station Bridge" + }, /turf/open/floor/plasteel, /area/mine/production) "eB" = ( @@ -1735,38 +1738,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/mine/production) -"eF" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Processing Area"; - req_access_txt = "48" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/mine/production) -"eG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, @@ -1843,12 +1814,9 @@ /turf/open/floor/plasteel, /area/mine/production) "eQ" = ( -/obj/machinery/door/airlock/mining{ - name = "Mining Station Storage"; - req_access_txt = "48" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/glass, /turf/open/floor/plasteel, /area/mine/living_quarters) "eR" = ( @@ -1867,10 +1835,6 @@ /obj/structure/closet/crate{ icon_state = "crateopen" }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, /turf/open/floor/plasteel, /area/mine/production) "eT" = ( @@ -1896,13 +1860,7 @@ /obj/structure/closet/crate{ icon_state = "crateopen" }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/mine/production) "eW" = ( @@ -1946,22 +1904,13 @@ /turf/open/floor/plating, /area/mine/production) "fa" = ( -/obj/machinery/mineral/equipment_vendor, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 +/obj/machinery/newscaster{ + pixel_x = 0; + pixel_y = 32 }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fb" = ( -/obj/machinery/light/small{ - dir = 1 - }, /obj/structure/extinguisher_cabinet{ pixel_x = -5; pixel_y = 30 @@ -1969,6 +1918,9 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fc" = ( @@ -1986,7 +1938,6 @@ dir = 2; network = list("mine") }, -/obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -1994,6 +1945,9 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/structure/table, +/obj/item/gps/mining, +/obj/item/gps/mining, /turf/open/floor/plasteel, /area/mine/living_quarters) "fe" = ( @@ -2087,16 +2041,6 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"fo" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "fp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -2109,7 +2053,6 @@ name = "Station Intercom (General)"; pixel_x = 28 }, -/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 4 }, @@ -2168,50 +2111,16 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"fx" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "fy" = ( -/obj/machinery/recharge_station, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) -"fz" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) -"fA" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, +/obj/structure/table, +/obj/item/clothing/glasses/meson, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/mining_scanner, /turf/open/floor/plasteel, /area/mine/living_quarters) "fB" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, +/obj/structure/displaycase, /turf/open/floor/plasteel, /area/mine/living_quarters) "fC" = ( @@ -2430,6 +2339,9 @@ /area/lavaland/surface/outdoors) "gd" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, /turf/open/floor/plasteel, /area/mine/production) "gj" = ( @@ -2456,6 +2368,12 @@ /obj/structure/stone_tile/center, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"gn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "go" = ( /obj/structure/stone_tile/block, /turf/open/lava/smooth/lava_land_surface, @@ -2618,6 +2536,18 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"hN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"ia" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/mine/production) "id" = ( /obj/structure/stone_tile{ dir = 4 @@ -2681,6 +2611,16 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"iM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "iX" = ( /obj/structure/stone_tile, /obj/structure/stone_tile{ @@ -2723,6 +2663,13 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"jh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/closet/secure_closet/freezer/gulag_fridge, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "jk" = ( /obj/structure/stone_tile/center, /obj/structure/stone_tile/surrounding_tile, @@ -2770,6 +2717,16 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"ju" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "jx" = ( /obj/structure/stone_tile{ dir = 4 @@ -2838,6 +2795,15 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"jV" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) "kg" = ( /obj/structure/fluff/drake_statue, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, @@ -2865,6 +2831,17 @@ /obj/structure/stone_tile, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"ku" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/displaycase, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "kv" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -2918,6 +2895,16 @@ /obj/structure/stone_tile/center/cracked, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"kI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable, +/obj/machinery/door/airlock/mining/glass{ + name = "Processing Area"; + req_access_txt = "48" + }, +/turf/open/floor/plasteel, +/area/mine/production) "kJ" = ( /obj/structure/stone_tile/surrounding_tile{ dir = 4 @@ -2943,6 +2930,12 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"kO" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "kR" = ( /obj/structure/stone_tile/slab/cracked, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, @@ -3098,6 +3091,15 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"lO" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) "lP" = ( /obj/structure/stone_tile/block/cracked{ dir = 4 @@ -3535,6 +3537,59 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"oL" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Lavaland Shuttle Airlock" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"oW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"po" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/production) +"pV" = ( +/obj/structure/cable, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"qt" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"sa" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"sj" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/mine/production) "ss" = ( /obj/machinery/button/door{ id = "miningbathroom"; @@ -3551,6 +3606,27 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) +"su" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"sH" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Mining External Airlock"; + opacity = 0; + req_access_txt = "0" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel, +/area/mine/production) +"sM" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/laborcamp/security) "tI" = ( /obj/machinery/light/small{ dir = 4 @@ -3563,6 +3639,34 @@ "tY" = ( /turf/closed/mineral/random/labormineral/volcanic, /area/lavaland/surface/outdoors/explored) +"tZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"up" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"uG" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/machinery/light, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"uJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/mine/laborcamp/security) "vb" = ( /obj/machinery/door/window/southleft, /obj/machinery/shower{ @@ -3574,13 +3678,94 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) -"zO" = ( +"vW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"wj" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"xi" = ( /obj/effect/spawner/structure/window/reinforced, +/turf/closed/wall, +/area/mine/living_quarters) +"xU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"yk" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, -/turf/open/floor/plating, -/area/mine/living_quarters) +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"yr" = ( +/turf/closed/wall/r_wall, +/area/mine/laborcamp) +"zn" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Mining External Airlock"; + opacity = 0; + req_access_txt = "0" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"zo" = ( +/obj/machinery/computer/prisoner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"zO" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Labor Camp Monitoring"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"zX" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "Aw" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -3597,6 +3782,59 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"AU" = ( +/obj/structure/table, +/obj/item/restraints/handcuffs, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"AW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"Be" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Bx" = ( +/obj/machinery/vending/security, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"Co" = ( +/obj/machinery/computer/shuttle/mining/common{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Cw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Dh" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "Es" = ( /obj/machinery/door/window/southright, /obj/machinery/shower{ @@ -3624,6 +3862,36 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) +"FF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/mine/laborcamp/security) +"Gw" = ( +/obj/structure/cable, +/obj/machinery/camera, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"GI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"GJ" = ( +/obj/item/bikehorn{ + color = "#000"; + desc = "A horn off of a bicycle. This one has been charred to hell and back, yet somehow it still honks."; + name = "charred bike horn" + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"Hd" = ( +/turf/closed/wall/r_wall, +/area/mine/laborcamp/security) "Ho" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -3633,21 +3901,57 @@ }, /turf/open/floor/plasteel/white, /area/mine/living_quarters) +"Hx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "HO" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Iv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "IK" = ( /obj/structure/toilet{ dir = 8 }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) +"Jf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "JZ" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "Kb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -3656,6 +3960,23 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Kv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Lg" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "Lu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 4 @@ -3678,6 +3999,36 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) +"NC" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 3; + height = 7; + id = "lavaland_common_away"; + name = "Mining base public dock"; + width = 7 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Pa" = ( +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"Pl" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "Pt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -3692,12 +4043,53 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, /area/mine/eva) -"RO" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer3{ +"QN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"Rx" = ( +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/mine/production) +"RE" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"RJ" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"RO" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"SJ" = ( +/obj/structure/statue{ + desc = "A lifelike statue of a horrifying monster."; + dir = 8; + icon = 'icons/mob/lavaland/lavaland_monsters.dmi'; + icon_state = "goliath"; + name = "goliath" + }, +/turf/open/floor/plasteel, /area/mine/living_quarters) "Tn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -3735,6 +4127,13 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"UA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/laborcamp/security) "UQ" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -3749,6 +4148,21 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/mine/production) +"US" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Lavaland Shuttle Airlock" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Vv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "VP" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -3758,6 +4172,21 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"VY" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ + dir = 4; + piping_layer = 3 + }, +/obj/structure/lattice/catwalk, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/laborcamp/security) +"We" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "Wp" = ( /obj/docking_port/stationary{ dir = 8; @@ -3821,12 +4250,27 @@ /turf/open/floor/plasteel, /area/mine/production) "YA" = ( -/obj/structure/lattice/catwalk, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/mine/living_quarters) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"YY" = ( +/obj/machinery/camera{ + c_tag = "Crew Area"; + dir = 1; + network = list("mine") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "Zf" = ( /obj/machinery/door/airlock{ id_tag = "miningbathroom"; @@ -3840,6 +4284,12 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) +"Zn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) (1,1,1) = {" aa @@ -7930,10 +8380,10 @@ aj aj aj aj -aj -aj -aj -aj +ab +ab +ab +ab aj aj aj @@ -8186,14 +8636,14 @@ aj aj aj aj -aj -aj -aj -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab +ab +ab +ab aj aj aj @@ -8442,16 +8892,16 @@ ab aj aj aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aj aj aj @@ -8691,26 +9141,26 @@ aD bZ aj aj -aD +GJ aj ab ai ai +ab aj aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aj aj aj @@ -8953,20 +9403,20 @@ aj ai ai ai -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aj aj aj @@ -9200,30 +9650,30 @@ aq bj az az -aq +yr +Hd +Hd +Hd +FF +FF +FF ca -ca -ca -aj -aj -aj -ai ad ai -ai -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aj aj aj @@ -9454,32 +9904,32 @@ az az az az +su az az -az -aq +yr cb bh cG -aj -aj -aj -aj +bh +We +qt +ca ai ab +VY +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj aj aj aj @@ -9710,33 +10160,33 @@ az az aU bb -az -az -az -by +tZ +hN +Iv +Iv bL cc bw -cG -aj -aj -aj -aj -aj +Hx +bh +ch +bh +ca +ab +ab +UA +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj aj aj aj @@ -9963,37 +10413,37 @@ ay aq aE az -az -az -az -az +Kv +tZ +tZ +Zn aQ bk az -by -aq +az +yr cd -ci -cG -aj -aj -aj -aj +ch +GI +bh +ch +bM +ca +FF +FF +uJ +FF +ca +ab +ab +ab +ab +ab +NC +ab +ab ab ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj aj aj aj @@ -10226,31 +10676,31 @@ az bc aq bl -aq -bA -aq -aq -aq -aq -aj -aj -aj +yr +yr +yr +Hd +Gw +QN +oW +ch +Vv +gn +bh +bh +yk +ju +ca +ab +ab +ab +ab +cR +US +cR ab ab ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj aj aj aj @@ -10483,30 +10933,30 @@ aq bd aq bl -aq +yr by -aq +pV ch -cz -aq -aj -aj -aj -ab -ab -ab +ch +iM +sa +sa +sa +vW +sa +sa RO +YY +ca +ab +ab +ab +ab +cR +dZ +cR ab ab -aj -aj -aj -ai -ai -aj -aj -aj -aj aj aj aj @@ -10740,28 +11190,28 @@ aW be aW bm -aq +yr bB bM cf -cA -aq -aj -aj -ab -ad -ai -JZ +ch +AW +RJ +jh +AU +Bx +Dh +bM YA JZ -ai -ab -ab -ab -ad -ai -ai -ai +ca +cM +cM +xi +cM +cR +oL +cR aj aj aj @@ -10997,28 +11447,28 @@ aq aq aq aq -aq -aq -aq +yr +yr +Hd cg cB -aq -aj +bh +uG cQ cQ cQ cQ -cR +sM zO -cR +sM cM +Lg +dZ +Co +kO +eL +Pl cR -cR -cR -cM -ai -ai -aj aj aj aj @@ -11255,27 +11705,27 @@ aX aD aD aD -aD -aq -ch +aw +FF +zo cC -aq -aj +Pa +zX cQ dg dg cQ -dZ -gW -dZ +up +Jf +xU cM fa -fo -fx -cM -ab -aj -aj +dZ +dZ +dZ +dZ +dZ +cR aj aj aj @@ -11512,27 +11962,27 @@ aD aD aD aD -aD -aq -aq -aq -aq -aj +aw +FF +FF +FF +FF +FF cQ dh dx cQ ea -gW +Cw ek cM fb dZ fy +fy +dZ +SJ cR -ab -aj -aj aj aj aj @@ -11785,11 +12235,11 @@ eK eQ ef Aw -fz +fy +fy +dZ +dZ cR -ab -aj -aj aj aj aj @@ -12042,11 +12492,11 @@ eL cM fc gW -fA -cR -ab -ai -ai +dZ +dZ +dZ +eM +cM aj aj aj @@ -12300,11 +12750,11 @@ cM fd fq fB +fB +fB +ku cM ai -ad -ai -ai ab aj aj @@ -18717,7 +19167,7 @@ bq bq bq bq -br +ia cH eB cD @@ -18974,15 +19424,15 @@ cO cX ck dJ -dT -bP +ia +cn ez bP eS bq ab -aj -aj +ab +ab aj aj aj @@ -19231,16 +19681,16 @@ Uh Uh Uh Uh -Uh -Uh +kI +Be eC eP eT bq ab -aj -aj -aj +ab +ab +ab aj aj aj @@ -19486,20 +19936,20 @@ cF cI cP cn +Rx bP -bP -bP +ia gd eD bP eU -br +bq +bq +bq +bq +po +ab ab -aj -aj -aj -aj -aj aj aj aj @@ -19745,18 +20195,18 @@ bq cZ ds dK -dU -cF +ia +bP eE -cn +bP eV br +wj +dU +br ab -aj -aj -aj -aj -aj +ab +ai aj aj aj @@ -20000,21 +20450,21 @@ bf cK bq bq -br -bq -dV -el -eF -dV -bq +ia bq +ia +bP +eE +bP +sj +sH +lO +sj +zn ab ab -aj -aj -aj -aj -aj +ai +ai aj aj aj @@ -20260,18 +20710,18 @@ da du dL cH -ck -eG -cD +dT +eE bP +cH +br +jV +RE br ab ab -aj -aj -aj -aj -aj +ab +ai aj aj aj @@ -20522,13 +20972,13 @@ eH cF eW bq +bq +bq +bq +po +ab ab ab -aj -aj -aj -aj -aj aj aj aj @@ -20781,11 +21231,11 @@ eX bq ab ab -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab aj aj aj @@ -21038,11 +21488,11 @@ eY bq ab ab -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab aj aj aj @@ -21295,10 +21745,10 @@ eY bq ab ab -aj -aj -aj -aj +ab +ab +ab +ab aj aj aj @@ -21553,10 +22003,10 @@ bq ab ab ab -aj -aj -aj -aj +ab +ab +ab +ab aj aj aj @@ -21810,10 +22260,10 @@ bq ab ab ab -aj -aj -aj -aj +ab +ab +ab +ab ab aj aj @@ -22067,10 +22517,10 @@ ab ab ab ab -aj -aj ab -aj +ab +ab +ab aj aj aj @@ -22324,9 +22774,9 @@ ab ab ab ab -aj -aj -aj +ab +ab +ab aj aj aj @@ -22581,8 +23031,8 @@ ab ab ab ab -aj -aj +ab +ab ab aj aj @@ -22838,8 +23288,8 @@ aj ab ab ab -aj -aj +ab +ab ab aj aj @@ -23095,7 +23545,7 @@ ai ab ab ab -aj +ab ab ab ab @@ -23352,7 +23802,7 @@ ai ai ab ab -aj +ab ab ab ab @@ -23609,7 +24059,7 @@ ai ai ai ab -aj +ab ab ab ab diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index d5547037c80..7803dbac70b 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -14642,20 +14642,6 @@ dir = 1 }, /area/hallway/secondary/exit/departure_lounge) -"aMR" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aMS" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aMT" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -14697,6 +14683,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/item/twohanded/rcl/pre_loaded, /turf/open/floor/plasteel, /area/storage/art) "aMW" = ( @@ -42330,7 +42317,6 @@ /area/engine/engineering) "caw" = ( /obj/structure/table, -/obj/item/twohanded/rcl/pre_loaded, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) @@ -81562,8 +81548,8 @@ aHE aAL aAL rlV -aAL -aMR +aDZ +aGV aAL aAL aQA @@ -81820,7 +81806,7 @@ aIL aDZ aDZ aDZ -aMS +aGV aDZ aDZ aQB diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm index 75b5dca6ba5..5550a211bf8 100644 --- a/_maps/shuttles/hunter_russian.dmm +++ b/_maps/shuttles/hunter_russian.dmm @@ -136,7 +136,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter) "A" = ( -/obj/machinery/computer/shuttle/pirate/hunter{ +/obj/machinery/computer/shuttle/hunter{ dir = 8 }, /turf/open/floor/mineral/plastitanium/red, diff --git a/_maps/shuttles/hunter_space_cop.dmm b/_maps/shuttles/hunter_space_cop.dmm index 5c0538bc69e..fde409ac3f1 100644 --- a/_maps/shuttles/hunter_space_cop.dmm +++ b/_maps/shuttles/hunter_space_cop.dmm @@ -9,7 +9,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) "ab" = ( -/obj/machinery/computer/shuttle/pirate/hunter{ +/obj/machinery/computer/shuttle/hunter{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/mining_common_meta.dmm b/_maps/shuttles/mining_common_meta.dmm new file mode 100644 index 00000000000..f04f8e1a3b2 --- /dev/null +++ b/_maps/shuttles/mining_common_meta.dmm @@ -0,0 +1,124 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/mining) +"b" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/mining) +"c" = ( +/obj/structure/table, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"d" = ( +/obj/machinery/computer/shuttle/mining/common, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"e" = ( +/turf/open/floor/mineral/titanium, +/area/shuttle/mining) +"f" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"g" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/mining) +"h" = ( +/obj/machinery/door/airlock/titanium{ + name = "Lavaland Shuttle Airlock" + }, +/obj/docking_port/mobile{ + dir = 8; + dwidth = 3; + height = 5; + id = "mining_common"; + name = "lavaland shuttle"; + port_direction = 4; + width = 7 + }, +/turf/open/floor/plating, +/area/shuttle/mining) +"i" = ( +/obj/structure/closet/crate, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"j" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/mining) +"k" = ( +/obj/structure/ore_box, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"l" = ( +/obj/structure/shuttle/engine/propulsion/burst, +/turf/open/floor/plating/airless, +/area/shuttle/mining) +"Q" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/mining) + +(1,1,1) = {" +a +a +b +a +b +a +a +"} +(2,1,1) = {" +a +c +e +g +f +i +a +"} +(3,1,1) = {" +b +d +Q +e +f +j +l +"} +(4,1,1) = {" +a +c +e +e +f +k +a +"} +(5,1,1) = {" +a +a +b +h +b +a +a +"} diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index da58aaacb4f..ea54cd06ae3 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -77,7 +77,7 @@ //The maximum size of a stack object. #define MAX_STACK_SIZE 50 //maximum amount of cable in a coil -#define MAXCOIL 15 +#define MAXCOIL 30 //tablecrafting defines #define CAT_NONE "" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 2c3398597db..99509bd623c 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -28,6 +28,8 @@ #define ITEM_SLOT_POCKET (1<<11) // this is to allow items with a w_class of WEIGHT_CLASS_NORMAL or WEIGHT_CLASS_BULKY to fit in pockets. #define ITEM_SLOT_DENYPOCKET (1<<12) // this is to deny items with a w_class of WEIGHT_CLASS_SMALL or WEIGHT_CLASS_TINY to fit in pockets. #define ITEM_SLOT_NECK (1<<13) +#define ITEM_SLOT_HANDS (1<<14) +#define ITEM_SLOT_BACKPACK (1<<15) //SLOTS #define SLOT_BACK 1 @@ -84,6 +86,10 @@ . = ITEM_SLOT_ICLOTHING if(SLOT_L_STORE, SLOT_R_STORE) . = ITEM_SLOT_POCKET + if(SLOT_HANDS) + . = ITEM_SLOT_HANDS + if(SLOT_IN_BACKPACK) + . = ITEM_SLOT_BACKPACK //Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index afb8722e8ea..a229930b553 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1591,3 +1591,5 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) return -1 else return 0 + +#define TURF_FROM_COORDS_LIST(List) (locate(List[1], List[2], List[3])) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index c9b696b1f8f..01ae67eb906 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -58,6 +58,8 @@ SUBSYSTEM_DEF(shuttle) var/obj/docking_port/mobile/preview_shuttle var/datum/map_template/shuttle/preview_template + var/datum/turf_reservation/preview_reservation + /datum/controller/subsystem/shuttle/Initialize(timeofday) ordernum = rand(1, 9000) @@ -557,6 +559,8 @@ SUBSYSTEM_DEF(shuttle) preview_shuttle = SSshuttle.preview_shuttle preview_template = SSshuttle.preview_template + preview_reservation = SSshuttle.preview_reservation + /datum/controller/subsystem/shuttle/proc/is_in_shuttle_bounds(atom/A) var/area/current = get_area(A) if(istype(current, /area/shuttle) && !istype(current, /area/shuttle/transit)) @@ -637,6 +641,7 @@ SUBSYSTEM_DEF(shuttle) preview_shuttle.jumpToNullSpace() preview_shuttle = null preview_template = null + QDEL_NULL(preview_reservation) if(!preview_shuttle) if(load_template(loading_template)) @@ -689,14 +694,18 @@ SUBSYSTEM_DEF(shuttle) preview_template = null existing_shuttle = null selected = null + QDEL_NULL(preview_reservation) /datum/controller/subsystem/shuttle/proc/load_template(datum/map_template/shuttle/S) . = FALSE // load shuttle template, centred at shuttle import landmark, - var/turf/landmark_turf = get_turf(locate(/obj/effect/landmark/shuttle_import) in GLOB.landmarks_list) - S.load(landmark_turf, centered = TRUE, register = FALSE) + preview_reservation = SSmapping.RequestBlockReservation(S.width, S.height, SSmapping.transit.z_value, /datum/turf_reservation/transit) + if(!preview_reservation) + CRASH("failed to reserve an area for shuttle template loading") + var/turf/BL = TURF_FROM_COORDS_LIST(preview_reservation.bottom_left_coords) + S.load(BL, centered = FALSE, register = FALSE) - var/affected = S.get_affected_turfs(landmark_turf, centered=TRUE) + var/affected = S.get_affected_turfs(BL, centered=FALSE) var/found = 0 // Search the turfs for docking ports diff --git a/code/datums/action.dm b/code/datums/action.dm index 157a4fd37a1..007b964a160 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -725,7 +725,7 @@ small_icon_state = "dwarf_legion" /datum/action/small_sprite/megafauna/spacedragon - small_icon = 'icons/mob/animal.dmi' + small_icon = 'icons/mob/carp.dmi' small_icon_state = "carp" /datum/action/small_sprite/Trigger() diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm index a1ac6c0b028..bca6a0a3814 100644 --- a/code/datums/components/anti_magic.dm +++ b/code/datums/components/anti_magic.dm @@ -2,7 +2,7 @@ var/magic = FALSE var/holy = FALSE var/psychic = FALSE - var/allowed_slots = ITEM_SLOT_BACK|ITEM_SLOT_MASK|ITEM_SLOT_NECK|ITEM_SLOT_BELT|ITEM_SLOT_ID|ITEM_SLOT_EARS|ITEM_SLOT_EYES|ITEM_SLOT_GLOVES|ITEM_SLOT_HEAD|ITEM_SLOT_FEET|ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING|ITEM_SLOT_POCKET + var/allowed_slots = ~ITEM_SLOT_BACKPACK var/charges = INFINITY var/blocks_self = TRUE var/datum/callback/reaction @@ -29,7 +29,7 @@ expire = _expire /datum/component/anti_magic/proc/on_equip(datum/source, mob/equipper, slot) - if(!CHECK_BITFIELD(allowed_slots, slotdefine2slotbit(slot))) + if(!CHECK_BITFIELD(allowed_slots, slotdefine2slotbit(slot))) //Check that the slot is valid for antimagic UnregisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC) return RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect, TRUE) diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 2102585b91d..c3f702de5d5 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -646,7 +646,7 @@ /datum/crafting_recipe/rcl - name = "Makeshift Rapid Cable Layer" + name = "Makeshift Rapid Pipe Cleaner Layer" result = /obj/item/twohanded/rcl/ghetto time = 40 tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index 5642af7d2d9..b1ad18c8823 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -124,6 +124,10 @@ port_id = "mining" can_be_bought = FALSE +/datum/map_template/shuttle/mining_common + port_id = "mining_common" + can_be_bought = FALSE + /datum/map_template/shuttle/cargo port_id = "cargo" can_be_bought = FALSE @@ -522,6 +526,10 @@ suffix = "kilo" name = "labour shuttle (Kilo)" +/datum/map_template/shuttle/mining_common/meta + suffix = "meta" + name = "lavaland shuttle (Meta)" + /datum/map_template/shuttle/arrival/delta suffix = "delta" name = "arrival shuttle (Delta)" diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 86c7b70c00c..b5383d88b4f 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -84,7 +84,7 @@ /datum/objective_item/steal/reactive name = "the reactive teleport armor." - targetitem = /obj/item/clothing/suit/armor/reactive + targetitem = /obj/item/clothing/suit/armor/reactive/teleport difficulty = 5 excludefromjob = list("Research Director") diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index b83595017fe..51203cd41e6 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -226,7 +226,7 @@ . += ..() var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [prod_coeff*100]%." + . += "The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [prod_coeff*100]%.
" /obj/machinery/autolathe/proc/main_win(mob/user) var/dat = "

Autolathe Menu:


" diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index be496b8635e..4414b2539cc 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -29,7 +29,7 @@ if(charging) . += "Current charge: [round(charging.percent(), 1)]%." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Charge rate at [charge_rate]J per cycle." + . += "The status display reads: Charge rate at [charge_rate]J per cycle." /obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell) && !panel_open) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 77b1f6910e2..9a4b60eb65e 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -81,9 +81,9 @@ . = ..() . += "The linking device can be scanned with a multitool." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Cloning speed at [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%." + . += "The status display reads: Cloning speed at [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%.
" if(efficiency > 5) - . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." + . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." //The return of data disks?? Just for transferring between genetics machine/cloning machine. //TO-DO: Make the genetics machine accept them. diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 3f44c9a72ec..3f8092c03f7 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -26,7 +26,7 @@ /obj/machinery/defibrillator_mount/examine(mob/user) . = ..() if(defib) - . += "There is a defib unit hooked up. Alt-click to remove it." + . += "There is a defib unit hooked up. Alt-click to remove it." if(GLOB.security_level >= SEC_LEVEL_RED) . += "Due to a security situation, its locking clamps can be toggled by swiping any ID." else diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm index 3aad8d874c5..f6e4e8cdc66 100644 --- a/code/game/machinery/dish_drive.dm +++ b/code/game/machinery/dish_drive.dm @@ -10,7 +10,7 @@ density = FALSE circuit = /obj/item/circuitboard/machine/dish_drive pass_flags = PASSTABLE - var/static/list/item_types = list(/obj/item/trash/waffles, + var/static/list/collectable_items = list(/obj/item/trash/waffles, /obj/item/trash/plate, /obj/item/trash/tray, /obj/item/reagent_containers/glass/bowl, @@ -18,6 +18,11 @@ /obj/item/kitchen/fork, /obj/item/shard, /obj/item/broken_bottle) + var/static/list/disposable_items = list(/obj/item/trash/waffles, + /obj/item/trash/plate, + /obj/item/trash/tray, + /obj/item/shard, + /obj/item/broken_bottle) var/time_since_dishes = 0 var/suction_enabled = TRUE var/transmit_enabled = TRUE @@ -42,7 +47,7 @@ flick("synthesizer_beam", src) /obj/machinery/dish_drive/attackby(obj/item/I, mob/living/user, params) - if(is_type_in_list(I, item_types) && user.a_intent != INTENT_HARM) + if(is_type_in_list(I, collectable_items) && user.a_intent != INTENT_HARM) if(!user.transferItemToLoc(I, src)) return to_chat(user, "You put [I] in [src], and it's beamed into energy!") @@ -81,7 +86,7 @@ if(!suction_enabled) return for(var/obj/item/I in view(4, src)) - if(is_type_in_list(I, item_types) && I.loc != src && (!I.reagents || !I.reagents.total_volume)) + if(is_type_in_list(I, collectable_items) && I.loc != src && (!I.reagents || !I.reagents.total_volume)) if(I.Adjacent(src)) visible_message("[src] beams up [I]!") I.forceMove(src) @@ -109,13 +114,17 @@ visible_message("[src] buzzes. There are no disposal bins in range!") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) return + var/disposed = 0 for(var/obj/item/I in contents) - I.forceMove(bin) - use_power(active_power_usage) - visible_message("[src] [pick("whooshes", "bwooms", "fwooms", "pshooms")] and beams its stored dishes into the nearby [bin.name].") - playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) - playsound(bin, 'sound/items/pshoom.ogg', 50, TRUE) - Beam(bin, icon_state = "rped_upgrade", time = 5) - bin.update_icon() - flick("synthesizer_beam", src) + if(is_type_in_list(I, disposable_items)) + I.forceMove(bin) + use_power(active_power_usage) + disposed++ + if (disposed) + visible_message("[src] [pick("whooshes", "bwooms", "fwooms", "pshooms")] and beams [disposed] stored item\s into the nearby [bin.name].") + playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + playsound(bin, 'sound/items/pshoom.ogg', 50, TRUE) + Beam(bin, icon_state = "rped_upgrade", time = 5) + bin.update_icon() + flick("synthesizer_beam", src) time_since_dishes = world.time + 600 diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 8794be7f7f8..968a0eb981c 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -22,15 +22,15 @@ precision_coeff = 0 for(var/obj/item/stock_parts/scanning_module/P in component_parts) scan_level += P.rating - for(var/obj/item/stock_parts/manipulator/P in component_parts) - precision_coeff = P.rating + for(var/obj/item/stock_parts/matter_bin/M in component_parts) + precision_coeff = M.rating for(var/obj/item/stock_parts/micro_laser/P in component_parts) damage_coeff = P.rating /obj/machinery/dna_scannernew/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Radiation pulse accuracy increased by factor [precision_coeff**2].
Radiation pulse damage decreased by factor [damage_coeff**2]." + . += "The status display reads: Radiation pulse accuracy increased by factor [precision_coeff**2].
Radiation pulse damage decreased by factor [damage_coeff**2].
" /obj/machinery/dna_scannernew/update_icon() diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 36e6210c054..668254a32b6 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -189,4 +189,4 @@ else if(!harvesting) . += "Alt-click [src] to start harvesting." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Harvest speed at [interval*0.1] seconds per organ." + . += "The status display reads: Harvest speed at [interval*0.1] seconds per organ." diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 419fc647e73..be27e0cac60 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -145,7 +145,7 @@ Possible to do for anyone motivated enough: /obj/machinery/holopad/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Current projection range: [holo_range] units." + . += "The status display reads: Current projection range: [holo_range] units." /obj/machinery/holopad/attackby(obj/item/P, mob/user, params) if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P)) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index a1f1b95f45f..09d4bd0a552 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -49,7 +49,7 @@ /obj/machinery/launchpad/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Maximum range: [range] units." + . += "The status display reads: Maximum range: [range] units." /obj/machinery/launchpad/attackby(obj/item/I, mob/user, params) if(stationary) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 4cbafeb6bc0..d1065c67fd5 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -159,7 +159,7 @@ /obj/machinery/limbgrower/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Storing up to [reagents.maximum_volume]u of synthflesh.
Synthflesh consumption at [prod_coeff*100]%." + . += "The status display reads: Storing up to [reagents.maximum_volume]u of synthflesh.
Synthflesh consumption at [prod_coeff*100]%.
" /obj/machinery/limbgrower/proc/main_win(mob/user) var/dat = "

Limb Grower Menu:


" diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 80e99c45065..73c48fc7e9b 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -32,11 +32,11 @@ - \A [charging]."} if(!(stat & (NOPOWER|BROKEN))) - . += "The status display reads:" - . += "- Recharging [recharge_coeff*10]% cell charge per cycle." + . += "The status display reads:" + . += "- Recharging [recharge_coeff*10]% cell charge per cycle." if(charging) var/obj/item/stock_parts/cell/C = charging.get_cell() - . += "- \The [charging]'s cell is at [C.percent()]%." + . += "- \The [charging]'s cell is at [C.percent()]%." /obj/machinery/recharger/proc/setCharging(new_charging) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 8fa5524f79d..f7db6af6c47 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -31,9 +31,9 @@ /obj/machinery/recharge_station/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Recharging [recharge_speed]J per cycle." + . += "The status display reads: Recharging [recharge_speed]J per cycle." if(repairs) - . += "[src] has been upgraded to support automatic repairs." + . += "[src] has been upgraded to support automatic repairs." /obj/machinery/recharge_station/process() if(!is_operational()) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 5c88239e28b..bf56b3aba6b 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -41,7 +41,7 @@ /obj/machinery/recycler/examine(mob/user) . = ..() - . += "Reclaiming [amount_produced]% of materials salvaged." + . += "Reclaiming [amount_produced]% of materials salvaged." . += {"The power light is [(stat & NOPOWER) ? "off" : "on"]. The safety-mode light is [safety_mode ? "on" : "off"]. The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"]."} diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index c1edb118fbb..4231f60c4d7 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -53,7 +53,7 @@ else . += "There is no power cell installed." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Temperature range at [settableTemperatureRange]°C.
Heating power at [heatingPower*0.001]kJ.
Power consumption at [(efficiency*-0.0025)+150]%." //100%, 75%, 50%, 25% + . += "The status display reads: Temperature range at [settableTemperatureRange]°C.
Heating power at [heatingPower*0.001]kJ.
Power consumption at [(efficiency*-0.0025)+150]%.
" //100%, 75%, 50%, 25% /obj/machinery/space_heater/update_icon() if(on) @@ -158,8 +158,6 @@ panel_open = !panel_open user.visible_message("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src].", "You [panel_open ? "open" : "close"] the hatch on \the [src].") update_icon() - if(panel_open) - interact(user) else if(default_deconstruction_crowbar(I)) return else diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index eeaa9450e43..c8566659356 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -208,7 +208,7 @@ if(target == user) user.visible_message("[user] slips into [src] and closes the door behind [user.p_them()]!", "You slip into [src]'s cramped space and shut its door.") else - target.visible_message("[user] pushes [target] into [src] and shuts its door!", "[user] shoves you into [src] and shuts the door!") + target.visible_message("[user] pushes [target] into [src] and shuts its door!", "[user] shoves you into [src] and shuts the door!") close_machine(target) add_fingerprint(user) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 0458174d10c..7072c6aab4c 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -137,7 +137,7 @@ else . += "The linking device is now able to be scanned with a multitool.
The wiring can be connected to a nearby console and hub with a pair of wirecutters.
" if(in_range(user, src) || isobserver(user)) - . += "The status display reads: This station can be linked to [efficiency] other station(s)." + . += "The status display reads: This station can be linked to [efficiency] other station(s)." /obj/machinery/teleport/station/proc/link_console_and_hub() for(var/direction in GLOB.cardinals) diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index b5e5be91e6a..7bee704768e 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -5,4 +5,10 @@ armor = list("melee" = 30, "bullet" = 30, "laser" = 15, "energy" = 20, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) mouse_pointer = 'icons/mecha/mecha_mouse.dmi' destruction_sleep_duration = 40 - exit_delay = 40 \ No newline at end of file + exit_delay = 40 + +/obj/mecha/combat/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this + for(var/obj/item/I in equipment) + if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/)) + var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun = I + gun.projectiles_cache = gun.projectiles_cache_max \ No newline at end of file diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 601bcce7fef..dd00adee505 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -39,6 +39,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay ME.attach(src) + max_ammo() /obj/mecha/combat/gygax/dark/add_cell(obj/item/stock_parts/cell/C=null) if(C) diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index a39b4987532..a5eec2ee323 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -40,6 +40,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME.attach(src) + max_ammo() /obj/mecha/combat/marauder/seraph desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel." @@ -66,6 +67,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME.attach(src) + max_ammo() /obj/mecha/combat/marauder/mauler desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model." @@ -89,5 +91,6 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME.attach(src) + max_ammo() diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 8d421b34850..79b8c2b0ef3 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -32,6 +32,19 @@ return if(!cargo_holder) return + if(ismecha(target)) + var/obj/mecha/M = target + var/have_ammo + for(var/obj/item/mecha_ammo/box in cargo_holder.cargo) + if(istype(box, /obj/item/mecha_ammo) && box.rounds) + have_ammo = TRUE + if(M.ammo_resupply(box, chassis.occupant, TRUE)) + return + if(have_ammo) + to_chat(chassis.occupant, "No further supplies can be provided to [M].") + else + to_chat(chassis.occupant, "No providable supplies found in cargo hold") + return if(isobj(target)) var/obj/O = target if(istype(O, /obj/machinery/door/firedoor)) diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm new file mode 100644 index 00000000000..6e151b800ee --- /dev/null +++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm @@ -0,0 +1,94 @@ +/obj/item/mecha_ammo + name = "generic ammo box" + desc = "A box of ammo for an unknown weapon." + w_class = WEIGHT_CLASS_BULKY + icon = 'icons/mecha/mecha_ammo.dmi' + icon_state = "empty" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + var/rounds = 0 + var/round_term = "round" + var/direct_load //For weapons where we re-load the weapon itself rather than adding to the ammo storage. + var/load_audio = "sound/weapons/gun_magazine_insert_empty_1.ogg" + var/ammo_type + +/obj/item/mecha_ammo/proc/update_name() + if(!rounds) + name = "empty ammo box" + desc = "An exosuit ammuniton box that has since been emptied. Please recycle." + icon_state = "empty" + +/obj/item/mecha_ammo/attack_self(mob/user) + ..() + if(rounds) + to_chat(user, "You cannot flatten the ammo box until it's empty!") + return + + to_chat(user, "You fold [src] flat.") + var/I = new /obj/item/stack/sheet/metal(user.loc) + qdel(src) + user.put_in_hands(I) + +/obj/item/mecha_ammo/examine(mob/user) + . = ..() + if(rounds) + . += "There [rounds > 1?"are":"is"] [rounds] [round_term][rounds > 1?"s":""] left." + +/obj/item/mecha_ammo/incendiary + name = "incendiary ammo" + desc = "A box of incendiary ammunition for use with exosuit weapons." + icon_state = "incendiary" + rounds = 24 + ammo_type = "incendiary" + +/obj/item/mecha_ammo/scattershot + name = "scattershot ammo" + desc = "A box of scaled-up buckshot, for use in exosuit shotguns." + icon_state = "scattershot" + rounds = 40 + ammo_type = "scattershot" + +/obj/item/mecha_ammo/lmg + name = "machine gun ammo" + desc = "A box of linked ammunition, designed for the Ultra AC 2 exosuit weapon." + icon_state = "lmg" + rounds = 300 + ammo_type = "lmg" + +/obj/item/mecha_ammo/missiles_br + name = "breaching missiles" + desc = "A box of large missiles, ready for loading into a BRM-6 exosuit missile rack." + icon_state = "missile_br" + rounds = 6 + round_term = "missile" + direct_load = TRUE + load_audio = "sound/weapons/bulletinsert.ogg" + ammo_type = "missiles_br" + +/obj/item/mecha_ammo/missiles_he + name = "anti-armor missiles" + desc = "A box of large missiles, ready for loading into an SRM-8 exosuit missile rack." + icon_state = "missile_he" + rounds = 8 + round_term = "missile" + direct_load = TRUE + load_audio = "sound/weapons/bulletinsert.ogg" + ammo_type = "missiles_he" + + +/obj/item/mecha_ammo/flashbang + name = "launchable flashbangs" + desc = "A box of smooth flashbangs, for use with a large exosuit launcher. Cannot be primed by hand." + icon_state = "flashbang" + rounds = 6 + round_term = "grenade" + ammo_type = "flashbang" + +/obj/item/mecha_ammo/clusterbang + name = "launchable flashbang clusters" + desc = "A box of clustered flashbangs, for use with a specialized exosuit cluster launcher. Cannot be primed by hand." + icon_state = "clusterbang" + rounds = 3 + round_term = "cluster" + direct_load = TRUE + ammo_type = "clusterbang" \ 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 62112be7683..5a953e0fda6 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -211,7 +211,11 @@ name = "general ballistic weapon" fire_sound = 'sound/weapons/gunshot.ogg' var/projectiles + var/projectiles_cache //ammo to be loaded in, if possible. + var/projectiles_cache_max var/projectile_energy_cost + var/disabledreload //For weapons with no cache (like the rockets) which are reloaded by hand + var/ammo_type /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_shot_amount() return min(projectiles, projectiles_per_shot) @@ -224,19 +228,32 @@ return 1 /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info() - return "[..()] \[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - Rearm":null]" + return "[..()] \[[src.projectiles][projectiles_cache_max &&!projectile_energy_cost?"/[projectiles_cache]":""]\][!disabledreload &&(src.projectiles < initial(src.projectiles))?" - Rearm":null]" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/rearm() if(projectiles < initial(projectiles)) var/projectiles_to_add = initial(projectiles) - projectiles - while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add) - projectiles++ - projectiles_to_add-- - chassis.use_power(projectile_energy_cost) - send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) - log_message("Rearmed [src.name].", LOG_MECHA) - return 1 + + if(projectile_energy_cost) + while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add) + projectiles++ + projectiles_to_add-- + chassis.use_power(projectile_energy_cost) + + else + if(!projectiles_cache) + return FALSE + if(projectiles_to_add <= projectiles_cache) + projectiles = projectiles + projectiles_to_add + projectiles_cache = projectiles_cache - projectiles_to_add + else + projectiles = projectiles + projectiles_cache + projectiles_cache = 0 + + send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) + log_message("Rearmed [src.name].", LOG_MECHA) + return TRUE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/needs_rearm() @@ -264,8 +281,10 @@ equip_cooldown = 10 projectile = /obj/item/projectile/bullet/incendiary/fnx99 projectiles = 24 - projectile_energy_cost = 15 + projectiles_cache = 24 + projectiles_cache_max = 96 harmful = TRUE + ammo_type = "incendiary" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced name = "\improper S.H.H. \"Quietus\" Carbine" @@ -285,10 +304,12 @@ equip_cooldown = 20 projectile = /obj/item/projectile/bullet/scattershot projectiles = 40 - projectile_energy_cost = 25 + projectiles_cache = 40 + projectiles_cache_max = 160 projectiles_per_shot = 4 variance = 25 harmful = TRUE + ammo_type = "scattershot" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg name = "\improper Ultra AC 2" @@ -297,23 +318,42 @@ equip_cooldown = 10 projectile = /obj/item/projectile/bullet/lmg projectiles = 300 - projectile_energy_cost = 20 + projectiles_cache = 300 + projectiles_cache_max = 1200 projectiles_per_shot = 3 variance = 6 randomspread = 1 projectile_delay = 2 harmful = TRUE + ammo_type = "lmg" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack name = "\improper SRM-8 missile rack" - desc = "A weapon for combat exosuits. Shoots light explosive missiles." + desc = "A weapon for combat exosuits. Launches light explosive missiles." icon_state = "mecha_missilerack" projectile = /obj/item/projectile/bullet/a84mm_he fire_sound = 'sound/weapons/grenadelaunch.ogg' projectiles = 8 - projectile_energy_cost = 1000 + projectiles_cache = 0 + projectiles_cache_max = 0 + disabledreload = TRUE equip_cooldown = 60 harmful = TRUE + ammo_type = "missiles_he" + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching + name = "\improper BRM-6 missile rack" + desc = "A weapon for combat exosuits. Launches low-explosive breaching missiles designed to explode only when striking a sturdy target." + icon_state = "mecha_missilerack_six" + projectile = /obj/item/projectile/bullet/a84mm_br + fire_sound = 'sound/weapons/grenadelaunch.ogg' + projectiles = 6 + projectiles_cache = 0 + projectiles_cache_max = 0 + disabledreload = TRUE + equip_cooldown = 60 + harmful = TRUE + ammo_type = "missiles_br" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher @@ -344,10 +384,12 @@ projectile = /obj/item/grenade/flashbang fire_sound = 'sound/weapons/grenadelaunch.ogg' projectiles = 6 + projectiles_cache = 6 + projectiles_cache_max = 24 missile_speed = 1.5 - projectile_energy_cost = 800 equip_cooldown = 60 var/det_time = 20 + ammo_type = "flashbang" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(var/obj/item/grenade/flashbang/F) var/turf/T = get_turf(src) @@ -359,9 +401,12 @@ name = "\improper SOB-3 grenade launcher" desc = "A weapon for combat exosuits. Launches primed clusterbangs. You monster." projectiles = 3 + projectiles_cache = 0 + projectiles_cache_max = 0 + disabledreload = TRUE projectile = /obj/item/grenade/clusterbuster - projectile_energy_cost = 1600 //getting off cheap seeing as this is 3 times the flashbangs held in the grenade launcher. equip_cooldown = 90 + ammo_type = "clusterbang" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar name = "banana mortar" diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index c993dd82a8f..e58a2a9c8d9 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -47,7 +47,7 @@ /obj/machinery/mech_bay_recharge_port/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Base recharge rate at [max_charge]J per cycle." + . += "The status display reads: Base recharge rate at [max_charge]J per cycle." /obj/machinery/mech_bay_recharge_port/process() if(stat & NOPOWER || !recharge_console) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 892f8fd9cc1..c993fed484a 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -29,6 +29,7 @@ "H.O.N.K", "Phazon", "Exosuit Equipment", + "Exosuit Ammunition", "Cyborg Upgrade Modules", "Misc" ) @@ -66,7 +67,7 @@ . = ..() var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [component_coeff*100]%.
Build time reduced by [100-time_coeff*100]%." + . += "The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [component_coeff*100]%.
Build time reduced by [100-time_coeff*100]%.
" /obj/machinery/mecha_part_fabricator/emag_act() if(obj_flags & EMAGGED) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index a0c76d81389..3f38dd948d1 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -985,12 +985,12 @@ /obj/mecha/container_resist(mob/living/user) is_currently_ejecting = TRUE - to_chat(occupant, "You begin the ejection procedure. Equipment is disabled during this process. Hold still to finish ejecting.") + to_chat(occupant, "You begin the ejection procedure. Equipment is disabled during this process. Hold still to finish ejecting.") if(do_after(occupant,exit_delay, target = src)) - to_chat(occupant, "You exit the mech.") + to_chat(occupant, "You exit the mech.") go_out() else - to_chat(occupant, "You stop exiting the mech. Weapons are enabled again.") + to_chat(occupant, "You stop exiting the mech. Weapons are enabled again.") is_currently_ejecting = FALSE /obj/mecha/Exited(atom/movable/M, atom/newloc) @@ -1115,3 +1115,53 @@ GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013??? if(occupant_sight_flags) if(user == occupant) user.sight |= occupant_sight_flags + +/////////////////////// +////// Ammo stuff ///// +/////////////////////// + +/obj/mecha/proc/ammo_resupply(var/obj/item/mecha_ammo/A, mob/user,var/fail_chat_override = FALSE) + if(!A.rounds) + if(!fail_chat_override) + to_chat(user, "This box of ammo is empty!") + return FALSE + var/ammo_needed + var/found_gun + for(var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun in equipment) + ammo_needed = 0 + + if(istype(gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) && gun.ammo_type == A.ammo_type) + found_gun = TRUE + if(A.direct_load) + ammo_needed = initial(gun.projectiles) - gun.projectiles + else + ammo_needed = gun.projectiles_cache_max - gun.projectiles_cache + + if(ammo_needed) + if(ammo_needed < A.rounds) + if(A.direct_load) + gun.projectiles = gun.projectiles + ammo_needed + else + gun.projectiles_cache = gun.projectiles_cache + ammo_needed + playsound(get_turf(user),A.load_audio,50,1) + to_chat(user, "You add [ammo_needed] [A.round_term][ammo_needed > 1?"s":""] to the [gun.name]") + A.rounds = A.rounds - ammo_needed + A.update_name() + return TRUE + + else + if(A.direct_load) + gun.projectiles = gun.projectiles + A.rounds + else + gun.projectiles_cache = gun.projectiles_cache + A.rounds + playsound(get_turf(user),A.load_audio,50,1) + to_chat(user, "You add [A.rounds] [A.round_term][A.rounds > 1?"s":""] to the [gun.name]") + A.rounds = 0 + A.update_name() + return TRUE + if(!fail_chat_override) + if(found_gun) + to_chat(user, "You can't fit any more ammo of this type!") + else + to_chat(user, "None of the equipment on this exosuit can use this ammo!") + return FALSE \ No newline at end of file diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index f31ce4ca970..98115e8fa5c 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -174,6 +174,10 @@ to_chat(user, "[src]-[W] interface initialization failed.") return + if(istype(W, /obj/item/mecha_ammo)) + ammo_resupply(W, user) + return + if(W.GetID()) if(add_req_access || maint_access) if(internals_access_allowed(user)) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index dbdb74bf49b..51927ce1cce 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -281,11 +281,12 @@ S.rabid = TRUE S.amount_grown = SLIME_EVOLUTION_THRESHOLD S.Evolve() - + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a pyroclastic anomaly slime?", ROLE_PAI, null, null, 100, S, POLL_IGNORE_PYROSLIME) if(LAZYLEN(candidates)) var/mob/dead/observer/chosen = pick(candidates) S.key = chosen.key + log_game("[key_name(S.key)] was made into a slime by pyroclastic anomaly at [AREACOORD(T)].") ///////////////////// diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index fca107e08a2..8b26d0cd20a 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -312,6 +312,10 @@ name = "Mining Shuttle (Computer Board)" build_path = /obj/machinery/computer/shuttle/mining +/obj/item/circuitboard/computer/mining_shuttle/common + name = "Lavaland Shuttle (Computer Board)" + build_path = /obj/machinery/computer/shuttle/mining/common + /obj/item/circuitboard/computer/white_ship name = "White Ship (Computer Board)" build_path = /obj/machinery/computer/shuttle/white_ship diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index d4b6d05f6e2..3555ed717d1 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -40,6 +40,16 @@ update_icon() return +/obj/item/defibrillator/fire_act(exposed_temperature, exposed_volume) + . = ..() + if(paddles?.loc == src) + paddles.fire_act(exposed_temperature, exposed_volume) + +/obj/item/defibrillator/extinguish() + . = ..() + if(paddles?.loc == src) + paddles.extinguish() + /obj/item/defibrillator/update_icon() update_power() update_overlays() @@ -285,6 +295,7 @@ force = 0 throwforce = 6 w_class = WEIGHT_CLASS_BULKY + resistance_flags = INDESTRUCTIBLE var/revivecost = 1000 var/cooldown = FALSE @@ -310,6 +321,12 @@ . = ..() check_range() + +/obj/item/twohanded/shockpaddles/fire_act(exposed_temperature, exposed_volume) + . = ..() + if((req_defib && defib) && loc != defib) + defib.fire_act(exposed_temperature, exposed_volume) + /obj/item/twohanded/shockpaddles/proc/check_range() if(!req_defib) return diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index f6e7a72c8bd..1283b94af5f 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -27,7 +27,7 @@ visible_message("[src] swells up!") //Animation - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/carp.dmi' flick("carp_swell", src) //Wait for animation to end sleep(6) @@ -63,7 +63,7 @@ H.spawn_gibs() H.apply_damage(200, def_zone = BODY_ZONE_CHEST) forceMove(get_turf(H)) //we move it back - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/carp.dmi' flick("carp_swell", src) sleep(6) //let the animation play out diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 6ae80af1ebe..682661617f6 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -60,9 +60,9 @@ . = ..() if(in_range(user, src) || isobserver(user)) if(!diode) - . += "The diode is missing." + . += "The diode is missing." else - . += "A class [diode.rating] laser diode is installed. It is screwed in place." + . += "A class [diode.rating] laser diode is installed. It is screwed in place." /obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params) . = ..() diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 8defe5ebd2e..fa9de999c30 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -35,7 +35,7 @@ throw_speed = 3 throw_range = 5 materials = list(MAT_METAL=500) - breakouttime = 600 //Deciseconds = 60s = 1 minute + breakouttime = 1 MINUTES armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) var/cuffsound = 'sound/weapons/handcuffs.ogg' var/trashtype = null //for disposable cuffs @@ -116,7 +116,7 @@ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' materials = list(MAT_METAL=150, MAT_GLASS=75) - breakouttime = 300 //Deciseconds = 30s + breakouttime = 30 SECONDS cuffsound = 'sound/weapons/cablecuff.ogg' /obj/item/restraints/handcuffs/cable/Initialize(mapload, param_color) @@ -165,7 +165,7 @@ /obj/item/restraints/handcuffs/fake name = "fake handcuffs" desc = "Fake handcuffs meant for gag purposes." - breakouttime = 10 //Deciseconds = 1s + breakouttime = 1 SECONDS /obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params) ..() @@ -205,7 +205,7 @@ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' materials = list() - breakouttime = 450 //Deciseconds = 45s + breakouttime = 45 SECONDS trashtype = /obj/item/restraints/handcuffs/cable/zipties/used item_color = "white" @@ -231,7 +231,7 @@ throwforce = 0 w_class = WEIGHT_CLASS_NORMAL slowdown = 7 - breakouttime = 300 //Deciseconds = 30s = 0.5 minute + breakouttime = 30 SECONDS /obj/item/restraints/legcuffs/beartrap name = "bear trap" diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index d9d32e6b159..08ab38cd4ba 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -131,27 +131,36 @@ user.death(FALSE) REMOVE_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT) -/obj/item/melee/sabre/bee - name = "the stinger" +/obj/item/melee/beesword + name = "The Stinger" desc = "Taken from a giant bee and folded over one thousand times in pure honey. Can sting through anything." icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "stinger" + icon_state = "beesword" item_state = "stinger" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' slot_flags = ITEM_SLOT_BELT + w_class = WEIGHT_CLASS_BULKY + sharpness = IS_SHARP force = 7 + throwforce = 10 block_chance = 20 armour_penetration = 85 attack_verb = list("slashed", "stung", "prickled", "poked") + hitsound = 'sound/weapons/rapierhit.ogg' -/obj/item/melee/sabre/bee/afterattack(atom/target, mob/user, proximity = TRUE) +/obj/item/melee/beesword/afterattack(atom/target, mob/user, proximity = TRUE) . = ..() user.changeNext_move(CLICK_CD_RAPID) if(iscarbon(target)) var/mob/living/carbon/H = target H.reagents.add_reagent(/datum/reagent/toxin/histamine, 4) +/obj/item/melee/beesword/suicide_act(mob/living/user) + user.visible_message("[user] is stabbing [user.p_them()]self in the throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!") + playsound(get_turf(src), hitsound, 75, 1, -1) + return TOXLOSS + /obj/item/melee/classic_baton name = "police baton" desc = "A wooden truncheon for beating criminal scum." diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index ee100ad42cc..7508d9d149c 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -355,20 +355,53 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ /* * Cardboard */ -GLOBAL_LIST_INIT(cardboard_recipes, list ( \ - new/datum/stack_recipe("box", /obj/item/storage/box), \ - new/datum/stack_recipe("light tubes", /obj/item/storage/box/lights/tubes), \ - new/datum/stack_recipe("light bulbs", /obj/item/storage/box/lights/bulbs), \ - new/datum/stack_recipe("mouse traps", /obj/item/storage/box/mousetraps), \ - new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \ - new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \ - new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \ - new/datum/stack_recipe("donut box", /obj/item/storage/fancy/donut_box), \ - new/datum/stack_recipe("egg box", /obj/item/storage/fancy/egg_box), \ - new/datum/stack_recipe("candle box", /obj/item/storage/fancy/candle_box), \ - new/datum/stack_recipe("folder", /obj/item/folder), \ - new/datum/stack_recipe("large box", /obj/structure/closet/cardboard, 4), \ - new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5), \ +GLOBAL_LIST_INIT(cardboard_recipes, list ( \ + new/datum/stack_recipe("box", /obj/item/storage/box), \ + new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \ + new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \ + new/datum/stack_recipe("large box", /obj/structure/closet/cardboard, 4, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5), \ + null, \ + + new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \ + new/datum/stack_recipe("folder", /obj/item/folder), \ + null, \ + //TO-DO: Find a proper way to just change the illustration on the box. Code isn't the issue, input is. + new/datum/stack_recipe_list("fancy boxes", list( + new /datum/stack_recipe("donut box", /obj/item/storage/fancy/donut_box), \ + new /datum/stack_recipe("egg box", /obj/item/storage/fancy/egg_box), \ + new /datum/stack_recipe("donk-pockets box", /obj/item/storage/box/donkpockets), \ + new /datum/stack_recipe("monkey cube box", /obj/item/storage/box/monkeycubes), \ + null, \ + + new /datum/stack_recipe("lethal ammo box", /obj/item/storage/box/lethalshot), \ + new /datum/stack_recipe("rubber shot ammo box", /obj/item/storage/box/rubbershot), \ + new /datum/stack_recipe("bean bag ammo box", /obj/item/storage/box/beanbag), \ + new /datum/stack_recipe("flashbang box", /obj/item/storage/box/flashbangs), \ + new /datum/stack_recipe("flashes box", /obj/item/storage/box/flashes), \ + new /datum/stack_recipe("handcuffs box", /obj/item/storage/box/handcuffs), \ + new /datum/stack_recipe("ID card box", /obj/item/storage/box/ids), \ + new /datum/stack_recipe("PDA box", /obj/item/storage/box/PDAs), \ + null, \ + + new /datum/stack_recipe("pillbottle box", /obj/item/storage/box/pillbottles), \ + new /datum/stack_recipe("beaker box", /obj/item/storage/box/beakers), \ + new /datum/stack_recipe("syringe box", /obj/item/storage/box/syringes), \ + new /datum/stack_recipe("latex gloves box", /obj/item/storage/box/gloves), \ + new /datum/stack_recipe("sterile masks box", /obj/item/storage/box/masks), \ + new /datum/stack_recipe("body bag box", /obj/item/storage/box/bodybags), \ + new /datum/stack_recipe("perscription glasses box", /obj/item/storage/box/rxglasses), \ + null, \ + + new /datum/stack_recipe("disk box", /obj/item/storage/box/disks), \ + new /datum/stack_recipe("light tubes box", /obj/item/storage/box/lights/tubes), \ + new /datum/stack_recipe("light bulbs box", /obj/item/storage/box/lights/bulbs), \ + new /datum/stack_recipe("mixed lights box", /obj/item/storage/box/lights/mixed), \ + new /datum/stack_recipe("mouse traps box", /obj/item/storage/box/mousetraps), \ + new /datum/stack_recipe("candle box", /obj/item/storage/fancy/candle_box) + )), + + null, \ )) /obj/item/stack/sheet/cardboard //BubbleWrap //it's cardboard you fuck diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 80d8a4dc02f..8a49a90a0c8 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -497,6 +497,31 @@ for(var/i in 1 to 9) new /obj/item/ammo_box/magazine/smgm45(src) +/obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax + desc = "A large duffel bag, packed to the brim with various exosuit ammo." + +/obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax/PopulateContents() + new /obj/item/mecha_ammo/incendiary(src) + new /obj/item/mecha_ammo/incendiary(src) + new /obj/item/mecha_ammo/incendiary(src) + new /obj/item/mecha_ammo/flashbang(src) + new /obj/item/mecha_ammo/flashbang(src) + new /obj/item/mecha_ammo/flashbang(src) + +/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler + desc = "A large duffel bag, packed to the brim with various exosuit ammo." + +/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler/PopulateContents() + new /obj/item/mecha_ammo/lmg(src) + new /obj/item/mecha_ammo/lmg(src) + new /obj/item/mecha_ammo/lmg(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/missiles_he(src) + new /obj/item/mecha_ammo/missiles_he(src) + new /obj/item/mecha_ammo/missiles_he(src) + /obj/item/storage/backpack/duffelbag/syndie/c20rbundle desc = "A large duffel bag containing a C-20r, some magazines, and a cheap looking suppressor." diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index b0850b2954e..5f3cebdeab3 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1072,3 +1072,19 @@ /obj/item/stock_parts/micro_laser/quadultra = 3, /obj/item/stock_parts/matter_bin/bluespace = 3) generate_items_inside(items_inside,src) + +/obj/item/storage/box/dishdrive + name = "DIY Dish Drive Kit" + desc = "Contains everything you need to build your own Dish Drive!" + custom_premium_price = 200 + +/obj/item/storage/box/dishdrive/PopulateContents() + var/static/items_inside = list( + /obj/item/stack/sheet/metal/five = 1, + /obj/item/stack/cable_coil/five = 1, + /obj/item/circuitboard/machine/dish_drive = 1, + /obj/item/stack/sheet/glass = 1, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stock_parts/matter_bin = 2, + /obj/item/screwdriver = 1) + generate_items_inside(items_inside,src) \ No newline at end of file diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 1df6d6ae1d2..a90f5157556 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -178,7 +178,7 @@ new /obj/item/storage/belt/fannypack/yellow(src) // 0 tc new /obj/item/storage/box/syndie_kit/bee_grenades(src) // 15 tc new /obj/item/reagent_containers/glass/bottle/beesease(src) // 10 tc? - new /obj/item/melee/sabre/bee(src) //priceless + new /obj/item/melee/beesword(src) //priceless if("mr_freeze") new /obj/item/clothing/glasses/cold(src) 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 612381fd7c2..6607a0e8ea9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -49,6 +49,13 @@ req_access = null locked = FALSE +/obj/structure/closet/secure_closet/freezer/gulag_fridge + name = "refrigerator" + +/obj/structure/closet/secure_closet/freezer/gulag_fridge/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/reagent_containers/food/drinks/beer/light(src) /obj/structure/closet/secure_closet/freezer/fridge name = "refrigerator" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 9cf6d015a22..d9627c93e6d 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -310,3 +310,17 @@ ..() for(var/i in 1 to 3) new /obj/item/storage/box/lethalshot(src) + +/obj/structure/closet/secure_closet/labor_camp_security + name = "labor camp security locker" + req_access = list(ACCESS_SECURITY) + icon_state = "sec" + +/obj/structure/closet/secure_closet/labor_camp_security/PopulateContents() + ..() + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/head/helmet/sec(src) + new /obj/item/clothing/under/rank/security(src) + new /obj/item/clothing/under/rank/security/skirt(src) + new /obj/item/clothing/glasses/hud/security/sunglasses(src) + new /obj/item/flashlight/seclite(src) diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index 7b482584a5a..09492117a4b 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -33,6 +33,19 @@ LAZYINITLIST(buckled_mobs) . = ..() +/obj/structure/guillotine/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/stack/sheet/plasteel)) + to_chat(user, "You start repairing the guillotine with the plasteel.") + if(blade_sharpness<10) + if(do_after(user,100,target=user)) + blade_sharpness = min(10,blade_sharpness+3) + I.use(1) + to_chat(user, "You repair the guillotine with the plasteel.") + else + to_chat(user, "You stop repairing the guillotine with the plasteel.") + else + to_chat(user, "The guillotine is already fully repaired!") + /obj/structure/guillotine/examine(mob/user) . = ..() diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 83b0399b214..c47d7dda9d7 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -76,7 +76,7 @@ to_chat(src, "For youtube-dl shortcuts like ytsearch: please use the appropriate full url from the website.") return var/shell_scrubbed_input = shell_url_scrub(web_sound_input) - var/list/output = world.shelleo("[ytdl] --format \"bestaudio\[ext=mp3]/best\[ext=mp4]\[height<=360]/bestaudio\[ext=m4a]/bestaudio\[ext=aac]\" --dump-single-json --no-playlist -- \"[shell_scrubbed_input]\"") + var/list/output = world.shelleo("[ytdl] --geo-bypass --format \"bestaudio\[ext=mp3]/best\[ext=mp4]\[height<=360]/bestaudio\[ext=m4a]/bestaudio\[ext=aac]\" --dump-single-json --no-playlist -- \"[shell_scrubbed_input]\"") var/errorlevel = output[SHELLEO_ERRORLEVEL] var/stdout = output[SHELLEO_STDOUT] var/stderr = output[SHELLEO_STDERR] diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index b45cdb996c4..2cc09be061a 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -23,7 +23,7 @@ /obj/item/organ/heart/gland/examine(mob/user) . = ..() - if(HAS_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) || isobserver(user)) + if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user)) . += "It is \a [true_name]." /obj/item/organ/heart/gland/proc/ownerCheck() @@ -52,23 +52,25 @@ /obj/item/organ/heart/gland/proc/mind_control(command, mob/living/user) if(!ownerCheck() || !mind_control_uses || active_mind_control) - return + return FALSE mind_control_uses-- to_chat(owner, "You suddenly feel an irresistible compulsion to follow an order...") to_chat(owner, "[command]") active_mind_control = TRUE - log_admin("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]") + message_admins("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]") update_gland_hud() var/obj/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /obj/screen/alert/mind_control) mind_alert.command = command addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration) + return TRUE /obj/item/organ/heart/gland/proc/clear_mind_control() if(!ownerCheck() || !active_mind_control) - return + return FALSE to_chat(owner, "You feel the compulsion fade, and you completely forget about your previous orders.") owner.clear_alert("mind_control") active_mind_control = FALSE + return TRUE /obj/item/organ/heart/gland/Remove(mob/living/carbon/M, special = 0) active = 0 @@ -151,6 +153,7 @@ icon_state = "mindshock" mind_control_uses = 1 mind_control_duration = 6000 + var/list/mob/living/carbon/human/broadcasted_mobs = list() /obj/item/organ/heart/gland/mindshock/activate() to_chat(owner, "You get a headache.") @@ -170,14 +173,71 @@ if(3) H.hallucination += 60 +/obj/item/organ/heart/gland/mindshock/mind_control(command, mob/living/user) + if(!ownerCheck() || !mind_control_uses || active_mind_control) + return FALSE + mind_control_uses-- + for(var/mob/M in oview(7, owner)) + if(!ishuman(M)) + continue + var/mob/living/carbon/human/H = M + if(H.stat) + continue + + broadcasted_mobs += H + to_chat(H, "You suddenly feel an irresistible compulsion to follow an order...") + to_chat(H, "[command]") + + message_admins("[key_name(user)] broadcasted an abductor mind control message from [key_name(owner)] to [key_name(H)]: [command]") + + var/obj/screen/alert/mind_control/mind_alert = H.throw_alert("mind_control", /obj/screen/alert/mind_control) + mind_alert.command = command + + if(LAZYLEN(broadcasted_mobs)) + active_mind_control = TRUE + addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration) + + update_gland_hud() + return TRUE + +/obj/item/organ/heart/gland/mindshock/clear_mind_control() + if(!active_mind_control || !LAZYLEN(broadcasted_mobs)) + return FALSE + for(var/M in broadcasted_mobs) + var/mob/living/carbon/human/H = M + to_chat(H, "You feel the compulsion fade, and you completely forget about your previous orders.") + H.clear_alert("mind_control") + active_mind_control = FALSE + return TRUE + +/obj/item/organ/heart/gland/access + true_name = "anagraphic electro-scrambler" + cooldown_low = 600 + cooldown_high = 1200 + uses = 1 + icon_state = "mindshock" + mind_control_uses = 3 + mind_control_duration = 900 + +/obj/item/organ/heart/gland/access/activate() + to_chat(owner, "You feel like a VIP for some reason.") + RegisterSignal(owner, COMSIG_MOB_ALLOWED, .proc/free_access) + +/obj/item/organ/heart/gland/access/proc/free_access(datum/source, obj/O) + return TRUE + +/obj/item/organ/heart/gland/access/Remove(mob/living/carbon/M, special = 0) + UnregisterSignal(owner, COMSIG_MOB_ALLOWED) + ..() + /obj/item/organ/heart/gland/pop - true_name = "anthropmorphic translocator" + true_name = "anthropmorphic transmorphosizer" cooldown_low = 900 cooldown_high = 1800 uses = -1 human_only = TRUE icon_state = "species" - mind_control_uses = 5 + mind_control_uses = 7 mind_control_duration = 300 /obj/item/organ/heart/gland/pop/activate() @@ -253,6 +313,54 @@ else owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) +/obj/item/organ/heart/gland/quantum + true_name = "quantic de-observation matrix" + cooldown_low = 150 + cooldown_high = 150 + uses = -1 + icon_state = "emp" + mind_control_uses = 2 + mind_control_duration = 1200 + var/mob/living/carbon/entangled_mob + +/obj/item/organ/heart/gland/quantum/activate() + if(entangled_mob) + return + for(var/mob/M in oview(owner, 7)) + if(!iscarbon(M)) + continue + entangled_mob = M + addtimer(CALLBACK(src, .proc/quantum_swap), rand(600, 2400)) + return + +/obj/item/organ/heart/gland/quantum/proc/quantum_swap() + if(QDELETED(entangled_mob)) + entangled_mob = null + return + var/turf/T = get_turf(owner) + do_teleport(owner, get_turf(entangled_mob),null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM) + do_teleport(entangled_mob, T,null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM) + to_chat(owner, "You suddenly find yourself somewhere else!") + to_chat(entangled_mob, "You suddenly find yourself somewhere else!") + if(!active_mind_control) //Do not reset entangled mob while mind control is active + entangled_mob = null + +/obj/item/organ/heart/gland/quantum/mind_control(command, mob/living/user) + if(..()) + if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD)) + to_chat(entangled_mob, "You suddenly feel an irresistible compulsion to follow an order...") + to_chat(entangled_mob, "[command]") + var/obj/screen/alert/mind_control/mind_alert = entangled_mob.throw_alert("mind_control", /obj/screen/alert/mind_control) + mind_alert.command = command + message_admins("[key_name(owner)] mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]") + update_gland_hud() + +/obj/item/organ/heart/gland/quantum/clear_mind_control() + if(active_mind_control) + to_chat(entangled_mob, "You feel the compulsion fade, and you completely forget about your previous orders.") + entangled_mob.clear_alert("mind_control") + ..() + /obj/item/organ/heart/gland/spiderman true_name = "araneae cloister accelerator" cooldown_low = 450 @@ -284,20 +392,41 @@ var/turf/T = owner.drop_location() new /obj/item/reagent_containers/food/snacks/egg/gland(T) + +/obj/item/organ/heart/gland/blood + true_name = "pseudonuclear hemo-destabilizer" + cooldown_low = 1200 + cooldown_high = 1800 + uses = -1 + icon_state = "egg" + lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' + mind_control_uses = 3 + mind_control_duration = 1500 + +/obj/item/organ/heart/gland/blood/activate() + if(!ishuman(owner) || !owner.dna.species) + return + var/mob/living/carbon/human/H = owner + var/datum/species/species = H.dna.species + to_chat(H, "You feel your blood heat up for a moment.") + species.exotic_blood = get_random_reagent_id() + /obj/item/organ/heart/gland/electric true_name = "electron accumulator/discharger" cooldown_low = 800 cooldown_high = 1200 + icon_state = "species" uses = -1 mind_control_uses = 2 mind_control_duration = 900 /obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0) ..() - ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, ORGAN_TRAIT) + ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") /obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0) - REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, ORGAN_TRAIT) + REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") ..() /obj/item/organ/heart/gland/electric/activate() @@ -315,6 +444,7 @@ cooldown_low = 50 cooldown_high = 50 uses = -1 + icon_state = "viral" mind_control_uses = 3 mind_control_duration = 1200 var/list/possible_reagents = list() @@ -327,13 +457,14 @@ /obj/item/organ/heart/gland/chem/activate() var/chem_to_add = pick(possible_reagents) owner.reagents.add_reagent(chem_to_add, 2) - owner.adjustToxLoss(-2, TRUE, TRUE) + owner.adjustToxLoss(-5, TRUE, TRUE) ..() /obj/item/organ/heart/gland/plasma true_name = "effluvium sanguine-synonym emitter" cooldown_low = 1200 cooldown_high = 1800 + icon_state = "slime" uses = -1 mind_control_uses = 1 mind_control_duration = 800 diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index fbb631ceae3..6677165a920 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -63,8 +63,10 @@ var/honorific if(owner.current.gender == FEMALE) honorific = "Ms." - else + else if(owner.current.gender == MALE) honorific = "Mr." + else + honorific = "Mx." if(GLOB.possible_changeling_IDs.len) changelingID = pick(GLOB.possible_changeling_IDs) GLOB.possible_changeling_IDs -= changelingID diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index da1f3a3ebd2..3daa0087b90 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -764,7 +764,6 @@ guns_left = 24 mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood fire_sound = 'sound/magic/wand_teleport.ogg' - item_flags = NEEDS_PERMIT | NOBLUDGEON | DROPDEL /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood @@ -772,10 +771,12 @@ /obj/item/ammo_casing/magic/arcane_barrage/blood projectile_type = /obj/item/projectile/magic/arcane_barrage/blood + firing_effect_type = /obj/effect/temp_visual/cult/sparks /obj/item/projectile/magic/arcane_barrage/blood name = "blood bolt" icon_state = "mini_leaper" + nondirectional_sprite = TRUE damage_type = BRUTE impact_effect_type = /obj/effect/temp_visual/dir_setting/bloodsplatter diff --git a/code/modules/antagonists/fugitive/fugitive_ship.dm b/code/modules/antagonists/fugitive/fugitive_ship.dm index af26ddd5cda..01555cde71a 100644 --- a/code/modules/antagonists/fugitive/fugitive_ship.dm +++ b/code/modules/antagonists/fugitive/fugitive_ship.dm @@ -32,7 +32,7 @@ to_chat(fugitive, "You are thrown into a vast void of bluespace, and as you fall further into oblivion the comparatively small entrance to reality gets smaller and smaller until you cannot see it anymore. You have failed to avoid capture.") fugitive.ghostize(TRUE) //so they cannot suicide, round end stuff. -/obj/machinery/computer/shuttle/pirate/hunter +/obj/machinery/computer/shuttle/hunter name = "shuttle console" shuttleId = "huntership" possible_destinations = "huntership_away;huntership_home;huntership_custom" diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 799707a743e..580966c6007 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -71,7 +71,7 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/examine(mob/user) //this is leaving out everything but efficiency since they follow the same idea of "better beaker, better results" . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Efficiency at [efficiency*100]%." + . += "The status display reads: Efficiency at [efficiency*100]%." /obj/machinery/atmospherics/components/unary/cryo_cell/Destroy() QDEL_NULL(radio) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 16bf857de7c..47261e406e2 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -49,6 +49,13 @@ if(showpipe) add_overlay(getpipeimage(icon, "scrub_cap", initialize_directions)) +/obj/machinery/atmospherics/components/unary/thermomachine/examine(mob/user) + . = ..() + . += "The thermostat is set to [target_temperature]K ([(T0C-target_temperature)*-1]C)." + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Efficiency [(heat_capacity/5000)*100]%." + . += "Temperature range [min_temperature]K - [max_temperature]K ([(T0C-min_temperature)*-1]C - [(T0C-max_temperature)*-1]C)." + /obj/machinery/atmospherics/components/unary/thermomachine/process_atmos() ..() if(!on || !nodes[1]) @@ -159,6 +166,12 @@ update_icon() +/obj/machinery/atmospherics/components/unary/thermomachine/CtrlClick(mob/living/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + return + on = !on + update_icon() + /obj/machinery/atmospherics/components/unary/thermomachine/freezer name = "freezer" icon_state = "freezer" @@ -192,6 +205,11 @@ L += M.rating min_temperature = max(T0C - (initial(min_temperature) + L * 15), TCMB) //73.15K with T1 stock parts +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/AltClick(mob/living/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + return + target_temperature = min_temperature + /obj/machinery/atmospherics/components/unary/thermomachine/heater name = "heater" icon_state = "heater" @@ -212,3 +230,8 @@ for(var/obj/item/stock_parts/micro_laser/M in component_parts) L += M.rating max_temperature = T20C + (initial(max_temperature) * L) //573.15K with T1 stock parts + +/obj/machinery/atmospherics/components/unary/thermomachine/heater/AltClick(mob/living/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + return + target_temperature = max_temperature diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm index f8446861c5b..ea98605506d 100644 --- a/code/modules/cargo/bounty_console.dm +++ b/code/modules/cargo/bounty_console.dm @@ -23,6 +23,8 @@ /obj/item/paper/bounty_printout/Initialize() . = ..() info = "

Nanotrasen Cargo Bounties


" + update_icon() + for(var/datum/bounty/B in GLOB.bounties_list) if(B.claimed) continue diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index 80301c036d6..beba7d9e8ee 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -44,9 +44,9 @@ /mob/living/simple_animal/pet/gondola/gondolapod/examine(mob/user) . = ..() if (contents.len) - . += "It looks like it hasn't made its delivery yet." + . += "It looks like it hasn't made its delivery yet." else - . += "It looks like it has already made its delivery." + . += "It looks like it has already made its delivery." /mob/living/simple_animal/pet/gondola/gondolapod/verb/check() set name = "Count Contents" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 3b75de4738a..5843f7a20da 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -271,7 +271,7 @@ /obj/item/clothing/head/foilhat/Initialize(mapload) . = ..() if(!warped) - AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD, 6, TRUE, null, CALLBACK(src, .proc/warp_up)) + AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD, 6, TRUE, null, CALLBACK(src, .proc/warp_up)) /obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot) . = ..() diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index cc9cff7f53a..d44c43899aa 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -369,7 +369,7 @@ /datum/outfit/death_commando name = "Death Commando" - uniform = /obj/item/clothing/under/color/green + uniform = /obj/item/clothing/under/rank/centcom_commander suit = /obj/item/clothing/suit/space/hardsuit/deathsquad shoes = /obj/item/clothing/shoes/combat/swat gloves = /obj/item/clothing/gloves/combat diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index cd8ba56fc53..cc28900495d 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -423,7 +423,7 @@ /obj/item/clothing/suit/space/hardsuit/wizard/Initialize() . = ..() - AddComponent(/datum/component/anti_magic, TRUE, FALSE, FALSE, null, INFINITY, FALSE) + AddComponent(/datum/component/anti_magic, TRUE, FALSE, FALSE, ITEM_SLOT_OCLOTHING, INFINITY, FALSE) //Medical hardsuit diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index e767c0f2038..1d5b4dbabd3 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -331,7 +331,7 @@ Contains: /obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize() . = ..() - AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE) + AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_OCLOTHING) /obj/item/clothing/suit/space/hardsuit/ert/paranormal name = "paranormal response team hardsuit" @@ -344,7 +344,7 @@ Contains: /obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize() . = ..() - AddComponent(/datum/component/anti_magic, TRUE, TRUE) + AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE, ITEM_SLOT_OCLOTHING) /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor name = "inquisitor's hardsuit" diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index ab23c30e007..cf0e5e1b05b 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -36,6 +36,7 @@ projectilesound = 'sound/weapons/emitter.ogg' maxHealth = 50 health = 50 + random_color = FALSE var/allowed_projectile_types = list(/obj/item/projectile/magic/change, /obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection, /obj/item/projectile/magic/death, /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball, /obj/item/projectile/magic/spellblade, /obj/item/projectile/magic/arcane_barrage) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index e335f9c923d..68d5246de3c 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -532,7 +532,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( A = image('icons/mob/monkey.dmi',H,"monkey1") A.name = "Monkey ([rand(1,999)])" if("carp")//Carp - A = image('icons/mob/animal.dmi',H,"carp") + A = image('icons/mob/carp.dmi',H,"carp") A.name = "Space Carp" if("corgi")//Corgi A = image('icons/mob/pets.dmi',H,"corgi") diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index c696ae96d61..5b4eafc00cd 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -72,7 +72,7 @@ God bless America. if(frying) . += "You can make out \a [frying] in the oil." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Frying at [fry_speed*100]% speed.
Using [oil_use*10] units of oil per second." + . += "The status display reads: Frying at [fry_speed*100]% speed.
Using [oil_use*10] units of oil per second.
" /obj/machinery/deepfryer/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/reagent_containers/pill)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index b75fbdd3425..af12485e997 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -33,10 +33,10 @@ /obj/machinery/gibber/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Outputting [meat_produced] meat slab(s) after [gibtime*0.1] seconds of processing." + . += "The status display reads: Outputting [meat_produced] meat slab(s) after [gibtime*0.1] seconds of processing." for(var/obj/item/stock_parts/manipulator/M in component_parts) if(M.rating >= 2) - . += "Gibber has been upgraded to process inorganic materials." + . += "Gibber has been upgraded to process inorganic materials." /obj/machinery/gibber/update_icon() cut_overlays() diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 3dd3a08ecc0..5736169d514 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -85,7 +85,7 @@ if(!(stat & (NOPOWER|BROKEN))) . += {"The status display reads:\n - Capacity: [max_n_of_items] items.\n - - Cook time reduced by [(efficiency - 1) * 25]%."} + - Cook time reduced by [(efficiency - 1) * 25]%."} /obj/machinery/microwave/update_icon() if(broken) diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index 5722601ad55..bf8ae8047e5 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -37,7 +37,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) /obj/machinery/monkey_recycler/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Producing [cube_production] cubes for every monkey inserted." + . += "The status display reads: Producing [cube_production] cubes for every monkey inserted." /obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params) if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index e31b9e6eddc..0a0b85adf7c 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -24,7 +24,7 @@ /obj/machinery/processor/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Outputting [rating_amount] item(s) at [rating_speed*100]% speed." + . += "The status display reads: Outputting [rating_amount] item(s) at [rating_speed*100]% speed." /obj/machinery/processor/proc/process_food(datum/food_processor_process/recipe, atom/movable/what) if (recipe.output && loc && !QDELETED(src)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 3d636a734a8..661d54f200e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -36,7 +36,7 @@ /obj/machinery/smartfridge/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: This unit can hold a maximum of [max_n_of_items] items." + . += "The status display reads: This unit can hold a maximum of [max_n_of_items] items." /obj/machinery/smartfridge/power_change() ..() diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 13e1d2d0337..197beccec87 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -55,7 +55,7 @@ /obj/machinery/biogenerator/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Productivity at [productivity*100]%.
Matter consumption reduced by [(efficiency*25)-25]%.
Machine can hold up to [max_items] pieces of produce." + . += "The status display reads: Productivity at [productivity*100]%.
Matter consumption reduced by [(efficiency*25)-25]%.
Machine can hold up to [max_items] pieces of produce.
" /obj/machinery/biogenerator/on_reagent_change(changetype) //When the reagents change, change the icon as well. update_icon() diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 3bebfb5cbd5..cf9bf8ee63d 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -63,7 +63,7 @@ var/uses = 1 if(seed) uses = round(seed.potency / 20) - AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, uses, TRUE, CALLBACK(src, .proc/block_magic), CALLBACK(src, .proc/expire)) //deliver us from evil o melon god + AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, ITEM_SLOT_HANDS, uses, TRUE, CALLBACK(src, .proc/block_magic), CALLBACK(src, .proc/expire)) //deliver us from evil o melon god /obj/item/reagent_containers/food/snacks/grown/holymelon/proc/block_magic(mob/user, major) if(major) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 88d69338b7a..5b370d96802 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -49,7 +49,7 @@ /obj/machinery/hydroponics/constructable/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Tray efficiency at [rating*100]%." + . += "The status display reads: Tray efficiency at [rating*100]%." /obj/machinery/hydroponics/Destroy() diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 710d86a4a7b..9fc59a33a77 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -59,7 +59,7 @@ /obj/machinery/seed_extractor/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Extracting [seed_multiplier] seed(s) per piece of produce.
Machine can store up to [max_seeds]% seeds." + . += "The status display reads: Extracting [seed_multiplier] seed(s) per piece of produce.
Machine can store up to [max_seeds]% seeds.
" /obj/machinery/seed_extractor/attackby(obj/item/O, mob/user, params) diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 050e774070c..075c6e1de68 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -34,3 +34,7 @@ backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/tox +/datum/outfit/job/scientist/pre_equip(mob/living/carbon/human/H) + ..() + if(prob(0.4)) + neck = /obj/item/clothing/neck/tie/horrible diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 719d3f75caf..4897bc01dd5 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -49,7 +49,7 @@ /obj/machinery/mineral/ore_redemption/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Smelting [sheet_per_ore] sheet(s) per piece of ore.
Ore pickup speed at [ore_pickup_rate]." + . += "The status display reads: Smelting [sheet_per_ore] sheet(s) per piece of ore.
Ore pickup speed at [ore_pickup_rate].
" /obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O) var/datum/component/material_container/mat_container = materials.mat_container diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index a1ba493d466..f8dca6735f7 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -82,6 +82,14 @@ return . = ..() +/obj/machinery/computer/shuttle/mining/common + name = "lavaland shuttle console" + desc = "Used to call and send the lavaland shuttle." + circuit = /obj/item/circuitboard/computer/mining_shuttle/common + shuttleId = "mining_common" + possible_destinations = "whiteship_home;lavaland_common_away;landing_zone_dock;mining_public" + + /**********************Mining car (Crate like thing, not the rail car)**************************/ /obj/structure/closet/crate/miningcar diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 37ff6bd4ffc..165960d3d58 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -103,3 +103,9 @@ if(istype(loc, /obj/item/organ/brain)) var/obj/item/organ/brain/B = loc . = B.traumas + +/mob/living/brain/get_policy_keywords() + . = ..() + + if(container) + . += "[container.type]" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 550563a8c50..d9631f115fd 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -623,7 +623,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put BT.on_life() if(getBrainLoss() >= BRAIN_DAMAGE_DEATH) //rip - to_chat(src, "The last spark of life in your brain fizzles out...") + to_chat(src, "The last spark of life in your brain fizzles out...") death() var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) if(B) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index da9a15af6e2..32e3bcfd035 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -113,6 +113,10 @@ S.cost = 1 S.source = get_or_create_estorage(/datum/robot_energy_storage/beacon) + else if(istype(S, /obj/item/stack/pipe_cleaner_coil)) + S.cost = 1 + S.source = get_or_create_estorage(/datum/robot_energy_storage/pipe_cleaner) + if(S && S.source) S.materials = list() S.is_cyborg = 1 @@ -480,7 +484,8 @@ /obj/item/lighter, /obj/item/storage/bag/tray, /obj/item/reagent_containers/borghypo/borgshaker, - /obj/item/borg/lollipop) + /obj/item/borg/lollipop, + /obj/item/stack/pipe_cleaner_coil/cyborg) emag_modules = list(/obj/item/reagent_containers/borghypo/borgshaker/hacked) ratvar_modules = list(/obj/item/clockwork/slab/cyborg/service, /obj/item/borg/sight/xray/truesight_lens) @@ -687,3 +692,8 @@ max_energy = 30 recharge_rate = 1 name = "Marker Beacon Storage" + +/datum/robot_energy_storage/pipe_cleaner + max_energy = 50 + recharge_rate = 2 + name = "Pipe Cleaner Synthesizer" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 447cbe339d3..9e25a074c44 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -3,9 +3,10 @@ /mob/living/simple_animal/hostile/carp name = "space carp" desc = "A ferocious, fang-bearing creature that resembles a fish." - icon_state = "carp" - icon_living = "carp" - icon_dead = "carp_dead" + icon = 'icons/mob/carp.dmi' + icon_state = "base" + icon_living = "base" + icon_dead = "base_dead" icon_gib = "carp_gib" mob_biotypes = list(MOB_ORGANIC, MOB_BEAST) speak_chance = 0 @@ -38,12 +39,90 @@ pressure_resistance = 200 gold_core_spawnable = HOSTILE_SPAWN + var/random_color = TRUE //if the carp uses random coloring + var/rarechance = 1 //chance for rare color variant + + var/static/list/carp_colors = list(\ + "lightpurple" = "#c3b9f1", \ + "lightpink" = "#da77a8", \ + "green" = "#70ff25", \ + "grape" = "#df0afb", \ + "swamp" = "#e5e75a", \ + "turquoise" = "#04e1ed", \ + "brown" = "#ca805a", \ + "teal" = "#20e28e", \ + "lightblue" = "#4d88cc", \ + "rusty" = "#dd5f34", \ + "beige" = "#bbaeaf", \ + "yellow" = "#f3ca4a", \ + "blue" = "#09bae1", \ + "palegreen" = "#7ef099", \ + ) + var/static/list/carp_colors_rare = list(\ + "silver" = "#fdfbf3", \ + ) + +/mob/living/simple_animal/hostile/carp/Initialize(mapload) + . = ..() + carp_randomify(rarechance) + update_icons() + +/mob/living/simple_animal/hostile/carp/proc/carp_randomify(rarechance) + if(random_color) + var/our_color + if(prob(rarechance)) + our_color = pick(carp_colors_rare) + add_atom_colour(carp_colors_rare[our_color], FIXED_COLOUR_PRIORITY) + else + our_color = pick(carp_colors) + add_atom_colour(carp_colors[our_color], FIXED_COLOUR_PRIORITY) + add_carp_overlay() + +/mob/living/simple_animal/hostile/carp/proc/add_carp_overlay() + if(!random_color) + return + cut_overlays() + var/mutable_appearance/base_overlay = mutable_appearance(icon, "base_mouth") + base_overlay.appearance_flags = RESET_COLOR + add_overlay(base_overlay) + +/mob/living/simple_animal/hostile/carp/proc/add_dead_carp_overlay() + if(!random_color) + return + cut_overlays() + var/mutable_appearance/base_dead_overlay = mutable_appearance(icon, "base_dead_mouth") + base_dead_overlay.appearance_flags = RESET_COLOR + add_overlay(base_dead_overlay) + +/mob/living/simple_animal/hostile/carp/death(gibbed) + . = ..() + cut_overlays() + if(!random_color || gibbed) + return + add_dead_carp_overlay() + +/mob/living/simple_animal/hostile/carp/revive(full_heal = 0, admin_revive = 0) + . = ..() + if(.) + regenerate_icons() + +/mob/living/simple_animal/hostile/carp/regenerate_icons() + cut_overlays() + if(!random_color) + return + if(stat != DEAD) + add_carp_overlay() + else + add_dead_carp_overlay() + ..() + /mob/living/simple_animal/hostile/carp/holocarp icon_state = "holocarp" icon_living = "holocarp" maxbodytemp = INFINITY gold_core_spawnable = NO_SPAWN del_on_death = 1 + random_color = FALSE /mob/living/simple_animal/hostile/carp/megacarp icon = 'icons/mob/broadMobs.dmi' @@ -57,6 +136,7 @@ health = 20 pixel_x = -16 mob_size = MOB_SIZE_LARGE + random_color = FALSE obj_damage = 80 melee_damage_lower = 20 @@ -90,5 +170,6 @@ gold_core_spawnable = NO_SPAWN faction = list(ROLE_SYNDICATE) AIStatus = AI_OFF + rarechance = 10 #undef REGENERATION_DELAY diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm index 44f7f9c9f87..8f64d88f060 100644 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm @@ -1,5 +1,3 @@ - - /mob/living/simple_animal/hostile/carp/eyeball name = "eyeball" desc = "An odd looking creature, it won't stop staring..." @@ -26,4 +24,5 @@ movement_type = FLYING faction = list("spooky") - del_on_death = 1 \ No newline at end of file + del_on_death = 1 + random_color = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index da3f86ed273..6693c3a7777 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -163,7 +163,6 @@ response_help = "tries desperately to appease" response_disarm = "foolishly pushes" response_harm = "angers" - access_card = ACCESS_THEATRE speak = list("HONK", "Honk!", "HAUAUANK!!!", "GUUURRRRAAAHHH!!!") emote_see = list("honks", "sweats", "grunts") speak_chance = 5 diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 0b4da0da557..35f82beeead 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -72,7 +72,7 @@ if(Target.Adjacent(src)) Target.attack_slime(src) - return + break if((Target.mobility_flags & MOBILITY_STAND) && prob(80)) if(Target.client && Target.health >= 20) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index cb304a0e9aa..90539a937a0 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -15,7 +15,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri name = "power cable" desc = "A flexible, superconducting insulated cable for heavy-duty power transfer." icon = 'icons/obj/power_cond/cable.dmi' - icon_state = "1-2-4-8" + icon_state = "1-2-4-8-node" level = 1 //is underfloor layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER anchored = TRUE @@ -37,24 +37,35 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri var/under_thing = NONE if(clear_before_updating) linked_dirs = 0 + var/obj/machinery/power/search_parent for(var/obj/machinery/power/P in loc) if(istype(P, /obj/machinery/power/terminal)) under_thing = UNDER_TERMINAL + search_parent = P break if(istype(P, /obj/machinery/power/smes)) under_thing = UNDER_SMES + search_parent = P break for(var/check_dir in GLOB.cardinals) var/TB = get_step(src, check_dir) + //don't link from smes to its terminal if(under_thing) - var/search_target switch(under_thing) if(UNDER_SMES) - search_target = /obj/machinery/power/terminal + var/obj/machinery/power/terminal/term = locate(/obj/machinery/power/terminal) in TB + //Why null or equal to the search parent? + //during map init it's possible for a placed smes terminal to not have initialized to the smes yet + //but the cable underneath it is ready to link. + //I don't believe null is even a valid state for a smes terminal while the game is actually running + //So in the rare case that this happens, we also shouldn't connect + //This might break. + if(term && (!term.master || term.master == search_parent)) + continue if(UNDER_TERMINAL) - search_target = /obj/machinery/power/smes - if(locate(search_target) in TB) - continue + var/obj/machinery/power/smes/S = locate(/obj/machinery/power/smes) in TB + if(S && (!S.terminal || S.terminal == search_parent)) + continue var/inverse = turn(check_dir, 180) for(var/obj/structure/cable/C in TB) linked_dirs |= check_dir @@ -282,9 +293,9 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri if(linked_dirs & check_dir && check_dir != ignore_dir) T = get_step(src, check_dir) if(T) - . |= power_list(T, src, powernetless_only) + . += power_list(T, src, powernetless_only) - . |= power_list(loc, src, powernetless_only) //get on turf matching cables + . += power_list(loc, src, powernetless_only) //get on turf matching cables /obj/structure/cable/proc/auto_propogate_cut_cable(obj/O) if(O && !QDELETED(O)) @@ -305,38 +316,26 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri return var/turf/T1 = loc - var/list/P_list if(!T1) return + + //clear the powernet of any machines on tile first + for(var/obj/machinery/power/P in T1) + P.disconnect_from_network() + + var/list/P_list = list() for(var/dir_check in GLOB.cardinals) if(linked_dirs & dir_check) T1 = get_step(T1, dir_check) - P_list += power_list(T1, src, FALSE, TRUE) // what adjacently joins on to cut cable... + P_list += locate(/obj/structure/cable) in T1 - P_list += power_list(loc, src, FALSE, TRUE)//... and on turf - - - if(P_list.len == 0)//if nothing in both list, then the cable was a lone cable, just delete it and its powernet - powernet.remove_cable(src) - - for(var/obj/machinery/power/P in T1)//check if it was powering a machine - if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to - P.disconnect_from_network() //remove from current network (and delete powernet) - return - // remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist if(remove) moveToNullspace() powernet.remove_cable(src) //remove the cut cable from its powernet - var/first = TRUE - var/delay = 0 for(var/obj/O in P_list) - if(first) - first = FALSE - continue - addtimer(CALLBACK(O, .proc/auto_propogate_cut_cable, O), delay) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables - delay += 5 + addtimer(CALLBACK(O, .proc/auto_propogate_cut_cable, O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables /////////////////////////////////////////////// // The cable coil object, used for laying cable @@ -350,7 +349,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai /obj/item/stack/cable_coil name = "cable coil" - custom_price = 15 + custom_price = 30 gender = NEUTER //That's a cable coil sounds better than that's some cable coils icon = 'icons/obj/power.dmi' icon_state = "coil" diff --git a/code/modules/power/pipecleaners.dm b/code/modules/power/pipecleaners.dm index de460951dd7..450741cf57c 100644 --- a/code/modules/power/pipecleaners.dm +++ b/code/modules/power/pipecleaners.dm @@ -130,14 +130,8 @@ By design, d1 is the smallest direction and d2 is the highest // - pipe cleaner coil : merge pipe cleaners // /obj/structure/pipe_cleaner/proc/handlecable(obj/item/W, mob/user, params) - var/turf/T = get_turf(src) - if(T.intact) - return if(W.tool_behaviour == TOOL_WIRECUTTER) - user.visible_message("[user] cuts the pipe cleaner.", "You cut the pipe cleaner.") - stored.add_fingerprint(user) - investigate_log("was cut by [key_name(usr)] in [AREACOORD(src)]", INVESTIGATE_WIRES) - deconstruct() + cut_pipe_cleaner(user) return else if(istype(W, /obj/item/stack/pipe_cleaner_coil)) @@ -149,6 +143,12 @@ By design, d1 is the smallest direction and d2 is the highest add_fingerprint(user) +/obj/structure/pipe_cleaner/proc/cut_pipe_cleaner(mob/user) + user.visible_message("[user] pulls up the pipe cleaner.", "You pull up the pipe cleaner.") + stored.add_fingerprint(user) + investigate_log("was pulled up by [key_name(usr)] in [AREACOORD(src)]", INVESTIGATE_WIRES) + deconstruct() + /obj/structure/pipe_cleaner/attackby(obj/item/W, mob/user, params) handlecable(W, user, params) @@ -163,6 +163,11 @@ By design, d1 is the smallest direction and d2 is the highest stored.item_color = colorC stored.update_icon() +/obj/structure/pipe_cleaner/AltClick(mob/living/user) + if(!user.canUseTopic(src, BE_CLOSE)) + return + cut_pipe_cleaner(user) + /////////////////////////////////////////////// // The pipe cleaner coil object, used for laying pipe cleaner /////////////////////////////////////////////// diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 65051fbb3f8..11997060bdc 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -122,7 +122,7 @@ if(anchored) . += "It is anchored to the ground." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Fuel efficiency increased by [(consumption*100)-100]%." + . += "The status display reads: Fuel efficiency increased by [(consumption*100)-100]%." /obj/machinery/power/port_gen/pacman/HasFuel() if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 15b950c996e..fef9b902c93 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -39,7 +39,7 @@ /obj/machinery/power/rtg/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Power generation now at [power_gen*0.001]kW." + . += "The status display reads: Power generation now at [power_gen*0.001]kW." /obj/machinery/power/rtg/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I)) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index c7e0e4344e2..2b454ffc18a 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -92,7 +92,7 @@ /obj/machinery/power/emitter/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Emitting one beam each [fire_delay*0.1] seconds.
Power consumption at [active_power_usage]W." + . += "The status display reads: Emitting one beam each [fire_delay*0.1] seconds.
Power consumption at [active_power_usage]W.
" /obj/machinery/power/emitter/ComponentInitialize() . = ..() diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 7031987151d..fe043c02347 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -43,7 +43,7 @@ /obj/machinery/power/tesla_coil/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Power generation at [input_power_multiplier*100]%.
Shock interval at [zap_cooldown*0.1] seconds." + . += "The status display reads: Power generation at [input_power_multiplier*100]%.
Shock interval at [zap_cooldown*0.1] seconds.
" /obj/machinery/power/tesla_coil/on_construction() if(anchored) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 130f0109934..2f6f68e0afb 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -196,7 +196,7 @@ /obj/machinery/power/turbine/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Productivity at [productivity*100]%." + . += "The status display reads: Productivity at [productivity*100]%." /obj/machinery/power/turbine/locate_machinery() if(compressor) diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 300644cae87..ec18e6cef44 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -73,7 +73,7 @@ return //too difficult to remove the rocket with TK /obj/item/gun/ballistic/rocketlauncher/suicide_act(mob/living/user) - user.visible_message("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!", \ + user.visible_message("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!", \ "You aim [src] at the ground to perform a bisnasty rocket jump...") if(can_shoot()) user.notransform = TRUE diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 78b0c9dfb05..caf3ea6853f 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -51,6 +51,8 @@ obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) /obj/item/gun/ballistic/rifle/boltaction name = "\improper Mosin Nagant" desc = "This piece of junk looks like something that could have been used 700 years ago. It feels slightly moist." + sawn_desc = "An extremely sawn-off Mosin Nagant, popularly known as an \"obrez\". There was probably a reason it wasn't manufactured this short to begin with." + w_class = WEIGHT_CLASS_BULKY icon_state = "moistnugget" item_state = "moistnugget" slot_flags = 0 //no ITEM_SLOT_BACK sprite, alas @@ -59,6 +61,30 @@ obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) knife_x_offset = 27 knife_y_offset = 13 +/obj/item/gun/ballistic/rifle/boltaction/attackby(obj/item/A, mob/user, params) + ..() + if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter)) + sawoff(user) + if(istype(A, /obj/item/melee/transforming/energy)) + var/obj/item/melee/transforming/energy/W = A + if(W.active) + sawoff(user) + +/obj/item/gun/ballistic/rifle/boltaction/sawoff(mob/user) + if(bayonet) + to_chat(user, "You cannot saw-off \the [src] with \the [bayonet] attached!") + return + . = ..() + if(.) + spread = 36 + can_bayonet = FALSE + +/obj/item/gun/ballistic/rifle/boltaction/blow_up(mob/user) + . = 0 + if(chambered && chambered.BB) + process_fire(user, user, FALSE) + . = 1 + /obj/item/gun/ballistic/rifle/boltaction/enchanted name = "enchanted bolt action rifle" desc = "Careful not to lose your head." @@ -73,7 +99,7 @@ obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) icon_state = "arcane_barrage" item_state = "arcane_barrage" can_bayonet = FALSE - item_flags = NEEDS_PERMIT | DROPDEL + item_flags = NEEDS_PERMIT | DROPDEL | ABSTRACT | NOBLUDGEON flags_1 = NONE mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage @@ -82,24 +108,24 @@ obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) . = ..() guns_left = 0 -/obj/item/gun/ballistic/rifle/boltaction/enchanted/proc/discard_gun(mob/user) - throw_at(pick(oview(7,get_turf(user))),1,1) - user.visible_message("[user] tosses aside the spent rifle!") +/obj/item/gun/ballistic/rifle/boltaction/enchanted/proc/discard_gun(mob/living/user) + user.throw_item(pick(oview(7,get_turf(user)))) -/obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage/discard_gun(mob/user) - return +/obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage/discard_gun(mob/living/user) + qdel(src) /obj/item/gun/ballistic/rifle/boltaction/enchanted/attack_self() return -/obj/item/gun/ballistic/rifle/boltaction/enchanted/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1) - ..() +/obj/item/gun/ballistic/rifle/boltaction/enchanted/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + . = ..() + if(!.) + return if(guns_left) - var/obj/item/gun/ballistic/rifle/boltaction/enchanted/GUN = new type - GUN.guns_left = guns_left - 1 - user.dropItemToGround(src, TRUE) + var/obj/item/gun/ballistic/rifle/boltaction/enchanted/gun = new type + gun.guns_left = guns_left - 1 + discard_gun(user) user.swap_hand() - user.put_in_hands(GUN) + user.put_in_hands(gun) else user.dropItemToGround(src, TRUE) - discard_gun(user) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index fc26612a74d..6dcfbde387c 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -94,14 +94,17 @@ max_charges = 10 //10, 5, 5, 4 /obj/item/gun/magic/wand/resurrection/zap_self(mob/living/user) + ..() + charges-- + if(user.anti_magic_check()) + user.visible_message("[src] has no effect on [user]!") + return user.revive(full_heal = 1) if(iscarbon(user)) var/mob/living/carbon/C = user C.regenerate_limbs() C.regenerate_organs() to_chat(user, "You feel great!") - charges-- - ..() /obj/item/gun/magic/wand/resurrection/debug //for testing desc = "Is it possible for something to be even more powerful than regular magic? This wand is." diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index 6f8d1135731..6ff9d45b3fe 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -30,7 +30,7 @@ return BULLET_ACT_HIT /obj/item/projectile/bullet/a84mm_he - name ="\improper HE rocket" + name ="\improper HE missile" desc = "Boom." icon_state = "missile" damage = 30 @@ -43,3 +43,33 @@ else explosion(target, 0, 0, 2, 4) return BULLET_ACT_HIT + +/obj/item/projectile/bullet/a84mm_br + name ="\improper HE missile" + desc = "Boom." + icon_state = "missile" + damage = 30 + ricochets_max = 0 //it's a MISSILE + var/sturdy = list( + /turf/closed, + /obj/mecha, + /obj/machinery/door/, + /obj/machinery/door/poddoor/shutters + ) + +/obj/item/broken_missile + name = "\improper broken missile" + desc = "A missile that did not detonate. The tail has snapped and it is in no way fit to be used again." + icon = 'icons/obj/projectiles.dmi' + icon_state = "missile_broken" + w_class = WEIGHT_CLASS_TINY + + +/obj/item/projectile/bullet/a84mm_br/on_hit(atom/target, blocked=0) + ..() + for(var/i in sturdy) + if(istype(target, i)) + explosion(target, 0, 1, 1, 2) + return BULLET_ACT_HIT + //if(istype(target, /turf/closed) || ismecha(target)) + new /obj/item/broken_missile(get_turf(src), 1) \ No newline at end of file diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 52ce7d6a75f..a4467b08843 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -100,7 +100,7 @@ . += "[src]'s maintenance hatch is open!" if(in_range(user, src) || isobserver(user)) . += {"The status display reads:
Recharging [recharge_amount] power units per interval.
Power efficiency increased by - [round((powerefficiency*1000)-100, 1)]%.
Macro granularity at [macroresolution]u."} + [round((powerefficiency*1000)-100, 1)]%.
Macro granularity at [macroresolution]u.
"} /obj/machinery/chem_dispenser/process() if (recharge_counter >= 4) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 0fddbb99707..f52203f4b35 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -54,7 +54,7 @@ /obj/machinery/chem_heater/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Heating reagents at [heater_coefficient*1000]% speed." + . += "The status display reads: Heating reagents at [heater_coefficient*1000]% speed." /obj/machinery/chem_heater/process() ..() diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index bf119e2f58f..07805fa1628 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -71,7 +71,7 @@ if(!(stat & (NOPOWER|BROKEN))) . += {"The status display reads:\n - - Grinding reagents at [speed*100]%."} + - Grinding reagents at [speed*100]%."} if(beaker) for(var/datum/reagent/R in beaker.reagents.reagent_list) . += "- [R.volume] units of [R.name]." diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 179cae3de03..3c6c3db77ad 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -139,7 +139,7 @@ materials = list(MAT_METAL = 10, MAT_GLASS = 5) build_path = /obj/item/stack/cable_coil category = list("initial","Tools","Tool Designs") - maxstack = 15 + maxstack = 30 departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE /datum/design/toolbox diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 892d32ddd08..09264d95530 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -147,6 +147,17 @@ construction_time = 100 category = list("Exosuit Equipment") +/datum/design/mech_scattershot_ammo + name = "LBX AC 10 Scattershot Ammunition" + desc = "Ammunition for the LBX AC 10 exosuit weapon." + id = "mech_scattershot_ammo" + build_type = PROTOLATHE | MECHFAB + build_path = /obj/item/mecha_ammo/scattershot + materials = list(MAT_METAL=6000) + construction_time = 20 + category = list("Exosuit Ammunition", "Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/mech_carbine name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)" desc = "Allows for the construction of FNX-99 \"Hades\" Carbine." @@ -157,6 +168,17 @@ construction_time = 100 category = list("Exosuit Equipment") +/datum/design/mech_carbine_ammo + name = "FNX-99 Carbine Ammunition" + desc = "Ammunition for the FNX-99 \"Hades\" Carbine." + id = "mech_carbine_ammo" + build_type = PROTOLATHE | MECHFAB + build_path = /obj/item/mecha_ammo/incendiary + materials = list(MAT_METAL=6000) + construction_time = 20 + category = list("Exosuit Ammunition", "Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/mech_ion name = "Exosuit Weapon (MKIV Ion Heavy Cannon)" desc = "Allows for the construction of MKIV Ion Heavy Cannon." @@ -217,16 +239,38 @@ construction_time = 100 category = list("Exosuit Equipment") +/datum/design/mech_grenade_launcher_ammo + name = "SGL-6 Grenade Launcher Ammunition" + desc = "Ammunition for the SGL-6 Grenade Launcher." + id = "mech_grenade_launcher_ammo" + build_type = PROTOLATHE | MECHFAB + build_path = /obj/item/mecha_ammo/flashbang + materials = list(MAT_METAL=4000,MAT_GOLD=500,MAT_SILVER=500) + construction_time = 20 + category = list("Exosuit Ammunition", "Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/mech_missile_rack - name = "Exosuit Weapon (SRM-8 Missile Rack)" - desc = "Allows for the construction of an SRM-8 Missile Rack." + name = "Exosuit Weapon (BRM-6 Missile Rack)" + desc = "Allows for the construction of an BRM-6 Breaching Missile Rack." id = "mech_missile_rack" build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching materials = list(MAT_METAL=22000,MAT_GOLD=6000,MAT_SILVER=8000) construction_time = 100 category = list("Exosuit Equipment") +/datum/design/mech_missile_rack_ammo + name = "SRM-8 Missile Rack Ammunition" + desc = "Ammunition for the SRM-8 Missile Rack." + id = "mech_missile_rack_ammo" + build_type = PROTOLATHE | MECHFAB + build_path = /obj/item/mecha_ammo/missiles_br + materials = list(MAT_METAL=8000,MAT_GOLD=500,MAT_SILVER=500) + construction_time = 20 + category = list("Exosuit Ammunition", "Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/clusterbang_launcher name = "Exosuit Module (SOB-3 Clusterbang Launcher)" desc = "A weapon that violates the Geneva Convention at 3 rounds per minute" @@ -237,6 +281,17 @@ construction_time = 100 category = list("Exosuit Equipment") +/datum/design/clusterbang_launcher_ammo + name = "SOB-3 Clusterbang Launcher Ammunition" + desc = "Ammunition for the SOB-3 Clusterbang Launcher" + id = "clusterbang_launcher_ammo" + build_type = PROTOLATHE | MECHFAB + build_path = /obj/item/mecha_ammo/clusterbang + materials = list(MAT_METAL=6000,MAT_GOLD=1500,MAT_URANIUM=1500) + construction_time = 20 + category = list("Exosuit Ammunition", "Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/mech_wormhole_gen name = "Exosuit Module (Localized Wormhole Generator)" desc = "An exosuit module that allows generating of small quasi-stable wormholes." @@ -357,6 +412,17 @@ construction_time = 100 category = list("Exosuit Equipment") +/datum/design/mech_lmg_ammo + name = "Ultra AC 2 Ammunition" + desc = "Ammunition for the Ultra AC 2 LMG" + id = "mech_lmg_ammo" + build_type = PROTOLATHE | MECHFAB + build_path = /obj/item/mecha_ammo/lmg + materials = list(MAT_METAL=4000) + construction_time = 20 + category = list("Exosuit Ammunition", "Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/mech_sleeper name = "Exosuit Medical Equipment (Mounted Sleeper)" desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves." diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 2fb432cc165..9beff5ae6da 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -97,7 +97,7 @@ /obj/machinery/rnd/experimentor/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Malfunction probability reduced by [badThingCoeff]%.
Cooldown interval between experiments at [resetTime*0.1] seconds." + . += "The status display reads: Malfunction probability reduced by [badThingCoeff]%.
Cooldown interval between experiments at [resetTime*0.1] seconds.
" /obj/machinery/rnd/experimentor/proc/checkCircumstances(obj/item/O) //snowflake check to only take "made" bombs diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm index ff6ab831883..9066552c6ee 100644 --- a/code/modules/research/nanites/nanite_chamber.dm +++ b/code/modules/research/nanites/nanite_chamber.dm @@ -32,7 +32,7 @@ /obj/machinery/nanite_chamber/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Scanning module has been upgraded to level [scan_level]." + . += "The status display reads: Scanning module has been upgraded to level [scan_level]." /obj/machinery/nanite_chamber/proc/set_busy(status, message, working_icon) busy = status diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm index bc50814fb1d..4d255803bc5 100644 --- a/code/modules/research/nanites/nanite_remote.dm +++ b/code/modules/research/nanites/nanite_remote.dm @@ -58,18 +58,18 @@ if(REMOTE_MODE_OFF) return if(REMOTE_MODE_SELF) - to_chat(user, "You activate [src], signaling the nanites in your bloodstream.") + to_chat(user, "You activate [src], signaling the nanites in your bloodstream.") signal_mob(user, code, key_name(user)) if(REMOTE_MODE_TARGET) if(isliving(target) && (get_dist(target, get_turf(src)) <= 7)) - to_chat(user, "You activate [src], signaling the nanites inside [target].") + to_chat(user, "You activate [src], signaling the nanites inside [target].") signal_mob(target, code, key_name(user)) if(REMOTE_MODE_AOE) - to_chat(user, "You activate [src], signaling the nanites inside every host around you.") + to_chat(user, "You activate [src], signaling the nanites inside every host around you.") for(var/mob/living/L in view(user, 7)) signal_mob(L, code, key_name(user)) if(REMOTE_MODE_RELAY) - to_chat(user, "You activate [src], signaling all connected relay nanites.") + to_chat(user, "You activate [src], signaling all connected relay nanites.") signal_relay(code, relay_code, key_name(user)) /obj/item/nanite_remote/proc/signal_mob(mob/living/M, code, source) @@ -177,18 +177,18 @@ if(REMOTE_MODE_OFF) return if(REMOTE_MODE_SELF) - to_chat(user, "You activate [src], signaling the nanites in your bloodstream.") + to_chat(user, "You activate [src], signaling the nanites in your bloodstream.") signal_mob(user, comm_code, comm_message) if(REMOTE_MODE_TARGET) if(isliving(target) && (get_dist(target, get_turf(src)) <= 7)) - to_chat(user, "You activate [src], signaling the nanites inside [target].") + to_chat(user, "You activate [src], signaling the nanites inside [target].") signal_mob(target, code, comm_message, key_name(user)) if(REMOTE_MODE_AOE) - to_chat(user, "You activate [src], signaling the nanites inside every host around you.") + to_chat(user, "You activate [src], signaling the nanites inside every host around you.") for(var/mob/living/L in view(user, 7)) signal_mob(L, code, comm_message, key_name(user)) if(REMOTE_MODE_RELAY) - to_chat(user, "You activate [src], signaling all connected relay nanites.") + to_chat(user, "You activate [src], signaling all connected relay nanites.") signal_relay(code, relay_code, comm_message, key_name(user)) /obj/item/nanite_remote/comm/signal_mob(mob/living/M, code, source) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index bacf1a4aed6..c1bfa37cba5 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -41,7 +41,7 @@ starting_node = TRUE display_name = "Basic Exosuit Equipment" description = "Various tools fit for basic mech units" - design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer") + design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher") /datum/techweb_node/basic_tools id = "basic_tools" @@ -199,16 +199,25 @@ display_name = "Miniaturized Bluespace Research" description = "Extreme reduction in space required for bluespace engines, leading to portable bluespace technology." prereq_ids = list("bluespace_travel", "practical_bluespace", "high_efficiency") - design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bag_holding", "quantum_keycard", "wormholeprojector") + design_ids = list("bluespace_matter_bin", "femto_mani", "bluespacebodybag", "triphasic_scanning", "quantum_keycard", "wormholeprojector") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) export_price = 5000 +/datum/techweb_node/advanced_bluespace + id = "bluespace_storage" + display_name = "Advanced Bluespace Storage" + description = "With the use of bluespace we can create even more advanced storage devices than we could have ever done" + prereq_ids = list("micro_bluespace", "janitor") + design_ids = list("bag_holding") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + export_price = 3000 + /datum/techweb_node/practical_bluespace id = "practical_bluespace" display_name = "Applied Bluespace Research" description = "Using bluespace to make things faster and better." prereq_ids = list("bluespace_basic", "engineering") - design_ids = list("bs_rped","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "bluespacebodybag", "phasic_scanning", "roastingstick", "ore_silo") + design_ids = list("bs_rped","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "roastingstick", "ore_silo") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) export_price = 5000 @@ -750,7 +759,7 @@ display_name = "Exosuit Weapon (LBX AC 10 \"Scattershot\")" description = "An advanced piece of mech weaponry" prereq_ids = list("ballistic_weapons") - design_ids = list("mech_scattershot") + design_ids = list("mech_scattershot", "mech_scattershot_ammo") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -759,7 +768,7 @@ display_name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)" description = "An advanced piece of mech weaponry" prereq_ids = list("ballistic_weapons") - design_ids = list("mech_carbine") + design_ids = list("mech_carbine", "mech_carbine_ammo") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -813,16 +822,16 @@ display_name = "Exosuit Weapon (SGL-6 Grenade Launcher)" description = "An advanced piece of mech weaponry" prereq_ids = list("explosive_weapons") - design_ids = list("mech_grenade_launcher") + design_ids = list("mech_grenade_launcher", "mech_grenade_launcher_ammo") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 /datum/techweb_node/mech_missile_rack id = "mech_missile_rack" - display_name = "Exosuit Weapon (SRM-8 Missile Rack)" + display_name = "Exosuit Weapon (BRM-6 Missile Rack)" description = "An advanced piece of mech weaponry" prereq_ids = list("explosive_weapons") - design_ids = list("mech_missile_rack") + design_ids = list("mech_missile_rack", "mech_missile_rack_ammo") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -831,7 +840,7 @@ display_name = "Exosuit Module (SOB-3 Clusterbang Launcher)" description = "An advanced piece of mech weaponry" prereq_ids = list("explosive_weapons") - design_ids = list("clusterbang_launcher") + design_ids = list("clusterbang_launcher", "clusterbang_launcher_ammo") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -858,7 +867,7 @@ display_name = "Exosuit Weapon (\"Ultra AC 2\" LMG)" description = "An advanced piece of mech weaponry" prereq_ids = list("ballistic_weapons") - design_ids = list("mech_lmg") + design_ids = list("mech_lmg", "mech_lmg_ammo") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index f82aaff0d66..4307ef98882 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -18,7 +18,7 @@ Consuming extracts: /obj/item/slimecross/consuming/attackby(obj/item/O, mob/user) if(istype(O,/obj/item/reagent_containers/food/snacks)) if(last_produced + cooldown > world.time) - to_chat(user, "[src] is still digesting after its last meal!") + to_chat(user, "[src] is still digesting after its last meal!") return var/datum/reagent/N = O.reagents.has_reagent(/datum/reagent/consumable/nutriment) if(N) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 4dc2a216d9f..02df514908e 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -202,7 +202,7 @@ roundstart_template = SSmapping.shuttle_templates[sid] if(!roundstart_template) - CRASH("Invalid path ([roundstart_template]) passed to docking port.") + CRASH("Invalid path ([sid]/[roundstart_template]) passed to docking port.") if(roundstart_template) SSshuttle.action_load(roundstart_template, src) @@ -786,8 +786,8 @@ current_engines = max(0,current_engines + mod) if(in_flight()) var/delta_coeff = engine_coeff / old_coeff - modTimer(delta_coeff) - + modTimer(delta_coeff) + /obj/docking_port/mobile/proc/count_engines() . = 0 for(var/thing in shuttle_areas) diff --git a/code/modules/spells/spell_types/hivemind.dm b/code/modules/spells/spell_types/hivemind.dm index 23e4c90d576..e321a5d7197 100644 --- a/code/modules/spells/spell_types/hivemind.dm +++ b/code/modules/spells/spell_types/hivemind.dm @@ -184,6 +184,7 @@ name = "Sensory Shock" desc = "After a short charging time, we overload the mind of one of our vessels with psionic energy, temporarilly disrupting their sight, hearing, and speech." charge_max = 600 + panel = "Hivemind Abilities" invocation_type = "none" clothes_req = 0 human_req = 1 @@ -697,7 +698,7 @@ var/list/enemies = list() to_chat(user, "We begin probing [target.name]'s mind!") - if(!do_after(user,100,0,target)) + if(do_after(user,100,0,target)) var/foiled = target.anti_magic_check(FALSE, FALSE, TRUE) if(!in_hive || foiled) var/timely = !in_hive ? 200 : 100 diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 47addbb6d0f..22f762768da 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -288,8 +288,9 @@ //Miasma sickness if(prob(0.5 * miasma_pp)) - var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) - miasma_disease.name = "Unknown" + var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(min(round(max(miasma_pp/2, 1), 1), 6), min(round(max(miasma_pp, 1), 1), 8)) + //tl;dr the first argument chooses the smaller of miasma_pp/2 or 6(typical max virus symptoms), the second chooses the smaller of miasma_pp or 8(max virus symptom level) // + miasma_disease.name = "Unknown"//^each argument has a minimum of 1 and rounds to the nearest value. Feel free to change the pp scaling I couldn't decide on good numbers for it. miasma_disease.try_infect(owner) // Miasma side effects diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 7380b9b1949..6ffe68172a5 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -487,7 +487,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "Surplus Rifle" desc = "A horribly outdated bolt action weapon. You've got to be desperate to use this." item = /obj/item/gun/ballistic/rifle/boltaction - cost = 2 + cost = 1 include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/dangerous/revolver @@ -839,6 +839,20 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 1 include_modes = list(/datum/game_mode/nuclear) +/datum/uplink_item/ammo/dark_gygax/bag + name = "Dark Gygax Ammo Bag" + desc = "A duffel bag containing ammo for three full reloads of the incendiary carbine and flash bang launcher that are equipped on a standard Dark Gygax exosuit." + item = /obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax + cost = 4 + include_modes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/ammo/mauler/bag + name = "Mauler Ammo Bag" + desc = "A duffel bag containing ammo for three full reloads of the LMG, scattershot carbine, and SRM-8 missile laucher that are equipped on a standard Mauler exosuit." + item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler + cost = 6 + include_modes = list(/datum/game_mode/nuclear) + //Grenades and Explosives /datum/uplink_item/explosives category = "Grenades and Explosives" diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index a5970fed5f1..f467775c25d 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -224,6 +224,7 @@ /obj/item/clothing/glasses/sunglasses/reagent = 1, /obj/item/clothing/neck/petcollar = 1, /obj/item/storage/belt/bandolier = 1) + premium = list(/obj/item/storage/box/dishdrive = 1) refill_canister = /obj/item/vending_refill/wardrobe/bar_wardrobe payment_department = ACCOUNT_SRV /obj/item/vending_refill/wardrobe/bar_wardrobe diff --git a/html/changelog.html b/html/changelog.html index 1264784148d..502105a49be 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,115 @@ -->
+

27 June 2019

+

Naksu updated:

+
    +
  • Fixed a couple of map issues in DeltaStation
  • +
+

actioninja updated:

+
    +
  • removed mech rcl from the research node so it stops spamming a warning in log
  • +
  • cables now disconnect machines when cut
  • +
  • terminal linking/not linking behavior with smeses has been improved
  • +
  • couple of small mapping fixes
  • +
  • changed cable coils back to 30
  • +
  • changed the box smes room a little to prevent stacking terminals
  • +
  • removed the rpcl from engineering on every map because it's not used for wiring anymore
  • +
+ +

26 June 2019

+

123chess456 updated:

+
    +
  • Non-binary changelings will now have the honorific "Mx." instead of "Mr.", reflecting the Syndicate's growing acceptance of non-binary operatives.
  • +
+

FlufflyCthulu updated:

+
    +
  • Fixes an issue with clown hulk simple mobs
  • +
+

Naksu updated:

+
    +
  • Mining base now has a common area accessible via a new shuttle on the medium-highpop maps, and a security office connecting the gulag and the mining base. Gulag also has functional atmos.
  • +
+

jcll updated:

+
    +
  • added geo-bypass
  • +
+

kriskog updated:

+
    +
  • Space heaters no longer steal focus upon screwdrivering.
  • +
+

nemvar updated:

+
    +
  • The enchanted bolt action rifle
  • +
  • Blood barrage has a new projectile icon.
  • +
  • Fixed an arcane barrage runtime
  • +
  • The bee sabre now has it's own suicide and no longer uses the one of the captains rapier.
  • +
  • The bee sabre uses the correct articles and actually has icons now.
  • +
+ +

25 June 2019

+

Arkatos updated:

+
    +
  • Action buttons can now be dragged onto each other to swap places
  • +
+

Arkatos1 updated:

+
    +
  • Normal carps now spawn with a random color! There might even be some really rare color variant.. try asking Cayenne about it.
  • +
+

Fikou updated:

+
    +
  • NEWS REPORT: The latest alien technology allows them to abduct cows instantly, this is a great tragedy for all farm owners, better watch the garden!
  • +
  • Centcom's Death Commando got a paycheck and jumpsuits of quality more similar to the rest of Centcom's staf- KS13 DOESN'T EXIST, THERE IS NO SUCH THING AS A DEATH COMMANDO
  • +
+

Floyd / Qustinnus updated:

+
    +
  • the bag of holding now requires a higher level of research to be unlocked as well as janitor tech (trashbags of holding)
  • +
  • the bluespace bodybag is now unlocked with mini BS research
  • +
+

Jerry Derpington, baldest of the balds updated:

+
    +
  • Nanotrasen has lost communication to two away mission sites that contained a beach for Nanotrasen employees.
  • +
  • Nanotrasen has been able to locate a new away mission site that ALSO has a beach. Nanotrasen employees will be able to enjoy the beach after all!
  • +
+

Jgta4444 updated:

+
    +
  • Dna scanner now correctly calculate its precision coefficient
  • +
+

Skoglol updated:

+
    +
  • Slimes should now feed properly again.
  • +
+

TetraK1 updated:

+
    +
  • Suiciding with an anomaly core kills you properly
  • +
  • Service borgs get pipe cleaners for wire art
  • +
  • you can altclick to pull up pipe cleaners
  • +
  • Fixed cutting and joining pipe cleaners on floor tiles
  • +
+

Trilbyspaceclone and nemvar updated:

+
    +
  • You can now craft more fancy boxes with cardboard.
  • +
+

XDTM updated:

+
    +
  • Antimagic items now also properly work when held in hand, instead of only when equipped.
  • +
  • Fixed abductor scientists not being able to perform advanced surgery.
  • +
  • Quantum teleportation now makes pretty rainbow sparks instead of the normal ones.
  • +
  • Non-bluespace teleportation (spells etc.) no longer makes sparks.
  • +
+

imsxz updated:

+
    +
  • diseases from miasma now become stronger the more miasma there is in the air
  • +
+

nemvar updated:

+
    +
  • Removed all sleepers from escape shuttles and replaced them with stasis units. Some shuttles have gotten surgery and new medical vendors added.
  • +
+

spookydonut updated:

+
    +
  • Removes shuttle manipulator.
  • +
+

23 June 2019

bgobandit updated:

    @@ -1525,51 +1634,6 @@
    • zombies can eat brains now
    - -

    25 April 2019

    -

    RaveRadbury updated:

    -
      -
    • pAI's now have the same headset tech as AI. Add and remove keys just like you would with headsets.
    • -
    • Service Halls now allow all Service dept. jobs.
    • -
    - -

    24 April 2019

    -

    Kierany9 updated:

    -
      -
    • The hivemind radar's no longer has a minimum range, but has an increased ping time.
    • -
    • How power use affects the hivemind radar has been tweaked as to ensure that going loud early is punished more.
    • -
    -

    Mickyan updated:

    -
      -
    • New quirk: Empath. Gain a better insight on the state of people around you by examining them.
    • -
    • New quirk: Friendly. Your hugs are just the best. Keep yourself in a good mood to give the bestest hugs!
    • -
    -

    MrDroppodBringer and Time-Green updated:

    -
      -
    • Adds the lipid extractor to the service protolathe arsenal
    • -
    -

    TetraK1 updated:

    -
      -
    • AI integrity restorer no longer drops a free AI core on deconstruction/destruction.
    • -
    -

    Tlaltecuhtli updated:

    -
      -
    • rubbershot does 66 stamina + 18 damage instead of 150 stamina + 18 damage
    • -
    • beanbang does 55 stamina + 5 damge instead of 80 + 5 damage
    • -
    -

    Wilchenx updated:

    -
      -
    • The modular pc vendor
    • -
    • minor entities on meta/pubby/box/delta to make room for said vendor
    • -
    -

    actioninja updated:

    -
      -
    • Fixed an exploit where incompatible magazine could be tactical reloaded into guns, and then still fire.
    • -
    -

    bgobandit updated:

    -
      -
    • Examining intercoms/radios shows the frequency they're set to, if you're in range.
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index bf25a080bdb..77cd949974f 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24983,3 +24983,84 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. the box works like a standard inventory box item.' - tweak: Mime spells are now granted via a spellbook that starts out in the mime's inventory. Mimes can choose one of these three. +2019-06-25: + Arkatos: + - rscadd: Action buttons can now be dragged onto each other to swap places + Arkatos1: + - imageadd: Normal carps now spawn with a random color! There might even be some + really rare color variant.. try asking Cayenne about it. + Fikou: + - rscadd: 'NEWS REPORT: The latest alien technology allows them to abduct cows instantly, + this is a great tragedy for all farm owners, better watch the garden!' + - bugfix: Centcom's Death Commando got a paycheck and jumpsuits of quality more + similar to the rest of Centcom's staf- KS13 DOESN'T EXIST, THERE IS NO SUCH + THING AS A DEATH COMMANDO + Floyd / Qustinnus: + - balance: the bag of holding now requires a higher level of research to be unlocked + as well as janitor tech (trashbags of holding) + - balance: the bluespace bodybag is now unlocked with mini BS research + Jerry Derpington, baldest of the balds: + - rscdel: Nanotrasen has lost communication to two away mission sites that contained + a beach for Nanotrasen employees. + - rscadd: Nanotrasen has been able to locate a new away mission site that ALSO has + a beach. Nanotrasen employees will be able to enjoy the beach after all! + Jgta4444: + - bugfix: Dna scanner now correctly calculate its precision coefficient + Skoglol: + - bugfix: Slimes should now feed properly again. + TetraK1: + - bugfix: Suiciding with an anomaly core kills you properly + - rscadd: Service borgs get pipe cleaners for wire art + - rscadd: you can altclick to pull up pipe cleaners + - bugfix: Fixed cutting and joining pipe cleaners on floor tiles + Trilbyspaceclone and nemvar: + - rscadd: You can now craft more fancy boxes with cardboard. + XDTM: + - bugfix: Antimagic items now also properly work when held in hand, instead of only + when equipped. + - bugfix: Fixed abductor scientists not being able to perform advanced surgery. + - tweak: Quantum teleportation now makes pretty rainbow sparks instead of the normal + ones. + - bugfix: Non-bluespace teleportation (spells etc.) no longer makes sparks. + imsxz: + - balance: diseases from miasma now become stronger the more miasma there is in + the air + nemvar: + - rscdel: Removed all sleepers from escape shuttles and replaced them with stasis + units. Some shuttles have gotten surgery and new medical vendors added. + spookydonut: + - admin: Removes shuttle manipulator. +2019-06-26: + 123chess456: + - rscadd: Non-binary changelings will now have the honorific "Mx." instead of "Mr.", + reflecting the Syndicate's growing acceptance of non-binary operatives. + FlufflyCthulu: + - bugfix: Fixes an issue with clown hulk simple mobs + Naksu: + - rscadd: Mining base now has a common area accessible via a new shuttle on the + medium-highpop maps, and a security office connecting the gulag and the mining + base. Gulag also has functional atmos. + jcll: + - bugfix: added geo-bypass + kriskog: + - bugfix: Space heaters no longer steal focus upon screwdrivering. + nemvar: + - bugfix: The enchanted bolt action rifle + - imageadd: Blood barrage has a new projectile icon. + - code_imp: Fixed an arcane barrage runtime + - rscadd: The bee sabre now has it's own suicide and no longer uses the one of the + captains rapier. + - bugfix: The bee sabre uses the correct articles and actually has icons now. +2019-06-27: + Naksu: + - bugfix: Fixed a couple of map issues in DeltaStation + actioninja: + - bugfix: removed mech rcl from the research node so it stops spamming a warning + in log + - bugfix: cables now disconnect machines when cut + - bugfix: terminal linking/not linking behavior with smeses has been improved + - bugfix: couple of small mapping fixes + - tweak: changed cable coils back to 30 + - tweak: changed the box smes room a little to prevent stacking terminals + - tweak: removed the rpcl from engineering on every map because it's not used for + wiring anymore diff --git a/html/changelogs/AutoChangeLog-pr-44529.yml b/html/changelogs/AutoChangeLog-pr-44529.yml new file mode 100644 index 00000000000..167148824ab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44529.yml @@ -0,0 +1,8 @@ +author: "zxaber" +delete-after: True +changes: + - balance: "Mecha ballistics weapons now require ammo created from an Exosuit Fabricator or the Security Protolathe, though they will start with a full magazine and in most cases enough for one full reload. Reloading these weapons no longer chunks your power cell. Clown (and mime) mecha equipment have not changed." + - balance: "The SRM-8 Missile Launcher has been replaced with the BRM-6 Breaching Missile Launcher in techwebs (Nukie Mauler remains equipped with the SRM-8)." + - balance: "Both Missile Launchers and the Clusterbang Launcher do not have an ammo cache, and cannot be reloaded by the pilot. Once the initial loaded ammo has been spent, you can use the appropriate ammo box to load the weapon directly." + - rscadd: "Utility mechs that have a clamp equipped can load ammo from their own cargo hold into other mechs." + - rscadd: "Nuke Ops can purchase spare ammo duffel bags for their mecha weapons, should they run low." diff --git a/html/changelogs/AutoChangeLog-pr-44654.yml b/html/changelogs/AutoChangeLog-pr-44654.yml deleted file mode 100644 index 0a9398b93ac..00000000000 --- a/html/changelogs/AutoChangeLog-pr-44654.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - bugfix: "Fixed abductor scientists not being able to perform advanced surgery." diff --git a/html/changelogs/AutoChangeLog-pr-44655.yml b/html/changelogs/AutoChangeLog-pr-44655.yml deleted file mode 100644 index c384bb5eb95..00000000000 --- a/html/changelogs/AutoChangeLog-pr-44655.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "spookydonut" -delete-after: True -changes: - - admin: "Removes shuttle manipulator." diff --git a/html/changelogs/AutoChangeLog-pr-44656.yml b/html/changelogs/AutoChangeLog-pr-44656.yml deleted file mode 100644 index b03fa8519d2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-44656.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fikou" -delete-after: True -changes: - - rscadd: "NEWS REPORT: The latest alien technology allows them to abduct cows instantly, this is a great tragedy for all farm owners, better watch the garden!" diff --git a/html/changelogs/AutoChangeLog-pr-44658.yml b/html/changelogs/AutoChangeLog-pr-44658.yml deleted file mode 100644 index 491126e3697..00000000000 --- a/html/changelogs/AutoChangeLog-pr-44658.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Action buttons can now be dragged onto each other to swap places" diff --git a/html/changelogs/AutoChangeLog-pr-44661.yml b/html/changelogs/AutoChangeLog-pr-44661.yml new file mode 100644 index 00000000000..c28fc7249fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44661.yml @@ -0,0 +1,4 @@ +author: "partykp" +delete-after: True +changes: + - tweak: "replaced the lower disposal bin in chemistry with a glass table and put half of the top table contents on it (metastation)." diff --git a/html/changelogs/AutoChangeLog-pr-44664.yml b/html/changelogs/AutoChangeLog-pr-44664.yml deleted file mode 100644 index 96abe2784aa..00000000000 --- a/html/changelogs/AutoChangeLog-pr-44664.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - tweak: "Quantum teleportation now makes pretty rainbow sparks instead of the normal ones." - - bugfix: "Non-bluespace teleportation (spells etc.) no longer makes sparks." diff --git a/html/changelogs/AutoChangeLog-pr-44665.yml b/html/changelogs/AutoChangeLog-pr-44665.yml deleted file mode 100644 index c95f2c93659..00000000000 --- a/html/changelogs/AutoChangeLog-pr-44665.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nemvar" -delete-after: True -changes: - - rscdel: "Removed all sleepers from escape shuttles and replaced them with stasis units. Some shuttles have gotten surgery and new medical vendors added." diff --git a/html/changelogs/AutoChangeLog-pr-44673.yml b/html/changelogs/AutoChangeLog-pr-44673.yml deleted file mode 100644 index a1cdfc0693f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-44673.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Jerry Derpington, baldest of the balds" -delete-after: True -changes: - - rscdel: "Nanotrasen has lost communication to two away mission sites that contained a beach for Nanotrasen employees." - - rscadd: "Nanotrasen has been able to locate a new away mission site that ALSO has a beach. Nanotrasen employees will be able to enjoy the beach after all!" diff --git a/html/changelogs/AutoChangeLog-pr-44704.yml b/html/changelogs/AutoChangeLog-pr-44704.yml deleted file mode 100644 index 2fa52b43eb5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-44704.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TetraK1" -delete-after: True -changes: - - bugfix: "Suiciding with an anomaly core kills you properly" diff --git a/html/changelogs/AutoChangeLog-pr-44733.yml b/html/changelogs/AutoChangeLog-pr-44733.yml new file mode 100644 index 00000000000..24898e886af --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44733.yml @@ -0,0 +1,4 @@ +author: "Akrilla" +delete-after: True +changes: + - bugfix: "Fix bad icon state for bounty console printouts" diff --git a/html/changelogs/AutoChangeLog-pr-44741.yml b/html/changelogs/AutoChangeLog-pr-44741.yml new file mode 100644 index 00000000000..9e8e4685efe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44741.yml @@ -0,0 +1,9 @@ +author: "XDTM" +delete-after: True +changes: + - rscadd: "Added a new abductor gland that randomizes blood type into a random reagent periodically." + - rscadd: "Added a new abductor gland that links to other people, and swaps their position with the owner. Mind control on this gland will affect the linked person." + - rscadd: "Added a new abductor gland that grants all access to the owner." + - bugfix: "Abductor scientists can now properly see the true name of glands when examining them." + - rscadd: "Mind control on mindshock glands now \"broadcasts\" the mind control, affecting bystanders but not the abductee." + - tweak: "Species gland now has 7 mind control uses, instead of 5 (duration is still 30 seconds)." diff --git a/html/changelogs/AutoChangeLog-pr-44756.yml b/html/changelogs/AutoChangeLog-pr-44756.yml new file mode 100644 index 00000000000..0074fc861ec --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44756.yml @@ -0,0 +1,5 @@ +author: "Mickyan" +delete-after: True +changes: + - rscadd: "DIY Dish Drive Kit now available at your local bardrobe. Start saving those tips!" + - tweak: "The Dish Drive no longer sends reusable items into the disposal bin" diff --git a/html/changelogs/AutoChangeLog-pr-44785.yml b/html/changelogs/AutoChangeLog-pr-44785.yml new file mode 100644 index 00000000000..a0d4b56e179 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44785.yml @@ -0,0 +1,5 @@ +author: "Skoglol" +delete-after: True +changes: + - rscadd: "Heaters/freezers now support ctrl clicking to turn on and alt clicking to min/max target temperature." + - rscadd: "Heaters/freezers now shows target temperature and part status on examine." diff --git a/html/changelogs/AutoChangeLog-pr-44789.yml b/html/changelogs/AutoChangeLog-pr-44789.yml new file mode 100644 index 00000000000..5d7b92b110d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44789.yml @@ -0,0 +1,4 @@ +author: "81Denton" +delete-after: True +changes: + - bugfix: "Incomplete and non-teleport reactive armors can no longer be used to complete the traitor objective." diff --git a/html/changelogs/AutoChangeLog-pr-44791.yml b/html/changelogs/AutoChangeLog-pr-44791.yml new file mode 100644 index 00000000000..29f8b4dfe1b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44791.yml @@ -0,0 +1,4 @@ +author: "Shaps/Ryll" +delete-after: True +changes: + - tweak: "Mosin Nagants are now bulky, but can be sawed off to fit in a bag" diff --git a/html/changelogs/AutoChangeLog-pr-44827.yml b/html/changelogs/AutoChangeLog-pr-44827.yml new file mode 100644 index 00000000000..be0db0e9e00 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44827.yml @@ -0,0 +1,5 @@ +author: "ShizCalev" +delete-after: True +changes: + - bugfix: "Setting a defibrillator unit on fire will now make it's paddles appear on fire too when pulled out!" + - bugfix: "Setting defibrillator paddles on fire will now cause the flames to run along it's cables and set the main unit on fire as well." diff --git a/html/changelogs/AutoChangeLog-pr-44831.yml b/html/changelogs/AutoChangeLog-pr-44831.yml new file mode 100644 index 00000000000..4479ce2b3ac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44831.yml @@ -0,0 +1,4 @@ +author: "kittymaster0" +delete-after: True +changes: + - rscadd: "gives scientists a chance to spawn with an awesome tie" diff --git a/icons/mecha/mecha_ammo.dmi b/icons/mecha/mecha_ammo.dmi new file mode 100644 index 00000000000..63bc38cfa71 Binary files /dev/null and b/icons/mecha/mecha_ammo.dmi differ diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index 029fe06342d..e9b6f1a9062 100644 Binary files a/icons/mecha/mecha_equipment.dmi and b/icons/mecha/mecha_equipment.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index f7de4b6197e..0fa693a7c52 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 5e146226d8d..52b5a533d3f 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/carp.dmi b/icons/mob/carp.dmi new file mode 100644 index 00000000000..5b6138ee99a Binary files /dev/null and b/icons/mob/carp.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index dda20ef571b..a55c0f813d2 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 37e791eb427..2b1738566bc 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/strings/redpill.json b/strings/redpill.json index 3f65db73e72..6a2e3d77802 100644 --- a/strings/redpill.json +++ b/strings/redpill.json @@ -19,7 +19,7 @@ "Nanotrasen just clones us every shift.", "There's no biological difference between lizards and humans.", "Why is there a floor, but no roof?", - "The universe always ends after we reach Centcomm.", + "The universe always ends after we reach CentCom.", "Everyone is controlled by strings behind a glowing screen", "Seperation is absolute.", "It doesn't take much for people to murder their friends.", diff --git a/tgstation.dme b/tgstation.dme index 9fef41a5ac8..51d78e0401c 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -735,6 +735,7 @@ #include "code\game\mecha\equipment\tools\other_tools.dm" #include "code\game\mecha\equipment\tools\weapon_bay.dm" #include "code\game\mecha\equipment\tools\work_tools.dm" +#include "code\game\mecha\equipment\weapons\mecha_ammo.dm" #include "code\game\mecha\equipment\weapons\weapons.dm" #include "code\game\mecha\medical\medical.dm" #include "code\game\mecha\medical\odysseus.dm" diff --git a/tools/dmitool/README.txt b/tools/dmitool/README.txt deleted file mode 100644 index 409ab873c3d..00000000000 --- a/tools/dmitool/README.txt +++ /dev/null @@ -1,5 +0,0 @@ -Uses PNGJ: https://code.google.com/p/pngj/. - -For help, use "java -jar dmitool.jar help". - -Requires Java 7. \ No newline at end of file diff --git a/tools/dmitool/build.gradle b/tools/dmitool/build.gradle deleted file mode 100644 index 2e5fbc5b08e..00000000000 --- a/tools/dmitool/build.gradle +++ /dev/null @@ -1,16 +0,0 @@ -apply plugin: 'java' - -repositories { - mavenCentral() -} - -dependencies { - compile group: 'ar.com.hjg', name: 'pngj', version: '2.1.0' -} - -jar { - from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } - manifest { - attributes 'Main-Class': 'dmitool.Main' - } -} \ No newline at end of file diff --git a/tools/dmitool/dmimerge.sh b/tools/dmitool/dmimerge.sh deleted file mode 100644 index dbe846fc6a9..00000000000 --- a/tools/dmitool/dmimerge.sh +++ /dev/null @@ -1,8 +0,0 @@ -java -jar tools/dmitool/dmitool.jar merge $1 $2 $3 $2 -if [ "$?" -gt 0 ] -then - echo "Unable to automatically resolve all icon_state conflicts, please merge manually." - exit 1 -fi - -exit 0 diff --git a/tools/dmitool/dmitool.jar b/tools/dmitool/dmitool.jar deleted file mode 100644 index 3e99778951d..00000000000 Binary files a/tools/dmitool/dmitool.jar and /dev/null differ diff --git a/tools/dmitool/dmitool.py b/tools/dmitool/dmitool.py deleted file mode 100644 index 390f0d745ff..00000000000 --- a/tools/dmitool/dmitool.py +++ /dev/null @@ -1,94 +0,0 @@ -""" Python 2.7 wrapper for dmitool. -""" - -import os -from subprocess import Popen, PIPE - -_JAVA_PATH = ["java"] -_DMITOOL_CMD = ["-jar", "dmitool.jar"] - -def _dmitool_call(*dmitool_args, **popen_args): - return Popen(_JAVA_PATH + _DMITOOL_CMD + [str(arg) for arg in dmitool_args], **popen_args) - -def _safe_parse(dict, key, deferred_value): - try: - dict[key] = deferred_value() - except Exception as e: - print "Could not parse property '%s': %s"%(key, e) - return e - return False - -def version(): - """ Returns the version as a string. """ - stdout, stderr = _dmitool_call("version", stdout=PIPE).communicate() - return str(stdout).strip() - -def help(): - """ Returns the help text as a string. """ - stdout, stderr = _dmitool_call("help", stdout=PIPE).communicate() - return str(stdout).strip() - -def info(filepath): - """ Totally not a hack that parses the output from dmitool into a dictionary. - May break at any moment. - """ - subproc = _dmitool_call("info", filepath, stdout=PIPE) - stdout, stderr = subproc.communicate() - - result = {} - data = stdout.split(os.linesep)[1:] - #for s in data: print s - - #parse header line - if len(data) > 0: - header = data.pop(0).split(",") - #don't need to parse states, it's redundant - _safe_parse(result, "images", lambda: int(header[0].split()[0].strip())) - _safe_parse(result, "size", lambda: header[2].split()[1].strip()) - - #parse state information - states = [] - for item in data: - if not len(item): continue - - stateinfo = {} - item = item.split(",", 3) - _safe_parse(stateinfo, "name", lambda: item[0].split()[1].strip(" \"")) - _safe_parse(stateinfo, "dirs", lambda: int(item[1].split()[0].strip())) - _safe_parse(stateinfo, "frames", lambda: int(item[2].split()[0].strip())) - if len(item) > 3: - stateinfo["misc"] = item[3] - - states.append(stateinfo) - - result["states"] = states - return result - -def extract_state(input_path, output_path, icon_state, direction=None, frame=None): - """ Extracts an icon state as a png to a given path. - If provided direction should be a string, one of S, N, E, W, SE, SW, NE, NW. - If provided frame should be a frame number or a string of two frame number separated by a dash. - """ - args = ["extract", input_path, icon_state, output_path] - if direction is not None: args.extend(("direction" , str(direction))) - if frame is not None: args.extend(("frame" , str(frame))) - return _dmitool_call(*args) - -def import_state(target_path, input_path, icon_state, replace=False, delays=None, rewind=False, loop=None, ismovement=False, direction=None, frame=None): - """ Inserts an input png given by the input_path into the target_path. - """ - args = ["import", target_path, icon_state, input_path] - - if replace: args.append("nodup") - if rewind: args.append("rewind") - if ismovement: args.append("movement") - if delays: args.extend(("delays", ",".join(delays))) - if direction is not None: args.extend(("direction", direction)) - if frame is not None: args.extend(("frame", frame)) - - if loop in ("inf", "infinity"): - args.append("loop") - elif loop: - args.extend(("loopn", loop)) - - return _dmitool_call(*args) diff --git a/tools/dmitool/git_merge_installer.bat b/tools/dmitool/git_merge_installer.bat deleted file mode 100644 index 18ab7c8026a..00000000000 --- a/tools/dmitool/git_merge_installer.bat +++ /dev/null @@ -1,6 +0,0 @@ -@echo off -set tab= -echo. >> ../../.git/config -echo [merge "merge-dmi"] >> ../../.git/config -echo %tab%name = iconfile merge driver >> ../../.git/config -echo %tab%driver = ./tools/dmitool/dmimerge.sh %%O %%A %%B >> ../../.git/config diff --git a/tools/dmitool/git_merge_installer.sh b/tools/dmitool/git_merge_installer.sh deleted file mode 100755 index e0c48823b11..00000000000 --- a/tools/dmitool/git_merge_installer.sh +++ /dev/null @@ -1,6 +0,0 @@ -F="../../.git/config" - -echo '' >> $F -echo '[merge "merge-dmi"]' >> $F -echo ' name = iconfile merge driver' >> $F -echo ' driver = ./tools/dmitool/dmimerge.sh %O %A %B' >> $F diff --git a/tools/dmitool/merging.txt b/tools/dmitool/merging.txt deleted file mode 100644 index d8943efb985..00000000000 --- a/tools/dmitool/merging.txt +++ /dev/null @@ -1,14 +0,0 @@ -1. Install java(http://www.java.com/en/download/index.jsp) -2. Make sure java is in your PATH. To test this, open git bash, and type "java". If it says unknown command, you need to add JAVA/bin to your PATH variable (A guide for this can be found at https://www.java.com/en/download/help/path.xml ). - -Merging -The easiest way to do merging is to install the merge driver. For this, open `-tg-station/.git/config` in a text editor, and paste the following lines to the end of it: - -[merge "merge-dmi"] - name = iconfile merge driver - driver = ./tools/dmitool/dmimerge.sh %O %A %B - -You may optionally instead run git_merge_installer.bat or git_merge_installer.sh which should automatically insert these lines for you at the appropriate location. - -After this, merging DMI files should happen automagically unless there are conflicts (an icon_state that both you and someone else changed). -If there are conflicts, you will unfortunately still be stuck with opening both versions in the editor, and manually resolving the issues with those states. diff --git a/tools/dmitool/src/main/java/dmitool/DMI.java b/tools/dmitool/src/main/java/dmitool/DMI.java deleted file mode 100644 index bb560107ae9..00000000000 --- a/tools/dmitool/src/main/java/dmitool/DMI.java +++ /dev/null @@ -1,455 +0,0 @@ -package dmitool; - -import ar.com.hjg.pngj.ImageInfo; -import ar.com.hjg.pngj.ImageLineInt; -import ar.com.hjg.pngj.PngReader; -import ar.com.hjg.pngj.PngWriter; -import ar.com.hjg.pngj.PngjInputException; -import ar.com.hjg.pngj.chunks.PngChunkPLTE; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Deque; -import java.util.HashMap; -import java.util.List; - -public class DMI implements Comparator { - int w, h; - List images; - int totalImages = 0; - RGBA[] palette; - boolean isPaletted; - - public DMI(int w, int h) { - this.w = w; - this.h = h; - images = new ArrayList<>(); - isPaletted = false; - palette = null; - } - - public DMI(String f) throws DMIException, FileNotFoundException { - this(new File(f)); - } - - public DMI(File f) throws DMIException, FileNotFoundException { - if(f.length() == 0) { // Empty .dmi is empty file - w = 32; - h = 32; - images = new ArrayList<>(); - isPaletted = false; - palette = null; - return; - } - InputStream in = new FileInputStream(f); - PngReader pngr; - try { - pngr = new PngReader(in); - } catch(PngjInputException pie) { - throw new DMIException("Bad file format!", pie); - } - String descriptor = pngr.getMetadata().getTxtForKey("Description"); - String[] lines = descriptor.split("\n"); - - if(Main.VERBOSITY > 0) System.out.println("Descriptor has " + lines.length + " lines."); - if(Main.VERBOSITY > 3) { - System.out.println("Descriptor:"); - System.out.println(descriptor); - } - - /* length 6 is: - # BEGIN DMI - version = 4.0 - state = "state" - dirs = 1 - frames = 1 - # END DMI - */ - if(lines.length < 6) throw new DMIException(null, 0, "Descriptor too short!"); - - if(!"# BEGIN DMI".equals(lines[0])) throw new DMIException(lines, 0, "Expected '# BEGIN DMI'"); - if(!"# END DMI".equals(lines[lines.length-1])) throw new DMIException(lines, lines.length-1, "Expected '# END DMI'"); - if(!"version = 4.0".equals(lines[1])) throw new DMIException(lines, 1, "Unknown version, expected 'version = 4.0'"); - - this.w = 32; - this.h = 32; - - int i = 2; - - if(lines[i].startsWith("\twidth = ")) { - this.w = Integer.parseInt(lines[2].substring("\twidth = ".length())); - i++; - } - if(lines[i].startsWith("\theight = ")) { - this.h = Integer.parseInt(lines[3].substring("\theight = ".length())); - i++; - } - - List states = new ArrayList<>(); - - while(i < lines.length - 1) { - long imagesInState = 1; - if(!lines[i].startsWith("state = \"") || !lines[i].endsWith("\"")) throw new DMIException(lines, i, "Error reading state string"); - String stateName = lines[i].substring("state = \"".length(), lines[i].length()-1); - i++; - int dirs = 1; - int frames = 1; - float[] delays = null; - boolean rewind = false; - int loop = -1; - String hotspot = null; - boolean movement = false; - while(lines[i].startsWith("\t")) { - if(lines[i].startsWith("\tdirs = ")) { - dirs = Integer.parseInt(lines[i].substring("\tdirs = ".length())); - imagesInState *= dirs; - i++; - } else if(lines[i].startsWith("\tframes = ")) { - frames = Integer.parseInt(lines[i].substring("\tframes = ".length())); - imagesInState *= frames; - i++; - } else if(lines[i].startsWith("\tdelay = ")) { - String delayString = lines[i].substring("\tdelay = ".length()); - String[] delayVals = delayString.split(","); - delays = new float[delayVals.length]; - for(int d=0; d 0) System.out.println(pal.getNentries() + " palette entries"); - - palette = new RGBA[pal.getNentries()]; - int[] rgb = new int[3]; - for(int q=0; q 0) System.out.println("Non-paletted image"); - } - - int iw = pngr.imgInfo.cols; - int ih = pngr.imgInfo.rows; - - if(totalImages > iw * ih) - throw new DMIException(null, 0, "Impossible number of images!"); - - if(Main.VERBOSITY > 0) System.out.println("Image size " + iw+"x"+ih); - int[][] px = new int[ih][]; - - for(int y=0; y statesY) - // this should NEVER happen, we pre-check it - throw new DMIException(null, 0, "CRITICAL: End of image reached with states to go!"); - } - } - if(is.delays != null) { - if((Main.STRICT && is.delays.length*is.dirs != img.length) || is.delays.length*is.dirs < img.length) - throw new DMIException(null, 0, "Delay array size mismatch: " + is.delays.length*is.dirs + " vs " + img.length + "!"); - } - is.images = img; - } - } - - public IconState getIconState(String name) { - for(IconState is: images) { - if(is.name.equals(name)) { - return is; - } - } - return null; - } - - /** - * Makes a copy, unless name is null. - */ - public void addIconState(String name, IconState is) { - if(name == null) { - images.add(is); - totalImages += is.dirs * is.frames; - } else { - IconState newState = (IconState)is.clone(); - newState.name = name; - images.add(newState); - totalImages += is.dirs * is.frames; - } - } - - public boolean removeIconState(String name) { - for(IconState is: images) { - if(is.name.equals(name)) { - images.remove(is); - totalImages -= is.dirs * is.frames; - return true; - } - } - return false; - } - - public boolean setIconState(IconState is) { - for(int i=0; i 0) System.out.println("Fixing PNG chunks..."); - out.writeInt(in.readInt()); - out.writeInt(in.readInt()); - - Deque notZTXT = new ArrayDeque<>(); - - PNGChunk c = null; - - while(c == null || c.type != IEND) { - c = new PNGChunk(in); - if(c.type == zTXt && notZTXT != null) { - PNGChunk cc = null; - while(cc == null || cc.type != IHDR) { - cc = notZTXT.pop(); - cc.write(out); - } - c.write(out); - while(notZTXT.size() != 0) { - PNGChunk pc = notZTXT.pop(); - pc.write(out); - } - notZTXT = null; - } else if(notZTXT != null) { - notZTXT.add(c); - } else { - c.write(out); - } - } - if(Main.VERBOSITY > 0) System.out.println("Chunks fixed."); - } - - @Override public int compare(IconState arg0, IconState arg1) { - return arg0.name.compareTo(arg1.name); - } - - public void writeDMI(OutputStream os) throws IOException { - writeDMI(os, false); - } - public void writeDMI(OutputStream os, boolean sortStates) throws IOException { - if(totalImages == 0) { // Empty .dmis are empty files - os.close(); - return; - } - - // Setup chunk-fix buffer - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - if(sortStates) { - Collections.sort(images, this); - } - - // Write the dmi into the buffer - int sx = (int)Math.ceil(Math.sqrt(totalImages)); - int sy = totalImages / sx; - if(sx*sy < totalImages) { - sy++; - } - if(Main.VERBOSITY > 0) System.out.println("Image size: " + w + "x" + h + "; number of images " + sx + "x" + sy + " (" + totalImages + ")"); - int ix = sx * w; - int iy = sy * h; - ImageInfo ii = new ImageInfo(ix, iy, 8, true); - PngWriter out = new PngWriter(baos, ii); - out.setCompLevel(9); // Maximum compression - String description = getDescriptor(); - if(Main.VERBOSITY > 0) System.out.println("Descriptor has " + (description.split("\n").length) + " lines."); - out.getMetadata().setText("Description", description, true, true); - - Image[][] img = new Image[sx][sy]; - { - int k = 0; - int r = 0; - for(IconState is: images) { - for(Image i: is.images) { - img[k++][r] = i; - - if(k == sx) { - k = 0; - r++; - } - } - } - } - - for(int irow=0; irow myIS = new HashMap<>(); - HashMap dmiIS = new HashMap<>(); - - for(IconState is: images) { - myIS.put(is.name, is); - } - for(IconState is: dmi.images) { - dmiIS.put(is.name, is); - } - if(!myIS.keySet().equals(dmiIS.keySet())) return false; - for(String s: myIS.keySet()) { - if(!myIS.get(s).equals(dmiIS.get(s))) return false; - } - - return true; - } -} diff --git a/tools/dmitool/src/main/java/dmitool/DMIDiff.java b/tools/dmitool/src/main/java/dmitool/DMIDiff.java deleted file mode 100644 index 431d9c1d15a..00000000000 --- a/tools/dmitool/src/main/java/dmitool/DMIDiff.java +++ /dev/null @@ -1,194 +0,0 @@ -package dmitool; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -public class DMIDiff { - Map newIconStates; - Map modifiedIconStates = new HashMap<>(); - Set removedIconStates; - - DMIDiff() { - newIconStates = new HashMap<>(); - removedIconStates = new HashSet<>(); - } - - public DMIDiff(DMI base, DMI mod) { - if(base.h != mod.h || base.w != mod.w) throw new IllegalArgumentException("Cannot compare non-identically-sized DMIs!"); - - HashMap baseIS = new HashMap<>(); - for(IconState is: base.images) { - baseIS.put(is.name, is); - } - - HashMap modIS = new HashMap<>(); - for(IconState is: mod.images) { - modIS.put(is.name, is); - } - - newIconStates = ((HashMap)modIS.clone()); - for(String s: baseIS.keySet()) { - newIconStates.remove(s); - } - - removedIconStates = new HashSet<>(); - removedIconStates.addAll(baseIS.keySet()); - removedIconStates.removeAll(modIS.keySet()); - - Set retainedStates = new HashSet<>(); - retainedStates.addAll(baseIS.keySet()); - retainedStates.retainAll(modIS.keySet()); - - for(String s: retainedStates) { - if(!baseIS.get(s).equals(modIS.get(s))) { - modifiedIconStates.put(s, new IconStateDiff(baseIS.get(s), modIS.get(s))); - } - } - } - /** - * ASSUMES NO MERGE CONFLICTS - MERGE DIFFS FIRST. - */ - public void applyToDMI(DMI dmi) { - for(String s: removedIconStates) { - dmi.removeIconState(s); - } - for(String s: modifiedIconStates.keySet()) { - dmi.setIconState(modifiedIconStates.get(s).newState); - } - for(String s: newIconStates.keySet()) { - dmi.addIconState(null, newIconStates.get(s)); - } - } - - /** - * @param other The diff to merge with - * @param conflictDMI A DMI to add conflicted icon_states to - * @param merged An empty DMIDiff to merge into - * @param aName The log name for this diff - * @param bName The log name for {@code other} - * @return A Set containing all icon_states which conflicted, along with what was done in each diff, in the format "icon_state: here|there"; here and there are one of "added", "modified", and "removed" - */ - public Set mergeDiff(DMIDiff other, DMI conflictDMI, DMIDiff merged, String aName, String bName) { - HashSet myTouched = new HashSet<>(); - myTouched.addAll(removedIconStates); - myTouched.addAll(newIconStates.keySet()); - myTouched.addAll(modifiedIconStates.keySet()); - - HashSet otherTouched = new HashSet<>(); - otherTouched.addAll(other.removedIconStates); - otherTouched.addAll(other.newIconStates.keySet()); - otherTouched.addAll(other.modifiedIconStates.keySet()); - - HashSet bothTouched = (HashSet)myTouched.clone(); - bothTouched.retainAll(otherTouched); // this set now contains the list of icon_states that *both* diffs modified, which we'll put in conflictDMI for manual merge (unless they were deletions - - if(Main.VERBOSITY > 0) { - System.out.println("a: " + Arrays.toString(myTouched.toArray())); - System.out.println("b: " + Arrays.toString(otherTouched.toArray())); - System.out.println("both: " + Arrays.toString(bothTouched.toArray())); - } - - HashSet whatHappened = new HashSet<>(); - - for(String s: bothTouched) { - String here, there; - if(removedIconStates.contains(s)) { - here = "removed"; - } else if(newIconStates.containsKey(s)) { - here = "added"; - } else if(modifiedIconStates.containsKey(s)) { - here = "modified"; - } else { - System.out.println("Unknown error; state="+s); - here = "???"; - } - - if(other.removedIconStates.contains(s)) { - there = "removed"; - } else if(other.newIconStates.containsKey(s)) { - there = "added"; - } else if(other.modifiedIconStates.containsKey(s)) { - there = "modified"; - } else { - System.out.println("Unknown error; state="+s); - there = "???"; - } - - whatHappened.add(s + ": " + here + "|" + there); - } - - // Removals - for(String s: removedIconStates) { - if(!bothTouched.contains(s)) { - merged.removedIconStates.add(s); - } - } - for(String s: other.removedIconStates) { - if(!bothTouched.contains(s)) { - merged.removedIconStates.add(s); - } - } - - // Modifications - for(String s: modifiedIconStates.keySet()) { - if(!bothTouched.contains(s)) { - merged.modifiedIconStates.put(s, modifiedIconStates.get(s)); - } else { - conflictDMI.addIconState(aName + "|" + s, modifiedIconStates.get(s).newState); - } - } - for(String s: other.modifiedIconStates.keySet()) { - if(!bothTouched.contains(s)) { - merged.modifiedIconStates.put(s, other.modifiedIconStates.get(s)); - } else { - conflictDMI.addIconState(bName + "|" + s, other.modifiedIconStates.get(s).newState); - } - } - - // Additions - for(String s: newIconStates.keySet()) { - if(!bothTouched.contains(s)) { - merged.newIconStates.put(s, newIconStates.get(s)); - } else { - conflictDMI.addIconState(aName + s, newIconStates.get(s)); - } - } - for(String s: other.newIconStates.keySet()) { - if(!bothTouched.contains(s)) { - merged.newIconStates.put(s, other.newIconStates.get(s)); - } else { - conflictDMI.addIconState(bName + s, other.newIconStates.get(s)); - } - } - - return whatHappened; - } - - @Override public String toString() { - String s = ""; - String t = "\t"; - String q = "\""; - String n = "\n"; - if(!removedIconStates.isEmpty()) { - s += "Removed:\n"; - for(String state: removedIconStates) - s += t + q + state + q + n; - } - if(!modifiedIconStates.isEmpty()) { - s += "Modified:\n"; - for(String state: modifiedIconStates.keySet()) - s += t + q + state + q + " [" + modifiedIconStates.get(state).toString() + "]\n"; - } - if(!newIconStates.isEmpty()) { - s += "Added:\n"; - for(String state: newIconStates.keySet()) - s += t + q + state + q + " " + newIconStates.get(state).infoStr() + n; - } - if("".equals(s)) - return "No changes"; - return s; - } -} \ No newline at end of file diff --git a/tools/dmitool/src/main/java/dmitool/DMIException.java b/tools/dmitool/src/main/java/dmitool/DMIException.java deleted file mode 100644 index e9293162894..00000000000 --- a/tools/dmitool/src/main/java/dmitool/DMIException.java +++ /dev/null @@ -1,24 +0,0 @@ -package dmitool; - -public class DMIException extends Exception { - String[] desc = null; - int line = 0; - public DMIException(String[] descriptor, int line, String what) { - super(what); - desc = descriptor; - this.line = line; - } - public DMIException(String what) { - super(what); - } - public DMIException(String what, Exception cause) { - super(what, cause); - } - - @Override public String getMessage() { - if(desc != null) - return "\"" + desc[line] + "\" - " + super.getMessage(); - - return super.getMessage(); - } -} \ No newline at end of file diff --git a/tools/dmitool/src/main/java/dmitool/IconState.java b/tools/dmitool/src/main/java/dmitool/IconState.java deleted file mode 100644 index a214f5d621a..00000000000 --- a/tools/dmitool/src/main/java/dmitool/IconState.java +++ /dev/null @@ -1,281 +0,0 @@ -package dmitool; - -import java.util.Arrays; -import ar.com.hjg.pngj.ImageInfo; -import ar.com.hjg.pngj.ImageLineInt; -import ar.com.hjg.pngj.PngWriter; -import ar.com.hjg.pngj.PngReader; -import ar.com.hjg.pngj.PngjInputException; -import java.io.InputStream; -import java.io.OutputStream; - -public class IconState { - String name; - int dirs; - int frames; - float[] delays; - Image[] images; // dirs come first - boolean rewind; - int loop; - String hotspot; - boolean movement; - - public String getInfoLine() { - String extraInfo = ""; - if(rewind) extraInfo += " rewind"; - if(frames != 1) { - extraInfo += " loop(" + (loop==-1 ? "infinite" : loop) + ")"; - } - if(hotspot != null) extraInfo += " hotspot('" + hotspot + "')"; - if(movement) extraInfo += " movement"; - if(extraInfo.equals("")) { - return String.format("state \"%s\", %d dir(s), %d frame(s)", name, dirs, frames); - } else { - return String.format("state \"%s\", %d dir(s), %d frame(s),%s", name, dirs, frames, extraInfo); - } - } - - @Override public IconState clone() { - IconState is = new IconState(name, dirs, frames, images.clone(), delays==null ? null : delays.clone(), rewind, loop, hotspot, movement); - is.delays = delays != null ? delays.clone() : null; - is.rewind = rewind; - - return is; - } - - public IconState(String name, int dirs, int frames, Image[] images, float[] delays, boolean rewind, int loop, String hotspot, boolean movement) { - if(delays != null) { - if(Main.STRICT && delays.length != frames) { - throw new IllegalArgumentException("Delays and frames must be the same length!"); - } - } - this.name = name; - this.dirs = dirs; - this.frames = frames; - this.images = images; - this.rewind = rewind; - this.loop = loop; - this.hotspot = hotspot; - this.delays = delays; - this.movement = movement; - } - void setDelays(float[] delays) { - this.delays = delays; - } - void setRewind(boolean b) { - rewind = b; - } - @Override public boolean equals(Object obj) { - if(obj == this) return true; - if(!(obj instanceof IconState)) return false; - - IconState is = (IconState)obj; - - if(!is.name.equals(name)) return false; - if(is.dirs != dirs) return false; - if(is.frames != frames) return false; - if(!Arrays.equals(images, is.images)) return false; - if(is.rewind != rewind) return false; - if(is.loop != loop) return false; - if(!Arrays.equals(delays, is.delays)) return false; - if(!(is.hotspot == null ? hotspot == null : is.hotspot.equals(hotspot))) return false; - if(is.movement != movement) return false; - - return true; - } - public String infoStr() { - return "[" + frames + " frame(s), " + dirs + " dir(s)]"; - } - public String getDescriptorFragment() { - String s = ""; - String q = "\""; - String n = "\n"; - s += "state = " + q + name + q + n; - s += "\tdirs = " + dirs + n; - s += "\tframes = " + frames + n; - if(delays != null) { - s += "\tdelay = " + delayArrayToString(delays) + n; - } - if(rewind) { - s += "\trewind = 1\n"; - } - if(loop != -1) { - s += "\tloop = " + loop + n; - } - if(hotspot != null) { - s += "\thotspot = " + hotspot + n; - } - if(movement) { - s += "\tmovement = 1\n"; - } - return s; - } - - private static String delayArrayToString(float[] d) { - String s = ""; - for(float f: d) { - s += ","+f; - } - return s.substring(1); - } - - /** - * Dump the state to the given OutputStream in PNG format. Frames will be dumped along the X axis of the image, and directions will be dumped along the Y. - */ - public void dumpToPNG(OutputStream outS, int minDir, int maxDir, int minFrame, int maxFrame) { - int totalDirs = maxDir - minDir + 1; - int totalFrames = maxFrame - minFrame + 1; - - int w = images[minDir + minFrame * this.dirs].w; - int h = images[minDir + minFrame * this.dirs].h; - - if(Main.VERBOSITY > 0) System.out.println("Writing " + totalDirs + " dir(s), " + totalFrames + " frame(s), " + totalDirs*totalFrames + " image(s) total."); - ImageInfo ii = new ImageInfo(totalFrames * w, totalDirs * h, 8, true); - PngWriter out = new PngWriter(outS, ii); - out.setCompLevel(9); - - Image[][] img = new Image[totalFrames][totalDirs]; - { - for(int i=0; i= frames) - throw new IllegalArgumentException("Provided frame is out of range: " + frame); - if(dir < 0 || dir >= dirs) - throw new IllegalArgumentException("Provided dir is out of range: " + dir); - - images[getIndex(dir, frame)] = splice; - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/dmitool/src/main/java/dmitool/IconStateDiff.java b/tools/dmitool/src/main/java/dmitool/IconStateDiff.java deleted file mode 100644 index a5d30db7fe0..00000000000 --- a/tools/dmitool/src/main/java/dmitool/IconStateDiff.java +++ /dev/null @@ -1,126 +0,0 @@ -package dmitool; - -import java.util.HashMap; -import java.util.HashSet; - -public class IconStateDiff { - static class ISAddress { - int dir; - int frame; - - public ISAddress(int dir, int frame) { - this.dir = dir; - this.frame = frame; - } - - public String infoStr(int maxDir, int maxFrame) { - if(maxDir == 1 && maxFrame == 1) { - return ""; - } else if(maxDir == 1) { - return "{" + frame + "}"; - } else if(maxFrame == 1) { - return "{" + Main.dirs[dir] + "}"; - } else { - return "{" + Main.dirs[dir] + " " + frame + "}"; - } - } - } - int oldFrameCount = 0; - int oldDirectionCount = 0; - boolean oldRewind = false; - int oldLoop = -1; - String oldHotspot = null; - - int newFrameCount = 0; - int newDirectionCount = 0; - boolean newRewind = false; - int newLoop = -1; - String newHotspot = null; - - IconState newState; - HashMap modifiedFrames = new HashMap<>(); - HashMap newFrames = new HashMap<>(); - HashSet removedFrames = new HashSet<>(); - - public IconStateDiff(IconState base, IconState mod) { - int maxDir = Math.max(base.dirs, mod.dirs); - int maxFrame = Math.max(base.frames, mod.frames); - - oldFrameCount = base.frames; - oldDirectionCount = base.dirs; - oldRewind = base.rewind; - oldLoop = base.loop; - oldHotspot = base.hotspot; - - newFrameCount = mod.frames; - newDirectionCount = mod.dirs; - newRewind = mod.rewind; - newLoop = mod.loop; - newHotspot = mod.hotspot; - - newState = mod; - - Image baseI, modI; - for(int d=0; d d && base.frames > f) { - baseI = base.images[f * base.dirs + d]; - } else baseI = null; - if(mod.dirs > d && mod.frames > f) { - modI = mod.images[f * mod.dirs + d]; - } else modI = null; - - if(baseI == null && modI == null) continue; - - if(baseI == null) newFrames.put(new ISAddress(d, f), modI); - else if(modI == null) removedFrames.add(new ISAddress(d, f)); - else if(!baseI.equals(modI)) { - modifiedFrames.put(new ISAddress(d, f), modI); - } - } - } - } - - @Override public String toString() { - String s = ""; - String tmp; - - if(newDirectionCount != oldDirectionCount) - s += " | dirs " + oldDirectionCount + "->" + newDirectionCount; - - if(newFrameCount != oldFrameCount) - s += " | frames " + oldFrameCount + "->" + newFrameCount; - - if(newRewind != oldRewind) { - s += " | rewind " + oldRewind + "->" + newRewind; - } - - if(newLoop != oldLoop) { - s += " | loop " + oldLoop + "->" + newLoop; - } - - if(newHotspot == null ? oldHotspot != null : !newHotspot.equals(oldHotspot)) { - s += " | hotspot " + oldHotspot + "->" + newHotspot; - } - - if(!modifiedFrames.isEmpty()) { - int total_frames = Math.min(oldFrameCount, newFrameCount) * Math.min(oldDirectionCount, newDirectionCount); - tmp = ""; - for(ISAddress isa: modifiedFrames.keySet()) { - String str = isa.infoStr(oldDirectionCount, oldFrameCount); - if(!"".equals(str)) { - tmp += ", " + str; - } - } - if(!"".equals(tmp)) { - s += " | modified " + modifiedFrames.size() + " of " + total_frames + ": " + tmp.substring(1); - } else { - s += " | modified " + modifiedFrames.size() + " of " + total_frames; - } - } - - if("".equals(s)) - return "No change"; - return s.substring(3); - } -} \ No newline at end of file diff --git a/tools/dmitool/src/main/java/dmitool/Image.java b/tools/dmitool/src/main/java/dmitool/Image.java deleted file mode 100644 index 2ea7ff41920..00000000000 --- a/tools/dmitool/src/main/java/dmitool/Image.java +++ /dev/null @@ -1,32 +0,0 @@ -package dmitool; - -import java.io.IOException; -import java.io.OutputStream; - -public abstract class Image { - int w, h; - - abstract RGBA getPixel(int x, int y); - - public Image(int w, int h) { - this.w = w; - this.h = h; - } - - @Override public boolean equals(Object obj) { - if(obj == this) return true; - if(!(obj instanceof Image)) return false; - - Image im = (Image) obj; - - if(w != im.w || h != im.h) return false; - - for(int i=0; i argq = new ArrayDeque<>(); - for(String s: args) { - argq.addLast(s); - } - if(argq.size() == 0) { - System.out.println("No command found; use 'help' for help"); - return; - } - String switches = argq.peekFirst(); - if(switches.startsWith("-")) { - for(char c: switches.substring(1).toCharArray()) { - switch(c) { - case 'v': VERBOSITY++; break; - case 'q': VERBOSITY--; break; - case 'S': STRICT = true; break; - } - } - argq.pollFirst(); - } - String op = argq.pollFirst(); - - switch(op) { - case "diff": { - if(argq.size() < 2) { - System.out.println("Insufficient arguments for command!"); - System.out.println(helpStr); - return; - } - String a = argq.pollFirst(); - String b = argq.pollFirst(); - - if(VERBOSITY >= 0) System.out.println("Loading " + a); - DMI dmi = doDMILoad(a); - if(VERBOSITY >= 0) dmi.printInfo(); - - if(VERBOSITY >= 0) System.out.println("Loading " + b); - DMI dmi2 = doDMILoad(b); - if(VERBOSITY >= 0) dmi2.printInfo(); - - DMIDiff dmid = new DMIDiff(dmi, dmi2); - System.out.println(dmid); - break; - } - case "sort": { - if(argq.size() < 1) { - System.out.println("Insufficient arguments for command!"); - System.out.println(helpStr); - return; - } - String f = argq.pollFirst(); - - if(VERBOSITY >= 0) System.out.println("Loading " + f); - DMI dmi = doDMILoad(f); - if(VERBOSITY >= 0) dmi.printInfo(); - - if(VERBOSITY >= 0) System.out.println("Saving " + f); - dmi.writeDMI(new FileOutputStream(f), true); - break; - } - case "merge": { - if(argq.size() < 4) { - System.out.println("Insufficient arguments for command!"); - System.out.println(helpStr); - return; - } - String baseF = argq.pollFirst(), - aF = argq.pollFirst(), - bF = argq.pollFirst(), - mergedF = argq.pollFirst(); - if(VERBOSITY >= 0) System.out.println("Loading " + baseF); - DMI base = doDMILoad(baseF); - if(VERBOSITY >= 0) base.printInfo(); - - if(VERBOSITY >= 0) System.out.println("Loading " + aF); - DMI aDMI = doDMILoad(aF); - if(VERBOSITY >= 0) aDMI.printInfo(); - - if(VERBOSITY >= 0) System.out.println("Loading " + bF); - DMI bDMI = doDMILoad(bF); - if(VERBOSITY >= 0) bDMI.printInfo(); - - DMIDiff aDiff = new DMIDiff(base, aDMI); - DMIDiff bDiff = new DMIDiff(base, bDMI); - DMIDiff mergedDiff = new DMIDiff(); - DMI conflictDMI = new DMI(32, 32); - - Set cf = aDiff.mergeDiff(bDiff, conflictDMI, mergedDiff, aF, bF); - - mergedDiff.applyToDMI(base); - - base.writeDMI(new FileOutputStream(mergedF)); - - if(!cf.isEmpty()) { - if(VERBOSITY >= 0) for(String s: cf) { - System.out.println(s); - } - conflictDMI.writeDMI(new FileOutputStream(mergedF + ".conflict.dmi"), true); - System.out.println("Add/modify conflicts placed in '" + mergedF + ".conflict.dmi'"); - System.exit(1); // Git expects non-zero on merge conflict - } else { - System.out.println("No conflicts"); - System.exit(0); - } - break; - } - case "extract": { - if(argq.size() < 3) { - System.out.println("Insufficient arguments for command!"); - System.out.println(helpStr); - return; - } - String file = argq.pollFirst(), - state = argq.pollFirst(), - outFile = argq.pollFirst(); - - DMI dmi = doDMILoad(file); - if(VERBOSITY >= 0) dmi.printInfo(); - - IconState is = dmi.getIconState(state); - if(is == null) { - System.out.println("icon_state '"+state+"' does not exist!"); - return; - } - // minDir, Maxdir, minFrame, Maxframe - int mDir=0, Mdir=is.dirs-1; - int mFrame=0, Mframe=is.frames-1; - - while(argq.size() > 1) { - String arg = argq.pollFirst(); - - switch(arg) { - case "d": - case "dir": - case "dirs": - case "direction": - case "directions": - String dString = argq.pollFirst(); - if(dString.contains("-")) { - String[] splitD = dString.split("-"); - if(splitD.length == 2) { - mDir = parseDir(splitD[0], is); - Mdir = parseDir(splitD[1], is); - } else { - System.out.println("Illegal dir string: '" + dString + "'!"); - return; - } - } else { - mDir = parseDir(dString, is); - Mdir = mDir; - } - // Invalid value check, warnings are printed in parseDir() - if(mDir == -1 || Mdir == -1) return; - if(Mdir < mDir) { - System.out.println("Maximum dir greater than minimum dir!"); - System.out.println("Textual direction order is S, N, E, W, SE, SW, NE, NW increasing 0 (S) to 7 (NW)"); - return; - } - break; - case "f": - case "frame": - case "frames": - String fString = argq.pollFirst(); - if(fString.contains("-")) { - String[] splitF = fString.split("-"); - if(splitF.length == 2) { - mFrame = parseFrame(splitF[0], is); - Mframe = parseFrame(splitF[1], is); - } else { - System.out.println("Illegal frame string: '" + fString + "'!"); - return; - } - } else { - mFrame = parseFrame(fString, is); - Mframe = mFrame; - } - // Invalid value check, warnings are printed in parseFrame() - if(mFrame == -1 || Mframe == -1) return; - if(Mframe < mFrame) { - System.out.println("Maximum frame greater than minimum frame!"); - return; - } - break; - default: - System.out.println("Unknown argument '" + arg + "' detected, ignoring."); - } - } - if(!argq.isEmpty()) { - System.out.println("Extra argument '" + argq.pollFirst() + "' detected, ignoring."); - } - is.dumpToPNG(new FileOutputStream(outFile), mDir, Mdir, mFrame, Mframe); - break; - } - case "import": { - if(argq.size() < 3) { - System.out.println("Insufficient arguments for command!"); - System.out.println(helpStr); - return; - } - String dmiFile = argq.pollFirst(), - stateName = argq.pollFirst(), - pngFile = argq.pollFirst(); - - boolean noDup = false; - boolean rewind = false; - int loop = 0; - boolean movement = false; - String hotspot = null; - float[] delays = null; - String replaceDir = null; - String replaceFrame = null; - while(!argq.isEmpty()) { - String s = argq.pollFirst(); - switch(s.toLowerCase()) { - case "nodup": - case "nd": - case "n": - noDup = true; - break; - case "rewind": - case "rw": - case "r": - rewind = true; - break; - case "loop": - case "lp": - case "l": - loop = -1; - break; - case "loopn": - case "lpn": - case "ln": - if(!argq.isEmpty()) { - String loopTimes = argq.pollFirst(); - try { - loop = Integer.parseInt(loopTimes); - } catch(NumberFormatException nfe) { - System.out.println("Illegal number '" + loopTimes + "' as argument to '" + s + "'!"); - return; - } - } else { - System.out.println("Argument '" + s + "' requires a numeric argument following it!"); - return; - } - break; - case "movement": - case "move": - case "mov": - case "m": - movement = true; - break; - case "delays": - case "delay": - case "del": - case "d": - if(!argq.isEmpty()) { - String delaysString = argq.pollFirst(); - String[] delaysSplit = delaysString.split(","); - delays = new float[delaysSplit.length]; - for(int i=0; i= 0) System.out.println("Loading " + dmiFile); - DMI toImportTo = doDMILoad(dmiFile); - if(VERBOSITY >= 0) toImportTo.printInfo(); - IconState is = IconState.importFromPNG(toImportTo, new FileInputStream(pngFile), stateName, delays, rewind, loop, hotspot, movement); - - //image insertion - if(replaceDir != null || replaceFrame != null) { - - IconState targetIs = toImportTo.getIconState(stateName); - if(targetIs == null) { - System.out.println("'direction' or 'frame' specified and no icon state '" + stateName + "' found, aborting!"); - return; - } - if(is.images.length == 0) { - System.out.println("'direction' or 'frame' specified and imported is empty, aborting!"); - return; - } - - if(!noDup) targetIs = targetIs.clone(); - - int dirToReplace, frameToReplace; - if(replaceDir != null && replaceFrame != null) { - frameToReplace = parseFrame(replaceFrame, targetIs); - dirToReplace = parseDir(replaceDir, targetIs); - targetIs.insertImage(dirToReplace, frameToReplace, is.images[0]); - } - else if(replaceDir != null) { - dirToReplace = parseDir(replaceDir, targetIs); - targetIs.insertDir(dirToReplace, is.images); - } - else if(replaceFrame != null) { - frameToReplace = parseFrame(replaceFrame, targetIs); - targetIs.insertFrame(frameToReplace, is.images); - } - - if(!noDup) toImportTo.addIconState(null, targetIs); - } - else { - if(noDup) { - if(!toImportTo.setIconState(is)) { - toImportTo.addIconState(null, is); - } - } else { - toImportTo.addIconState(null, is); - } - } - - if(VERBOSITY >= 0) toImportTo.printInfo(); - - if(VERBOSITY >= 0) System.out.println("Saving " + dmiFile); - toImportTo.writeDMI(new FileOutputStream(dmiFile)); - break; - } - case "verify": { - if(argq.size() < 1) { - System.out.println("Insufficient arguments for command!"); - System.out.println(helpStr); - return; - } - String vF = argq.pollFirst(); - if(VERBOSITY >= 0) System.out.println("Loading " + vF); - DMI v = doDMILoad(vF); - if(VERBOSITY >= 0) v.printInfo(); - break; - } - case "info": { - if(argq.size() < 1) { - System.out.println("Insufficient arguments for command!"); - System.out.println(helpStr); - return; - } - String infoFile = argq.pollFirst(); - if(VERBOSITY >= 0) System.out.println("Loading " + infoFile); - DMI info = doDMILoad(infoFile); - info.printInfo(); - info.printStateList(); - break; - } - case "version": - System.out.println(VERSION); - return; - default: - System.out.println("Command '" + op + "' not found!"); - case "help": - System.out.println(helpStr); - break; - } - } - - static int parseDir(String s, IconState is) { - try { - int i = Integer.parseInt(s); - if(0 <= i && i < is.dirs) { - return i; - } else { - System.out.println("Direction not in valid range [0, "+(is.dirs-1)+"]!"); - return -1; - } - } catch(NumberFormatException nfe) { - for(int q=0; q