By Pater Noster Servings: 2 Prep Time: 10 mins Cook Time: 1-2 hrs Difficulty: Easy Trappist beer is a rich and pleasant beer traditionally brewed by monks.
Ingredients
Ale: Ale! The core of any good drink. Easily obtainable by fermenting oats in a barrel for a while. This will be the basis of our brew, giving it it's fruity taste and color! Holy water: This is what a makes a trappist a trappist and not a trapisst, the religion! Real easy to get if you are reading this where you are supposed to be reading this! If the chaplain can't bothered it's also easily harvestable from holymelons as long as you bother to separate it. Sugar: Sugar is what's gonna make it all come together sweetening the brew and mixing well with the ale from earlier. It's easy to obtain from grinding sugarcanes. Feel free to add liberally.
Preparation
1. Mix the ale and holy water together. 2. Add some sugar to the mix as you keep stirring it for 1 minute. 3. At this point you're free to just use it as is! But feel free to experiment by adding new flavours and really making it your own!
In the event of a singuloose, or a tesloose, crew should fling themselves out of the nearest airlock, in the hopes that their corpse is discovered in the future.
Have a safe day, GEC management.";
- name = "Warning"
- },
-/turf/open/floor/plating/airless,
-/area/ship/construction)
-"Uc" = (
-/obj/effect/turf_decal/corner/transparent/solgovgold{
- dir = 5
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/plasteel/tech,
-/area/ship/hallway/central)
-"Ud" = (
-/obj/structure/filingcabinet{
- layer = 2
- },
-/obj/effect/turf_decal/siding/thinplating/dark{
- dir = 10
- },
-/obj/structure/railing,
-/obj/machinery/camera/autoname{
- dir = 5;
- network = list("GEC");
- pixel_y = 21
- },
-/turf/open/floor/carpet/red,
-/area/ship/bridge)
-"Ug" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
- },
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/ship/hallway/central)
-"Ul" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering/atmospherics)
-"Up" = (
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/hallway/central)
-"Ur" = (
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/ship/engineering/atmospherics)
-"Ut" = (
-/obj/effect/turf_decal/industrial/caution{
- dir = 4;
- pixel_x = 15
- },
-/turf/open/floor/plasteel/tech/airless,
-/area/ship/construction)
-"Uy" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/crew/dorm)
-"Uz" = (
-/obj/machinery/atmospherics/components/unary/shuttle/heater{
- dir = 4
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- dir = 4;
- id = "engine_shutters"
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/door/window{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/ship/engineering)
-"UH" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 8
- },
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/ship/crew/canteen)
-"UN" = (
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/suit_storage_unit/atmos{
- layer = 2.8
- },
-/obj/structure/railing,
-/turf/open/floor/plating,
-/area/ship/engineering/atmospherics)
-"UQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/ship/hallway/central)
-"US" = (
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4;
- name = "Mix to Mix Tank / Filtering"
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering/atmospherics)
-"Vf" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible,
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering/atmospherics)
-"Vi" = (
-/obj/structure/chair{
- dir = 1
- },
-/obj/effect/turf_decal/corner/transparent/bar/diagonal,
-/obj/machinery/firealarm/directional/west,
-/turf/open/floor/plasteel,
-/area/ship/crew/canteen)
-"Vj" = (
-/obj/effect/turf_decal/corner/transparent/solgovgold{
- dir = 6
- },
-/obj/effect/turf_decal/industrial/traffic{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering/atmospherics)
-"Vn" = (
-/obj/structure/particle_accelerator/power_box,
-/turf/open/floor/plating/airless,
-/area/ship/construction)
-"Vr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/holopad/emergency/bar,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/canteen)
-"Vy" = (
-/obj/machinery/air_sensor/atmos/oxygen_tank,
-/turf/open/floor/engine/o2,
-/area/ship/engineering/atmospherics)
-"VL" = (
-/obj/machinery/light_switch{
- pixel_y = 22;
- pixel_x = -12
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"Wb" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters/preopen{
- dir = 4;
- id = "construction_shutters"
- },
-/turf/open/floor/plating/airless,
-/area/ship/construction)
-"We" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/tech/airless,
-/area/ship/construction)
-"Wp" = (
-/obj/machinery/power/terminal{
- dir = 8
- },
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/obj/effect/decal/fakelattice{
- color = "#8D8B8B";
- layer = 2.1
- },
-/obj/structure/railing,
-/obj/structure/cable,
-/turf/open/floor/plating{
- color = "#8D8B8B";
- icon_state = "elevatorshaft"
- },
-/area/ship/engineering)
-"Ws" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 6
- },
-/turf/open/floor/engine/hull/reinforced,
-/area/ship/construction)
-"Wv" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/cargo)
-"WE" = (
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/obj/machinery/computer/atmos_control/tank/oxygen_tank,
-/obj/machinery/atmospherics/pipe/simple/brown/hidden{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/ship/engineering/atmospherics)
-"WI" = (
-/obj/structure/closet/radiation/empty{
- anchored = 1
- },
-/obj/item/clothing/suit/radiation/space,
-/obj/item/clothing/suit/radiation/space,
-/obj/item/clothing/head/radiation/space,
-/obj/item/clothing/head/radiation/space,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/item/geiger_counter,
-/obj/item/geiger_counter,
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering/atmospherics)
-"WK" = (
-/obj/effect/turf_decal/corner/transparent/bar/diagonal,
-/obj/structure/table,
-/obj/machinery/jukebox/boombox,
-/turf/open/floor/plasteel,
-/area/ship/crew/canteen)
-"WN" = (
-/obj/machinery/field/generator,
-/obj/structure/railing,
-/turf/open/floor/plating/airless,
-/area/ship/construction)
-"WS" = (
-/obj/effect/turf_decal/corner/transparent/solgovgold{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/plasteel/tech,
-/area/ship/hallway/central)
-"WX" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/engine/hull/reinforced/interior,
-/area/ship/engineering/atmospherics)
-"Xf" = (
-/obj/effect/turf_decal/corner/transparent/solgovgold{
- dir = 6
- },
-/obj/effect/turf_decal/industrial/traffic{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible/layer2{
- dir = 4
- },
-/obj/machinery/meter/atmos/layer2{
- desc = "It measures Mix Tank Outlet.";
- name = "Mix Tank Outlet meter"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering/atmospherics)
-"Xj" = (
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/decal/fakelattice{
- color = "#8D8B8B";
- layer = 2.1
- },
-/obj/machinery/atmospherics/pipe/simple/purple/hidden{
- dir = 2
- },
-/turf/open/floor/plating{
- color = "#8D8B8B";
- icon_state = "elevatorshaft"
- },
-/area/ship/engineering)
-"Xs" = (
-/obj/effect/turf_decal/atmos/carbon_dioxide,
-/turf/open/floor/engine/co2,
-/area/ship/engineering/atmospherics)
-"Xv" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output,
-/turf/open/floor/engine/co2,
-/area/ship/engineering/atmospherics)
-"Xw" = (
-/obj/machinery/field/generator,
-/obj/structure/railing,
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
- },
-/turf/open/floor/plating/airless,
-/area/ship/construction)
-"Xx" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/atmospherics/pipe/simple/purple/visible/layer4{
- dir = 4
- },
-/turf/open/floor/engine/hull/reinforced/interior,
-/area/ship/engineering/atmospherics)
-"XB" = (
-/obj/effect/turf_decal/corner/transparent/solgovgold{
- dir = 10
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/plasteel/tech,
-/area/ship/hallway/central)
-"XC" = (
-/obj/effect/turf_decal/corner/transparent/solgovgold{
- dir = 6
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/hallway/central)
-"XD" = (
-/obj/effect/turf_decal/corner/transparent/solgovgold{
- dir = 10
- },
-/obj/effect/turf_decal/industrial/traffic,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering/atmospherics)
-"XJ" = (
-/obj/machinery/light/small/directional/south,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer2{
- dir = 2
- },
-/obj/machinery/shower{
- dir = 4
- },
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering/atmospherics)
-"XN" = (
-/obj/machinery/cell_charger,
-/obj/structure/table,
-/obj/effect/turf_decal/steeldecal/steel_decals10{
- dir = 9
- },
-/obj/effect/turf_decal/steeldecal/steel_decals10{
- dir = 10
- },
-/obj/effect/turf_decal/techfloor,
-/obj/structure/railing,
-/turf/open/floor/plasteel/dark,
-/area/ship/engineering)
-"XP" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/structure/curtain/cloth/grey,
-/turf/open/floor/plating,
-/area/ship/crew/canteen)
-"XV" = (
-/obj/machinery/modular_computer/console/preset/command{
- dir = 8
- },
-/obj/machinery/light/dim/directional/east,
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/bridge)
-"XX" = (
-/obj/structure/table,
-/obj/item/flashlight/lamp{
- pixel_x = -4;
- pixel_y = 8
- },
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
- dir = 9
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"Yj" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
- dir = 1
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering/atmospherics)
-"Yq" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/obj/structure/railing/corner,
-/obj/structure/railing/corner{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/ship/bridge)
-"Yw" = (
-/obj/structure/table/reinforced,
-/obj/machinery/reagentgrinder{
- pixel_y = 5
- },
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/crew/canteen)
-"YB" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/cargo)
-"YK" = (
-/obj/machinery/atmospherics/components/binary/valve/layer2{
- dir = 4
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/components/binary/valve/layer4{
- dir = 4
- },
-/turf/open/floor/engine/hull/reinforced,
-/area/ship/construction)
-"YO" = (
-/obj/effect/turf_decal/corner/transparent/solgovgold{
- dir = 5
- },
-/obj/effect/turf_decal/industrial/traffic{
- dir = 1
- },
-/obj/machinery/atmospherics/components/trinary/mixer/flipped{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible/layer2{
- dir = 4
- },
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering/atmospherics)
-"YY" = (
-/obj/effect/turf_decal/steeldecal/steel_decals_central2{
- dir = 1
- },
-/obj/machinery/light/small/directional/south,
-/obj/structure/toilet{
- dir = 1
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/crew/dorm)
-"Zk" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/firealarm/directional/south,
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering/atmospherics)
-"Zl" = (
-/obj/machinery/door/airlock/hatch{
- dir = 4;
- id_tag = "ce_bolts";
- name = "Project Overseer's Office"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 8
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 4
- },
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/bridge)
-"Zm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering/atmospherics)
-"Zr" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering/atmospherics)
-"Zz" = (
-/obj/effect/turf_decal/corner/transparent/solgovgold{
- dir = 5
- },
-/obj/effect/turf_decal/industrial/traffic{
- dir = 1
- },
-/obj/machinery/atmospherics/components/binary/pump/layer2{
- desc = "A pump that moves gas by pressure. This one sucks up gasses from the atmosphere and sends them to be filtered out into the tanks";
- dir = 4;
- name = "Atmosphere to Filtering"
- },
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering/atmospherics)
-"ZJ" = (
-/obj/effect/turf_decal/corner/transparent/solgovgold{
- dir = 5
- },
-/obj/effect/turf_decal/industrial/traffic{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible/layer2{
- dir = 9
- },
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering/atmospherics)
-"ZR" = (
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Mix Tank"
- },
-/turf/open/floor/plating,
-/area/ship/engineering/atmospherics)
-"ZW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 10
- },
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/turf/open/floor/plating,
-/area/ship/cargo)
-"ZZ" = (
-/obj/effect/turf_decal/spline/fancy/opaque/black/corner{
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 2;
- name = "Helm"
- },
-/obj/structure/catwalk/over/plated_catwalk/white{
- color = "#4c535b"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/ship/bridge)
-
-(1,1,1) = {"
-kD
-kD
-kD
-kD
-jv
-nz
-xJ
-kD
-Qy
-Qy
-sl
-IC
-IC
-kD
-IC
-IC
-sl
-Qy
-Qy
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-"}
-(2,1,1) = {"
-qS
-Qs
-Qs
-Qs
-Iv
-tV
-Qs
-Qs
-He
-He
-sl
-CY
-CY
-sl
-CY
-CY
-sl
-Uz
-He
-tx
-tx
-tx
-tx
-tx
-Uy
-kD
-kD
-kD
-kD
-kD
-kD
-"}
-(3,1,1) = {"
-Qs
-QM
-MC
-TE
-Sx
-Zz
-Qs
-Qs
-OM
-Ak
-aA
-ld
-ld
-Fr
-ld
-Wp
-Tc
-Kv
-PT
-tx
-tx
-Kz
-pY
-GO
-tx
-kD
-kD
-kD
-kD
-kD
-kD
-"}
-(4,1,1) = {"
-Qs
-Vy
-pl
-Eu
-WE
-st
-xZ
-Qs
-vv
-EG
-lJ
-KO
-nU
-Xj
-ru
-tU
-Tc
-BP
-Qm
-tx
-iw
-aE
-cX
-iK
-tx
-kD
-kD
-kD
-kD
-kD
-kD
-"}
-(5,1,1) = {"
-Qs
-pl
-dn
-TE
-ig
-hC
-oZ
-dg
-LK
-Du
-qq
-pN
-IU
-OA
-uX
-XN
-Tc
-xj
-uc
-tx
-ol
-nt
-uw
-tx
-tx
-Uy
-kD
-kD
-kD
-kD
-kD
-"}
-(6,1,1) = {"
-Qs
-Qs
-Qs
-Qs
-xK
-sU
-fx
-Qs
-OZ
-uI
-Hx
-qn
-IU
-gR
-or
-LI
-Bp
-kd
-rh
-tx
-zI
-Ge
-Az
-tx
-AB
-tx
-Uy
-kD
-kD
-kD
-kD
-"}
-(7,1,1) = {"
-Qs
-JG
-NH
-TE
-Ij
-sU
-Kp
-Qs
-Qs
-wD
-sY
-ug
-SK
-fQ
-rS
-vp
-sd
-wt
-uc
-tx
-Qw
-OD
-HL
-tx
-Bj
-JW
-tx
-kD
-kD
-kD
-kD
-"}
-(8,1,1) = {"
-Qs
-RS
-xP
-Eu
-tT
-wk
-Lf
-Ul
-Qs
-mO
-sl
-sl
-Sr
-Cc
-pf
-sl
-zV
-sl
-sl
-tx
-tx
-Lu
-kr
-FA
-kY
-YY
-tx
-kD
-kD
-kD
-kD
-"}
-(9,1,1) = {"
-Qs
-xP
-uR
-TE
-QO
-hQ
-Tf
-Zk
-Qs
-Qs
-Qs
-sl
-sl
-HN
-sl
-sl
-sl
-sl
-CN
-eK
-tx
-tS
-tx
-tx
-CL
-JH
-tx
-kD
-kD
-kD
-kD
-"}
-(10,1,1) = {"
-Qs
-Qs
-Qs
-Qs
-aT
-sU
-CA
-rj
-uL
-NF
-Qs
-LM
-So
-WS
-Bf
-Lr
-IT
-Kq
-XC
-XC
-Bf
-HK
-MN
-Wv
-Wv
-Wv
-Wv
-jo
-kD
-kD
-kD
-"}
-(11,1,1) = {"
-Qs
-Xs
-ps
-TE
-Qg
-sU
-Jz
-iq
-ck
-rU
-fG
-zh
-DN
-MW
-Ab
-xc
-UQ
-BR
-DN
-DN
-Ab
-hE
-Uc
-Wv
-CI
-uW
-zE
-Wv
-jo
-kD
-kD
-"}
-(12,1,1) = {"
-Qs
-NG
-zC
-Eu
-vE
-AA
-EX
-gZ
-XD
-ce
-Qs
-yt
-oe
-oe
-yT
-gy
-oe
-Kq
-kF
-oe
-me
-pC
-bS
-gx
-qp
-FR
-YB
-Sn
-Wv
-kD
-kD
-"}
-(13,1,1) = {"
-Qs
-zC
-Xv
-TE
-Jb
-YO
-NY
-JQ
-Bz
-ud
-Qs
-jE
-uG
-lL
-XP
-KU
-XP
-lL
-Gd
-ow
-oA
-Rn
-gN
-Wv
-VL
-ZW
-tN
-Eo
-cR
-kD
-kD
-"}
-(14,1,1) = {"
-Qs
-Qs
-Qs
-Qs
-xK
-sU
-eY
-gZ
-XD
-TG
-Qs
-lL
-lL
-lL
-vF
-HW
-oF
-lL
-lL
-lL
-IB
-Hj
-IB
-Wv
-hm
-Nn
-YB
-Sn
-rD
-PL
-kD
-"}
-(15,1,1) = {"
-Qs
-Qs
-Qs
-Qs
-Iv
-xv
-Xx
-WX
-bZ
-Zm
-Qs
-rw
-Gs
-Vi
-Os
-tK
-hF
-iV
-bM
-XP
-oA
-cA
-iZ
-Wv
-PE
-vf
-cj
-Si
-Lc
-kD
-kD
-"}
-(16,1,1) = {"
-Qs
-NO
-EE
-TE
-Ur
-sU
-IN
-Yj
-GS
-cT
-Qs
-qE
-iG
-Os
-jn
-mY
-wE
-zP
-MA
-XP
-XB
-cA
-uB
-Wv
-qD
-hW
-hz
-zb
-jX
-kD
-kD
-"}
-(17,1,1) = {"
-Qs
-oD
-vk
-Eu
-Lw
-Rj
-IN
-Yj
-GS
-jl
-Qs
-Da
-bC
-Ts
-aY
-UH
-zU
-oq
-Oa
-XP
-cn
-mU
-Io
-Wv
-tE
-IE
-bm
-KX
-Wv
-kD
-kD
-"}
-(18,1,1) = {"
-Qs
-vk
-Pk
-TE
-Hz
-Qd
-Rw
-Yj
-GS
-iU
-Qs
-WK
-Lo
-dS
-sf
-xh
-lL
-lL
-lL
-lL
-oA
-cA
-yn
-wq
-wq
-wq
-wq
-wq
-wq
-wq
-RI
-"}
-(19,1,1) = {"
-Qs
-Qs
-Qs
-Qs
-PF
-ZJ
-qH
-Vf
-xr
-LE
-Qs
-Ma
-LV
-MT
-Os
-FJ
-lL
-XX
-aV
-lL
-pD
-cA
-gN
-wq
-FU
-uA
-Ud
-fy
-tt
-wc
-wq
-"}
-(20,1,1) = {"
-Qs
-kf
-GH
-Tq
-nT
-uj
-US
-Yj
-Bw
-cP
-Qs
-Gr
-Sk
-jw
-eU
-sQ
-lL
-FM
-FI
-lL
-IB
-Hj
-IB
-wq
-gv
-dA
-fn
-iT
-Tb
-uJ
-wq
-"}
-(21,1,1) = {"
-Qs
-JS
-ql
-UN
-Dx
-SA
-fk
-dc
-bb
-wI
-Qs
-Me
-Bs
-Ne
-LU
-fU
-lL
-hq
-hU
-lL
-Dh
-cA
-BU
-wq
-hb
-qa
-zx
-Hc
-tf
-IA
-wq
-"}
-(22,1,1) = {"
-Qs
-HE
-MG
-AI
-jp
-uj
-hV
-yu
-xr
-Tu
-Qs
-Nl
-Kd
-Vr
-Kd
-Kd
-Cb
-vW
-jU
-lL
-TQ
-cA
-gN
-wq
-fV
-fV
-fV
-wq
-Zl
-wq
-wq
-"}
-(23,1,1) = {"
-Qs
-fD
-BO
-Qs
-Qs
-td
-rY
-mF
-bZ
-JV
-Qs
-Tg
-qz
-wV
-Yw
-nJ
-lL
-hj
-ms
-lL
-cn
-mU
-Io
-Fe
-rA
-Mw
-jY
-cq
-El
-jZ
-wq
-"}
-(24,1,1) = {"
-DI
-MG
-DX
-Kc
-SJ
-Ie
-AE
-lQ
-fa
-Ua
-rg
-rg
-rg
-rg
-rg
-rg
-rg
-dC
-mq
-lL
-QZ
-Ug
-rL
-jh
-kl
-TO
-Yq
-QY
-Mp
-IR
-wq
-"}
-(25,1,1) = {"
-DI
-Le
-Vj
-SQ
-Xf
-Nz
-mp
-ws
-uP
-GC
-rg
-ah
-uH
-pJ
-ly
-Qr
-rg
-rg
-rg
-rg
-oA
-cA
-Uc
-Fe
-KV
-EY
-rF
-SO
-eB
-gD
-wq
-"}
-(26,1,1) = {"
-DI
-Kg
-ZR
-pF
-dQ
-jW
-TV
-Zr
-pq
-Qs
-rg
-lM
-qu
-yH
-WN
-Tp
-Vn
-BN
-rg
-rg
-by
-Rn
-Uc
-wq
-yf
-QK
-AH
-dx
-eB
-yp
-On
-"}
-(27,1,1) = {"
-qS
-Qs
-vH
-OF
-vH
-Qs
-Qs
-To
-Qs
-rg
-IG
-Lq
-xs
-CR
-Xw
-Ub
-pz
-Nq
-Ko
-rg
-NE
-Ad
-NE
-NE
-qR
-dt
-FL
-dt
-ZZ
-wQ
-On
-"}
-(28,1,1) = {"
-kD
-mt
-Ow
-fN
-JL
-Qs
-qj
-uD
-XJ
-xg
-Jv
-jP
-ia
-ia
-Eg
-We
-We
-hr
-SI
-rg
-gQ
-ut
-yX
-Up
-Mm
-XV
-cZ
-Es
-On
-ca
-yL
-"}
-(29,1,1) = {"
-kD
-mt
-cf
-lO
-fN
-Qs
-WI
-uD
-oP
-xg
-cN
-cN
-cN
-cN
-rg
-cN
-cN
-cN
-Iz
-rg
-QI
-Cd
-iQ
-Up
-wq
-wq
-ca
-ca
-On
-kD
-kD
-"}
-(30,1,1) = {"
-kD
-Qs
-Qs
-Qs
-Qs
-Qs
-Qs
-vQ
-Qs
-rg
-up
-ia
-ia
-ia
-Lx
-ia
-ia
-ia
-lc
-rg
-NE
-KZ
-NE
-NE
-rg
-rg
-kD
-kD
-kD
-kD
-kD
-"}
-(31,1,1) = {"
-kD
-kD
-Mb
-rg
-Ej
-ia
-GF
-vU
-pp
-Et
-Et
-We
-We
-We
-zA
-ia
-ia
-ia
-LS
-BT
-hw
-YK
-Ws
-ia
-Ls
-rg
-kD
-kD
-kD
-kD
-kD
-"}
-(32,1,1) = {"
-kD
-kD
-kD
-rg
-Ls
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-GN
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-Ls
-rg
-kD
-kD
-kD
-kD
-kD
-"}
-(33,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-SV
-ak
-Aq
-Aq
-Aq
-Aq
-Aq
-pU
-ia
-lc
-ia
-ak
-Aq
-Aq
-Aq
-Aq
-Aq
-pU
-gi
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(34,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-GN
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(35,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-GN
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(36,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-GN
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(37,1,1) = {"
-kD
-kD
-kD
-rg
-Ls
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-lc
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-Ls
-rg
-kD
-kD
-kD
-kD
-kD
-"}
-(38,1,1) = {"
-kD
-kD
-kD
-rg
-Ls
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-GN
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-Ls
-rg
-kD
-kD
-kD
-kD
-kD
-"}
-(39,1,1) = {"
-kD
-kD
-kD
-rg
-Ls
-ia
-Oh
-bR
-bR
-bR
-bR
-bR
-oC
-ia
-GN
-ia
-Oh
-bR
-bR
-bR
-bR
-bR
-oC
-ia
-Ls
-rg
-kD
-kD
-kD
-kD
-kD
-"}
-(40,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-GN
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(41,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-aP
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(42,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(43,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-ia
-ak
-Aq
-Aq
-Aq
-Aq
-Aq
-pU
-ia
-ia
-ia
-ak
-Aq
-Aq
-Aq
-Aq
-Aq
-pU
-ia
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(44,1,1) = {"
-kD
-kD
-kD
-rg
-Ls
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-ia
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-Ls
-rg
-kD
-kD
-kD
-kD
-kD
-"}
-(45,1,1) = {"
-kD
-kD
-kD
-rg
-Ls
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-ia
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-Ls
-rg
-kD
-kD
-kD
-kD
-kD
-"}
-(46,1,1) = {"
-kD
-kD
-kD
-rg
-Ls
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-ia
-ia
-Jj
-ON
-wl
-wl
-wl
-wl
-Sp
-ia
-Ls
-rg
-kD
-kD
-kD
-kD
-kD
-"}
-(47,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-ia
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-ia
-ia
-Jj
-IK
-wl
-wl
-wl
-wl
-Sp
-ia
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(48,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-SV
-Jj
-wl
-wl
-wl
-wl
-wl
-Sp
-ia
-ia
-ia
-Jj
-lH
-wl
-wl
-wl
-wl
-Sp
-gi
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(49,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-ia
-Oh
-bR
-bR
-bR
-bR
-bR
-oC
-ia
-ia
-ia
-Oh
-bR
-bR
-bR
-bR
-bR
-oC
-ia
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(50,1,1) = {"
-kD
-kD
-kD
-xI
-Ls
-Ls
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-Ls
-Ls
-xI
-kD
-kD
-kD
-kD
-kD
-"}
-(51,1,1) = {"
-kD
-kD
-kD
-Md
-rg
-Ls
-Ls
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-Ls
-Ls
-rg
-Md
-kD
-kD
-kD
-kD
-kD
-"}
-(52,1,1) = {"
-kD
-kD
-kD
-kD
-Md
-rg
-Ls
-Ls
-Ls
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-ia
-Ls
-Ls
-Ls
-rg
-Md
-kD
-kD
-kD
-kD
-kD
-kD
-"}
-(53,1,1) = {"
-kD
-kD
-kD
-kD
-kD
-Md
-rg
-rg
-Ls
-Ls
-Ls
-ia
-ia
-ia
-Ut
-ia
-ia
-ia
-Ls
-Ls
-Ls
-rg
-rg
-Md
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-"}
-(54,1,1) = {"
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-Md
-rg
-rg
-Ls
-Ls
-Ls
-Ls
-Ls
-Ls
-Ls
-Ls
-Ls
-rg
-rg
-Md
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-"}
-(55,1,1) = {"
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-Md
-rg
-rg
-Wb
-Wb
-Wb
-Wb
-Wb
-rg
-rg
-Md
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-"}
-(56,1,1) = {"
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-kD
-"}
diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
index 0cd79289edec..ce77d98f5833 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
@@ -55,12 +55,12 @@
req_access = list(20)
},
/obj/item/storage/backpack/security,
-/obj/item/clothing/under/syndicate/combat,
-/obj/item/clothing/suit/armor/vest/capcarapace/syndicate,
-/obj/item/clothing/shoes/jackboots,
+/obj/item/clothing/under/syndicate/ngr/officer,
+/obj/item/clothing/suit/armor/ngr/captain,
+/obj/item/clothing/shoes/combat,
/obj/item/clothing/gloves/combat,
/obj/item/clothing/glasses/hud/security/sunglasses/eyepatch,
-/obj/item/clothing/head/HoS/syndicate,
+/obj/item/clothing/head/ngr/peaked,
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/gun/ballistic/revolver,
/obj/item/ammo_box/a357/match,
@@ -75,10 +75,6 @@
icon_state = "syndicate";
name = "armor locker"
},
-/obj/item/clothing/suit/armor/vest/syndie,
-/obj/item/clothing/suit/armor/vest/syndie,
-/obj/item/clothing/head/helmet/operator,
-/obj/item/clothing/head/helmet/operator,
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/radio/intercom/directional/west{
pixel_y = -5
@@ -91,6 +87,12 @@
/obj/machinery/light/small/directional/west{
pixel_y = 7
},
+/obj/item/clothing/glasses/hud/security/sunglasses/ngr,
+/obj/item/clothing/glasses/hud/security/sunglasses/ngr,
+/obj/item/clothing/suit/armor/ngr,
+/obj/item/clothing/suit/armor/ngr,
+/obj/item/clothing/head/helmet/ngr,
+/obj/item/clothing/head/helmet/ngr,
/turf/open/floor/mineral/plastitanium,
/area/ship/security/armory)
"bN" = (
@@ -882,14 +884,10 @@
"pt" = (
/obj/effect/turf_decal/industrial/outline,
/obj/item/clothing/shoes/workboots/mining,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/item/clothing/gloves/explorer,
/obj/item/clothing/accessory/armband/cargo,
/obj/item/storage/belt/mining,
/obj/item/clothing/glasses/meson,
/obj/item/clothing/glasses/welding,
-/obj/item/clothing/head/hardhat/orange,
-/obj/item/clothing/head/soft/grey,
/obj/machinery/light/small/directional/north,
/obj/structure/closet/secure_closet{
anchored = 1;
@@ -899,15 +897,9 @@
},
/obj/machinery/firealarm/directional/east,
/obj/effect/turf_decal/industrial/outline,
-/obj/item/clothing/shoes/workboots/mining,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/item/clothing/gloves/explorer,
-/obj/item/clothing/accessory/armband/cargo,
-/obj/item/storage/belt/mining,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/welding,
-/obj/item/clothing/head/hardhat/orange,
-/obj/item/clothing/head/soft/grey,
+/obj/item/clothing/under/syndicate/ngr/jumpsuit,
+/obj/item/clothing/suit/hazardvest/ngr,
+/obj/item/clothing/head/hardhat/ngr,
/turf/open/floor/plasteel/tech/grid,
/area/ship/storage)
"pu" = (
@@ -1028,14 +1020,10 @@
req_access = list(11)
},
/obj/item/clothing/shoes/workboots,
-/obj/item/clothing/under/syndicate/gorlex,
/obj/item/clothing/accessory/armband/engine,
-/obj/item/clothing/suit/hazardvest,
/obj/item/storage/belt/utility,
/obj/item/clothing/glasses/meson,
/obj/item/clothing/glasses/welding,
-/obj/item/clothing/head/hardhat,
-/obj/item/clothing/head/soft/yellow,
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/south,
/obj/machinery/light_switch{
@@ -1043,6 +1031,9 @@
pixel_y = -16;
pixel_x = -12
},
+/obj/item/clothing/under/syndicate/ngr,
+/obj/item/clothing/suit/hazardvest/ngr,
+/obj/item/clothing/head/hardhat/ngr,
/turf/open/floor/plasteel/tech/grid,
/area/ship/storage)
"rM" = (
@@ -1059,7 +1050,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/structure/chair/sofa/left,
+/obj/structure/chair/sofa/brown/left/directional/south,
/obj/effect/landmark/start/assistant,
/turf/open/floor/carpet/red,
/area/ship/crew)
@@ -1154,15 +1145,14 @@
req_access = list(48)
},
/obj/item/clothing/shoes/workboots/mining,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/item/clothing/gloves/explorer,
/obj/item/clothing/accessory/armband/cargo,
/obj/item/storage/belt/mining,
/obj/item/clothing/glasses/meson,
/obj/item/clothing/glasses/welding,
-/obj/item/clothing/head/hardhat/orange,
-/obj/item/clothing/head/soft/grey,
/obj/machinery/airalarm/directional/north,
+/obj/item/clothing/under/syndicate/ngr/jumpsuit,
+/obj/item/clothing/suit/hazardvest/ngr,
+/obj/item/clothing/head/hardhat/ngr,
/turf/open/floor/plasteel/tech/grid,
/area/ship/storage)
"tI" = (
@@ -1340,6 +1330,18 @@
/area/ship/crew)
"wP" = (
/obj/effect/turf_decal/industrial/outline,
+/obj/structure/closet/crate{
+ name = "desert equipment crate";
+ desc = "A rectangular steel crate containing supplies to survive a desert environment more easily."
+ },
+/obj/item/clothing/neck/shemagh/ngr,
+/obj/item/clothing/neck/shemagh/ngr,
+/obj/item/clothing/neck/shemagh/ngr,
+/obj/item/clothing/neck/shemagh/ngr,
+/obj/item/clothing/head/ngr/flap,
+/obj/item/clothing/head/ngr/flap,
+/obj/item/clothing/head/ngr/flap,
+/obj/item/clothing/head/ngr/flap,
/turf/open/floor/plasteel/mono/dark,
/area/ship/cargo)
"xm" = (
@@ -1486,34 +1488,35 @@
/turf/open/floor/plasteel/mono/dark,
/area/ship/cargo)
"zq" = (
-/obj/structure/closet/wall/red{
- dir = 8;
- name = "uniform closet";
- pixel_x = 28
- },
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/under/syndicate/skirt,
-/obj/item/clothing/under/syndicate/skirt,
-/obj/item/clothing/under/syndicate/skirt,
-/obj/item/clothing/under/syndicate/skirt,
-/obj/item/clothing/under/syndicate,
-/obj/item/clothing/under/syndicate,
-/obj/item/clothing/under/syndicate,
-/obj/item/clothing/under/syndicate,
-/obj/item/clothing/head/soft/black,
-/obj/item/clothing/head/soft/black,
-/obj/item/clothing/head/soft/black,
-/obj/item/clothing/head/soft/black,
+/obj/structure/closet/wall/red/directional/east{
+ name = "uniform closet"
+ },
+/obj/item/tank/jetpack/suit,
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/under/syndicate/ngr,
+/obj/item/clothing/under/syndicate/ngr,
+/obj/item/clothing/under/syndicate/ngr,
+/obj/item/clothing/under/syndicate/ngr,
/obj/structure/cable{
icon_state = "1-8"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
+ },
+/obj/item/clothing/under/syndicate/ngr/jumpsuit,
+/obj/item/clothing/under/syndicate/ngr/jumpsuit,
+/obj/item/clothing/under/syndicate/ngr/jumpsuit,
+/obj/item/clothing/under/syndicate/ngr/jumpsuit,
+/obj/item/clothing/head/ngr,
+/obj/item/clothing/head/ngr,
+/obj/item/clothing/head/ngr,
+/obj/item/clothing/head/ngr,
/obj/item/radio,
/obj/item/radio,
/obj/item/radio,
@@ -1521,12 +1524,6 @@
/obj/item/radio,
/obj/item/radio,
/obj/item/radio,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
- },
/turf/open/floor/plasteel/dark,
/area/ship/crew/dorm)
"zA" = (
@@ -1558,9 +1555,7 @@
/turf/open/floor/plating,
/area/ship/maintenance/starboard)
"Af" = (
-/obj/structure/closet/emcloset/wall{
- pixel_y = 28
- },
+/obj/structure/closet/emcloset/wall/directional/north,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plasteel/mono/dark,
/area/ship/cargo)
@@ -1650,19 +1645,14 @@
name = "foreman's locker";
req_access = list(56)
},
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/item/clothing/suit/toggle/industrial,
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/under/syndicate/ngr/officer,
/obj/item/clothing/gloves/combat,
/obj/item/storage/belt/utility/chief{
name = "\improper Foreman's toolbelt"
},
/obj/item/clothing/glasses/meson,
/obj/item/clothing/glasses/welding,
-/obj/item/clothing/head/hardhat/white,
-/obj/item/clothing/head/beret/ce{
- name = "foreman beret"
- },
/obj/item/storage/toolbox/syndicate,
/obj/item/wrench/combat,
/obj/item/ammo_box/magazine/m10mm,
@@ -1670,6 +1660,8 @@
/obj/item/clothing/accessory/holster,
/obj/item/grenade/chem_grenade/metalfoam,
/obj/machinery/airalarm/directional/west,
+/obj/item/clothing/suit/ngr,
+/obj/item/clothing/head/hardhat/ngr/foreman,
/obj/item/tank/jetpack/suit,
/turf/open/floor/carpet/red,
/area/ship/cargo/office)
@@ -1700,7 +1692,7 @@
dir = 4;
pixel_x = -20
},
-/obj/item/clothing/suit/space/hardsuit/syndi/sbg,
+/obj/item/clothing/suit/space/hardsuit/syndi/ngr,
/obj/item/clothing/mask/gas/syndicate,
/turf/open/floor/carpet/black,
/area/ship/bridge)
@@ -1946,9 +1938,7 @@
/turf/open/floor/carpet/red,
/area/ship/crew/dorm)
"Gj" = (
-/obj/structure/chair/sofa/corner{
- dir = 4
- },
+/obj/structure/chair/sofa/brown/corner/directional/east,
/obj/machinery/power/apc/auto_name/directional/west,
/obj/structure/cable{
icon_state = "0-4"
@@ -2395,6 +2385,8 @@
/obj/structure/cable{
icon_state = "1-8"
},
+/obj/machinery/power/ship_gravity,
+/obj/structure/cable,
/turf/open/floor/plating,
/area/ship/maintenance/starboard)
"Oy" = (
@@ -2799,9 +2791,7 @@
/area/ship/hallway/central)
"Tq" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/chair/sofa/right{
- dir = 4
- },
+/obj/structure/chair/sofa/brown/right/directional/east,
/obj/effect/landmark/start/assistant,
/obj/structure/extinguisher_cabinet/directional/north,
/obj/structure/extinguisher_cabinet/directional/west,
@@ -3161,9 +3151,7 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/structure/closet/emcloset/wall{
- pixel_y = 28
- },
+/obj/structure/closet/emcloset/wall/directional/north,
/turf/open/floor/plasteel/tech,
/area/ship/hallway/central)
"Yc" = (
diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
index 4500ef61d3ba..445b6391a30d 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
@@ -1,1007 +1,1030 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"ab" = (
-/obj/structure/railing{
+"ac" = (
+/obj/effect/turf_decal/industrial/warning/corner{
dir = 4
},
-/obj/effect/decal/cleanable/oil{
- icon_state = "streak4"
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 8
+ },
+/obj/structure/railing/corner{
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
+ dir = 10
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
- },
-/obj/structure/cable,
-/obj/machinery/power/terminal,
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"ah" = (
-/obj/item/clothing/under/syndicate/combat,
-/obj/item/clothing/mask/gas/syndicate,
-/obj/effect/turf_decal/techfloor{
dir = 10
},
-/obj/item/clothing/mask/gas/sechailer/balaclava,
-/obj/item/clothing/under/syndicate/skirt,
-/obj/structure/closet/syndicate{
- desc = "It's a basic storage unit.";
- name = "uniform closet"
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/turf/open/floor/mineral/plastitanium,
+/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"am" = (
+"ae" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/light/directional/west,
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"ah" = (
/obj/effect/turf_decal/spline/fancy/opaque/black{
- dir = 6
+ dir = 1
},
-/obj/structure/table/reinforced,
-/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/computer/med_data/laptop{
- dir = 1
+/obj/structure/cable{
+ icon_state = "1-2"
},
+/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer3,
+/obj/effect/turf_decal/industrial/outline/yellow,
+/turf/open/floor/plasteel/tech,
+/area/ship/engineering)
+"as" = (
/obj/effect/turf_decal/spline/fancy/opaque/black{
- dir = 6
+ dir = 9
},
-/turf/open/floor/pod,
-/area/ship/cargo)
-"an" = (
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
+/obj/structure/rack,
+/obj/item/storage/toolbox/syndicate{
+ name = "syndicate toolbox";
+ pixel_x = -3;
+ pixel_y = 5
},
-/obj/effect/turf_decal/industrial/warning/corner,
-/obj/structure/railing/corner{
+/obj/item/geiger_counter{
+ pixel_x = 1;
+ pixel_y = 5
+ },
+/obj/item/holosign_creator/atmos,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 9
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"aI" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+/obj/machinery/suit_storage_unit/inherit,
+/obj/item/clothing/mask/breath,
+/obj/item/clothing/suit/space/syndicate/black/med,
+/obj/item/clothing/head/helmet/space/syndicate/black/med,
+/obj/machinery/firealarm/directional/south,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/medical)
+"aL" = (
+/obj/machinery/vending/custom{
+ layer = 3.1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/effect/turf_decal/techfloor{
dir = 6
},
+/turf/open/floor/plasteel/tech,
+/area/ship/cargo)
+"aO" = (
+/obj/effect/turf_decal/techfloor{
+ dir = 8
+ },
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "0-4"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"ao" = (
-/obj/effect/decal/cleanable/plasma,
-/obj/structure/cable,
-/obj/machinery/power/terminal,
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"av" = (
-/obj/item/reagent_containers/food/snacks/canned/beans{
- pixel_x = -5;
- pixel_y = 3
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -19;
+ pixel_y = 12
},
-/obj/item/reagent_containers/food/snacks/canned/beans{
- pixel_x = 2;
- pixel_y = 3
+/obj/machinery/power/apc/auto_name/directional/west,
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ship/maintenance/port)
+"aY" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/syndicateemblem/bottom/right{
+ dir = 8
},
-/obj/structure/closet/crate{
- name = "food crate"
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"bm" = (
+/obj/machinery/door/window/eastright,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/medical)
+"bA" = (
+/obj/machinery/door/poddoor{
+ id = "syndie_warship_cargo";
+ name = "Cargo Hatch"
},
-/obj/effect/turf_decal/arrows{
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/cargo)
+"bM" = (
+/obj/effect/turf_decal/industrial/warning{
dir = 8
},
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/airalarm/directional/east,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 8
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 4
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/aft)
-"ax" = (
-/obj/machinery/computer/helm,
-/obj/effect/turf_decal/techfloor{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"cn" = (
+/obj/effect/turf_decal/industrial/warning/corner{
dir = 1
},
-/turf/open/floor/plasteel/tech,
-/area/ship/bridge)
-"aA" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/vomit/old,
-/obj/effect/turf_decal/industrial/warning{
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"cr" = (
+/obj/docking_port/stationary{
+ dwidth = 5;
+ height = 15;
+ width = 30
+ },
+/turf/template_noop,
+/area/template_noop)
+"cG" = (
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning/corner{
dir = 8
},
-/obj/item/stack/ore/salvage/scrapbluespace,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/tech,
-/area/ship/maintenance/starboard)
-"aL" = (
-/obj/machinery/computer/operating{
- dir = 1
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"dc" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
},
-/turf/open/floor/pod/dark,
-/area/ship/medical)
-"aR" = (
-/obj/item/clothing/shoes/jackboots,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating/rust,
+/area/ship/maintenance/starboard)
+"dD" = (
/obj/item/clothing/mask/gas/syndicate,
/obj/effect/turf_decal/techfloor{
- dir = 6
+ dir = 10
},
-/obj/item/clothing/head/beret/black,
-/obj/item/clothing/under/syndicate,
/obj/structure/closet/syndicate{
desc = "It's a basic storage unit.";
name = "uniform closet"
},
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/under/syndicate/hardliners,
/turf/open/floor/mineral/plastitanium,
/area/ship/hallway/central)
-"aU" = (
-/obj/structure/table/reinforced{
- color = "#c1b6a5"
+"dG" = (
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 5
},
-/obj/machinery/cell_charger,
/obj/structure/railing{
- dir = 4
+ dir = 5;
+ layer = 2.9
},
-/obj/item/stock_parts/cell/high,
-/obj/item/stock_parts/cell/high,
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/structure/bed/dogbed,
+/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child{
+ faction = list("neutral","playerSyndicate");
+ name = "Goliath";
+ environment_smash = 0;
+ desc = "A little guy."
},
-/obj/structure/cable{
- icon_state = "0-2"
+/obj/effect/decal/cleanable/wrapping,
+/turf/open/floor/plasteel/tech,
+/area/ship/bridge)
+"dJ" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"aX" = (
-/obj/effect/turf_decal/industrial/warning,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"bg" = (
/obj/structure/railing{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/stairs{
- icon = 'icons/obj/stairs.dmi'
+ icon_state = "0-8"
},
-/area/ship/maintenance/starboard)
-"bk" = (
-/obj/structure/frame/computer,
-/obj/effect/turf_decal/techfloor{
- dir = 1
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 19;
+ pixel_y = -12
},
-/turf/open/floor/plasteel/tech,
-/area/ship/bridge)
-"bn" = (
-/obj/structure/bookcase/random/fiction,
-/obj/effect/turf_decal/siding/wood{
- dir = 9
+/obj/machinery/power/apc/auto_name/directional/east,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"dL" = (
+/obj/machinery/power/smes{
+ charge = 5e+006
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/firealarm/directional/west,
-/obj/machinery/light_switch{
- pixel_x = -13;
- pixel_y = 22
+/obj/effect/turf_decal/industrial/radiation{
+ dir = 8
},
-/turf/open/floor/holofloor/wood,
-/area/ship/crew/dorm)
-"bs" = (
-/obj/effect/spawner/lootdrop/salvage_capacitor,
-/obj/effect/decal/cleanable/shreds,
+/obj/structure/cable,
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plating,
-/area/ship/maintenance/port)
-"bv" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "Syndie_warship_lockdown";
- name = "Lockdown Shutters"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/hallway/central)
-"bE" = (
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/plasteel/tech,
+/area/ship/engineering)
+"dR" = (
/obj/effect/turf_decal/industrial/warning{
- dir = 9
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/security/armory)
-"bI" = (
-/obj/effect/spawner/lootdrop/salvage_manipulator,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/industrial/warning,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/turf/open/floor/plating{
- icon_state = "panelscorched"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/area/ship/maintenance/starboard)
-"bR" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/light/dim/directional/west,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/extinguisher_cabinet/directional/north,
-/turf/open/floor/plasteel/tech,
-/area/ship/maintenance/starboard)
-"bS" = (
-/obj/effect/turf_decal/techfloor{
- dir = 8
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/structure/table/reinforced,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/radio{
- desc = "An old handheld radio. You could use it, if you really wanted to.";
- icon_state = "radio";
- name = "old radio";
- pixel_x = 2;
- pixel_y = 9
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/obj/item/flashlight/lantern{
- pixel_x = -6;
- pixel_y = 9
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/aft)
+"dS" = (
+/obj/structure/tank_dispenser/oxygen,
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
},
-/obj/item/storage/box/gum{
- pixel_x = 2;
- pixel_y = -3
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 23;
+ pixel_y = -8
},
-/obj/item/pen/edagger{
- pixel_x = -3
+/obj/machinery/light/small/directional/east{
+ pixel_y = 2
},
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"co" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"dV" = (
+/obj/effect/turf_decal/industrial/warning/cee,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/effect/turf_decal/techfloor/corner,
-/obj/effect/turf_decal/techfloor/corner{
- dir = 8
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"dY" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 6
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/railing{
+ dir = 6
},
+/obj/machinery/light/directional/east,
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"cu" = (
-/obj/docking_port/stationary{
- dwidth = 5;
- width = 30;
- height = 15;
- dir = 8
+"ea" = (
+/obj/machinery/porta_turret/ship/syndicate/weak{
+ dir = 6
},
-/turf/template_noop,
-/area/template_noop)
-"cz" = (
-/obj/effect/turf_decal/industrial/warning{
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/bridge)
+"en" = (
+/obj/structure/railing/corner{
dir = 8
},
-/obj/effect/turf_decal/syndicateemblem/middle/left,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"cR" = (
-/obj/machinery/door/airlock/hatch{
- name = "Cargo Bay"
+/turf/open/floor/plasteel/stairs{
+ dir = 1
+ },
+/area/ship/crew/dorm)
+"eo" = (
+/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
+ dir = 5
},
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "0-8"
+ },
+/obj/machinery/light_switch{
+ pixel_y = 21;
+ pixel_x = 12
},
+/obj/machinery/power/apc/auto_name/directional/north,
/turf/open/floor/mineral/plastitanium,
+/area/ship/crew/canteen)
+"es" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/techfloor{
+ dir = 4
+ },
+/turf/open/floor/plasteel/telecomms_floor,
/area/ship/cargo)
-"cV" = (
-/obj/machinery/power/shuttle/engine/electric{
- dir = 1
+"ew" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"cZ" = (
-/obj/structure/table/reinforced,
-/obj/machinery/light/directional/west,
-/obj/effect/turf_decal/industrial/fire{
+/obj/effect/turf_decal/industrial/warning{
dir = 4
},
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/firealarm/directional/north,
-/obj/item/radio/intercom/directional/west,
-/obj/item/t_scanner{
- pixel_x = -7;
- pixel_y = 3
- },
-/obj/item/switchblade{
- pixel_x = -5;
- pixel_y = -6
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/item/trash/syndi_cakes,
-/obj/item/trash/can,
-/obj/item/suppressor{
- pixel_y = 11
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/aft)
+"ez" = (
+/obj/machinery/holopad/emergency/command,
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/item/gun/ballistic/automatic/pistol{
- pixel_x = 4;
- pixel_y = -14
+/turf/open/floor/plasteel/tech,
+/area/ship/bridge)
+"eK" = (
+/obj/effect/turf_decal/borderfloor,
+/obj/effect/decal/cleanable/generic{
+ pixel_x = -12;
+ pixel_y = 7
},
-/turf/open/floor/pod/dark,
-/area/ship/security/armory)
-"dm" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/mask/gas/syndicate,
+/obj/structure/closet/secure_closet/wall/directional/south{
+ icon_state = "sec_wall";
+ name = "Bridge Officer's Locker";
+ req_access_txt = "57"
},
-/obj/machinery/airalarm/directional/south,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/melee/classic_baton/telescopic,
+/obj/item/radio/headset/syndicate,
+/obj/item/megaphone{
+ pixel_x = -2
},
+/obj/item/clothing/under/syndicate/cybersun/officer,
+/obj/item/clothing/suit/cybersun_suit,
+/obj/item/clothing/head/HoS/cybersun,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
-"dp" = (
-/obj/item/scalpel{
- pixel_y = 16
+"eN" = (
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 9
},
/obj/structure/table/reinforced,
-/obj/item/bodypart/l_arm/robot{
+/obj/item/paper_bin{
pixel_x = -6
},
-/obj/item/bodypart/r_arm/robot{
- pixel_x = 6
- },
-/obj/item/hemostat,
-/turf/open/floor/pod/dark,
-/area/ship/medical)
-"dv" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
+/obj/item/pen{
+ pixel_x = -6
},
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/ammo_box/magazine/m10mm,
-/obj/item/ammo_box/magazine/m10mm,
-/obj/item/ammo_box/c10mm,
-/obj/item/ammo_box/c10mm,
-/obj/structure/closet/secure_closet/wall{
- dir = 1;
- icon_state = "sec_wall";
- name = "Ammo locker";
- pixel_y = -29;
- req_access_txt = "1"
+/obj/item/stamp/qm{
+ pixel_x = 6;
+ pixel_y = 9
},
-/obj/item/ammo_box/magazine/m10mm,
-/obj/item/ammo_box/magazine/m12g,
-/obj/item/ammo_box/magazine/m12g,
-/obj/item/ammo_box/magazine/smgm45,
-/obj/item/ammo_box/magazine/smgm45,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/security/armory)
-"dw" = (
-/obj/effect/spawner/lootdrop/salvage_matter_bin,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
+/obj/item/stamp{
+ pixel_x = 6;
+ pixel_y = 4
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/item/stamp/denied{
+ pixel_x = 6;
+ pixel_y = -1
},
-/turf/open/floor/plating,
-/area/ship/maintenance/starboard)
-"dz" = (
-/obj/machinery/door/firedoor,
-/obj/structure/barricade/wooden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 8
},
-/obj/machinery/door/airlock/hatch{
- name = "Starboard Maintenance"
+/obj/item/toy/figure/cargotech{
+ pixel_x = -8;
+ pixel_y = 15
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/maintenance/starboard)
-"dF" = (
-/obj/structure/sign/poster/contraband/random{
- pixel_x = 32
+/turf/open/floor/pod,
+/area/ship/cargo)
+"eR" = (
+/obj/effect/turf_decal/steeldecal/steel_decals_central4{
+ dir = 1
},
+/turf/open/floor/plasteel/tech,
+/area/ship/cargo)
+"eW" = (
+/obj/effect/decal/cleanable/cobweb,
+/obj/machinery/blackbox_recorder,
+/turf/open/floor/engine,
+/area/ship/bridge)
+"eX" = (
/obj/effect/turf_decal/industrial/warning{
- dir = 4
+ dir = 1
},
-/obj/effect/turf_decal/syndicateemblem/top/right,
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"dG" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 4
+"eY" = (
+/obj/effect/turf_decal/box,
+/obj/effect/turf_decal/industrial/outline/yellow,
+/obj/machinery/button/door{
+ dir = 8;
+ id = "syndiewarship_armorybay";
+ name = "Weapon Hold";
+ pixel_x = 25;
+ pixel_y = 7
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 8
+/obj/effect/turf_decal/techfloor,
+/obj/machinery/suit_storage_unit/inherit,
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 24;
+ pixel_y = -2
+ },
+/obj/item/clothing/suit/space/hardsuit/syndi/hl,
+/obj/item/clothing/mask/gas/syndicate,
+/obj/machinery/camera/autoname{
+ dir = 1
},
+/turf/open/floor/mineral/plastitanium,
+/area/ship/security/armory)
+"fd" = (
+/obj/effect/turf_decal/trimline/transparent/bar/filled/line,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/structure/cable{
- icon_state = "2-8"
+/turf/open/floor/mineral/plastitanium,
+/area/ship/crew/canteen)
+"fn" = (
+/obj/machinery/button/door{
+ dir = 8;
+ id = "Syndie_warship_lockdown";
+ name = "Lockdown Control";
+ pixel_x = 26
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"dO" = (
-/obj/machinery/door/poddoor/shutters{
- id = "syndiewarship_armorybay";
- name = "Weapon Hold"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
},
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/railing{
+ dir = 4
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/security/armory)
-"dR" = (
-/obj/structure/salvageable/computer,
-/obj/effect/decal/cleanable/wrapping,
-/obj/machinery/firealarm/directional/west,
-/turf/open/floor/circuit/green/off,
-/area/ship/maintenance/port)
-"dT" = (
-/obj/machinery/computer/secure_data/syndie{
- dir = 8
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 4
},
-/obj/effect/turf_decal/techfloor{
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
dir = 4
},
-/obj/machinery/power/apc/auto_name/directional/east,
/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"ea" = (
-/obj/machinery/porta_turret/ship/syndicate/heavy{
- dir = 6
+ icon_state = "2-8"
},
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/bridge)
-"em" = (
-/obj/machinery/light/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"ft" = (
/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/obj/effect/turf_decal/industrial/warning/corner{
dir = 8
},
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"fD" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
/obj/structure/cable{
- icon_state = "2-8"
+ icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"es" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/sign/poster/ripped{
- pixel_x = 32
+/obj/machinery/light_switch{
+ pixel_y = -23;
+ pixel_x = 3;
+ dir = 1
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+/turf/open/floor/plasteel/stairs{
dir = 8
},
-/obj/machinery/button/door{
- dir = 8;
- id = "Artillery2shutter";
- name = "Artillery Hatch";
- pixel_x = 29;
- pixel_y = -4
+/area/ship/bridge)
+"fX" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/obj/machinery/button/shieldwallgen{
+/obj/machinery/door/poddoor/shutters/preopen{
dir = 8;
- id = "komodo_starboard";
- pixel_x = 28;
- pixel_y = 6
+ id = "Syndie_warship_lockdown";
+ name = "Lockdown Shutters"
},
-/turf/open/floor/plasteel/dark,
-/area/ship/maintenance/starboard)
-"ew" = (
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/door/firedoor/border_only{
dir = 8
},
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/door/firedoor/border_only{
dir = 4
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/hallway/central)
+"fZ" = (
+/obj/structure/railing,
+/obj/effect/decal/cleanable/glass{
+ dir = 8
+ },
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/aft)
-"ex" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/chair/office{
- dir = 8;
- name = "tactical swivel chair"
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/rack,
+/obj/item/grenade/chem_grenade/smart_metal_foam{
+ pixel_x = 2;
+ pixel_y = 8
+ },
+/obj/item/grenade/chem_grenade/smart_metal_foam{
+ pixel_x = -2;
+ pixel_y = 6
+ },
+/obj/item/storage/belt/utility{
+ pixel_x = 3;
+ pixel_y = 5
+ },
+/obj/item/storage/belt/utility{
+ pixel_y = -3
+ },
+/obj/item/clothing/shoes/magboots/syndie{
+ pixel_x = -6;
+ pixel_y = -5
+ },
+/obj/item/clothing/head/beret/eng/hazard{
+ pixel_x = -5;
+ pixel_y = 4
},
-/turf/open/floor/pod,
-/area/ship/cargo)
-"eD" = (
-/obj/structure/cable,
-/obj/machinery/power/terminal,
/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
-"eE" = (
-/obj/machinery/light/directional/south,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 1
- },
-/obj/machinery/firealarm/directional/south,
-/obj/structure/cable{
- icon_state = "4-8"
+"gk" = (
+/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
+/obj/machinery/door/poddoor/shutters{
+ id = "syndiewarship_windows";
+ name = "Blast Shutters"
},
-/obj/structure/cable{
- icon_state = "1-8"
+/turf/open/floor/plating,
+/area/ship/hallway/central)
+"gr" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 9
},
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"eW" = (
-/obj/structure/closet/crate,
-/obj/effect/decal/cleanable/cobweb,
-/obj/item/blackbox,
-/obj/item/storage/toolbox/infiltrator,
-/obj/machinery/light_switch{
- dir = 1;
- pixel_x = -10;
- pixel_y = -19
+/obj/effect/turf_decal/techfloor/corner{
+ dir = 1
},
-/turf/open/floor/engine,
-/area/ship/bridge)
-"eX" = (
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 4
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"gu" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/syndicateemblem/middle/middle{
+ dir = 8
},
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/effect/landmark/observer_start,
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"eY" = (
-/obj/effect/turf_decal/industrial/warning/corner,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 8
+"gC" = (
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 10
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"fc" = (
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/industrial/warning{
- dir = 5
+/obj/structure/table/reinforced,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/computer/med_data/laptop{
+ dir = 4
},
-/obj/structure/railing{
- dir = 5
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 10
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"fg" = (
-/obj/machinery/suit_storage_unit/inherit/industrial,
-/obj/item/clothing/suit/space/syndicate/black/engie,
-/obj/item/clothing/head/helmet/space/syndicate/black/engie,
-/obj/effect/turf_decal/techfloor{
+/turf/open/floor/pod,
+/area/ship/cargo)
+"gE" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/security/armory)
+"gM" = (
+/obj/effect/turf_decal/industrial/warning/corner{
dir = 8
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/engineering)
-"fk" = (
-/obj/machinery/computer/mech_bay_power_console{
+/obj/effect/turf_decal/industrial/warning/corner{
dir = 1
},
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/techfloor{
- dir = 6
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/effect/decal/cleanable/blood/old{
- pixel_x = -14;
- pixel_y = 6
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/turf/open/floor/plasteel/telecomms_floor,
-/area/ship/cargo)
-"ft" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
+/obj/structure/cable{
+ icon_state = "4-8"
},
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"fE" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "Syndie_warship_lockdown";
- name = "Lockdown Shutters"
+"gN" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/maintenance/port)
+"gQ" = (
+/obj/structure/railing{
+ dir = 1;
+ layer = 2.8
},
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
+/obj/item/clothing/mask/gas/syndicate,
+/obj/effect/turf_decal/techfloor{
+ dir = 8
},
-/turf/open/floor/plasteel/tech/grid,
+/obj/structure/closet/syndicate{
+ desc = "It's a basic storage unit.";
+ name = "uniform closet"
+ },
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -23;
+ pixel_y = 4
+ },
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/under/syndicate/hardliners,
+/turf/open/floor/mineral/plastitanium,
/area/ship/hallway/central)
-"gd" = (
-/obj/effect/turf_decal/siding/wood,
-/obj/structure/closet/wall{
- dir = 1;
- name = "Utility Closet";
- pixel_y = -30
+"hk" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/obj/item/radio,
-/obj/item/radio,
-/obj/item/radio,
-/obj/item/radio,
-/obj/item/flashlight,
-/obj/item/flashlight,
-/obj/item/flashlight,
-/obj/item/flashlight,
-/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/industrial/warning,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+/obj/effect/turf_decal/techfloor/corner{
dir = 8
},
-/turf/open/floor/holofloor/wood,
-/area/ship/crew/dorm)
-"gh" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/techfloor{
+/obj/effect/turf_decal/techfloor/corner{
dir = 1
},
-/turf/open/floor/plasteel/telecomms_floor,
-/area/ship/cargo)
-"gj" = (
-/obj/effect/turf_decal/techfloor{
- dir = 6
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/structure/closet/crate,
-/obj/item/radio/intercom/directional/east,
-/obj/effect/spawner/lootdrop/costume,
-/obj/item/storage/box/emptysandbags,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"gp" = (
-/obj/machinery/button/door{
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"ho" = (
+/obj/item/kirbyplants/random,
+/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
+ dir = 9
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/crew/canteen)
+"hr" = (
+/obj/machinery/door/poddoor{
dir = 8;
- id = "syndiewarship_armorybay";
- name = "Weapon Hold";
- pixel_x = 28;
- req_access_txt = "3"
+ id = "Artillery2shutter"
+ },
+/obj/machinery/power/shieldwallgen/atmos{
+ anchored = 1;
+ dir = 1;
+ id = "komodo_starboard";
+ locked = 1
},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "0-8"
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/security/armory)
-"gq" = (
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/maintenance/starboard)
+"hy" = (
+/obj/effect/decal/cleanable/food/flour,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 9
},
-/obj/effect/turf_decal/industrial/warning/corner,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/railing/corner{
- dir = 1
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
},
+/obj/structure/catwalk/over,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+ dir = 5
},
+/turf/open/floor/plating,
+/area/ship/engineering)
+"hJ" = (
+/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/cable{
icon_state = "4-8"
},
+/turf/open/floor/plasteel/tech,
+/area/ship/bridge)
+"hL" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 5
+ },
+/obj/structure/railing{
+ dir = 5
+ },
+/obj/machinery/light/directional/east,
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"gt" = (
-/obj/item/stack/ore/salvage/scraptitanium,
-/obj/structure/cable{
- icon_state = "1-2"
+"hO" = (
+/obj/machinery/cryopod{
+ dir = 1
},
-/turf/open/floor/plating{
- icon_state = "platingdmg1"
+/obj/structure/railing{
+ dir = 8
},
-/area/ship/maintenance/starboard)
-"gw" = (
-/obj/structure/table/reinforced,
-/obj/item/toy/cards/deck/syndicate,
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
- dir = 6
+/obj/effect/turf_decal/industrial/warning{
+ dir = 9
},
-/obj/item/spacecash/bundle/c1000{
- pixel_x = 5;
- pixel_y = 11
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod/dark,
+/area/ship/crew/dorm)
+"hV" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/decal/cleanable/greenglow,
+/obj/effect/decal/cleanable/plasma,
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/item/spacecash/bundle/c1000{
- pixel_x = 3;
- pixel_y = 8
+/turf/open/floor/plating,
+/area/ship/maintenance/port)
+"hY" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/engineering)
+"ib" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
},
-/obj/item/reagent_containers/food/drinks/beer{
- pixel_x = -7;
- pixel_y = 3
+/turf/open/floor/holofloor/wood,
+/area/ship/bridge)
+"ic" = (
+/obj/structure/table/wood,
+/obj/structure/bedsheetbin,
+/obj/structure/railing,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/carpet/red_gold,
+/area/ship/crew/dorm)
+"io" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/vomit/old,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"gy" = (
-/obj/effect/turf_decal/steeldecal/steel_decals8,
-/obj/structure/chair/comfy/shuttle{
- dir = 1;
- name = "Helm"
+/obj/item/stack/ore/salvage/scrapbluespace,
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/structure/railing/corner,
/turf/open/floor/plasteel/tech,
+/area/ship/maintenance/starboard)
+"ip" = (
+/obj/machinery/computer/med_data/syndie,
+/obj/effect/turf_decal/techfloor{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/plasteel/dark,
/area/ship/bridge)
-"gE" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/security/armory)
-"gH" = (
-/obj/machinery/light/directional/east,
-/obj/effect/turf_decal/spline/fancy/opaque/black{
+"iH" = (
+/obj/machinery/computer/mech_bay_power_console{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/techfloor{
dir = 10
},
-/obj/machinery/mineral/ore_redemption{
- dir = 1;
- output_dir = 1
+/obj/effect/decal/cleanable/blood/old{
+ pixel_x = -14;
+ pixel_y = 6
},
-/turf/open/floor/pod,
+/turf/open/floor/plasteel/telecomms_floor,
/area/ship/cargo)
-"gJ" = (
+"iJ" = (
/obj/effect/turf_decal/siding/wood{
- dir = 6
+ dir = 8
},
-/obj/structure/closet/wall{
- dir = 1;
- name = "uniform closet";
- pixel_y = -30
+/obj/structure/closet/wall/directional/west{
+ name = "Utility Closet"
},
+/obj/item/radio,
+/obj/item/radio,
+/obj/item/radio,
+/obj/item/radio,
+/obj/item/flashlight,
+/obj/item/flashlight,
+/obj/item/flashlight,
+/obj/item/flashlight,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/storage/backpack/duffelbag/syndie,
-/obj/item/storage/backpack/duffelbag/syndie,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/item/clothing/under/syndicate/combat,
-/obj/item/clothing/under/syndicate/combat,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 5
},
-/obj/item/storage/backpack/satchel,
-/obj/item/storage/backpack/satchel,
-/obj/item/storage/backpack/satchel,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/turf/open/floor/holofloor/wood,
/area/ship/crew/dorm)
-"gK" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/corner_techfloor_grid{
- dir = 5
+"iL" = (
+/obj/machinery/door/airlock/hatch{
+ dir = 8;
+ name = "Port Maintenance"
},
+/obj/structure/barricade/wooden/crude,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
+ dir = 4
},
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"gN" = (
-/turf/closed/wall/mineral/plastitanium,
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
/area/ship/maintenance/port)
-"hc" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+"iT" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/turf/open/floor/plasteel/stairs,
+/area/ship/bridge)
+"jh" = (
+/obj/machinery/atmospherics/components/binary/dp_vent_pump/layer2{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/closet/emcloset/wall/directional/west,
+/obj/machinery/advanced_airlock_controller{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/ship/engineering)
+"ji" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/oil{
+ icon_state = "streak3"
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
-"hg" = (
+"jn" = (
+/obj/machinery/computer/secure_data/syndie{
+ dir = 1
+ },
+/obj/effect/turf_decal/techfloor,
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"jt" = (
/obj/effect/turf_decal/industrial/warning{
- dir = 4
+ dir = 1
},
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "Syndie_warship_lockdown";
- name = "Lockdown Shutters"
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
dir = 1
},
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/hallway/central)
-"hj" = (
-/obj/machinery/turretid{
- pixel_x = -2;
- pixel_y = 8
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/structure/table/reinforced,
-/obj/item/gps{
- pixel_x = -6;
- pixel_y = 2
+/obj/machinery/firealarm/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/aft)
+"jv" = (
+/obj/machinery/door/airlock/hatch{
+ dir = 8;
+ name = "Aft Hallway"
},
-/obj/machinery/button/door{
- id = "warshipbridge";
- name = "Bridge lockdown";
- pixel_x = 7;
- pixel_y = -2
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/turf/open/floor/plasteel/tech,
-/area/ship/bridge)
-"ho" = (
-/obj/machinery/light/directional/west,
-/obj/machinery/power/apc/auto_name/directional/south,
-/obj/structure/cable,
-/obj/effect/turf_decal/steeldecal/steel_decals3,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"hp" = (
-/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/border_only{
dir = 8
},
-/turf/open/floor/plasteel/stairs{
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/effect/turf_decal/industrial/warning{
dir = 4
},
-/area/ship/bridge)
-"hK" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
-/obj/machinery/light_switch{
- pixel_x = -10;
- pixel_y = 26
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/aft)
+"jA" = (
+/obj/machinery/door/poddoor/shutters{
+ dir = 8;
+ id = "syndie_mechbay";
+ name = "Mechbay"
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/medical)
-"hY" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/engineering)
-"io" = (
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/cargo)
+"jD" = (
+/obj/effect/spawner/lootdrop/salvage_capacitor,
+/obj/effect/decal/cleanable/shreds,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/airalarm/directional/north,
+/turf/open/floor/plating,
+/area/ship/maintenance/port)
+"jE" = (
/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
/obj/machinery/door/poddoor/shutters{
dir = 4;
- id = "syndiewarship_windows";
+ id = "warshipbridge";
name = "Blast Shutters"
},
/turf/open/floor/plating,
-/area/ship/crew/dorm)
-"ip" = (
-/obj/structure/railing,
-/obj/effect/turf_decal/borderfloorblack,
-/obj/machinery/airalarm/directional/west,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/maintenance/port)
-"iq" = (
-/obj/structure/bed,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/bedsheet/rd,
-/obj/structure/curtain{
- color = "#5c131b"
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/clothing/under/syndicate/bloodred/sleepytime,
-/turf/open/floor/carpet/black,
/area/ship/bridge)
-"is" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 5
- },
-/obj/structure/bed,
-/obj/item/bedsheet/black,
-/obj/structure/curtain/cloth/fancy{
- name = "blood-red curtains"
+"jL" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/turf/open/floor/holofloor/wood,
-/area/ship/crew/dorm)
-"iz" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/streak,
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/maintenance/port)
-"iK" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 9
+ icon_state = "4-8"
},
-/obj/structure/railing{
- dir = 8
+/obj/structure/cable{
+ icon_state = "2-4"
},
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"iO" = (
-/obj/structure/railing{
- dir = 4
- },
-/obj/effect/turf_decal/steeldecal/steel_decals10,
-/obj/effect/decal/cleanable/robot_debris,
-/obj/structure/cable,
-/obj/machinery/power/terminal,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"iX" = (
-/obj/machinery/shower{
- pixel_y = 14
- },
-/obj/structure/mirror{
- pixel_x = -28
+"jW" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 5
},
-/obj/effect/turf_decal/box,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/turf/open/floor/mineral/plastitanium,
/area/ship/medical)
-"jb" = (
-/obj/structure/salvageable/server,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/techfloor,
-/turf/open/floor/plasteel/telecomms_floor,
-/area/ship/maintenance/port)
-"je" = (
-/obj/machinery/light/directional/north,
-/obj/item/gun/ballistic/automatic/pistol,
-/obj/item/gun/ballistic/automatic/pistol{
- pixel_y = 3
+"ke" = (
+/obj/effect/turf_decal/techfloor{
+ dir = 8
},
-/obj/effect/turf_decal/industrial/fire,
-/obj/structure/guncase,
-/obj/structure/railing{
- dir = 4
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/obj/item/gun/ballistic/automatic/smg/c20r/unrestricted,
-/obj/item/gun/ballistic/shotgun/bulldog/unrestricted,
-/turf/open/floor/pod/dark,
-/area/ship/security/armory)
-"jp" = (
+/turf/open/floor/plasteel/tech,
+/area/ship/cargo)
+"kh" = (
/obj/effect/turf_decal/arrows{
- dir = 8
+ dir = 1
},
/obj/structure/closet/crate/engineering,
/obj/effect/decal/cleanable/dirt/dust,
@@ -1012,1203 +1035,1178 @@
pixel_x = 4;
pixel_y = -3
},
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable{
- icon_state = "0-8"
- },
+/obj/structure/cable,
+/obj/machinery/power/apc/auto_name/directional/south,
/turf/open/floor/mineral/plastitanium,
/area/ship/hallway/aft)
-"jr" = (
-/obj/machinery/door/poddoor{
- dir = 4;
- id = "syndie_warship_cargo";
- name = "Cargo Hatch"
+"km" = (
+/obj/effect/turf_decal/box,
+/obj/effect/turf_decal/industrial/outline/yellow,
+/obj/effect/turf_decal/techfloor,
+/obj/structure/cable,
+/obj/machinery/suit_storage_unit/inherit,
+/obj/item/clothing/suit/space/hardsuit/syndi/hl,
+/obj/item/clothing/mask/gas/syndicate,
+/obj/machinery/power/apc/auto_name/directional/west,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/security/armory)
+"ko" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/obj/machinery/power/shieldwallgen/atmos{
- anchored = 1;
- id = "komodo_cargo";
- locked = 1
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/decal/cleanable/oil,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
/obj/structure/cable{
- icon_state = "0-4"
+ icon_state = "4-8"
},
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/cargo)
-"jw" = (
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 8
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/engineering)
+"kq" = (
+/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
+/obj/machinery/door/poddoor/shutters{
+ id = "syndiewarship_windows";
+ name = "Blast Shutters"
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 4
+/turf/open/floor/plating,
+/area/ship/medical)
+"kr" = (
+/obj/item/stack/ore/salvage/scrapgold,
+/obj/structure/table/reinforced,
+/turf/open/floor/circuit/green/off,
+/area/ship/maintenance/starboard)
+"kD" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/crew/canteen)
+"kG" = (
+/obj/machinery/porta_turret/ship/syndicate/weak{
+ dir = 1
},
-/obj/structure/cable{
- icon_state = "4-8"
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/bridge)
+"kI" = (
+/turf/open/floor/engine,
+/area/ship/bridge)
+"kL" = (
+/obj/structure/table/wood,
+/obj/structure/railing,
+/obj/item/paicard{
+ pixel_x = -7;
+ pixel_y = 4
+ },
+/obj/item/paicard{
+ pixel_x = 1;
+ pixel_y = 1
},
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/directional/east,
+/turf/open/floor/carpet/red_gold,
+/area/ship/crew/dorm)
+"kM" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/oil,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "2-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"jz" = (
+/turf/open/floor/plasteel/dark,
+/area/ship/maintenance/port)
+"lb" = (
/obj/structure/chair/comfy/shuttle{
- dir = 2;
+ dir = 8;
name = "tactical chair"
},
-/obj/machinery/light/directional/north,
/obj/effect/turf_decal/techfloor{
dir = 5
},
+/obj/machinery/light/directional/east,
/turf/open/floor/mineral/plastitanium,
/area/ship/hallway/central)
-"jE" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
- id = "warshipbridge";
- name = "Blast Shutters";
- dir = 4
+"lg" = (
+/obj/machinery/door/window/southleft{
+ dir = 8
},
-/turf/open/floor/plating,
-/area/ship/bridge)
-"jF" = (
-/obj/structure/railing/corner{
- dir = 4
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/trimline/transparent/bar/filled/corner,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/crew/canteen)
+"lj" = (
+/obj/effect/turf_decal/industrial/warning/corner,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/effect/turf_decal/steeldecal/steel_decals_central4{
- dir = 4
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"lm" = (
+/obj/structure/salvageable/computer{
+ dir = 8
+ },
+/turf/open/floor/circuit/green/off,
+/area/ship/maintenance/starboard)
+"lr" = (
+/obj/structure/closet/wall/orange/directional/south{
+ name = "Engineering locker"
+ },
+/obj/item/clothing/shoes/workboots,
+/obj/item/clothing/head/welding,
+/obj/item/clothing/head/hardhat/red,
+/obj/item/clothing/head/hardhat/weldhat/orange{
+ pixel_x = 7;
+ pixel_y = 2
+ },
+/obj/item/clothing/glasses/meson/engine,
+/obj/item/storage/belt/utility/full/engi,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "engine fuel pump"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
},
+/obj/item/clothing/under/syndicate/hardliners,
+/obj/item/clothing/suit/hazardvest/hardliners,
+/turf/open/floor/plasteel/tech,
+/area/ship/engineering)
+"ls" = (
/obj/structure/railing/corner,
+/obj/effect/turf_decal/steeldecal/steel_decals_central4,
+/obj/structure/railing/corner{
+ dir = 8
+ },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
+ dir = 10
},
/obj/structure/cable/yellow{
- icon_state = "4-8"
+ icon_state = "1-2"
},
/obj/structure/cable/yellow{
- icon_state = "1-4"
+ icon_state = "2-4"
},
/obj/effect/turf_decal/steeldecal/steel_decals10{
- dir = 10
+ dir = 9
},
/obj/effect/turf_decal/steeldecal/steel_decals10{
- dir = 9
+ dir = 5
},
/turf/open/floor/plasteel/tech,
/area/ship/engineering)
-"jP" = (
-/obj/effect/decal/cleanable/dirt/dust,
+"lt" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/tech,
-/area/ship/bridge)
-"jX" = (
-/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/directional/east,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"lu" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8;
+ name = "tactical chair"
+ },
/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/techfloor{
+ dir = 4
+ },
+/obj/machinery/airalarm/directional/east,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/central)
+"lv" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
/obj/effect/turf_decal/industrial/warning{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plating/rust,
-/area/ship/maintenance/port)
-"km" = (
-/obj/effect/turf_decal/industrial/warning/corner{
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"lz" = (
+/obj/structure/frame/computer{
dir = 8
},
-/obj/effect/turf_decal/industrial/warning/corner{
+/obj/effect/turf_decal/techfloor{
dir = 4
},
+/turf/open/floor/plasteel/tech,
+/area/ship/bridge)
+"lA" = (
/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing{
+ dir = 4;
+ layer = 2.8
+ },
+/turf/open/floor/pod/dark,
+/area/ship/crew/dorm)
+"lY" = (
/obj/structure/railing/corner{
- dir = 4
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/obj/effect/turf_decal/steeldecal/steel_decals1{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/orange/visible{
dir = 4
},
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 8
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"kr" = (
-/obj/item/stack/ore/salvage/scrapgold,
-/obj/structure/table/reinforced,
-/turf/open/floor/circuit/green/off,
-/area/ship/maintenance/starboard)
-"kC" = (
-/obj/item/kirbyplants/random,
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
- dir = 10
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible/layer2{
+ dir = 1
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"kD" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/crew/canteen)
-"kH" = (
-/obj/structure/railing,
+/turf/open/floor/plasteel/tech,
+/area/ship/engineering)
+"mp" = (
+/obj/effect/decal/cleanable/plasma,
/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/effect/turf_decal/industrial/outline/yellow,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 10
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/port_gen/pacman,
+/obj/machinery/light/dim/directional/east,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/plasteel/tech,
+/area/ship/engineering)
+"my" = (
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
dir = 4
},
-/obj/effect/turf_decal/borderfloorblack,
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "2-8"
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
},
+/obj/structure/catwalk/over,
/turf/open/floor/plating,
-/area/ship/maintenance/port)
-"kI" = (
-/turf/open/floor/engine,
-/area/ship/bridge)
-"kK" = (
-/obj/effect/decal/cleanable/plasma,
-/obj/machinery/power/terminal,
+/area/ship/engineering)
+"mC" = (
+/obj/structure/railing,
+/obj/effect/turf_decal/steeldecal/steel_decals10{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/robot_debris,
/obj/structure/cable{
icon_state = "0-4"
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/power/terminal{
+ dir = 8
},
/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
-"la" = (
-/obj/machinery/light/directional/north,
-/obj/structure/tank_dispenser/oxygen,
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable/yellow{
- icon_state = "2-4"
+"mE" = (
+/obj/effect/decal/cleanable/glass{
+ dir = 8
},
-/turf/open/floor/plasteel/tech/techmaint,
+/turf/open/floor/circuit/green/off,
+/area/ship/maintenance/port)
+"mI" = (
+/obj/machinery/door/airlock/external,
+/obj/machinery/atmospherics/pipe/layer_manifold,
+/turf/open/floor/plasteel,
/area/ship/engineering)
-"lj" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/railing{
- dir = 1
+"mP" = (
+/obj/machinery/power/smes{
+ charge = 5e+006
},
-/obj/effect/turf_decal/techfloor{
- dir = 1
+/obj/effect/turf_decal/industrial/radiation{
+ dir = 8
},
-/obj/structure/closet/crate/trashcart,
-/obj/item/trash/cheesie,
-/obj/item/trash/can/food/peaches/maint,
-/obj/item/trash/can/food/beans{
- pixel_x = 6;
- pixel_y = -3
- },
-/obj/item/trash/energybar,
-/obj/item/trash/popcorn,
-/obj/item/circuitboard/machine/rdserver,
-/obj/item/trash/can/food/beans{
- pixel_x = 4;
- pixel_y = -5
- },
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/cable,
+/obj/item/toy/figure/engineer{
+ pixel_x = 9;
+ pixel_y = 14
},
/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"lk" = (
-/obj/machinery/vending/cigarette/syndicate,
-/obj/structure/railing/corner{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ship/hallway/central)
-"lm" = (
-/obj/machinery/door/airlock/hatch{
- name = "Engineering"
+/area/ship/engineering)
+"mX" = (
+/obj/machinery/door/airlock/hatch,
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
},
+/obj/machinery/door/firedoor/border_only,
+/turf/open/floor/plasteel/showroomfloor,
+/area/ship/hallway/aft)
+"mY" = (
/obj/effect/turf_decal/industrial/warning{
dir = 8
},
/obj/effect/turf_decal/industrial/warning{
dir = 4
},
+/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/door/firedoor,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/engineering)
-"lu" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
+/obj/machinery/light_switch{
dir = 4;
- id = "syndiewarship_windows";
- name = "Blast Shutters"
+ pixel_x = -23;
+ pixel_y = 4
},
-/turf/open/floor/plating,
+/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"lL" = (
+"mZ" = (
+/obj/item/kirbyplants/random,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
+ },
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_y = -23;
+ pixel_x = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/aft)
+"nb" = (
+/obj/effect/turf_decal/techfloor,
+/obj/item/storage/bag/ore,
+/obj/item/storage/bag/ore,
+/obj/item/pickaxe,
+/obj/item/pickaxe,
+/obj/item/mining_scanner,
+/obj/item/mining_scanner,
+/obj/structure/closet/wall/directional/south{
+ icon_door = "orange_wall";
+ name = "Mining equipment"
+ },
+/obj/item/gps/mining,
+/turf/open/floor/plasteel/tech,
+/area/ship/cargo)
+"nh" = (
+/obj/structure/salvageable/server,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/techfloor{
+ dir = 8
+ },
+/obj/machinery/button/shieldwallgen{
+ id = "komodo_port";
+ pixel_y = 24;
+ pixel_x = 6
+ },
+/obj/machinery/button/door{
+ id = "Artillery1shutter";
+ name = "Artillery Hatch";
+ pixel_x = -4;
+ pixel_y = 26
+ },
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ship/maintenance/port)
+"nq" = (
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 9
+ },
+/obj/structure/closet/crate,
+/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/effect/turf_decal/box,
+/obj/machinery/camera/autoname{
+ dir = 10
+ },
+/turf/open/floor/pod,
+/area/ship/cargo)
+"nv" = (
/obj/machinery/door/poddoor{
- id = "Artillery1shutter"
+ dir = 8;
+ id = "Artillery2shutter"
},
/obj/machinery/power/shieldwallgen/atmos{
anchored = 1;
- dir = 4;
- id = "komodo_port";
+ id = "komodo_starboard";
locked = 1
},
/obj/structure/cable{
- icon_state = "0-2"
+ icon_state = "0-8"
},
/turf/open/floor/plasteel/tech/grid,
-/area/ship/maintenance/port)
-"lT" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 6
+/area/ship/maintenance/starboard)
+"nz" = (
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
},
-/obj/effect/turf_decal/techfloor/corner,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"lV" = (
-/obj/structure/railing{
- dir = 1
+"nA" = (
+/obj/structure/chair/office{
+ dir = 1;
+ name = "tactical swivel chair"
},
-/obj/structure/railing,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/firealarm/directional/west,
+/turf/open/floor/plasteel/tech,
+/area/ship/engineering)
+"nD" = (
+/obj/effect/turf_decal/industrial/warning,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 8
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/security/armory)
+"nI" = (
+/obj/structure/railing,
+/obj/effect/decal/cleanable/oil{
+ icon_state = "streak4"
},
-/obj/machinery/button/door{
- dir = 1;
- id = "warship_engines";
- name = "Engine shutters";
- pixel_y = -24
+/obj/structure/cable{
+ icon_state = "0-4"
},
-/turf/open/floor/plasteel/stairs{
+/obj/machinery/power/terminal{
dir = 8
},
-/area/ship/engineering)
-"mj" = (
-/obj/effect/turf_decal/siding/wood{
+/obj/machinery/atmospherics/pipe/simple/supply/visible/layer2{
dir = 5
},
-/obj/structure/table/reinforced,
-/obj/item/flashlight/lamp{
- pixel_x = -4;
- pixel_y = 7
- },
-/obj/item/paper_bin{
- pixel_x = 4
- },
-/obj/item/pen/red{
- pixel_x = 2;
- pixel_y = 1
- },
-/obj/item/clothing/mask/gas/syndicate{
- pixel_x = -4
- },
-/obj/item/areaeditor/shuttle{
- pixel_x = -1;
- pixel_y = -1
- },
-/obj/machinery/firealarm/directional/north,
-/obj/item/codespeak_manual/unlimited{
- pixel_x = 6;
- pixel_y = 5
- },
-/turf/open/floor/holofloor/wood,
-/area/ship/bridge)
-"mr" = (
-/obj/machinery/shower{
- pixel_y = 14
- },
-/obj/structure/curtain,
-/obj/item/soap/syndie,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/plasteel/freezer,
-/area/ship/hallway/aft)
-"mv" = (
-/obj/machinery/atmospherics/components/unary/shuttle/heater{
- dir = 1
- },
-/obj/structure/window/plasma/reinforced/spawner,
-/obj/machinery/door/window/eastright{
- dir = 1;
- name = "Engine Access"
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 5
},
-/obj/machinery/door/poddoor{
- id = "warship_engines";
- name = "Thruster Blast Door"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 10
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/tech,
/area/ship/engineering)
-"mA" = (
-/obj/machinery/light/directional/north,
+"nU" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/maintenance/port)
+"nV" = (
/obj/effect/turf_decal/spline/fancy/opaque/black{
- dir = 8
+ dir = 1
},
/obj/machinery/autolathe/hacked,
/obj/item/stack/sheet/plasteel/twenty{
pixel_x = -3;
pixel_y = 6
},
-/obj/item/stack/sheet/glass/fifty{
- pixel_x = 6
- },
-/obj/item/stack/sheet/metal/fifty,
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"mN" = (
-/obj/machinery/atmospherics/components/unary/shuttle/heater{
- dir = 1
- },
-/obj/structure/window/plasma/reinforced/spawner,
-/obj/machinery/door/poddoor{
- id = "warship_engines";
- name = "Thruster Blast Door"
+ icon_state = "1-2"
},
-/obj/machinery/door/window/eastleft{
- dir = 1;
- name = "Engine Access"
+/obj/item/stack/sheet/glass/twenty{
+ pixel_x = 6
},
-/turf/open/floor/plating,
+/obj/item/stack/sheet/metal/ten,
+/obj/machinery/light/directional/east,
+/turf/open/floor/plasteel/tech,
/area/ship/engineering)
-"mY" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 6
- },
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
+"nX" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "4-8"
},
/obj/structure/cable{
icon_state = "1-8"
},
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"nb" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/spline/fancy/opaque/black{
- dir = 10
- },
-/obj/structure/railing{
- dir = 10
+"ok" = (
+/obj/machinery/vending/cigarette/syndicate,
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ship/hallway/central)
+"ot" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8;
+ name = "tactical chair"
},
-/turf/open/floor/plasteel/tech,
-/area/ship/bridge)
-"nk" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/steeldecal/steel_decals4,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+/obj/effect/turf_decal/techfloor{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 10
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/central)
+"ox" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8;
+ name = "tactical chair"
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/closet/firecloset/wall/directional/east,
+/obj/effect/turf_decal/techfloor{
+ dir = 4
},
-/turf/open/floor/plasteel/tech,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/central)
+"oO" = (
+/obj/machinery/door/airlock/hatch{
+ name = "Captain's Office";
+ req_access_txt = "20"
+ },
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
/area/ship/bridge)
-"no" = (
-/obj/structure/table/reinforced,
-/obj/structure/window/reinforced{
+"pb" = (
+/obj/structure/railing{
dir = 8
},
-/obj/machinery/microwave{
- pixel_y = 5
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/turf_decal/borderfloorblack{
+ dir = 8
},
-/obj/item/storage/box/donkpockets/donkpocketteriyaki{
- pixel_x = 4;
- pixel_y = 5
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/obj/item/storage/box/donkpockets/donkpocketteriyaki,
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
- dir = 5
+/obj/machinery/firealarm/directional/south,
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
},
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"ny" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/area/ship/maintenance/starboard)
+"ph" = (
+/obj/machinery/power/shieldwallgen/atmos{
+ anchored = 1;
+ dir = 4;
+ id = "komodo_cargo";
+ locked = 1
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/door/poddoor{
+ id = "syndie_warship_cargo";
+ name = "Cargo Hatch"
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/cargo)
+"po" = (
+/obj/structure/flora/grass/jungle/b,
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/ausbushes/brflowers,
+/obj/structure/flora/ausbushes/leafybush,
+/obj/structure/window/reinforced{
dir = 8
},
-/turf/open/floor/plasteel/stairs{
+/turf/open/floor/grass,
+/area/ship/crew/canteen)
+"pA" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/power/terminal{
dir = 8
},
-/area/ship/bridge)
-"nG" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"pJ" = (
+/obj/machinery/power/smes/shuttle/precharged{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/obj/structure/cable{
+ icon_state = "0-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/obj/structure/window/plasma/reinforced/spawner{
dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/machinery/door/window/eastleft{
+ name = "Engine Access"
+ },
+/obj/machinery/door/poddoor{
+ dir = 8;
+ id = "warship_engines";
+ name = "Thruster Blast Door"
},
-/obj/structure/catwalk/over,
/turf/open/floor/plating,
/area/ship/engineering)
-"nQ" = (
-/obj/machinery/computer/monitor/secret{
- dir = 4
+"pN" = (
+/obj/machinery/porta_turret/ship/syndicate/weak{
+ dir = 9
},
-/obj/effect/turf_decal/spline/fancy/opaque/black,
-/obj/effect/turf_decal/techfloor{
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/bridge)
+"qf" = (
+/obj/structure/railing{
dir = 8
},
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/railing,
-/turf/open/floor/plasteel/tech,
-/area/ship/bridge)
-"nR" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/borderfloorblack{
dir = 8
},
/obj/structure/cable{
icon_state = "2-4"
},
-/turf/open/floor/plasteel/dark,
-/area/ship/maintenance/port)
-"nU" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/maintenance/port)
-"oi" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/robot_debris/limb,
-/obj/machinery/light/dim/directional/east,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/obj/structure/extinguisher_cabinet/directional/north,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plating,
/area/ship/maintenance/port)
-"on" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 6
+"qk" = (
+/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
+/obj/machinery/door/poddoor/shutters{
+ id = "syndiewarship_windows";
+ name = "Blast Shutters"
},
-/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/ship/engineering)
+"qm" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/industrial/fire,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"oo" = (
-/obj/structure/rack,
-/obj/effect/turf_decal/techfloor,
-/obj/effect/spawner/lootdrop/maintenance/two,
-/turf/open/floor/plasteel/telecomms_floor,
-/area/ship/maintenance/starboard)
-"pf" = (
-/obj/machinery/power/port_gen/pacman/super,
-/obj/structure/railing{
- dir = 4
- },
-/obj/effect/decal/cleanable/oil{
- icon_state = "gib7"
+/obj/item/trash/syndi_cakes{
+ pixel_y = 6;
+ pixel_x = 4
},
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/machinery/light/dim/directional/north,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 4
+/obj/item/t_scanner{
+ pixel_x = -2;
+ pixel_y = 12
},
-/obj/structure/cable/yellow{
- icon_state = "0-2"
+/obj/machinery/light/directional/north,
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/pod/dark,
+/area/ship/security/armory)
+"qz" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 9
},
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"po" = (
+/obj/effect/turf_decal/industrial/warning/corner,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 6
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 6
},
/obj/structure/cable{
icon_state = "2-4"
},
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/turf/open/floor/plating,
-/area/ship/maintenance/starboard)
-"pA" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/railing/corner{
- dir = 1
- },
-/obj/structure/railing/corner{
- dir = 4
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"qB" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8;
+ name = "tactical chair"
},
/obj/effect/turf_decal/techfloor{
- dir = 1
+ dir = 6
},
+/obj/machinery/light/directional/east,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/central)
+"qD" = (
+/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/structure/cable{
- icon_state = "1-8"
+/turf/open/floor/mineral/plastitanium,
+/area/ship/crew/canteen)
+"qF" = (
+/obj/machinery/power/smes/shuttle/precharged{
+ dir = 4
},
-/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"pE" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "0-8"
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/window/plasma/reinforced/spawner{
+ dir = 8
},
-/turf/open/floor/plasteel/tech,
-/area/ship/bridge)
-"pF" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/effect/decal/cleanable/wrapping,
-/obj/effect/turf_decal/techfloor{
- dir = 4
+/obj/machinery/door/poddoor{
+ dir = 8;
+ id = "warship_engines";
+ name = "Thruster Blast Door"
},
-/turf/open/floor/plasteel/tech/techmaint,
+/obj/machinery/door/window/eastright{
+ name = "Engine Access"
+ },
+/turf/open/floor/plating,
/area/ship/engineering)
-"pN" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/hatch{
- name = "Aft Hallway"
- },
-/obj/effect/turf_decal/industrial/warning{
+"qG" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/syndicateemblem/middle/right{
dir = 8
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
- },
/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/aft)
-"pS" = (
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "Syndie_warship_lockdown";
- name = "Lockdown Control";
- pixel_x = -6;
- pixel_y = 6
- },
-/obj/machinery/button/door{
- id = "syndie_warship_cargo";
- name = "cargohold shutters";
- pixel_x = 6;
- pixel_y = 6
- },
-/obj/machinery/button/door{
- id = "syndiewarship_windows";
- name = "Window Control";
- pixel_y = -4
- },
-/obj/item/desk_flag{
- pixel_x = -10
- },
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"qc" = (
-/obj/machinery/door/airlock/hatch{
- name = "Dormitory"
- },
+/area/ship/hallway/central)
+"qZ" = (
+/obj/structure/chair/comfy/grey/directional/east,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
+/obj/machinery/light/directional/west,
+/turf/open/floor/carpet/red_gold,
/area/ship/crew/dorm)
-"qu" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
- },
-/obj/effect/turf_decal/industrial/warning/corner,
-/obj/effect/turf_decal/industrial/warning/corner{
+"rg" = (
+/obj/item/cautery,
+/obj/structure/table/reinforced,
+/obj/item/healthanalyzer,
+/obj/structure/window/reinforced{
dir = 4
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 8
+/turf/open/floor/pod/dark,
+/area/ship/medical)
+"rm" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+/obj/effect/turf_decal/industrial/warning{
dir = 8
},
-/obj/structure/sign/poster/contraband/random{
- pixel_x = -32
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 10
},
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "2-8"
},
/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/aft)
-"qy" = (
-/obj/structure/railing/corner{
- dir = 4;
- layer = 2.8
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/plasteel/stairs{
- dir = 8
- },
-/area/ship/crew/dorm)
-"qD" = (
-/obj/machinery/light/directional/west{
- light_color = "#e8eaff"
+/area/ship/hallway/central)
+"rv" = (
+/turf/closed/wall/r_wall/syndicate/nodiagonal,
+/area/ship/medical)
+"rE" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 10
},
+/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/techfloor{
- dir = 9
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 5
},
-/turf/open/floor/plasteel/telecomms_floor,
-/area/ship/cargo)
-"qI" = (
-/obj/effect/turf_decal/techfloor{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
},
-/obj/item/storage/bag/ore,
-/obj/item/storage/bag/ore,
-/obj/item/pickaxe,
-/obj/item/pickaxe,
-/obj/item/mining_scanner,
-/obj/item/mining_scanner,
-/obj/machinery/light/directional/east,
-/obj/structure/closet/wall{
- dir = 8;
- icon_door = "orange_wall";
- name = "Mining equipment";
- pixel_x = 29
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/obj/item/gps/mining,
-/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"qK" = (
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"rI" = (
/obj/structure/table/reinforced,
-/obj/effect/turf_decal/industrial/fire/corner{
- dir = 4
+/obj/item/toy/cards/deck/syndicate,
+/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
+ dir = 10
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/airalarm/directional/south,
-/obj/item/storage/box/firingpins{
- pixel_x = 21
+/obj/item/spacecash/bundle/c1000{
+ pixel_x = 5;
+ pixel_y = 11
},
-/obj/item/clothing/glasses/night{
- pixel_y = 6
+/obj/item/spacecash/bundle/c1000{
+ pixel_x = 3;
+ pixel_y = 8
},
-/obj/item/clothing/glasses/night{
- pixel_x = 2;
- pixel_y = 1
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_x = -7;
+ pixel_y = 3
},
-/obj/item/clothing/glasses/night{
- pixel_x = -2;
- pixel_y = -4
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_y = -23;
+ pixel_x = 4
},
-/turf/open/floor/pod/dark,
-/area/ship/security/armory)
-"qT" = (
-/obj/machinery/syndicatebomb/self_destruct{
- anchored = 1
+/turf/open/floor/mineral/plastitanium,
+/area/ship/crew/canteen)
+"rN" = (
+/obj/structure/table/reinforced,
+/obj/item/toy/figure/syndie{
+ pixel_y = 5;
+ pixel_x = -8
},
/obj/machinery/light/directional/south,
-/turf/open/floor/circuit/red,
+/obj/machinery/fax/syndicate,
+/turf/open/floor/plasteel/dark,
/area/ship/bridge)
-"rf" = (
-/obj/structure/railing/corner,
-/obj/effect/turf_decal/steeldecal/steel_decals1,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"rh" = (
-/obj/machinery/porta_turret/ship/syndicate/heavy{
- dir = 10
+"rS" = (
+/obj/machinery/porta_turret/ship/syndicate/weak{
+ dir = 5
},
/turf/closed/wall/mineral/plastitanium,
/area/ship/bridge)
-"rj" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/industrial/fire{
+"rX" = (
+/obj/effect/turf_decal/industrial/warning{
dir = 1
},
-/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/grenade/frag{
- pixel_x = 6;
- pixel_y = -3
- },
-/turf/open/floor/pod/dark,
-/area/ship/security/armory)
-"ro" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"rZ" = (
/obj/structure/railing{
- dir = 1
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/obj/structure/railing{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/button/door{
+ dir = 4;
+ id = "warship_engines";
+ name = "Engine shutters";
+ pixel_x = -24
},
-/obj/machinery/airalarm/directional/north,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/turf/open/floor/plasteel/stairs{
+ dir = 1
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"rs" = (
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
- dir = 9
+/area/ship/engineering)
+"si" = (
+/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
+/obj/machinery/door/poddoor/shutters{
+ dir = 1;
+ id = "warshipbridge";
+ name = "Blast Shutters"
},
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/structure/cable{
- icon_state = "0-2"
+/turf/open/floor/plating,
+/area/ship/bridge)
+"sn" = (
+/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
+/obj/machinery/door/poddoor/shutters{
+ id = "syndiewarship_windows";
+ name = "Blast Shutters"
},
-/obj/machinery/light_switch{
- pixel_x = -20;
- pixel_y = 12;
+/turf/open/floor/plating,
+/area/ship/crew/canteen)
+"sq" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/engineering)
+"sy" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
dir = 4
},
/turf/open/floor/mineral/plastitanium,
/area/ship/crew/canteen)
-"rv" = (
-/turf/closed/wall/r_wall/syndicate/nodiagonal,
-/area/ship/medical)
-"rA" = (
-/obj/machinery/cryopod{
- dir = 8
- },
-/obj/structure/railing,
-/obj/effect/turf_decal/industrial/warning{
- dir = 10
+"sF" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/pod/dark,
-/area/ship/crew/dorm)
-"rK" = (
-/obj/machinery/button/door{
- dir = 1;
- id = "syndie_mechbay";
- name = "mechbay door";
- pixel_y = -24
+/obj/structure/catwalk/over,
+/turf/open/floor/plating,
+/area/ship/engineering)
+"sG" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8;
+ name = "tactical chair"
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/techfloor,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/turf_decal/techfloor/corner,
+/obj/machinery/light/directional/east,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/central)
+"sQ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
},
-/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"rN" = (
-/obj/effect/turf_decal/industrial/warning{
+/obj/structure/bed{
dir = 8
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/syndicateemblem/top/left,
-/obj/machinery/firealarm/directional/west,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"rS" = (
-/obj/machinery/porta_turret/ship/syndicate/heavy{
- dir = 5
- },
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/bridge)
-"sb" = (
-/obj/structure/closet/toolcloset,
-/obj/structure/railing{
- dir = 1
+/obj/item/bedsheet/black{
+ dir = 8
},
-/obj/effect/decal/cleanable/oil{
- icon_state = "streak5"
+/obj/structure/curtain/cloth/fancy{
+ name = "blood-red curtains"
},
-/obj/effect/turf_decal/industrial/outline/yellow,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"si" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
- dir = 1;
- id = "warshipbridge";
- name = "Blast Shutters"
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
},
-/turf/open/floor/plating,
-/area/ship/bridge)
-"sj" = (
-/obj/effect/turf_decal/industrial/warning{
+/turf/open/floor/holofloor/wood,
+/area/ship/crew/dorm)
+"sS" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
-/obj/effect/turf_decal/syndicateemblem/bottom/right,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"sn" = (
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/light/dim/directional/north,
+/turf/open/floor/plasteel/tech,
+/area/ship/maintenance/starboard)
+"sV" = (
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/warning/corner,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing/corner,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/item/clothing/suit/armor/vest/syndie,
-/obj/item/clothing/suit/armor/vest/syndie,
-/obj/item/clothing/suit/armor/vest/syndie,
-/obj/item/clothing/head/helmet/operator,
-/obj/item/clothing/head/helmet/operator,
-/obj/item/clothing/head/helmet/operator,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "1-8"
},
-/obj/structure/closet/secure_closet/wall{
- dir = 1;
- icon_state = "sec_wall";
- name = "Armour locker";
- pixel_y = -29;
- req_access_txt = "1"
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/item/storage/belt/military,
-/obj/item/storage/belt/military,
-/obj/item/storage/belt/military,
/turf/open/floor/mineral/plastitanium/red,
-/area/ship/security/armory)
-"sq" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering)
-"sy" = (
+/area/ship/hallway/central)
+"sX" = (
/obj/effect/turf_decal/industrial/warning{
- dir = 8
+ dir = 1
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/syndicateemblem/bottom/left,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"sI" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 2;
- name = "tactical chair"
- },
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/techfloor{
- dir = 9
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/central)
-"sQ" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
+/obj/item/ammo_box/magazine/m10mm,
+/obj/item/ammo_box/magazine/m10mm,
+/obj/item/storage/toolbox/ammo/c10mm,
+/obj/structure/closet/secure_closet/wall/directional/west{
+ icon_state = "sec_wall";
+ name = "Ammo Locker";
+ req_access_txt = "1"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
+/obj/item/ammo_box/magazine/m10mm,
+/obj/item/ammo_box/magazine/smgm45,
+/obj/item/ammo_box/magazine/smgm45,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/security/armory)
+"sY" = (
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 6
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/railing{
+ dir = 4
},
-/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"sT" = (
-/obj/effect/turf_decal/borderfloor{
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
dir = 4
},
-/obj/effect/decal/cleanable/generic,
-/obj/structure/chair/comfy/shuttle{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/fireaxecabinet{
dir = 8;
- name = "tactical chair"
+ pixel_x = 27
},
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
-"td" = (
-/obj/machinery/porta_turret/ship/syndicate/heavy{
- dir = 9
- },
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/bridge)
"tf" = (
/turf/closed/wall/mineral/plastitanium,
/area/ship/security/armory)
-"ti" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
+"tn" = (
+/obj/effect/turf_decal/techfloor{
+ dir = 10
+ },
+/obj/structure/closet/crate,
+/obj/effect/spawner/lootdrop/costume,
+/obj/item/storage/box/emptysandbags,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/machinery/button/door{
dir = 4;
- id = "syndiewarship_windows";
- name = "Blast Shutters"
+ id = "syndie_mechbay";
+ name = "mechbay door";
+ pixel_x = -24
},
-/turf/open/floor/plating,
-/area/ship/crew/canteen)
-"tj" = (
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/plasteel/tech,
+/area/ship/cargo)
+"tr" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+/obj/effect/turf_decal/techfloor{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 1
+/obj/structure/closet/crate/trashcart,
+/obj/item/trash/cheesie,
+/obj/item/trash/can/food/peaches/maint,
+/obj/item/trash/can/food/beans{
+ pixel_x = 6;
+ pixel_y = -3
},
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/item/trash/energybar,
+/obj/item/trash/popcorn,
+/obj/item/circuitboard/machine/rdserver,
+/obj/item/trash/can/food/beans{
+ pixel_x = 4;
+ pixel_y = -5
},
-/obj/structure/cable/yellow{
- icon_state = "1-8"
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
-/area/ship/engineering)
+/turf/open/floor/plasteel/tech,
+/area/ship/cargo)
"tv" = (
-/obj/structure/railing{
- dir = 8
- },
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/mask/gas/syndicate,
-/obj/effect/turf_decal/techfloor,
-/obj/item/clothing/under/syndicate,
-/obj/structure/closet/syndicate{
- desc = "It's a basic storage unit.";
- name = "uniform closet"
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/central)
-"tw" = (
-/obj/machinery/door/airlock/vault{
- req_access_txt = "53"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/engine,
-/area/ship/bridge)
-"tx" = (
-/obj/machinery/vending/tool,
-/obj/effect/turf_decal/industrial/warning{
- dir = 5
- },
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"ty" = (
/obj/effect/turf_decal/industrial/warning{
dir = 8
},
/obj/effect/turf_decal/industrial/warning{
dir = 4
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/mineral/plastitanium/red,
-/area/ship/engineering)
+/area/ship/hallway/central)
"tC" = (
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ship/bridge)
-"tO" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 2;
- name = "tactical chair"
+"tD" = (
+/obj/machinery/button/door{
+ dir = 8;
+ id = "syndie_mechbay";
+ name = "mechbay door";
+ pixel_x = 24
},
-/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/turf_decal/techfloor{
- dir = 1
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/central)
-"tT" = (
-/obj/machinery/light/small/directional/north,
-/obj/machinery/power/smes{
- charge = 5e+006
+ dir = 6
},
-/obj/item/toy/figure/engineer{
- pixel_x = 9;
- pixel_y = 14
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ship/cargo)
+"tF" = (
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 6
},
-/obj/effect/turf_decal/industrial/radiation,
/obj/structure/railing{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "0-8"
+ dir = 4
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/clothing/under/syndicate/skirt/maid,
+/obj/item/clothing/gloves/combat/maid,
+/obj/item/clothing/head/maidheadband/syndicate,
+/obj/item/clothing/accessory/maidapron/syndicate,
+/obj/structure/closet/crate/secure/loot,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
},
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"tY" = (
-/obj/effect/turf_decal/industrial/warning/corner,
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 10
},
-/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"tT" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/door/airlock/external,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"up" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/siding/wood{
- dir = 10
- },
-/turf/open/floor/holofloor/wood,
-/area/ship/bridge)
-"uA" = (
-/obj/structure/chair/stool/bar{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"uB" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/firealarm/directional/west,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/open/floor/plasteel/tech/techmaint,
+/turf/open/floor/plasteel,
/area/ship/engineering)
-"uD" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 2;
- name = "tactical chair"
+"ub" = (
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 6
},
-/obj/machinery/light_switch{
- pixel_x = -17;
- pixel_y = 26
+/obj/item/kirbyplants/random,
+/obj/effect/decal/cleanable/wrapping,
+/obj/machinery/camera/autoname{
+ dir = 4
},
-/obj/effect/turf_decal/techfloor{
- dir = 1
+/obj/structure/railing{
+ dir = 6
},
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/central)
-"uF" = (
-/obj/machinery/holopad/emergency/command,
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/machinery/firealarm/directional/west{
+ pixel_y = -2
},
/turf/open/floor/plasteel/tech,
/area/ship/bridge)
-"uL" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 10
- },
+"ue" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/industrial/fire/corner,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"uQ" = (
-/obj/machinery/light/directional/south,
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
+/obj/item/clothing/glasses/night{
+ pixel_y = 6
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"uR" = (
-/obj/structure/rack,
-/obj/item/grenade/chem_grenade/smart_metal_foam{
+/obj/item/clothing/glasses/night{
pixel_x = 2;
- pixel_y = 8
+ pixel_y = 1
},
-/obj/item/grenade/chem_grenade/smart_metal_foam{
+/obj/item/clothing/glasses/night{
pixel_x = -2;
- pixel_y = 6
- },
-/obj/item/storage/belt/utility{
- pixel_y = -3
+ pixel_y = -4
},
-/obj/item/storage/belt/utility{
- pixel_x = 3;
- pixel_y = 5
+/obj/machinery/airalarm/directional/west,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/pod/dark,
+/area/ship/security/armory)
+"uh" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/effect/turf_decal/techfloor,
+/obj/structure/sign/poster/official/moth/delam{
+ pixel_y = -32
},
-/obj/item/clothing/shoes/magboots/syndie{
- pixel_x = -6;
- pixel_y = -5
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"ul" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/obj/effect/turf_decal/spline/fancy/opaque/black{
- dir = 8
+/obj/effect/turf_decal/industrial/warning,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/item/clothing/head/beret/eng/hazard{
- pixel_x = -5;
- pixel_y = 4
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/effect/decal/cleanable/dirt,
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/plasteel/tech,
+/turf/open/floor/mineral/plastitanium/red,
/area/ship/engineering)
-"uW" = (
-/obj/machinery/vending/medical,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/medical)
-"vg" = (
+"us" = (
+/obj/structure/bookcase/random/fiction,
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light_switch{
+ pixel_y = 23;
+ pixel_x = -6
+ },
+/obj/machinery/firealarm/directional/east{
+ pixel_y = -8
+ },
+/turf/open/floor/holofloor/wood,
+/area/ship/crew/dorm)
+"uG" = (
/obj/effect/turf_decal/industrial/warning{
dir = 8
},
@@ -2221,54 +2219,99 @@
icon_state = "1-2"
},
/turf/open/floor/mineral/plastitanium/red,
-/area/ship/engineering)
-"vm" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/techfloor,
-/obj/machinery/power/apc/auto_name/directional/south,
-/obj/structure/cable,
-/obj/machinery/light_switch{
- dir = 1;
- pixel_x = -12;
- pixel_y = -16
+/area/ship/hallway/central)
+"uJ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/techfloor{
+ dir = 5
},
+/obj/machinery/light/directional/north,
/turf/open/floor/plasteel/telecomms_floor,
-/area/ship/maintenance/starboard)
-"vq" = (
-/obj/machinery/power/smes/shuttle/precharged{
- dir = 1
+/area/ship/cargo)
+"uS" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
/obj/structure/cable{
- icon_state = "0-2"
+ icon_state = "4-8"
},
-/obj/structure/window/plasma/reinforced/spawner,
-/obj/machinery/door/window/eastleft{
- dir = 1;
- name = "Engine Access"
+/turf/open/floor/pod,
+/area/ship/cargo)
+"uV" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = 3;
+ pixel_y = 7
},
-/obj/machinery/door/poddoor{
- id = "warship_engines";
- name = "Thruster Blast Door"
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,
+/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine{
+ pixel_x = -16;
+ pixel_y = 4
+ },
+/obj/item/mecha_parts/mecha_equipment/repair_droid,
+/obj/structure/railing,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/machinery/firealarm/directional/east{
+ pixel_y = 4
+ },
+/obj/machinery/light/directional/south,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/cargo)
+"vd" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/turf/open/floor/plasteel/tech,
+/area/ship/cargo)
+"vl" = (
+/obj/item/stack/ore/salvage/scrapplasma/five,
+/obj/effect/decal/cleanable/ash/large,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable{
+ icon_state = "4-8"
},
/turf/open/floor/plating,
-/area/ship/engineering)
-"vw" = (
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/area/ship/maintenance/port)
+"vp" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/industrial/fire{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/secure_closet/wall/directional/west{
+ icon_state = "secure_wall";
+ name = "Peacekeeping Locker";
+ req_access_txt = "1"
+ },
+/obj/item/gun/energy/disabler,
+/obj/item/gun/energy/disabler,
+/obj/item/storage/box/handcuffs,
+/obj/item/holosign_creator/security,
+/obj/item/megaphone/sec,
+/obj/item/restraints/legcuffs/bola/energy,
+/turf/open/floor/pod/dark,
+/area/ship/security/armory)
+"vs" = (
+/obj/structure/railing/corner{
+ dir = 8
},
-/obj/effect/turf_decal/industrial/warning/corner,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
+ dir = 4
},
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
+/turf/open/floor/plasteel/stairs{
+ dir = 8
+ },
+/area/ship/bridge)
"vx" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/mineral/plastitanium,
@@ -2289,1621 +2332,1304 @@
/obj/structure/cable{
icon_state = "1-4"
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"vC" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+"vF" = (
+/obj/structure/railing{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/structure/cable/yellow,
/obj/structure/cable/yellow{
- icon_state = "4-8"
+ icon_state = "1-2"
},
-/obj/structure/catwalk/over,
-/obj/structure/closet/wall/orange{
- name = "fuel locker";
- pixel_y = 28
+/obj/machinery/power/terminal{
+ dir = 4
},
-/obj/item/stack/sheet/mineral/uranium/five,
-/obj/item/stack/sheet/mineral/uranium/five{
- pixel_x = 2
+/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer2,
+/turf/open/floor/plasteel/stairs{
+ dir = 1
},
-/obj/effect/spawner/lootdrop/maintenance/three,
-/turf/open/floor/plating,
/area/ship/engineering)
-"vQ" = (
-/obj/machinery/light/directional/east,
-/obj/effect/turf_decal/box,
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/machinery/button/door{
- dir = 8;
- id = "syndiewarship_armorybay";
- name = "Weapon Hold";
- pixel_x = 28
- },
-/obj/effect/turf_decal/techfloor{
- dir = 4
+"vI" = (
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 10
},
-/obj/machinery/suit_storage_unit/inherit,
-/obj/machinery/light_switch{
- pixel_x = -13;
- pixel_y = 22
- },
-/obj/item/clothing/suit/space/hardsuit/syndi/hl,
-/obj/item/clothing/mask/gas/syndicate,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/security/armory)
-"vT" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/structure/railing{
+ dir = 10
},
+/turf/open/floor/plasteel/tech,
+/area/ship/bridge)
+"vL" = (
/obj/effect/decal/cleanable/dirt,
+/obj/structure/chair/office{
+ dir = 1;
+ name = "tactical swivel chair"
+ },
+/turf/open/floor/pod,
+/area/ship/cargo)
+"vT" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 9
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"wo" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
- dir = 4;
- id = "syndiewarship_windows";
- name = "Blast Shutters"
+/obj/structure/cable{
+ icon_state = "1-8"
},
+/obj/structure/catwalk/over/plated_catwalk/dark,
/turf/open/floor/plating,
-/area/ship/medical)
-"ws" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/obj/effect/turf_decal/techfloor{
- dir = 8
+/area/ship/maintenance/port)
+"vX" = (
+/obj/machinery/door/poddoor/shutters{
+ dir = 8;
+ id = "syndiewarship_armorybay";
+ name = "Weapon Hold"
},
-/obj/structure/extinguisher_cabinet/directional/west,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/engineering)
-"wO" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/siding/wood{
- dir = 6
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/machinery/light/small/directional/east,
-/obj/item/toy/plush/beeplushie{
- pixel_x = 3;
- pixel_y = 8
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/holofloor/wood,
-/area/ship/bridge)
-"wP" = (
-/obj/structure/railing,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/border_only{
dir = 4
},
-/obj/structure/cable/yellow{
- icon_state = "0-8"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/security/armory)
+"vY" = (
+/obj/effect/decal/cleanable/cobweb,
+/obj/item/cigbutt{
+ anchored = 1;
+ color = "#808080";
+ layer = 2;
+ pixel_x = -4;
+ pixel_y = 1
+ },
+/obj/effect/decal/cleanable/greenglow,
+/obj/effect/decal/fakelattice,
+/obj/structure/railing,
+/turf/open/floor/plasteel/elevatorshaft,
+/area/ship/hallway/aft)
+"wd" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "engine fuel pump"
},
/obj/structure/cable/yellow{
- icon_state = "4-8"
+ icon_state = "2-4"
},
-/obj/machinery/power/terminal{
- dir = 1
+/obj/effect/turf_decal/steeldecal/steel_decals10{
+ dir = 5
},
-/turf/open/floor/plasteel/stairs{
- dir = 8
+/obj/effect/turf_decal/steeldecal/steel_decals10{
+ dir = 9
},
+/turf/open/floor/plasteel/tech,
/area/ship/engineering)
-"xg" = (
-/obj/structure/mecha_wreckage/mauler,
-/obj/effect/turf_decal/techfloor,
-/turf/open/floor/plasteel/telecomms_floor,
-/area/ship/cargo)
-"xj" = (
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
+"wk" = (
+/obj/machinery/computer/operating{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+/turf/open/floor/pod/dark,
+/area/ship/medical)
+"wE" = (
+/obj/structure/table/reinforced,
+/obj/machinery/light/directional/east,
+/obj/machinery/chem_dispenser/drinks/beer{
dir = 8
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
/turf/open/floor/mineral/plastitanium,
/area/ship/crew/canteen)
-"xl" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+"wG" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/stairs,
-/area/ship/bridge)
-"xC" = (
-/obj/machinery/power/smes{
- charge = 5e+006
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/obj/structure/railing{
- dir = 1
+/obj/machinery/atmospherics/components/binary/volume_pump{
+ name = "Input to Fuel"
},
-/obj/effect/turf_decal/industrial/radiation,
-/obj/structure/cable{
- icon_state = "0-8"
+/obj/effect/turf_decal/industrial/shutoff{
+ dir = 8
},
/turf/open/floor/plasteel/tech,
/area/ship/engineering)
-"xD" = (
-/obj/machinery/door/poddoor{
- id = "Artillery2shutter"
- },
-/obj/machinery/power/shieldwallgen/atmos{
- anchored = 1;
- dir = 4;
- id = "komodo_starboard";
- locked = 1
+"wJ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/steeldecal/steel_decals4{
+ dir = 8
},
-/obj/structure/cable{
- icon_state = "0-2"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
},
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/maintenance/starboard)
-"xP" = (
-/obj/structure/sink{
- dir = 4;
- pixel_x = -12;
- pixel_y = 2
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
},
-/obj/structure/mirror{
- pixel_x = -26
+/obj/structure/cable{
+ icon_state = "4-8"
},
+/turf/open/floor/plasteel/tech,
+/area/ship/bridge)
+"wR" = (
/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/plasteel/freezer,
-/area/ship/hallway/aft)
-"xZ" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 5
- },
-/obj/structure/railing{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 4
},
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"yw" = (
-/obj/machinery/porta_turret/ship/syndicate{
- dir = 8
- },
-/turf/closed/wall/mineral/plastitanium,
+/obj/machinery/airalarm/directional/west,
+/turf/open/floor/plasteel/dark,
/area/ship/bridge)
-"yJ" = (
-/obj/structure/frame/machine,
-/obj/structure/grille/broken,
-/obj/structure/spider/stickyweb,
-/obj/item/toy/plush/spider,
-/turf/open/floor/plasteel/tech,
-/area/ship/maintenance/port)
-"yV" = (
-/obj/structure/chair/stool/bar{
- dir = 1
+"wT" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
+/turf/open/floor/mineral/plastitanium,
+/area/ship/security/armory)
+"xd" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/effect/turf_decal/techfloor,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/engineering)
+"xj" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 5
},
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"yX" = (
+/turf/open/floor/plasteel/tech,
+/area/ship/cargo)
+"xr" = (
+/obj/machinery/cryopod{
+ dir = 1
+ },
/obj/structure/railing{
+ dir = 4;
+ layer = 2.8
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/computer/cryopod/directional/east,
+/obj/effect/decal/cleanable/robot_debris,
+/turf/open/floor/pod/dark,
+/area/ship/crew/dorm)
+"xF" = (
+/obj/structure/chair/stool/bar{
dir = 4
},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"yY" = (
+/turf/open/floor/mineral/plastitanium,
+/area/ship/crew/canteen)
+"xH" = (
+/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil{
- icon_state = "streak3"
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/effect/turf_decal/syndicateemblem/top/middle{
+ dir = 8
},
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"zk" = (
-/obj/structure/railing{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
-/obj/machinery/atmospherics/components/unary/tank/air{
- piping_layer = 2
- },
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/airalarm/directional/north,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering)
-"zu" = (
-/obj/machinery/button/door{
- id = "Syndie_warship_lockdown";
- name = "Lockdown Control";
- pixel_y = 26
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/obj/structure/railing{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/structure/cable{
+ icon_state = "4-8"
},
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"zF" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
- dir = 4;
- id = "warshipbridge";
- name = "Blast Shutters"
- },
-/turf/open/floor/plating,
-/area/ship/bridge)
-"zK" = (
-/obj/structure/closet/crate{
- name = "food crate"
- },
-/obj/item/storage/box/donkpockets{
- pixel_x = -5;
- pixel_y = 3
- },
-/obj/item/storage/box/donkpockets{
- pixel_x = 2;
- pixel_y = 3
- },
-/obj/effect/turf_decal/arrows{
- dir = 8
+"xJ" = (
+/obj/structure/curtain,
+/obj/item/soap/syndie,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/shower{
+ pixel_y = 14
},
-/obj/machinery/light/directional/east,
-/obj/structure/railing,
-/turf/open/floor/mineral/plastitanium,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/plasteel/showroomfloor,
/area/ship/hallway/aft)
-"zR" = (
-/obj/structure/railing{
+"xM" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/oil,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/mask/gas/syndicate,
-/obj/effect/turf_decal/techfloor,
-/obj/item/clothing/mask/balaclava,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/structure/closet/syndicate{
- desc = "It's a basic storage unit.";
- name = "uniform closet"
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/central)
-"zV" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
- dir = 4;
- id = "syndiewarship_windows";
- name = "Blast Shutters"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
-"Ai" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "engine fuel pump"
+"xV" = (
+/obj/structure/cable{
+ icon_state = "0-8"
},
-/obj/structure/cable/yellow{
- icon_state = "1-4"
+/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{
+ dir = 1
},
-/obj/effect/turf_decal/steeldecal/steel_decals10{
- dir = 9
+/obj/effect/decal/cleanable/generic,
+/obj/item/stack/cable_coil/orange{
+ pixel_x = 6;
+ pixel_y = -6
},
-/obj/effect/turf_decal/steeldecal/steel_decals10{
- dir = 10
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 9
},
+/obj/effect/turf_decal/industrial/outline/yellow,
+/obj/item/radio/intercom/directional/south,
+/obj/effect/decal/cleanable/robot_debris/old,
/turf/open/floor/plasteel/tech,
/area/ship/engineering)
-"Aj" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/crew/canteen)
-"Al" = (
-/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
-/obj/machinery/door/poddoor/shutters{
- id = "warshipbridge";
- name = "Blast Shutters";
- dir = 8
+"xW" = (
+/obj/structure/railing{
+ dir = 4
},
-/turf/open/floor/plating,
-/area/ship/bridge)
-"Ap" = (
-/obj/effect/turf_decal/techfloor,
-/obj/machinery/power/apc/auto_name/directional/south,
-/obj/structure/cable,
-/obj/machinery/light_switch{
- dir = 1;
- pixel_x = -12;
- pixel_y = -16
+/obj/effect/turf_decal/techfloor{
+ dir = 4
},
-/turf/open/floor/plasteel/telecomms_floor,
-/area/ship/maintenance/port)
-"As" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/highsecurity{
- name = "Bridge";
- req_access_txt = "19"
+/obj/machinery/light/floor,
+/turf/open/floor/plasteel/tech,
+/area/ship/cargo)
+"yb" = (
+/obj/structure/railing,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"Au" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/orange/visible,
/obj/effect/turf_decal/industrial/warning,
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/machinery/atmospherics/components/binary/pump/on/layer2{
+ dir = 8;
+ name = "Air to Distro";
+ target_pressure = 500
},
+/turf/open/floor/plasteel/tech,
+/area/ship/engineering)
+"yd" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 10
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Av" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Az" = (
-/obj/effect/decal/cleanable/glass,
-/turf/open/floor/circuit/green/off,
-/area/ship/maintenance/port)
-"AR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/obj/machinery/door/airlock/external{
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ship/maintenance/starboard)
+"yg" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/ship/engineering)
-"AY" = (
-/obj/structure/sign/syndicate,
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/maintenance/port)
-"Bf" = (
-/obj/structure/chair/comfy{
dir = 4
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line,
-/obj/machinery/airalarm/directional/south,
-/obj/effect/decal/cleanable/vomit/old{
- pixel_x = 9;
- pixel_y = -1
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"Bg" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{
- dir = 1
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
-/turf/open/floor/engine/hull,
-/area/ship/external)
-"Bj" = (
-/obj/effect/turf_decal/industrial/warning/corner{
+/obj/structure/catwalk/over,
+/turf/open/floor/plating,
+/area/ship/engineering)
+"yk" = (
+/obj/machinery/power/terminal{
dir = 8
},
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/railing/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "2-8"
+ icon_state = "0-2"
},
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Bk" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 6
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"yp" = (
+/obj/structure/salvageable/computer{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
+/obj/effect/decal/cleanable/wrapping,
+/turf/open/floor/circuit/green/off,
+/area/ship/maintenance/port)
+"ys" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"BL" = (
-/obj/effect/turf_decal/corner_techfloor_grid{
- dir = 5
+/obj/structure/catwalk/over,
+/obj/structure/closet/wall/orange/directional/east{
+ name = "fuel locker"
},
-/obj/structure/railing{
- dir = 1
+/obj/item/stack/sheet/mineral/plasma/five,
+/obj/item/stack/sheet/mineral/plasma/five,
+/obj/item/stack/sheet/mineral/plasma/five,
+/obj/item/stack/sheet/mineral/plasma/five,
+/turf/open/floor/plating,
+/area/ship/engineering)
+"yB" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/structure/closet/crate/secure/loot,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/engineering)
+"yH" = (
+/obj/item/gun/ballistic/automatic/pistol,
+/obj/item/gun/ballistic/automatic/pistol{
+ pixel_y = 3
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
+/obj/effect/turf_decal/industrial/fire{
+ dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"BP" = (
-/obj/structure/sign/syndicate,
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/maintenance/starboard)
-"BV" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/corner_techfloor_grid{
- dir = 5
- },
-/obj/structure/railing/corner{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/structure/guncase,
+/obj/structure/railing,
+/obj/item/gun/ballistic/automatic/smg/c20r,
+/obj/machinery/light/directional/east,
+/turf/open/floor/pod/dark,
+/area/ship/security/armory)
+"yJ" = (
+/obj/structure/frame/machine,
+/obj/structure/grille/broken,
+/obj/structure/spider/stickyweb,
+/obj/item/toy/plush/spider,
+/turf/open/floor/plasteel/tech,
+/area/ship/maintenance/port)
+"yO" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 23;
+ pixel_y = 12
},
-/obj/machinery/power/apc/auto_name/directional/north,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/medical)
+"yV" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/turf_decal/industrial/warning,
/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/light_switch{
- pixel_x = -13;
- pixel_y = 22
+ icon_state = "4-8"
},
+/turf/open/floor/plasteel/tech,
+/area/ship/maintenance/port)
+"zw" = (
+/obj/effect/turf_decal/borderfloor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
-"BW" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 2;
- name = "tactical chair"
- },
+"zx" = (
+/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/light_switch{
- pixel_x = -10;
- pixel_y = 26
- },
-/obj/effect/turf_decal/techfloor{
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
dir = 1
},
-/obj/item/radio/intercom/directional/north{
- pixel_y = 31;
- pixel_x = 3
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/central)
-"Ca" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
- },
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Cn" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
+/obj/structure/cable{
+ icon_state = "1-8"
},
/turf/open/floor/mineral/plastitanium/red,
-/area/ship/security/armory)
-"Cr" = (
-/obj/machinery/light/directional/east,
+/area/ship/hallway/central)
+"zP" = (
/obj/machinery/suit_storage_unit/inherit/industrial,
/obj/item/clothing/suit/space/syndicate/black/engie,
/obj/item/clothing/head/helmet/space/syndicate/black/engie,
-/obj/effect/turf_decal/techfloor{
- dir = 4
- },
-/obj/machinery/firealarm/directional/north,
+/obj/effect/turf_decal/techfloor,
+/obj/machinery/light/directional/south,
+/obj/machinery/firealarm/directional/east,
/turf/open/floor/mineral/plastitanium,
/area/ship/engineering)
-"CA" = (
+"zZ" = (
/obj/effect/turf_decal/industrial/warning{
dir = 1
},
-/obj/effect/turf_decal/industrial/warning,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+/obj/effect/turf_decal/syndicateemblem/middle/left{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"Aa" = (
+/obj/machinery/door/airlock/hatch{
+ name = "Canteen"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "1-2"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"CH" = (
-/obj/effect/turf_decal/steeldecal/steel_decals_central4{
- dir = 8
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"CK" = (
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/border_only,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/crew/canteen)
+"Ab" = (
/obj/structure/railing{
dir = 1
},
-/obj/structure/railing,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 5
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
-/obj/structure/cable/yellow{
+/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/plasteel/stairs{
- dir = 8
- },
-/area/ship/engineering)
-"CL" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/crew/dorm)
-"CM" = (
-/turf/template_noop,
-/area/template_noop)
-"CO" = (
-/obj/machinery/power/shuttle/engine/fueled/plasma{
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ship/maintenance/port)
+"Ad" = (
+/obj/structure/table/reinforced,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
dir = 1
},
-/turf/open/floor/plating,
-/area/ship/engineering)
-"CP" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/dim/directional/south,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 1
+ dir = 8
},
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"CT" = (
-/obj/machinery/computer/security{
- dir = 8
- },
-/obj/effect/turf_decal/techfloor{
- dir = 4
+/obj/item/reagent_containers/glass/rag{
+ pixel_x = -5;
+ pixel_y = 12
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 8
+/obj/machinery/firealarm/directional/north,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/crew/canteen)
+"Aj" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/crew/canteen)
+"Al" = (
+/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
+/obj/machinery/door/poddoor/shutters{
+ dir = 8;
+ id = "warshipbridge";
+ name = "Blast Shutters"
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/radio/intercom/wideband/directional/east,
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating,
/area/ship/bridge)
-"CY" = (
-/obj/machinery/door/airlock/external{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/layer_manifold{
- dir = 4
- },
-/obj/docking_port/mobile{
- dir = 4;
- launch_status = 0;
- port_direction = 8
- },
-/turf/open/floor/plasteel,
-/area/ship/engineering)
-"CZ" = (
-/obj/machinery/computer/bsa_control,
-/obj/machinery/firealarm/directional/east,
-/turf/open/floor/circuit/green/off,
-/area/ship/maintenance/starboard)
-"Dd" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/hallway/central)
-"Dl" = (
-/obj/machinery/computer/med_data/syndie{
- dir = 4
- },
-/obj/effect/turf_decal/techfloor{
- dir = 8
+"AL" = (
+/obj/effect/turf_decal/borderfloor{
+ dir = 1
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 4
+/obj/item/gun/ballistic/automatic/pistol{
+ pixel_y = 3
},
-/obj/item/radio/intercom/directional/west,
-/obj/machinery/light_switch{
- dir = 4;
- pixel_x = -23;
- pixel_y = 13
+/obj/item/ammo_box/magazine/m10mm,
+/obj/item/ammo_box/magazine/m10mm,
+/obj/item/ammo_box/c10mm,
+/obj/item/clothing/gloves/tackler/combat/insulated,
+/obj/structure/closet/secure_closet/wall/directional/west{
+ icon_state = "sec_wall";
+ name = "Sergeant's Locker";
+ req_access_txt = "58"
},
+/obj/item/melee/classic_baton/telescopic,
+/obj/item/clothing/suit/armor/vest/blueshirt,
+/obj/item/clothing/accessory/holster,
+/obj/item/clothing/shoes/combat,
+/obj/item/radio/headset/syndicate,
+/obj/item/clothing/under/syndicate/hardliners/officer,
+/obj/item/clothing/suit/armor/hardliners/sergeant,
+/obj/item/clothing/head/hardliners/peaked,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
-"Do" = (
-/obj/machinery/door/airlock/hatch{
- dir = 4;
- name = "Dormitory"
- },
+"AS" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 5
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 5
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/light/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"AV" = (
+/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
+/obj/machinery/door/poddoor/shutters{
+ id = "syndiewarship_windows";
+ name = "Blast Shutters"
},
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating,
/area/ship/crew/dorm)
-"DO" = (
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/mask/gas/syndicate,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
+"AY" = (
+/obj/structure/sign/syndicate,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/maintenance/port)
+"AZ" = (
+/obj/structure/closet/toolcloset,
+/obj/structure/railing{
+ dir = 4;
+ layer = 2.8
},
-/obj/effect/turf_decal/techfloor{
- dir = 10
+/obj/effect/decal/cleanable/oil{
+ icon_state = "streak5"
},
-/obj/item/clothing/mask/balaclava,
-/obj/item/clothing/under/syndicate/gorlex,
-/obj/structure/closet/syndicate{
- desc = "It's a basic storage unit.";
- name = "uniform closet"
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/central)
-"DQ" = (
-/obj/structure/railing/corner,
-/turf/open/floor/plasteel/stairs{
+/obj/effect/turf_decal/industrial/outline/yellow,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"Bd" = (
+/obj/machinery/computer/helm{
dir = 8
},
-/area/ship/crew/dorm)
-"DZ" = (
-/obj/effect/turf_decal/industrial/warning{
+/obj/effect/turf_decal/techfloor{
dir = 4
},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/security/armory)
-"Ed" = (
-/obj/machinery/light/small/directional/south,
-/obj/structure/table/reinforced{
- color = "#c1b6a5"
- },
-/obj/effect/turf_decal/spline/fancy/opaque/black{
- dir = 8
- },
-/obj/item/paper_bin{
- pixel_x = -6
- },
-/obj/item/clipboard{
- pixel_x = 5
- },
-/obj/item/folder/red{
- pixel_x = 6;
- pixel_y = -3
- },
-/obj/item/pen{
- pixel_x = -6;
- pixel_y = 1
- },
/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"Eg" = (
-/obj/structure/toilet{
- pixel_y = 13
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/light/small/directional/west,
-/obj/effect/decal/cleanable/cobweb,
-/obj/structure/sign/poster/official/moth/smokey{
- pixel_x = 28
+/area/ship/bridge)
+"Bx" = (
+/obj/machinery/porta_turret/ship/syndicate/weak,
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/bridge)
+"BK" = (
+/obj/effect/turf_decal/box,
+/obj/machinery/shower{
+ dir = 1
},
-/turf/open/floor/plasteel/freezer,
-/area/ship/hallway/aft)
-"Eh" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/hatch{
- dir = 4;
- name = "Canteen"
+/turf/open/floor/mineral/plastitanium,
+/area/ship/medical)
+"BP" = (
+/obj/structure/sign/syndicate,
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/maintenance/starboard)
+"BQ" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 10
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/obj/effect/turf_decal/techfloor/corner{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
+ dir = 4
},
/turf/open/floor/mineral/plastitanium/red,
-/area/ship/crew/canteen)
-"El" = (
-/obj/structure/filingcabinet,
-/obj/item/folder/documents/syndicate/mining,
-/turf/open/floor/engine,
-/area/ship/bridge)
-"Ep" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/cargo)
-"Ew" = (
-/obj/structure/table/reinforced{
- color = "#c1b6a5"
- },
-/obj/effect/turf_decal/spline/fancy/opaque/black{
- dir = 8
- },
-/obj/item/storage/fancy/nugget_box{
- pixel_x = -5;
- pixel_y = -21
- },
-/obj/item/flashlight/lamp{
- pixel_x = -8;
- pixel_y = 13
- },
-/obj/item/phone{
- pixel_x = 7;
- pixel_y = 10
- },
-/obj/item/trash/can{
- pixel_x = -8;
- pixel_y = -2
+/area/ship/hallway/central)
+"BR" = (
+/obj/machinery/door/airlock/hatch{
+ dir = 8;
+ name = "Engineering"
},
-/obj/item/newspaper{
- pixel_x = -4;
- pixel_y = -1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/item/reagent_containers/food/drinks/mug{
- pixel_x = 9;
- pixel_y = 4
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"EM" = (
-/obj/structure/table/reinforced,
-/obj/item/camera_bug{
- pixel_x = -4;
- pixel_y = 7
- },
-/obj/item/megaphone{
- pixel_x = -2;
- pixel_y = -6
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
},
-/obj/machinery/light/directional/west,
-/obj/effect/turf_decal/techfloor{
+/obj/machinery/door/firedoor/border_only{
dir = 8
},
-/obj/machinery/recharger{
- pixel_x = 7;
- pixel_y = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"ES" = (
/obj/effect/turf_decal/industrial/warning{
dir = 8
},
/obj/effect/turf_decal/industrial/warning{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/aft)
-"EX" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
/area/ship/engineering)
-"EY" = (
-/obj/effect/turf_decal/techfloor,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"Fc" = (
-/obj/structure/cable{
- icon_state = "1-8"
+"BY" = (
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 1
},
-/obj/structure/extinguisher_cabinet/directional/east,
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"Fg" = (
+/obj/effect/turf_decal/industrial/warning/corner,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/syndicateemblem/middle/middle,
+/obj/structure/railing/corner,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "1-8"
},
-/obj/effect/landmark/observer_start,
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"Fo" = (
-/obj/item/stack/ore/salvage/scrapmetal/ten,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/ship/maintenance/port)
-"Fr" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
+"Ce" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/industrial/warning{
dir = 1
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"Fx" = (
-/obj/machinery/button/door{
- id = "syndie_mechbay";
- name = "mechbay door";
- pixel_y = 25
- },
-/obj/effect/turf_decal/techfloor{
- dir = 5
- },
-/turf/open/floor/plasteel/telecomms_floor,
-/area/ship/cargo)
-"FL" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 9
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 1
},
-/obj/structure/bookcase/random/fiction,
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/holofloor/wood,
-/area/ship/bridge)
-"FT" = (
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
-/obj/effect/decal/cleanable/greenglow,
-/obj/effect/decal/cleanable/plasma,
/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/ship/maintenance/port)
-"FV" = (
-/obj/effect/spawner/lootdrop/salvage_scanning,
-/obj/effect/decal/cleanable/shreds{
- pixel_y = 14
- },
-/turf/open/floor/plating,
-/area/ship/maintenance/port)
-"FY" = (
-/obj/machinery/porta_turret/ship/syndicate{
- dir = 4
- },
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/bridge)
-"Gl" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/railing{
- dir = 1;
- layer = 2.8
+ icon_state = "4-8"
},
-/turf/open/floor/pod/dark,
-/area/ship/crew/dorm)
-"Gp" = (
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/aft)
+"Ci" = (
/obj/effect/turf_decal/industrial/warning{
dir = 1
},
-/obj/effect/turf_decal/industrial/warning/corner,
-/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Gy" = (
-/obj/item/stack/ore/salvage/scrapplasma/five,
-/obj/effect/decal/cleanable/ash/large,
+/area/ship/hallway/aft)
+"Cj" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 6
},
-/turf/open/floor/plating,
-/area/ship/maintenance/port)
-"GT" = (
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/industrial/warning{
- dir = 9
+/obj/structure/railing/corner{
+ dir = 4
},
-/obj/structure/railing{
- dir = 9
- },
-/obj/machinery/firealarm/directional/north,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Hc" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/maintenance/starboard)
-"Hd" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 4
},
/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/turf/open/floor/plating,
-/area/ship/maintenance/port)
-"Ho" = (
-/obj/structure/railing{
- dir = 1
- },
-/obj/effect/turf_decal/techfloor{
- dir = 1
+ icon_state = "0-8"
},
+/obj/machinery/power/apc/auto_name/directional/east,
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"CB" = (
+/obj/item/stack/ore/salvage/scraptitanium,
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"Hp" = (
-/obj/structure/railing,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/robot_debris,
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/turf_decal/borderfloorblack,
-/obj/machinery/airalarm/directional/east,
-/obj/structure/cable{
- icon_state = "1-8"
- },
+/obj/machinery/airalarm/directional/south,
/turf/open/floor/plating{
- icon_state = "platingdmg3"
+ icon_state = "platingdmg1"
},
/area/ship/maintenance/starboard)
-"Hv" = (
-/obj/structure/railing/corner{
+"CG" = (
+/obj/effect/decal/cleanable/plasma,
+/obj/machinery/power/terminal{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 9
+/obj/structure/cable{
+ icon_state = "0-2"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/structure/cable,
-/obj/machinery/power/terminal,
-/turf/open/floor/plasteel/tech,
+/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
-"Hy" = (
-/obj/machinery/cryopod{
- dir = 8
- },
-/obj/structure/railing{
- dir = 1;
- layer = 2.8
- },
-/obj/machinery/computer/cryopod/directional/north{
- pixel_y = 26
+"CL" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/crew/dorm)
+"CM" = (
+/turf/template_noop,
+/area/template_noop)
+"Dd" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/hallway/central)
+"Du" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 9
},
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 9
},
+/obj/structure/closet/firecloset/wall/directional/east,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"Eb" = (
/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/pod/dark,
-/area/ship/crew/dorm)
-"HB" = (
-/obj/structure/railing{
+/obj/effect/turf_decal/techfloor{
dir = 8
},
-/obj/machinery/atmospherics/components/unary/tank/toxins,
-/obj/effect/turf_decal/industrial/outline/yellow,
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering)
-"HJ" = (
-/obj/effect/turf_decal/spline/fancy/opaque/black{
- dir = 5
+/turf/open/floor/plasteel/tech,
+/area/ship/cargo)
+"Ek" = (
+/obj/structure/closet/secure_closet{
+ anchored = 1;
+ icon_state = "hos";
+ name = "captain's locker";
+ req_access_txt = "20"
},
-/obj/item/kirbyplants/random,
-/obj/effect/decal/cleanable/wrapping,
+/obj/item/clothing/gloves/krav_maga/combatglovesplus,
+/obj/item/clothing/glasses/thermal/eyepatch,
+/obj/item/gun/ballistic/revolver,
+/obj/item/clothing/under/syndicate/sniper,
+/obj/item/ammo_box/a357,
+/obj/item/ammo_box/a357,
+/obj/item/radio/headset/syndicate/alt/leader,
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/under/syndicate/hardliners/officer,
+/obj/item/clothing/suit/toggle/armor/vest/hardliners,
+/obj/item/clothing/head/hardliners/peaked,
+/turf/open/floor/carpet/black,
+/area/ship/bridge)
+"El" = (
+/obj/structure/filingcabinet,
+/obj/item/folder/documents/syndicate/red,
+/turf/open/floor/engine,
+/area/ship/bridge)
+"Em" = (
+/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/camera/autoname{
- dir = 1
- },
-/obj/machinery/firealarm/directional/south,
-/obj/structure/railing{
- dir = 5
- },
/turf/open/floor/plasteel/tech,
-/area/ship/bridge)
-"HM" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = 3;
- pixel_y = 7
- },
-/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,
-/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine{
- pixel_x = 4;
- pixel_y = -18
+/area/ship/maintenance/starboard)
+"Eo" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 6
},
-/obj/item/mecha_parts/mecha_equipment/repair_droid,
-/obj/machinery/light/directional/east,
-/obj/structure/railing{
- dir = 4
+/obj/structure/railing,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/machinery/firealarm/directional/north,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/turf/open/floor/plasteel/tech/grid,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"Ep" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ship/cargo)
-"HN" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/box/bodybags{
- pixel_y = 6
- },
-/obj/item/stack/medical/gauze,
-/obj/item/stack/medical/ointment,
-/obj/item/stack/medical/bruise_pack{
- pixel_x = 6
+"EB" = (
+/obj/structure/closet/crate{
+ name = "food crate"
},
-/obj/structure/window/reinforced{
+/obj/effect/turf_decal/arrows{
dir = 1
},
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/structure/cable,
-/obj/item/storage/firstaid/brute{
- pixel_x = -7;
- pixel_y = 4
- },
-/obj/item/storage/firstaid/fire{
- pixel_x = -7;
- pixel_y = -3
- },
-/turf/open/floor/pod/dark,
-/area/ship/medical)
-"HV" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/techfloor,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 1
},
-/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"Ib" = (
-/obj/structure/railing/corner,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/industrial/stand_clear,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/sign/poster/contraband/random{
- pixel_x = -32
+/obj/effect/spawner/lootdrop/ration{
+ pixel_x = -6
},
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/effect/spawner/lootdrop/ration{
+ pixel_x = -6
},
-/turf/open/floor/plasteel/tech,
-/area/ship/maintenance/starboard)
-"Ic" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
+/obj/effect/spawner/lootdrop/ration{
+ pixel_x = -6
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/obj/effect/spawner/lootdrop/ration{
+ pixel_x = -6
},
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/machinery/airalarm/directional/south,
/turf/open/floor/mineral/plastitanium,
-/area/ship/medical)
-"If" = (
+/area/ship/hallway/aft)
+"EF" = (
/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
+ dir = 4
},
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-2"
},
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"Ig" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 2;
- name = "tactical chair"
- },
-/obj/effect/turf_decal/techfloor{
- dir = 1
+"EJ" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 10
},
-/turf/open/floor/mineral/plastitanium,
+/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"Ih" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
- },
+"EL" = (
+/obj/machinery/power/ship_gravity,
/obj/structure/cable{
- icon_state = "2-8"
+ icon_state = "0-2"
},
-/turf/open/floor/plasteel/dark,
-/area/ship/maintenance/starboard)
-"Ii" = (
-/obj/machinery/atmospherics/components/binary/dp_vent_pump/layer2{
- dir = 8
+/obj/effect/turf_decal/industrial/outline/yellow,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"EN" = (
+/obj/machinery/syndicatebomb/self_destruct{
+ anchored = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+/obj/machinery/door/window/brigdoor/northright{
+ dir = 4;
+ req_access_txt = "19"
},
-/obj/structure/closet/emcloset/wall{
- dir = 1;
- pixel_y = -28
+/obj/machinery/light/dim/directional/west{
+ brightness = 6;
+ bulb_colour = "#FF3232";
+ bulb_power = 0.4
},
-/obj/machinery/advanced_airlock_controller{
- pixel_y = 28
+/turf/open/floor/circuit/red,
+/area/ship/bridge)
+"Fe" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/turf/open/floor/plasteel,
-/area/ship/engineering)
-"Ij" = (
-/obj/structure/railing{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/syndicateemblem/top/left{
+ dir = 8
},
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/turf/open/floor/plating,
-/area/ship/maintenance/starboard)
-"Il" = (
+/obj/machinery/firealarm/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"FB" = (
/obj/effect/turf_decal/industrial/warning{
- dir = 5
+ dir = 1
},
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 4
},
/turf/open/floor/mineral/plastitanium/red,
/area/ship/security/armory)
-"In" = (
-/obj/machinery/mech_bay_recharge_port,
-/obj/effect/turf_decal/techfloor{
- dir = 10
+"FL" = (
+/obj/machinery/computer/security{
+ dir = 1
},
-/obj/machinery/camera/autoname{
+/obj/effect/turf_decal/techfloor,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 1
},
-/turf/open/floor/plasteel/telecomms_floor,
-/area/ship/cargo)
-"Io" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating/rust,
-/area/ship/maintenance/starboard)
-"IE" = (
/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/radio/intercom/wideband/directional/south,
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"FO" = (
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/machinery/firealarm/directional/north,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"FV" = (
+/obj/effect/spawner/lootdrop/salvage_scanning,
+/obj/effect/decal/cleanable/shreds{
+ pixel_y = 14
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"IL" = (
-/obj/structure/table/reinforced,
-/obj/machinery/light/directional/east,
-/obj/item/paper_bin{
- pixel_x = 6
+/turf/open/floor/plating,
+/area/ship/maintenance/port)
+"Gh" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/techfloor{
+ dir = 8
},
-/obj/item/pen/red{
- pixel_x = 5;
- pixel_y = 1
+/obj/structure/cable{
+ icon_state = "0-4"
},
-/obj/effect/turf_decal/techfloor{
- dir = 4
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -19;
+ pixel_y = -11
},
-/obj/item/clipboard{
- pixel_x = -5
+/obj/machinery/power/apc/auto_name/directional/west,
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ship/maintenance/starboard)
+"Gj" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/obj/item/taperecorder{
- pixel_x = -3
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"Gl" = (
+/obj/machinery/door/poddoor{
+ dir = 8;
+ id = "Artillery1shutter"
},
-/obj/item/clothing/glasses/hud/security/night{
- pixel_x = -4;
- pixel_y = -6
+/obj/machinery/power/shieldwallgen/atmos{
+ anchored = 1;
+ dir = 1;
+ id = "komodo_port";
+ locked = 1
},
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"Jo" = (
-/obj/machinery/power/port_gen/pacman/super,
-/obj/effect/decal/cleanable/cobweb,
-/obj/effect/decal/cleanable/plasma,
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 6
+/obj/structure/cable{
+ icon_state = "0-8"
},
-/obj/structure/cable/yellow{
- icon_state = "0-2"
+/obj/docking_port/mobile{
+ can_move_docking_ports = 1;
+ dir = 8;
+ launch_status = 0;
+ preferred_direction = 4
},
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"Js" = (
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 10
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/maintenance/port)
+"Gs" = (
+/obj/structure/railing,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/item/radio/intercom/directional/east,
/obj/structure/cable{
- icon_state = "0-2"
+ icon_state = "4-8"
},
-/obj/machinery/computer/monitor,
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"Jw" = (
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/neck/scarf/red,
-/obj/item/clothing/mask/bandana/skull,
+/turf/open/floor/plasteel/stairs{
+ dir = 8;
+ icon = 'icons/obj/stairs.dmi'
+ },
+/area/ship/maintenance/starboard)
+"GD" = (
/obj/item/clothing/mask/gas/syndicate,
-/obj/effect/turf_decal/techfloor{
- dir = 6
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 4
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 1
+/obj/effect/turf_decal/techfloor{
+ dir = 9
},
-/obj/item/clothing/under/utility,
+/obj/item/clothing/mask/balaclava,
/obj/structure/closet/syndicate{
desc = "It's a basic storage unit.";
name = "uniform closet"
},
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/under/syndicate/hardliners,
/turf/open/floor/mineral/plastitanium,
/area/ship/hallway/central)
-"Jx" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"JB" = (
-/obj/machinery/computer/crew/syndie{
- dir = 4
- },
-/obj/effect/turf_decal/techfloor{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/airalarm/directional/west,
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"JC" = (
+"GJ" = (
/obj/effect/turf_decal/industrial/warning{
dir = 4
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 8
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 1
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "1-8"
},
+/obj/machinery/light/directional/east,
/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/aft)
-"JE" = (
-/obj/effect/turf_decal/box,
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/effect/turf_decal/techfloor{
- dir = 4
+/area/ship/hallway/central)
+"GN" = (
+/obj/machinery/modular_computer/console/preset/command{
+ dir = 1
},
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable{
- icon_state = "0-8"
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 8
},
-/obj/machinery/suit_storage_unit/inherit,
-/obj/item/clothing/suit/space/hardsuit/syndi/hl,
-/obj/item/clothing/mask/gas/syndicate,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/security/armory)
-"JH" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/firealarm/directional/west,
+/obj/effect/turf_decal/techfloor,
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/bridge)
+"GS" = (
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "1-4"
},
+/obj/structure/extinguisher_cabinet/directional/south,
/turf/open/floor/plasteel/dark,
-/area/ship/crew/dorm)
-"JK" = (
-/obj/machinery/door/window/southleft,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/trimline/transparent/bar/filled/corner{
- dir = 4
+/area/ship/bridge)
+"Hc" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/maintenance/starboard)
+"Hf" = (
+/obj/structure/table/reinforced{
+ color = "#c1b6a5"
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"JV" = (
-/obj/structure/closet/wall/orange{
- dir = 8;
- name = "Engineering locker";
- pixel_x = 30
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 1
},
-/obj/item/clothing/under/syndicate/coldres,
-/obj/item/clothing/suit/toggle/industrial,
-/obj/item/clothing/shoes/workboots,
-/obj/item/clothing/head/welding,
-/obj/item/clothing/head/hardhat/red,
-/obj/item/clothing/head/hardhat/weldhat/orange{
- pixel_x = 7;
- pixel_y = 2
+/obj/item/paper_bin{
+ pixel_x = -6
},
-/obj/item/clothing/glasses/meson/engine,
-/obj/item/storage/belt/utility/full/engi,
-/obj/machinery/atmospherics/components/binary/pump{
- name = "engine fuel pump"
+/obj/item/clipboard{
+ pixel_x = 5
},
-/obj/item/circuitboard/machine/protolathe/department/security,
-/obj/item/circuitboard/machine/circuit_imprinter/department/sec,
-/obj/item/circuitboard/computer/rdconsole,
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/item/folder/red{
+ pixel_x = 6;
+ pixel_y = -3
+ },
+/obj/item/pen{
+ pixel_x = -6;
+ pixel_y = 1
},
+/obj/machinery/light/small/directional/west,
/turf/open/floor/plasteel/tech,
/area/ship/engineering)
-"Kd" = (
-/obj/item/kirbyplants/random,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 8
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/aft)
-"Ko" = (
-/obj/item/retractor,
-/obj/item/cautery,
+"Ho" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
+/turf/open/floor/plasteel/dark,
+/area/ship/maintenance/port)
+"Hr" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
/obj/structure/table/reinforced,
-/obj/item/healthanalyzer,
-/obj/item/circular_saw,
-/obj/item/surgicaldrill{
+/obj/item/flashlight/lamp{
+ pixel_x = -4;
+ pixel_y = 7
+ },
+/obj/item/paper_bin{
+ pixel_x = 4
+ },
+/obj/item/pen/red{
+ pixel_x = 2;
+ pixel_y = 1
+ },
+/obj/item/clothing/mask/gas/syndicate{
+ pixel_x = -4
+ },
+/obj/item/areaeditor/shuttle{
+ pixel_x = -1;
+ pixel_y = -1
+ },
+/obj/machinery/firealarm/directional/east,
+/obj/item/codespeak_manual{
+ pixel_x = 6;
pixel_y = 5
},
-/obj/structure/window/reinforced{
+/turf/open/floor/holofloor/wood,
+/area/ship/bridge)
+"Hs" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 10
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"Ht" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 6
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over,
+/turf/open/floor/plating,
+/area/ship/engineering)
+"HF" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning/corner{
dir = 1
},
-/turf/open/floor/pod/dark,
-/area/ship/medical)
-"KE" = (
+/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/item/radio/intercom/directional/west,
/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"KG" = (
-/obj/structure/closet/secure_closet{
- anchored = 1;
- icon_state = "hos";
- name = "captain's locker";
- req_access_txt = "20"
+ icon_state = "1-2"
},
-/obj/item/clothing/under/syndicate/combat,
-/obj/item/clothing/under/syndicate/ngr/officer,
-/obj/item/clothing/suit/armor/vest/capcarapace/syndicate,
-/obj/item/clothing/gloves/krav_maga/combatglovesplus,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/glasses/thermal/eyepatch,
-/obj/item/clothing/head/HoS/beret/syndicate,
-/obj/item/clothing/head/HoS/syndicate,
-/obj/item/clothing/head/ngrcap{
- pixel_x = 5;
- pixel_y = -4
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"HI" = (
+/obj/machinery/computer/cargo/express{
+ layer = 3
},
-/obj/item/gun/ballistic/derringer/traitor,
-/obj/item/clothing/under/syndicate/sniper,
-/obj/item/clothing/suit/armor/vest/capcarapace/ngr_captain,
-/obj/item/ammo_box/a357,
-/obj/item/ammo_box/a357,
-/obj/item/radio/headset/syndicate/alt/leader,
-/turf/open/floor/carpet/black,
-/area/ship/bridge)
-"KL" = (
-/obj/machinery/vending/custom,
-/obj/structure/railing{
+/obj/effect/turf_decal/techfloor{
dir = 1
},
-/obj/effect/turf_decal/techfloor{
- dir = 5
+/obj/structure/cable{
+ icon_state = "0-2"
},
-/turf/open/floor/plasteel/tech,
+/obj/machinery/airalarm/directional/north,
+/obj/machinery/power/apc/auto_name/directional/east,
+/turf/open/floor/pod,
/area/ship/cargo)
-"Le" = (
-/obj/structure/railing/corner{
+"HQ" = (
+/obj/machinery/light/directional/south,
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/item/kirbyplants/random{
+ pixel_x = 4
+ },
+/turf/open/floor/pod,
+/area/ship/cargo)
+"HU" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/warning/corner{
dir = 8
},
+/obj/effect/turf_decal/industrial/warning/corner,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/industrial/stand_clear,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/sign/poster/contraband/random{
- pixel_x = 32
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
},
/obj/structure/cable{
icon_state = "2-8"
},
-/turf/open/floor/plasteel/tech,
-/area/ship/maintenance/port)
-"Ln" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 2;
- name = "tactical chair"
+/obj/structure/sign/poster/syndicate/random{
+ pixel_y = 32
},
-/obj/structure/closet/firecloset/wall{
- pixel_y = 29
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/aft)
+"Ie" = (
+/obj/machinery/suit_storage_unit/inherit,
+/obj/effect/turf_decal/box,
+/obj/effect/turf_decal/industrial/outline/yellow,
+/obj/effect/turf_decal/techfloor,
+/obj/item/clothing/suit/space/hardsuit/syndi/hl,
+/obj/item/clothing/mask/gas/syndicate,
+/obj/machinery/light/directional/south,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/security/armory)
+"If" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 9
},
-/obj/effect/turf_decal/techfloor{
- dir = 1
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/turf/open/floor/mineral/plastitanium,
+/obj/machinery/firealarm/directional/west,
+/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"Lt" = (
-/obj/machinery/door/airlock/hatch{
- name = "Captain's Office";
- req_access_txt = "20";
+"Il" = (
+/obj/effect/turf_decal/industrial/warning{
dir = 4
},
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"Lx" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/obj/effect/turf_decal/techfloor{
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
dir = 4
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/engineering)
-"LP" = (
-/obj/structure/table/reinforced,
-/obj/structure/window/reinforced{
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"Im" = (
+/obj/machinery/button/door{
+ dir = 1;
+ id = "syndiewarship_armorybay";
+ name = "Weapon Hold";
+ req_access_txt = "3";
+ pixel_y = -26
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ship/security/armory)
+"It" = (
+/obj/effect/turf_decal/borderfloor,
+/obj/effect/decal/cleanable/generic,
+/obj/structure/chair/comfy/shuttle{
+ dir = 1;
+ name = "tactical chair"
+ },
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"IO" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/effect/turf_decal/borderfloorblack{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/firealarm/directional/north,
+/turf/open/floor/plasteel/tech,
+/area/ship/maintenance/port)
+"Ji" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced,
/obj/item/storage/fancy/cigarettes/cigpack_syndicate{
pixel_x = 8;
pixel_y = 2
@@ -3915,78 +3641,315 @@
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/decal/cleanable/dirt,
/obj/item/lighter{
- pixel_x = 7;
+ pixel_x = -7;
pixel_y = -4
},
/turf/open/floor/mineral/plastitanium,
/area/ship/crew/canteen)
-"LU" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
+"Jp" = (
+/obj/structure/sink{
+ pixel_y = 16
+ },
+/obj/structure/mirror{
+ pixel_y = 30;
+ layer = 2.8
},
/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/plasteel/showroomfloor,
+/area/ship/hallway/aft)
+"Jt" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/techfloor{
+ dir = 1
+ },
+/obj/machinery/recharger{
+ pixel_x = 7;
+ pixel_y = 1
+ },
+/obj/machinery/light/directional/north,
+/obj/item/clipboard{
+ pixel_x = -5
+ },
+/obj/item/taperecorder{
+ pixel_x = -3
+ },
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"JJ" = (
+/obj/structure/barricade/wooden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Mb" = (
-/obj/machinery/power/shieldwallgen/atmos{
- anchored = 1;
- dir = 1;
- id = "komodo_cargo";
- locked = 1
+/obj/machinery/door/airlock/hatch{
+ dir = 8;
+ name = "Starboard Maintenance"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/maintenance/starboard)
+"JN" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
/obj/structure/cable{
- icon_state = "0-4"
+ icon_state = "4-8"
},
-/obj/machinery/door/poddoor{
+/turf/open/floor/plasteel/stairs{
+ dir = 8;
+ icon = 'icons/obj/stairs.dmi'
+ },
+/area/ship/maintenance/port)
+"JO" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8;
+ name = "tactical chair"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/techfloor{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/central)
+"JQ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/holofloor/wood,
+/area/ship/bridge)
+"JV" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 8;
+ id = "Syndie_warship_lockdown";
+ name = "Lockdown Shutters"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/hallway/central)
+"JX" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/pod/dark,
+/area/ship/crew/dorm)
+"Ko" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/techfloor{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/light/floor,
+/obj/machinery/button/shieldwallgen{
+ dir = 4;
+ id = "komodo_cargo";
+ pixel_x = -24;
+ pixel_y = -6
+ },
+/obj/machinery/button/door{
dir = 4;
id = "syndie_warship_cargo";
- name = "Cargo Hatch"
+ name = "cargohold shutters";
+ pixel_x = -26;
+ pixel_y = 4
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/cargo)
+"Kq" = (
+/obj/effect/turf_decal/borderfloor{
+ dir = 1
+ },
+/obj/structure/chair/comfy/shuttle{
+ name = "Operations"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"Kz" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/syndicateemblem/bottom/left{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"KL" = (
+/obj/structure/table/reinforced{
+ color = "#c1b6a5"
+ },
+/obj/machinery/cell_charger,
+/obj/structure/railing,
+/obj/item/stock_parts/cell/high,
+/obj/item/stock_parts/cell/high,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/apc/auto_name/directional/east,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"KT" = (
+/obj/structure/closet/crate{
+ name = "food crate"
+ },
+/obj/item/storage/box/donkpockets{
+ pixel_x = -5;
+ pixel_y = 3
+ },
+/obj/item/storage/box/donkpockets{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/arrows{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/machinery/light/directional/south,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/aft)
+"Lb" = (
+/obj/item/clothing/neck/scarf/red,
+/obj/item/clothing/mask/bandana/skull,
+/obj/item/clothing/mask/gas/syndicate,
+/obj/effect/turf_decal/techfloor{
+ dir = 10
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 4
},
+/obj/structure/closet/syndicate{
+ desc = "It's a basic storage unit.";
+ name = "uniform closet"
+ },
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/under/syndicate/hardliners/jumpsuit,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/central)
+"Lj" = (
+/obj/item/scalpel{
+ pixel_y = 6;
+ pixel_x = 10
+ },
+/obj/structure/table/reinforced,
+/obj/item/hemostat,
+/obj/machinery/light/directional/west,
+/obj/effect/spawner/lootdrop/random_prosthetic{
+ pixel_x = 6
+ },
+/obj/effect/spawner/lootdrop/random_prosthetic{
+ pixel_x = -6
+ },
+/turf/open/floor/pod/dark,
+/area/ship/medical)
+"Lk" = (
+/obj/structure/railing/corner,
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"Lo" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/syndicateemblem/bottom/middle{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"LP" = (
+/obj/structure/table/reinforced,
+/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack,
+/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg{
+ pixel_y = -6
+ },
+/obj/structure/railing,
/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
-"Mm" = (
-/obj/machinery/chem_dispenser/drinks/beer/fullupgrade,
+"LV" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/syndicateemblem/top/right{
+ dir = 8
+ },
+/obj/structure/sign/poster/syndicate/random{
+ pixel_y = -32
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"Mb" = (
/obj/structure/table/reinforced,
-/obj/machinery/light/directional/north,
-/obj/machinery/firealarm/directional/north,
-/obj/machinery/vending/boozeomat/syndicate_access{
- pixel_x = 32
+/obj/structure/window/reinforced{
+ dir = 1
},
+/obj/machinery/microwave{
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
+ dir = 6
+ },
+/obj/item/radio/intercom/directional/south,
/turf/open/floor/mineral/plastitanium,
/area/ship/crew/canteen)
-"Mo" = (
-/obj/effect/turf_decal/borderfloor{
- dir = 4
+"Ml" = (
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 8
},
-/obj/effect/decal/cleanable/generic{
- pixel_x = -12;
- pixel_y = 7
+/obj/effect/turf_decal/techfloor{
+ dir = 1
},
-/obj/item/clothing/under/syndicate/sniper,
-/obj/item/clothing/under/syndicate/ngr,
-/obj/item/clothing/shoes/combat,
-/obj/item/clothing/mask/gas/syndicate,
-/obj/item/clothing/suit/armor/vest/duster,
-/obj/structure/closet/secure_closet/wall{
- dir = 8;
- icon_state = "sec_wall";
- name = "Bridge officer's locker";
- pixel_x = 29;
- req_access_txt = "57"
+/obj/structure/cable{
+ icon_state = "0-2"
},
-/obj/item/melee/classic_baton/telescopic,
-/obj/item/clothing/neck/chameleon,
-/obj/item/radio/headset/syndicate,
-/turf/open/floor/plasteel/dark,
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/machinery/computer/monitor,
+/turf/open/floor/plasteel/tech,
/area/ship/bridge)
"ME" = (
/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium,
@@ -3996,216 +3959,248 @@
},
/turf/open/floor/plating,
/area/ship/bridge)
-"MG" = (
-/obj/machinery/door/poddoor{
- id = "Artillery2shutter"
+"MF" = (
+/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
+ dir = 6
},
-/obj/machinery/power/shieldwallgen/atmos{
- anchored = 1;
- dir = 8;
- id = "komodo_starboard";
- locked = 1
+/obj/structure/closet/wall/red/directional/south{
+ name = "Bartender's locker"
},
-/obj/structure/cable{
- icon_state = "0-2"
+/obj/item/clothing/shoes/cowboy/black,
+/obj/item/storage/belt/military/snack,
+/obj/item/storage/pill_bottle/lsd{
+ pixel_x = 9;
+ pixel_y = 5
},
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/maintenance/starboard)
-"MI" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 4
+/obj/item/clothing/accessory/waistcoat,
+/obj/item/reagent_containers/food/drinks/shaker{
+ pixel_x = -9;
+ pixel_y = 2
},
-/obj/machinery/button/door{
- dir = 4;
- id = "Artillery1shutter";
- name = "Artillery Hatch";
- pixel_x = -29;
- pixel_y = -4
+/obj/item/clothing/under/suit/waiter/syndicate,
+/obj/machinery/vending/boozeomat/syndicate_access{
+ pixel_x = 32;
+ density = 0
},
-/obj/machinery/button/shieldwallgen{
- dir = 4;
- id = "komodo_port";
- pixel_x = -28;
- pixel_y = 6
+/turf/open/floor/mineral/plastitanium,
+/area/ship/crew/canteen)
+"MG" = (
+/obj/machinery/door/airlock/hatch{
+ name = "Dormitory"
},
-/turf/open/floor/plasteel/dark,
-/area/ship/maintenance/port)
-"MJ" = (
-/obj/structure/chair/comfy/black{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/firedoor/border_only{
dir = 1
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/light/directional/south,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"MR" = (
-/obj/effect/turf_decal/industrial/warning/cee{
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
dir = 8
},
-/obj/effect/turf_decal/techfloor/corner{
- dir = 1
+/turf/open/floor/plasteel/dark,
+/area/ship/crew/dorm)
+"MO" = (
+/obj/machinery/atmospherics/components/unary/shuttle/heater{
+ dir = 4
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"MU" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+/obj/structure/window/plasma/reinforced/spawner{
dir = 8
},
-/obj/machinery/firealarm/directional/east,
-/obj/machinery/suit_storage_unit/inherit,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/suit/space/syndicate/black/med,
-/obj/item/clothing/head/helmet/space/syndicate/black/med,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/medical)
-"MX" = (
-/obj/structure/sign/poster/contraband/random{
- pixel_y = 32
+/obj/machinery/door/poddoor{
+ dir = 8;
+ id = "warship_engines";
+ name = "Thruster Blast Door"
+ },
+/obj/machinery/door/window/eastleft{
+ name = "Engine Access"
+ },
+/turf/open/floor/plating,
+/area/ship/engineering)
+"MV" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 6
},
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/item/kirbyplants/random,
-/turf/open/floor/pod,
-/area/ship/cargo)
-"Ng" = (
-/obj/effect/turf_decal/spline/fancy/opaque/black{
- dir = 10
- },
-/obj/structure/rack,
-/obj/item/inducer/syndicate{
- pixel_y = -7
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/security/armory)
+"Nd" = (
+/obj/structure/railing/corner{
+ dir = 1
},
-/obj/item/storage/toolbox/syndicate{
- name = "syndicate toolbox";
- pixel_x = -3;
- pixel_y = 5
+/obj/structure/cable{
+ icon_state = "0-4"
},
-/obj/item/geiger_counter{
- pixel_x = 1;
- pixel_y = 5
+/obj/machinery/power/terminal{
+ dir = 8
},
-/obj/item/holosign_creator/atmos,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 10
+/obj/machinery/atmospherics/pipe/simple/supply/visible/layer2,
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/turf/open/floor/plasteel/tech/techmaint,
+/turf/open/floor/plasteel/tech,
/area/ship/engineering)
-"Nh" = (
-/obj/structure/railing{
- dir = 8
+"Nf" = (
+/obj/item/clothing/under/syndicate/combat,
+/obj/item/clothing/mask/gas/syndicate,
+/obj/effect/turf_decal/techfloor{
+ dir = 9
+ },
+/obj/structure/closet/syndicate{
+ desc = "It's a basic storage unit.";
+ name = "uniform closet"
+ },
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/under/syndicate/hardliners/jumpsuit,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/central)
+"Ni" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "2-4"
},
-/turf/open/floor/plasteel/stairs{
- icon = 'icons/obj/stairs.dmi'
+/obj/structure/closet/secure_closet/wall/directional/west{
+ icon_state = "sec_wall";
+ name = "Armor Locker";
+ req_access_txt = "1"
},
-/area/ship/maintenance/port)
-"Nz" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering)
-"NB" = (
-/obj/structure/table/wood,
-/obj/structure/railing{
+/obj/item/clothing/suit/armor/hardliners/jacket,
+/obj/item/clothing/suit/armor/hardliners/jacket,
+/obj/item/clothing/suit/armor/hardliners/jacket,
+/obj/item/clothing/suit/armor/hardliners,
+/obj/item/clothing/suit/armor/hardliners,
+/obj/item/clothing/suit/armor/hardliners,
+/obj/item/clothing/head/helmet/hardliners,
+/obj/item/clothing/head/helmet/hardliners,
+/obj/item/clothing/head/helmet/hardliners,
+/obj/item/storage/belt/security/webbing/hardliners,
+/obj/item/storage/belt/security/webbing/hardliners,
+/obj/item/storage/belt/security/webbing/hardliners,
+/obj/item/clothing/glasses/hud/security/sunglasses/hardliners,
+/obj/item/clothing/glasses/hud/security/sunglasses/hardliners,
+/obj/item/clothing/glasses/hud/security/sunglasses/hardliners,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/security/armory)
+"Nj" = (
+/obj/structure/chair/stool/bar{
dir = 4
},
-/obj/item/paicard{
- pixel_x = -7;
- pixel_y = 4
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
+ dir = 1
},
-/obj/item/paicard{
- pixel_x = 1;
- pixel_y = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 6
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/airalarm/directional/north,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"NE" = (
-/obj/effect/decal/cleanable/cobweb,
-/obj/item/cigbutt{
- anchored = 1;
- color = "#808080";
- layer = 2;
- pixel_x = -4;
- pixel_y = 1
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/obj/effect/decal/cleanable/greenglow,
-/obj/effect/decal/fakelattice,
-/obj/structure/railing{
+/turf/open/floor/mineral/plastitanium,
+/area/ship/crew/canteen)
+"Nq" = (
+/obj/machinery/mech_bay_recharge_port{
+ dir = 2
+ },
+/obj/effect/turf_decal/techfloor{
+ dir = 9
+ },
+/obj/machinery/camera/autoname{
dir = 4
},
-/turf/open/floor/plasteel/elevatorshaft,
-/area/ship/hallway/aft)
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ship/cargo)
+"ND" = (
+/obj/structure/railing,
+/obj/machinery/atmospherics/components/unary/tank/air{
+ piping_layer = 2;
+ dir = 8
+ },
+/obj/effect/turf_decal/industrial/outline/yellow,
+/obj/effect/decal/cleanable/greenglow,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/airalarm/directional/east,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
"NI" = (
/obj/structure/table/wood,
-/obj/item/flashlight/lamp{
- pixel_x = -6;
- pixel_y = 8
- },
/obj/item/paper_bin{
- pixel_x = 5;
+ pixel_x = 7;
pixel_y = 1
},
+/obj/item/flashlight/lamp{
+ pixel_x = -6;
+ pixel_y = 4
+ },
/obj/item/pen/fountain{
- pixel_x = 4;
+ pixel_x = 7;
pixel_y = 2
},
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/carpet/red_gold,
/area/ship/crew/dorm)
-"NY" = (
-/obj/structure/railing{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+"Oe" = (
+/obj/effect/turf_decal/techfloor{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/turf/open/floor/plating,
-/area/ship/maintenance/port)
-"Ok" = (
+/obj/structure/table/reinforced,
/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/directional/north,
+/obj/machinery/turretid{
+ pixel_y = 2
+ },
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"Om" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/syndicateemblem/top/middle,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 6
+ },
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Or" = (
-/obj/structure/railing/corner,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 1
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "2-4"
},
-/turf/open/floor/plasteel/stairs,
-/area/ship/bridge)
-"OG" = (
+/obj/structure/catwalk/over,
+/turf/open/floor/plating,
+/area/ship/engineering)
+"Oq" = (
/obj/effect/turf_decal/industrial/warning{
- dir = 10
+ dir = 5
},
-/obj/effect/turf_decal/techfloor/corner{
- dir = 8
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/firealarm/directional/north{
+ pixel_x = 8
},
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
"OP" = (
-/obj/machinery/porta_turret/ship/syndicate{
+/obj/machinery/porta_turret/ship/syndicate/weak{
dir = 10
},
/turf/closed/wall/mineral/plastitanium,
@@ -4213,165 +4208,125 @@
"OQ" = (
/turf/closed/wall/mineral/plastitanium,
/area/ship/maintenance/starboard)
-"OT" = (
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
- dir = 5
+"OV" = (
+/obj/machinery/door/airlock/hatch{
+ name = "Infirmary"
},
-/obj/structure/closet/wall/red{
- dir = 8;
- name = "Bartender's locker";
- pixel_x = 29
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/item/clothing/shoes/cowboy/black,
-/obj/item/storage/belt/military/snack,
-/obj/item/storage/belt/bandolier,
-/obj/item/storage/pill_bottle/lsd{
- pixel_x = 9;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/effect/turf_decal/industrial/warning,
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/border_only,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/medical)
+"Pl" = (
+/obj/structure/railing,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ship/maintenance/starboard)
+"Pp" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/robot_debris/limb,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
},
-/obj/item/clothing/accessory/waistcoat,
-/obj/item/reagent_containers/food/drinks/shaker{
- pixel_x = -9;
- pixel_y = 2
+/obj/machinery/light/dim/directional/south,
+/turf/open/floor/plating,
+/area/ship/maintenance/port)
+"Pt" = (
+/obj/machinery/atmospherics/components/unary/shuttle/heater{
+ dir = 4
},
-/obj/item/clothing/under/syndicate/sniper,
-/obj/item/clothing/head/that,
-/obj/item/clothing/under/rank/civilian/bartender/purple,
-/obj/item/clothing/suit/apron/purple_bartender,
-/obj/item/storage/box/lethalshot,
-/obj/item/gun/ballistic/shotgun/doublebarrel,
-/obj/item/clothing/under/suit/waiter/syndicate,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"Po" = (
-/obj/machinery/power/smes/shuttle/precharged{
- dir = 1
+/obj/structure/window/plasma/reinforced/spawner{
+ dir = 8
},
-/obj/structure/cable{
- icon_state = "0-2"
+/obj/machinery/door/window/eastright{
+ name = "Engine Access"
},
-/obj/structure/window/plasma/reinforced/spawner,
/obj/machinery/door/poddoor{
+ dir = 8;
id = "warship_engines";
name = "Thruster Blast Door"
},
-/obj/machinery/door/window/eastright{
- dir = 1;
- name = "Engine Access"
- },
/turf/open/floor/plating,
/area/ship/engineering)
-"Pu" = (
-/obj/machinery/light/directional/east,
-/obj/structure/closet/cardboard/metal,
-/obj/item/reagent_containers/food/drinks/waterbottle/large,
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
- pixel_x = 3;
- pixel_y = 3
+"PA" = (
+/obj/structure/mecha_wreckage/mauler,
+/obj/effect/turf_decal/techfloor{
+ dir = 8
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
- pixel_x = -3;
- pixel_y = 3
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ship/cargo)
+"PE" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
+ dir = 8
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
- pixel_x = 8;
- pixel_y = -2
+/obj/effect/decal/cleanable/vomit/old{
+ pixel_x = 9;
+ pixel_y = -1
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
- pixel_x = 4;
- pixel_y = -2
+/obj/machinery/airalarm/directional/west,
+/obj/structure/chair/comfy/red,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/crew/canteen)
+"PG" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 9
},
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/light_switch{
- pixel_x = -13;
- pixel_y = 22
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/aft)
-"Pv" = (
-/obj/effect/turf_decal/spline/fancy/opaque/black{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 6
},
-/obj/structure/railing{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 6
},
-/turf/open/floor/plasteel/tech,
-/area/ship/bridge)
-"Pz" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/structure/cable{
- icon_state = "2-8"
+ icon_state = "2-4"
},
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"PB" = (
-/obj/effect/turf_decal/spline/fancy/opaque/black{
- dir = 9
- },
-/mob/living/simple_animal/hostile/carp/megacarp{
- faction = list("neutral");
- name = "Tom";
- resize = 0.8
- },
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/bed/dogbed,
-/obj/structure/railing{
- dir = 9;
- layer = 2.9
+"PN" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8;
+ name = "tactical chair"
},
-/turf/open/floor/plasteel/tech,
-/area/ship/bridge)
-"PE" = (
-/obj/machinery/suit_storage_unit/inherit,
-/obj/effect/turf_decal/box,
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/structure/extinguisher_cabinet/directional/north,
/obj/effect/turf_decal/techfloor{
dir = 4
},
-/obj/machinery/camera/autoname{
- dir = 8
- },
-/obj/item/clothing/suit/space/hardsuit/syndi/hl,
-/obj/item/clothing/mask/gas/syndicate,
/turf/open/floor/mineral/plastitanium,
-/area/ship/security/armory)
-"PK" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 6
- },
-/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"Qv" = (
-/obj/effect/decal/cleanable/dirt,
+"PO" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/effect/turf_decal/steeldecal/steel_decals1{
+ dir = 8
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-2"
},
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/structure/railing/corner{
+ dir = 1
},
/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"Qy" = (
-/obj/structure/railing,
-/obj/effect/spawner/lootdrop/salvage_manipulator,
+/area/ship/bridge)
+"PP" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/turf_decal/industrial/warning{
- dir = 8
- },
-/obj/effect/turf_decal/borderfloorblack,
-/obj/structure/cable{
- icon_state = "1-8"
+ dir = 1
},
/obj/structure/cable{
icon_state = "4-8"
@@ -4380,589 +4335,723 @@
icon_state = "panelscorched"
},
/area/ship/maintenance/starboard)
-"QI" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 10
+"PS" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/effect/turf_decal/steeldecal/steel_decals3{
+ dir = 8
+ },
+/obj/machinery/light/directional/north,
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -19;
+ pixel_y = -11
+ },
+/turf/open/floor/plasteel/dark,
+/area/ship/crew/dorm)
+"PV" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/sign/poster/ripped{
+ pixel_y = -32
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ship/maintenance/starboard)
+"PX" = (
+/obj/effect/decal/cleanable/plasma,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/power/terminal{
+ dir = 8
+ },
+/obj/structure/catwalk/over,
+/turf/open/floor/plating,
+/area/ship/engineering)
+"PZ" = (
+/obj/structure/reagent_dispensers/fueltank,
+/obj/effect/decal/cleanable/wrapping,
+/obj/effect/turf_decal/techfloor,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"Qb" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable{
+ icon_state = "4-8"
},
+/obj/machinery/firealarm/directional/north,
+/turf/open/floor/plasteel/dark,
+/area/ship/crew/dorm)
+"Qh" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 5
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
+ dir = 4
},
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Rk" = (
-/obj/structure/sign/syndicate,
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/cargo)
-"Ro" = (
-/obj/machinery/iv_drip,
-/obj/item/reagent_containers/blood/universal{
- pixel_x = 4;
- pixel_y = 4
+/obj/machinery/door/airlock/grunge{
+ dir = 8;
+ name = "Bridge";
+ req_access_txt = "19"
},
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/sign/departments/medbay/alt{
- pixel_x = 32
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
},
-/obj/structure/closet/crate/freezer/blood,
-/turf/open/floor/pod/dark,
-/area/ship/medical)
-"Rp" = (
-/obj/machinery/porta_turret/ship/syndicate{
- dir = 6
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
},
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/bridge)
-"Rz" = (
-/obj/structure/table/reinforced,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
+/obj/effect/turf_decal/industrial/warning{
dir = 8
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
},
-/obj/item/reagent_containers/glass/rag{
- pixel_x = -5;
- pixel_y = 12
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"QC" = (
+/obj/structure/table/reinforced,
+/obj/machinery/chem_dispenser/drinks{
+ dir = 8
},
/turf/open/floor/mineral/plastitanium,
/area/ship/crew/canteen)
-"RB" = (
-/obj/effect/turf_decal/industrial/warning/cee{
- dir = 4
+"QI" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 5
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 10
+ dir = 5
},
/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/techfloor/corner{
- dir = 4
+ icon_state = "1-4"
},
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"RG" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 2;
- name = "tactical chair"
+"QW" = (
+/obj/structure/railing{
+ dir = 8
},
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/techfloor/corner{
- dir = 4
+/obj/effect/spawner/lootdrop/salvage_manipulator,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/effect/turf_decal/borderfloorblack{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/central)
-"RN" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 2;
- name = "tactical chair"
+/area/ship/maintenance/starboard)
+"QZ" = (
+/obj/effect/turf_decal/steeldecal/steel_decals9{
+ dir = 8
},
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/techfloor/corner{
- dir = 1
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/central)
-"RT" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/hatch{
- name = "Port Maintenance"
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/structure/barricade/wooden/crude,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 6
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/effect/turf_decal/industrial/caution,
+/turf/open/floor/plasteel/tech,
+/area/ship/engineering)
+"Rf" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/industrial/warning,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
+/turf/open/floor/plating/rust,
/area/ship/maintenance/port)
-"Sd" = (
+"Rk" = (
+/obj/structure/sign/syndicate,
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/cargo)
+"Rl" = (
+/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/turf_decal/spline/fancy/opaque/black{
- dir = 10
+ dir = 9
+ },
+/obj/structure/railing{
+ dir = 9
},
+/turf/open/floor/plasteel/tech,
+/area/ship/bridge)
+"Ro" = (
+/obj/effect/decal/cleanable/dirt,
/obj/structure/table/reinforced,
-/obj/item/paper_bin{
- pixel_x = -6
+/obj/item/clipboard,
+/obj/item/reagent_containers/hypospray/medipen{
+ pixel_y = 6
},
-/obj/item/pen{
- pixel_x = -6
+/obj/item/reagent_containers/hypospray/medipen,
+/obj/item/reagent_containers/hypospray/medipen{
+ pixel_y = -6
},
-/obj/item/stamp/qm{
- pixel_x = 6;
- pixel_y = 9
+/obj/item/reagent_containers/glass/bottle/charcoal,
+/obj/item/reagent_containers/glass/bottle/formaldehyde{
+ pixel_x = 4;
+ pixel_y = 1
},
-/obj/item/stamp{
- pixel_x = 6;
- pixel_y = 4
+/obj/item/reagent_containers/hypospray/medipen/pumpup{
+ pixel_x = -1;
+ pixel_y = -4
},
-/obj/item/stamp/denied{
- pixel_x = 6;
- pixel_y = -1
+/obj/item/reagent_containers/hypospray/medipen/pumpup{
+ pixel_x = 3
},
-/obj/effect/turf_decal/spline/fancy/opaque/black,
-/obj/item/toy/figure/cargotech{
- pixel_x = -8;
- pixel_y = 15
+/obj/structure/sign/departments/medbay/alt{
+ pixel_y = -32
},
-/turf/open/floor/pod,
-/area/ship/cargo)
-"Sm" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/turf/open/floor/mineral/plastitanium,
+/area/ship/medical)
+"Rs" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 1
+/turf/open/floor/plasteel/dark,
+/area/ship/maintenance/starboard)
+"RK" = (
+/obj/structure/bed{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/bedsheet/rd{
dir = 8
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/curtain{
+ color = "#5c131b"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Sn" = (
-/obj/machinery/door/poddoor/shutters{
- id = "syndiewarship_armorybay";
- name = "Weapon Hold"
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/clothing/under/syndicate/bloodred/sleepytime,
+/turf/open/floor/carpet/black,
+/area/ship/bridge)
+"RR" = (
+/obj/machinery/door/poddoor{
+ dir = 8;
+ id = "Artillery1shutter"
},
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/security/armory)
-"Sq" = (
-/obj/machinery/door/airlock/hatch{
- dir = 4
+/obj/machinery/power/shieldwallgen/atmos{
+ anchored = 1;
+ id = "komodo_port";
+ locked = 1
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/aft)
-"Sr" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/steeldecal/steel_decals1,
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "0-8"
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/maintenance/port)
+"RS" = (
+/obj/effect/turf_decal/steeldecal/steel_decals8{
+ dir = 8
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4;
+ name = "Helm"
},
/obj/structure/railing/corner{
dir = 8
},
/turf/open/floor/plasteel/tech,
/area/ship/bridge)
-"SC" = (
-/obj/machinery/computer/cargo/express{
+"RZ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/effect/turf_decal/techfloor{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/machinery/airalarm/directional/west,
-/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable{
- icon_state = "0-4"
+ icon_state = "4-8"
},
-/turf/open/floor/pod,
-/area/ship/cargo)
-"SG" = (
-/obj/machinery/door/airlock/hatch{
- dir = 4
+/obj/machinery/door/airlock/grunge{
+ dir = 8;
+ name = "Bridge";
+ req_access_txt = "19"
},
-/turf/open/floor/plasteel/showroomfloor,
-/area/ship/hallway/aft)
-"SN" = (
-/obj/effect/turf_decal/steeldecal/steel_decals9,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/industrial/caution,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+/obj/effect/turf_decal/industrial/warning{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/orange/hidden{
+/obj/effect/turf_decal/industrial/warning{
dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
},
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"SU" = (
-/obj/structure/flora/grass/jungle/b,
-/obj/structure/flora/ausbushes/fullgrass,
-/obj/structure/flora/ausbushes/brflowers,
-/obj/structure/flora/ausbushes/leafybush,
-/obj/structure/window/reinforced,
-/turf/open/floor/grass,
-/area/ship/crew/canteen)
-"SX" = (
-/obj/machinery/light/directional/east,
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/door/firedoor/border_only{
dir = 4
},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"Sd" = (
+/obj/structure/mirror{
+ pixel_x = 28
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
+/obj/structure/sink/kitchen{
+ dir = 8
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"SZ" = (
-/obj/machinery/door/poddoor{
- id = "Artillery1shutter"
+/obj/machinery/airalarm/directional/north,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/medical)
+"Sv" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/machinery/power/shieldwallgen/atmos{
- anchored = 1;
- dir = 8;
- id = "komodo_port";
- locked = 1
+/obj/structure/cable{
+ icon_state = "2-8"
},
/obj/structure/cable{
- icon_state = "0-2"
+ icon_state = "1-8"
},
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/maintenance/port)
-"TB" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 10
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"To" = (
+/obj/structure/railing/corner{
+ dir = 1
},
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/obj/effect/turf_decal/industrial/stand_clear{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 4
},
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/structure/sign/poster/contraband/random{
+ pixel_y = -32
},
-/turf/open/floor/holofloor/wood,
-/area/ship/crew/dorm)
-"TE" = (
-/turf/open/floor/mineral/plastitanium,
-/area/ship/security/armory)
-"TH" = (
-/obj/effect/turf_decal/borderfloor{
- dir = 8
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/structure/chair/comfy/shuttle{
- dir = 4;
- name = "Operations"
+/turf/open/floor/plasteel/tech,
+/area/ship/maintenance/port)
+"Tr" = (
+/obj/machinery/door/poddoor/shutters{
+ dir = 8;
+ id = "syndiewarship_armorybay";
+ name = "Weapon Hold"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 4
},
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"TJ" = (
-/obj/structure/railing{
+/obj/machinery/door/firedoor/border_only{
dir = 8
},
-/obj/structure/railing{
- dir = 8
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
},
-/obj/structure/railing{
+/obj/effect/turf_decal/industrial/warning{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/security/armory)
+"TB" = (
+/obj/machinery/door/airlock/hatch,
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
},
-/turf/open/floor/plasteel/stairs,
-/area/ship/cargo)
-"TN" = (
-/obj/structure/frame/machine,
-/obj/structure/grille/broken,
-/obj/structure/railing{
- dir = 4
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/aft)
+"TE" = (
+/turf/open/floor/mineral/plastitanium,
+/area/ship/security/armory)
+"TK" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 9
},
-/obj/effect/decal/cleanable/glass,
+/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "2-4"
},
-/obj/structure/cable{
- icon_state = "1-8"
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"TQ" = (
+/obj/machinery/suit_storage_unit/inherit/industrial,
+/obj/item/clothing/suit/space/syndicate/black/engie,
+/obj/item/clothing/head/helmet/space/syndicate/black/engie,
+/obj/effect/turf_decal/techfloor{
+ dir = 1
},
-/turf/open/floor/plasteel/tech/techmaint,
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 23;
+ pixel_y = -4
+ },
+/turf/open/floor/mineral/plastitanium,
/area/ship/engineering)
"TR" = (
/turf/closed/wall/mineral/plastitanium,
/area/ship/medical)
-"TY" = (
-/obj/effect/turf_decal/steeldecal/steel_decals6,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "0-8"
+"TU" = (
+/obj/structure/railing/corner{
+ layer = 2.8
},
-/obj/machinery/power/terminal{
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/stairs{
dir = 1
},
-/turf/open/floor/plasteel/tech,
-/area/ship/engineering)
-"Uo" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/hatch{
- dir = 4;
- name = "Infirmary"
+/area/ship/crew/dorm)
+"Uh" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
},
+/obj/machinery/light/dim/directional/west,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"Un" = (
+/obj/effect/turf_decal/industrial/warning,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 10
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/hallway/central)
+"Uy" = (
+/obj/effect/turf_decal/trimline/transparent/bar/filled/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 4
},
+/obj/machinery/light/directional/west,
/turf/open/floor/mineral/plastitanium,
-/area/ship/medical)
-"Uw" = (
-/obj/effect/decal/cleanable/food/flour,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 4
+/area/ship/crew/canteen)
+"UF" = (
+/obj/structure/closet/cardboard/metal,
+/obj/item/reagent_containers/food/drinks/waterbottle/large,
+/obj/item/reagent_containers/food/drinks/waterbottle/large{
+ pixel_x = 3;
+ pixel_y = 3
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 10
+/obj/item/reagent_containers/food/drinks/waterbottle/large{
+ pixel_x = -3;
+ pixel_y = 3
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 4
+/obj/item/reagent_containers/food/drinks/waterbottle/large{
+ pixel_x = 8;
+ pixel_y = -2
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/item/reagent_containers/food/drinks/waterbottle/large{
+ pixel_x = 4;
+ pixel_y = -2
},
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 23;
+ pixel_y = 4
},
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/light/directional/south,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/aft)
+"UK" = (
+/obj/structure/table/reinforced,
+/obj/machinery/button/door{
+ dir = 8;
+ id = "Syndie_warship_lockdown";
+ name = "Lockdown Control";
+ pixel_x = -6;
+ pixel_y = 6
},
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Ux" = (
-/obj/machinery/door/poddoor/shutters{
- id = "syndie_mechbay";
- name = "Mechbay"
+/obj/machinery/button/door{
+ dir = 8;
+ id = "syndie_warship_cargo";
+ name = "cargohold shutters";
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/machinery/button/door{
+ dir = 8;
+ id = "syndiewarship_windows";
+ name = "Window Control";
+ pixel_y = -4
+ },
+/obj/item/desk_flag{
+ pixel_x = -10
+ },
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"UP" = (
+/obj/machinery/door/airlock/hatch{
+ dir = 8;
+ name = "Vault";
+ req_access_txt = "19";
+ security_level = 6
},
-/obj/machinery/door/firedoor/border_only,
/obj/machinery/door/firedoor/border_only{
- dir = 1
+ dir = 8
},
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/cargo)
-"UH" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+/obj/machinery/door/firedoor/border_only{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 5
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
},
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"UJ" = (
-/obj/effect/turf_decal/borderfloor{
+/turf/open/floor/engine,
+/area/ship/bridge)
+"UT" = (
+/obj/structure/toilet{
dir = 8
},
-/obj/item/gun/ballistic/automatic/pistol/candor{
- pixel_x = 1;
- pixel_y = 5
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/poster/official/moth/smokey{
+ pixel_y = -32
},
-/obj/item/ammo_box/magazine/m45,
-/obj/item/ammo_box/magazine/m45{
- pixel_x = 3
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/plasteel/showroomfloor,
+/area/ship/hallway/aft)
+"Vc" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/medical)
+"Vj" = (
+/obj/structure/table/optable,
+/obj/machinery/defibrillator_mount/loaded{
+ pixel_x = -26
},
-/obj/item/clothing/under/syndicate/ngr,
-/obj/item/clothing/gloves/tackler/combat/insulated,
-/obj/item/clothing/suit/armor/vest/leather{
- desc = "Lightly armored leather overcoat meant as casual wear for high-ranking officers. Bears the crest of the Gorlex Marauders."
+/turf/open/floor/pod/dark,
+/area/ship/medical)
+"Vk" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/cargo)
+"Vl" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/tank/toxins{
+ dir = 8
},
-/obj/item/clothing/mask/gas/sechailer/swat,
-/obj/item/clothing/head/HoS/beret/syndicate,
+/obj/effect/turf_decal/industrial/outline/yellow,
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "2-8"
},
-/obj/structure/closet/secure_closet/wall{
- dir = 1;
- icon_state = "sec_wall";
- name = "Sergeant's locker";
- pixel_y = -29;
- req_access_txt = "58"
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
+"Vq" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/box/bodybags{
+ pixel_y = 6
},
-/obj/item/melee/classic_baton/telescopic,
-/obj/item/clothing/suit/armor/vest/blueshirt,
-/obj/item/clothing/under/syndicate/combat,
-/obj/item/clothing/accessory/holster,
-/obj/item/clothing/shoes/combat,
-/obj/item/radio/headset/syndicate,
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"UK" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/hatch{
- name = "Engineering"
+/obj/item/stack/medical/gauze,
+/obj/item/stack/medical/ointment,
+/obj/item/stack/medical/bruise_pack{
+ pixel_x = 6
+ },
+/obj/structure/window/reinforced{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "0-4"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/engineering)
-"UO" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/item/storage/firstaid/brute{
+ pixel_x = -7;
+ pixel_y = 4
+ },
+/obj/item/storage/firstaid/fire{
+ pixel_x = -7;
+ pixel_y = -3
+ },
+/obj/machinery/power/apc/auto_name/directional/north,
+/turf/open/floor/pod/dark,
+/area/ship/medical)
+"VK" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 10
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+/turf/open/floor/holofloor/wood,
+/area/ship/crew/dorm)
+"VN" = (
+/obj/machinery/door/airlock/hatch{
+ dir = 8;
+ name = "Dormitory"
},
+/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Vc" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/medical)
-"Vj" = (
-/obj/structure/table/optable,
-/obj/machinery/light/directional/south,
-/obj/machinery/defibrillator_mount/loaded{
- pixel_y = -26
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
},
-/turf/open/floor/pod/dark,
-/area/ship/medical)
-"Vk" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/cargo)
-"Vq" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 1
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/obj/machinery/door/airlock/hatch{
- name = "Bridge";
- req_access_txt = "19"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
},
/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"Vu" = (
-/obj/structure/table/reinforced,
-/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack,
-/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg{
- pixel_y = -6
+/area/ship/crew/dorm)
+"VR" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/hallway/aft)
+"VU" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 5
},
-/obj/structure/railing{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/cargo)
-"VA" = (
-/obj/structure/chair/office{
- dir = 8;
- name = "tactical swivel chair"
+/turf/open/floor/mineral/plastitanium/red,
+/area/ship/security/armory)
+"VZ" = (
+/obj/structure/railing,
+/obj/effect/decal/cleanable/oil{
+ icon_state = "gib7"
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/firealarm/directional/south,
-/obj/machinery/light_switch{
- dir = 1;
- pixel_x = -8;
- pixel_y = -24
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/turf_decal/industrial/outline/yellow,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
},
+/obj/machinery/power/port_gen/pacman,
/turf/open/floor/plasteel/tech,
/area/ship/engineering)
-"VO" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+"We" = (
+/obj/machinery/door/airlock/hatch{
+ dir = 8;
+ name = "Cargo Bay"
},
-/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/aft)
-"VR" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/hallway/aft)
-"Wc" = (
-/obj/structure/table/wood,
-/obj/item/radio/intercom/directional/south,
-/obj/structure/bedsheetbin,
-/obj/structure/railing{
- dir = 4
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
},
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/dorm)
-"Wj" = (
-/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/turf_decal/industrial/warning{
dir = 8
},
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ship/cargo)
+"Wl" = (
+/obj/machinery/door/poddoor{
+ id = "syndie_warship_cargo";
+ name = "Cargo Hatch"
+ },
+/obj/machinery/power/shieldwallgen/atmos{
+ anchored = 1;
+ dir = 8;
+ id = "komodo_cargo";
+ locked = 1
+ },
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "0-2"
},
-/turf/open/floor/plating{
- icon_state = "panelscorched"
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/cargo)
+"Wq" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/structure/bed{
+ dir = 8
+ },
+/obj/item/bedsheet/black{
+ dir = 8
+ },
+/obj/structure/curtain/cloth/fancy{
+ name = "blood-red curtains"
},
-/area/ship/maintenance/starboard)
-"Wo" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/syndicateemblem/bottom/middle,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/item/clothing/under/dress/blacktango,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 8
+ },
+/obj/item/trash/popcorn,
+/turf/open/floor/holofloor/wood,
+/area/ship/crew/dorm)
+"Wu" = (
+/obj/effect/turf_decal/industrial/warning/cee{
+ dir = 1
+ },
+/obj/effect/turf_decal/techfloor/corner{
+ dir = 4
},
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
-"Wq" = (
-/obj/machinery/button/door{
- dir = 4;
- id = "syndie_warship_cargo";
- name = "cargohold shutters";
- pixel_x = -25
+"WA" = (
+/obj/structure/table/reinforced,
+/obj/item/paper_bin{
+ pixel_x = 6
+ },
+/obj/item/pen/red{
+ pixel_x = 5;
+ pixel_y = 1
+ },
+/obj/effect/turf_decal/techfloor,
+/obj/item/clipboard{
+ pixel_x = -5
},
+/obj/item/taperecorder{
+ pixel_x = -3
+ },
+/obj/item/clothing/glasses/hud/security/night{
+ pixel_x = -4;
+ pixel_y = -6
+ },
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"WD" = (
/obj/structure/table/reinforced,
/obj/item/storage/fancy/cigarettes/cigpack_robustgold{
pixel_x = -6;
@@ -4972,419 +5061,470 @@
pixel_x = -5;
pixel_y = 3
},
-/obj/machinery/light_switch{
- dir = 4;
- pixel_x = -24;
- pixel_y = 10
- },
/obj/item/trash/boritos,
-/obj/machinery/button/shieldwallgen{
- dir = 4;
- id = "komodo_cargo";
- pixel_x = -24;
- pixel_y = -10
- },
+/obj/machinery/computer/helm/viewscreen/directional/north,
/turf/open/floor/pod,
/area/ship/cargo)
-"Ws" = (
+"WK" = (
+/obj/structure/table/reinforced,
+/obj/machinery/button/door{
+ dir = 8;
+ id = "warshipbridge";
+ name = "Bridge Window";
+ pixel_y = -1;
+ pixel_x = -2
+ },
+/obj/item/reagent_containers/food/drinks/mug{
+ pixel_x = -6;
+ pixel_y = 9
+ },
+/obj/item/gps{
+ pixel_x = 6;
+ pixel_y = 4
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/bridge)
+"WL" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8;
+ name = "tactical chair"
+ },
+/obj/effect/turf_decal/techfloor/corner{
+ dir = 4
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/central)
+"WQ" = (
+/obj/structure/railing,
+/obj/item/clothing/mask/gas/syndicate,
+/obj/effect/turf_decal/techfloor{
+ dir = 8
+ },
+/obj/item/clothing/mask/balaclava,
+/obj/structure/closet/syndicate{
+ desc = "It's a basic storage unit.";
+ name = "uniform closet"
+ },
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/under/syndicate/hardliners,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/central)
+"WR" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/bridge)
+"Xd" = (
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/structure/sign/poster/syndicate/random{
+ pixel_x = 32
+ },
/turf/open/floor/pod,
/area/ship/cargo)
-"Ww" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/obj/structure/railing{
- dir = 1
- },
+"Xf" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
-/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable{
- icon_state = "0-2"
+ icon_state = "2-8"
+ },
+/obj/item/radio/intercom/directional/north{
+ pixel_x = 6
},
/obj/machinery/light_switch{
- pixel_x = -13;
+ pixel_x = -8;
pixel_y = 22
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"WA" = (
-/obj/structure/table/reinforced,
-/obj/item/toy/figure/syndie{
- pixel_x = -4;
- pixel_y = 5
- },
-/obj/machinery/fax/syndicate{
- pixel_x = 4;
- pixel_y = 0
- },
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
-"WJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+"Xp" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/effect/turf_decal/techfloor{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/mineral/plastitanium,
-/area/ship/security/armory)
-"WM" = (
+/area/ship/engineering)
+"Xr" = (
+/obj/structure/salvageable/machine,
+/obj/effect/decal/cleanable/cobweb,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+/turf/open/floor/plasteel/tech,
+/area/ship/maintenance/starboard)
+"Xs" = (
+/obj/effect/turf_decal/steeldecal/steel_decals6{
+ dir = 8
+ },
+/obj/structure/cable/yellow,
+/obj/machinery/power/terminal{
dir = 4
},
+/obj/machinery/atmospherics/components/binary/pump/layer2{
+ dir = 1;
+ name = "Input to Air"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plasteel/tech,
-/area/ship/cargo)
-"WP" = (
-/obj/machinery/modular_computer/console/preset/command{
- dir = 8
+/area/ship/engineering)
+"Xu" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8;
+ name = "tactical chair"
+ },
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 23;
+ pixel_y = 16
},
-/obj/effect/turf_decal/spline/fancy/opaque/black,
/obj/effect/turf_decal/techfloor{
dir = 4
},
-/obj/structure/railing,
-/turf/open/floor/plasteel/tech,
-/area/ship/bridge)
-"WT" = (
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/mineral/plastitanium,
+/area/ship/hallway/central)
+"XI" = (
+/obj/machinery/iv_drip,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate/freezer/blood,
+/turf/open/floor/pod/dark,
+/area/ship/medical)
+"XS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/turf/open/floor/plasteel/stairs{
+ dir = 1
+ },
+/area/ship/bridge)
+"XT" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/structure/bookcase/random/fiction,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/holofloor/wood,
+/area/ship/bridge)
+"Yb" = (
+/obj/machinery/power/shuttle/engine/electric{
+ dir = 4
},
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "0-4"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"WW" = (
-/obj/effect/turf_decal/corner_techfloor_grid{
- dir = 5
+/turf/open/floor/plating,
+/area/ship/engineering)
+"Yk" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{
+ dir = 4
},
-/obj/structure/fireaxecabinet{
- pixel_y = 27
+/turf/open/floor/engine/hull,
+/area/ship/external/dark)
+"Yn" = (
+/obj/machinery/power/shuttle/engine/fueled/plasma{
+ dir = 4
},
-/obj/structure/railing{
- dir = 1
+/turf/open/floor/plating,
+/area/ship/engineering)
+"Yp" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 8;
+ id = "Syndie_warship_lockdown";
+ name = "Lockdown Shutters"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"WY" = (
-/obj/machinery/camera/autoname{
- dir = 9
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/structure/extinguisher_cabinet/directional/north,
-/turf/open/floor/pod,
-/area/ship/cargo)
-"WZ" = (
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/door/firedoor/border_only{
dir = 8
},
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/door/firedoor/border_only{
dir = 4
},
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/hallway/central)
+"YP" = (
+/obj/item/stack/ore/salvage/scrapmetal/ten,
+/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/machinery/firealarm/directional/west,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/aft)
-"Xg" = (
-/obj/structure/railing,
-/obj/effect/decal/cleanable/robot_debris,
-/obj/item/radio/intercom/directional/south,
-/turf/open/floor/pod/dark,
-/area/ship/crew/dorm)
-"Xk" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 5
+/turf/open/floor/plating,
+/area/ship/maintenance/port)
+"YQ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing/corner{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 5
+/obj/structure/railing/corner,
+/obj/effect/turf_decal/techfloor{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
/obj/structure/cable{
- icon_state = "1-8"
+ icon_state = "4-8"
},
/obj/structure/cable{
icon_state = "1-4"
},
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"Xr" = (
-/obj/structure/salvageable/machine,
-/obj/effect/decal/cleanable/cobweb,
-/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plasteel/tech,
-/area/ship/maintenance/starboard)
-"Xz" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/structure/bed,
-/obj/item/bedsheet/black,
-/obj/structure/curtain/cloth/fancy{
- name = "blood-red curtains"
+/area/ship/cargo)
+"YR" = (
+/obj/structure/table/reinforced{
+ color = "#c1b6a5"
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/clothing/under/dress/blacktango,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
-/obj/item/trash/popcorn,
-/turf/open/floor/holofloor/wood,
-/area/ship/crew/dorm)
-"XC" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/directional/east,
-/obj/machinery/airalarm/directional/east,
-/obj/structure/table/reinforced,
-/obj/item/clipboard,
-/obj/item/reagent_containers/hypospray/medipen{
- pixel_y = 6
+/obj/effect/turf_decal/spline/fancy/opaque/black{
+ dir = 1
},
-/obj/item/reagent_containers/hypospray/medipen,
-/obj/item/reagent_containers/hypospray/medipen{
- pixel_y = -6
+/obj/item/flashlight/lamp{
+ pixel_x = -8;
+ pixel_y = 11
},
-/obj/item/reagent_containers/glass/bottle/charcoal,
-/obj/item/reagent_containers/glass/bottle/formaldehyde{
- pixel_x = 4;
- pixel_y = 1
+/obj/item/phone{
+ pixel_x = 7;
+ pixel_y = 10
},
-/obj/item/reagent_containers/hypospray/medipen/pumpup{
+/obj/item/reagent_containers/food/drinks/mug{
pixel_x = -1;
- pixel_y = -12
+ pixel_y = 4
},
-/obj/item/reagent_containers/hypospray/medipen/pumpup{
- pixel_x = 3;
- pixel_y = -10
+/obj/item/storage/fancy/nugget_box{
+ pixel_x = 6;
+ pixel_y = -7
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/medical)
-"XE" = (
-/obj/machinery/porta_turret/ship/syndicate/heavy{
- dir = 8
+/obj/item/trash/can{
+ pixel_x = -8;
+ pixel_y = -2
},
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/bridge)
-"XF" = (
-/obj/machinery/power/terminal,
/obj/structure/cable{
- icon_state = "0-4"
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/tech/techmaint,
+/turf/open/floor/plasteel/tech,
/area/ship/engineering)
-"XH" = (
-/obj/structure/reagent_dispensers/watertank,
+"YT" = (
+/obj/effect/spawner/lootdrop/salvage_manipulator,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/ship/maintenance/starboard)
+"YX" = (
+/obj/machinery/computer/crew/syndie,
/obj/effect/turf_decal/techfloor{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ship/bridge)
+"Zb" = (
+/obj/structure/railing{
dir = 4
},
-/obj/structure/sign/poster/official/moth/delam{
- pixel_x = 33
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/stairs{
+ dir = 1
},
-/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
-"Ye" = (
-/obj/effect/turf_decal/industrial/warning{
+"Zd" = (
+/obj/structure/railing{
dir = 1
},
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 8
+/obj/structure/railing{
+ dir = 1
},
-/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Yl" = (
-/obj/machinery/door/poddoor{
- dir = 4;
- id = "syndie_warship_cargo";
- name = "Cargo Hatch"
+/turf/open/floor/plasteel/stairs{
+ dir = 8
},
-/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
-"Yv" = (
-/obj/machinery/chem_dispenser/drinks/fullupgrade,
-/obj/structure/table/reinforced,
-/obj/structure/extinguisher_cabinet/directional/north,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen)
-"Yw" = (
-/obj/effect/turf_decal/industrial/warning,
+"Zf" = (
+/obj/effect/spawner/lootdrop/salvage_matter_bin,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/turf_decal/industrial/warning{
dir = 1
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"YE" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 2;
- name = "tactical chair"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/airalarm/directional/north,
+/turf/open/floor/plating,
+/area/ship/maintenance/starboard)
+"Zg" = (
+/obj/structure/rack,
/obj/effect/turf_decal/techfloor{
- dir = 1
+ dir = 8
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/hallway/central)
-"YJ" = (
-/obj/structure/closet/wall/white/med{
- name = "medical locker";
- pixel_y = 29
+/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/machinery/button/door{
+ dir = 1;
+ id = "Artillery2shutter";
+ name = "Artillery Hatch";
+ pixel_x = -4;
+ pixel_y = -24
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+/obj/machinery/button/shieldwallgen{
+ dir = 1;
+ id = "komodo_starboard";
+ pixel_x = 6;
+ pixel_y = -22
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ship/maintenance/starboard)
+"Zi" = (
+/obj/structure/closet/wall/white/med{
+ dir = 8;
+ name = "medical locker";
+ pixel_x = 29
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/structure/cable{
- icon_state = "2-8"
+ icon_state = "1-8"
},
-/obj/item/clothing/under/utility,
/obj/item/clothing/suit/longcoat/roboblack,
-/obj/item/clothing/suit/apron/surgical,
-/obj/item/clothing/neck/stethoscope,
/obj/item/clothing/mask/surgical,
-/obj/item/clothing/head/beret/black,
/obj/item/clothing/gloves/color/latex/nitrile/evil{
pixel_x = 1;
pixel_y = -3
},
+/obj/item/storage/belt/medical,
/obj/item/bodybag,
/obj/item/bodybag{
pixel_x = -3;
pixel_y = 3
},
+/obj/item/clothing/suit/hardliners,
+/obj/item/clothing/head/hardliners,
+/obj/item/clothing/under/syndicate/hardliners,
/turf/open/floor/mineral/plastitanium,
/area/ship/medical)
-"YP" = (
-/obj/machinery/door/window/eastright{
- dir = 1
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/medical)
-"YY" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/tech,
-/area/ship/maintenance/starboard)
-"Za" = (
-/obj/effect/decal/cleanable/dirt,
+"Zy" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 10
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 10
- },
-/obj/structure/closet/firecloset/wall{
- pixel_y = 29
- },
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"Zb" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 10
+ dir = 4
},
-/obj/machinery/firealarm/directional/south,
/obj/structure/cable{
icon_state = "1-4"
},
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"Zu" = (
-/obj/structure/railing/corner{
- dir = 4
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/structure/railing/corner,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_y = -21;
+ pixel_x = 6
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+/obj/machinery/firealarm/directional/south{
+ pixel_x = -6
+ },
+/turf/open/floor/pod,
+/area/ship/cargo)
+"Zz" = (
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/industrial/stand_clear{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
+/obj/structure/sign/poster/contraband/random{
+ pixel_y = 32
+ },
/obj/structure/cable{
icon_state = "2-8"
},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"ZI" = (
-/obj/effect/turf_decal/borderfloor{
- dir = 4
- },
+/turf/open/floor/plasteel/tech,
+/area/ship/maintenance/starboard)
+"ZO" = (
/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 5
+ },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 5
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
},
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
-"ZO" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
+"ZV" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
},
-/obj/effect/turf_decal/syndicateemblem/middle/right,
-/turf/open/floor/mineral/plastitanium/red,
-/area/ship/hallway/central)
-"ZS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/machinery/firealarm/directional/east,
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/structure/closet/wall/directional/west{
+ name = "uniform closet"
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/storage/backpack/duffelbag/syndie,
+/obj/item/storage/backpack/duffelbag/syndie,
+/obj/item/clothing/under/syndicate/gorlex,
+/obj/item/clothing/under/syndicate/gorlex,
+/obj/item/clothing/under/syndicate/gorlex,
+/obj/item/clothing/under/syndicate/combat,
+/obj/item/clothing/under/syndicate/combat,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
},
-/turf/open/floor/pod,
-/area/ship/cargo)
+/obj/item/storage/backpack/satchel,
+/obj/item/storage/backpack/satchel,
+/obj/item/storage/backpack/satchel,
+/turf/open/floor/holofloor/wood,
+/area/ship/crew/dorm)
(1,1,1) = {"
CM
@@ -5394,763 +5534,819 @@ CM
CM
CM
CM
+pN
+Yb
+Yb
+Yb
+OP
+CM
+CM
+CM
+CM
+CM
+CM
+"}
+(2,1,1) = {"
+CM
CM
CM
+Yk
+sq
+Yb
+Yb
+hY
+pJ
+pJ
+qF
+hY
+Yb
+Yb
+sq
CM
CM
CM
+"}
+(3,1,1) = {"
CM
+pN
+Yn
+yB
+sq
+pJ
+qF
+sq
+pA
+PX
+mC
+sq
+pJ
+qF
+sq
+sq
+Yn
+OP
+"}
+(4,1,1) = {"
CM
+hY
+MO
+yB
+EL
+yk
+CG
+Uh
+ji
+Om
+Lk
+rZ
+Nd
+nI
+Hf
+sq
+Pt
+hY
+"}
+(5,1,1) = {"
CM
+qk
+wd
+ls
+Zb
+Ht
+sF
+ys
+my
+hy
+fZ
+ah
+wG
+yb
+YR
+nA
+lr
+hY
+"}
+(6,1,1) = {"
CM
+qk
+mp
+VZ
+as
+xM
+AZ
+sq
+dS
+yg
+KL
+nV
+QZ
+lY
+vF
+Xs
+xV
+hY
+"}
+(7,1,1) = {"
CM
+hY
+sq
+sq
+sq
+FO
+uh
+sq
+sq
+BR
+sq
+sq
+Vl
+ND
+dL
+mP
+sq
+hY
+"}
+(8,1,1) = {"
CM
CM
+mI
+jh
+tT
+Du
+PZ
+sq
+Xp
+ko
+xd
+CL
+CL
+CL
+CL
+CL
+CL
CM
+"}
+(9,1,1) = {"
CM
CM
+Ep
+Ep
+Ep
+Ep
+Ep
+Ep
+TQ
+ul
+zP
+CL
+PS
+en
+JX
+hO
+CL
CM
+"}
+(10,1,1) = {"
CM
CM
+Ep
+Nq
+PA
+iH
+LP
+Ep
+sq
+BR
+sq
+CL
+Qb
+TU
+lA
+xr
+CL
CM
+"}
+(11,1,1) = {"
CM
CM
-cu
+Ep
+uJ
+es
+tD
+uV
+Ep
+vY
+Ce
+mZ
+CL
+VN
+CL
+CL
+CL
+CL
+Bx
+"}
+(12,1,1) = {"
CM
+kG
+Ep
+jA
+jA
+Ep
+Ep
+Ep
+VR
+HU
+ew
+MG
+VK
+iJ
+ZV
+qZ
+ic
+AV
+"}
+(13,1,1) = {"
CM
+ph
+Ko
+Eb
+ke
+tn
+Ep
+xJ
+TB
+Ci
+KT
+CL
+us
+Wq
+sQ
+NI
+kL
+AV
+"}
+(14,1,1) = {"
+cr
+bA
+eR
+vd
+xj
+nb
+Ep
+VR
+VR
+jt
+EB
+gE
+gE
+gE
+gE
+gE
+gE
+gE
+"}
+(15,1,1) = {"
CM
+Wl
+xW
+tr
+YQ
+aL
+Ep
+Jp
+mX
+dR
+kh
+gE
+ue
+vp
+sX
+Ni
+km
+tf
+"}
+(16,1,1) = {"
CM
+Rk
+eN
+gC
+Zd
+nq
+Ep
+UT
+VR
+Ci
+UF
+gE
+qm
+TE
+FB
+nD
+Ie
+tf
+"}
+(17,1,1) = {"
CM
+Vk
+WD
+vL
+uS
+HQ
+Ep
+VR
+VR
+jv
+VR
+gE
+gE
+yH
+VU
+MV
+eY
+tf
+"}
+(18,1,1) = {"
CM
+Vk
+HI
+Xd
+Zy
+Ep
+Ep
+Nf
+WQ
+hk
+gQ
+Lb
+gE
+gE
+Tr
+vX
+gE
+tf
+"}
+(19,1,1) = {"
CM
+kG
+Ep
+Ep
+We
+Ep
+GD
+gr
+Gj
+gM
+ft
+BQ
+dD
+gE
+wT
+Im
+gE
+Bx
+"}
+(20,1,1) = {"
CM
CM
+gk
+Wu
+rm
+mY
+bM
+HF
+EF
+Sv
+lj
+Il
+tv
+uG
+lv
+dV
+gk
CM
+"}
+(21,1,1) = {"
CM
CM
+gk
+lb
+ot
+JO
+PN
+WL
+Kz
+Lo
+aY
+sG
+ox
+Xu
+lu
+qB
+gk
CM
"}
-(2,1,1) = {"
-CM
+(22,1,1) = {"
CM
CM
-td
-gN
-gN
-gN
-gN
-gN
-gN
-gN
-rh
+kG
+Dd
+Dd
+Dd
+Dd
+Dd
+zZ
+gu
+qG
+Dd
+Dd
+Dd
+Dd
+Dd
+Bx
CM
+"}
+(23,1,1) = {"
CM
CM
+sn
+ho
+Uy
+PE
+rI
+kD
+Fe
+xH
+LV
+Vc
+wk
+Vj
+Lj
+kq
CM
CM
+"}
+(24,1,1) = {"
CM
CM
+sn
+Nj
+xF
+qD
+fd
+Aa
+rX
+nX
+AS
+Vc
+Vq
+bm
+rg
+kq
CM
CM
+"}
+(25,1,1) = {"
CM
CM
-XE
-Vk
-Vk
-Rk
-jr
-Yl
+Aj
+Ad
+Ji
+lg
Mb
-XE
-CM
-CM
+kD
+eX
+jL
+Un
+OV
+Zi
+jW
+aI
+rv
+TR
CM
+"}
+(26,1,1) = {"
CM
-hY
-zV
-zV
-hY
-OP
CM
+Aj
+eo
+sy
+MF
+kD
+kD
+fX
+Yp
+JV
+Vc
+Vc
+yO
+vx
+Ro
+TR
CM
"}
-(3,1,1) = {"
-CM
+(27,1,1) = {"
CM
CM
-lL
-Gy
-Fo
-bs
-ip
-dR
-MI
-jb
-gN
-CM
-Aj
-Aj
-Aj
-Aj
Aj
-ti
-ti
-yw
-lu
-lu
-Ep
-SC
-Wq
+QC
+wE
+kD
+kD
+If
+cn
+zx
+nz
+EJ
+Vc
+Vc
Sd
-Ho
-CH
-rK
-Ep
-Ep
-Ep
-Ep
-CY
-sq
-Jo
-Ai
-mN
-CO
-CM
+BK
+TR
CM
"}
-(4,1,1) = {"
+(28,1,1) = {"
CM
CM
-CM
-SZ
-FT
-iz
-jX
-kH
-Az
-nR
-Ap
-nU
-lu
+Aj
+po
kD
-SU
-Yv
-rs
-Rz
-uA
-kC
-Dd
-sI
-MR
-Ep
-MX
-ex
-am
-lj
-WM
-HV
-Ux
-qD
-In
-Ep
-Ii
-sq
-pf
-jF
-Nz
-Nz
-Bg
+kD
+PG
+BY
+dJ
+fn
+lt
+cG
+rE
+Vc
+Vc
+XI
+TR
CM
"}
-(5,1,1) = {"
+(29,1,1) = {"
CM
CM
-CM
-AY
-yJ
-FV
-oi
-Le
-Nh
-Hd
-NY
-RT
-vA
+Aj
kD
kD
-Mm
-Fr
-LP
-yV
-uQ
-Dd
-BW
-CA
-cR
-ZS
-Ws
-TJ
-pA
-sQ
-EY
-Ux
-gh
-xg
-Ep
-AR
-sq
-Ng
-CK
-tx
-sq
-sq
+TK
+sV
+dY
+tC
+tC
+tC
+hL
+ac
+QI
+Vc
+Vc
+TR
CM
"}
-(6,1,1) = {"
+(30,1,1) = {"
CM
CM
-jE
-tC
-tC
-tC
-tC
-tC
+CM
+gk
+qz
+GJ
+Eo
tC
tC
+EN
tC
tC
-em
-uL
-kD
-kD
-OT
-JK
-Jx
-Bf
-Dd
-tO
-Yw
-Ep
-Ep
-WY
-gH
-KL
-qI
-gj
-Ep
-Fx
-fk
-Ep
-Za
-uB
-hc
-UH
-XF
-vq
-cV
-CM
-"}
-(7,1,1) = {"
+Oq
+Hs
+vA
+gk
CM
-zF
-ME
-EM
-Dl
-JB
-bS
-tC
-BL
-KE
-Vq
-Or
-xZ
-Bj
-QI
-kD
-kD
-no
-xj
-gw
-Dd
-Ig
-Sm
-DO
-Ep
-Ep
-Ep
-Ep
-Ep
-Ep
-Ep
-HM
-Vu
-Ep
-pF
-XH
-sb
-nG
-kK
-Po
-cV
CM
"}
-(8,1,1) = {"
-jE
-si
-nQ
-pS
-ZI
-sT
-Mo
-tC
-WW
-dm
+(31,1,1) = {"
+CM
+pN
+gN
+nU
+iL
tC
+vs
tC
+eW
+kI
+El
tC
-fc
-km
-Zb
-kD
-kD
-Eh
-kD
+ok
Dd
-RN
-Ye
-OG
-ah
-VR
-Eg
-xP
-VR
-mr
-Ep
-Ep
-Ep
-Ep
-sq
-sq
-sq
-vC
-CP
-sq
-hY
+JJ
+Hc
+OQ
OP
"}
-(9,1,1) = {"
-ME
-bk
-Sr
-nb
-hp
-PB
-tC
+(32,1,1) = {"
+CM
+gN
+nh
+aO
+Ab
tC
-BV
-eE
+RZ
tC
-eW
tC
+UP
tC
-Ww
-jw
-fE
-ft
-LU
-rN
-cz
-sy
-If
-Av
-zR
-VR
-VR
-SG
-VR
-Sq
-VR
-NE
-sq
-fg
-ws
-sq
-la
-tj
-yY
-eD
-vq
-cV
-"}
-(10,1,1) = {"
-ME
-hj
-uF
-jP
-nk
-pE
-xl
-As
-gK
-Fc
-tw
-kI
-qT
tC
-zu
-dG
-bv
-WT
-Pz
-Ok
-Fg
-Wo
-IE
-tY
-co
-pN
-ew
-ES
-WZ
-ew
-qu
-JC
-lm
-vg
-ty
-UK
-EX
-Uw
-Xk
-ao
-vq
-cV
-"}
-(11,1,1) = {"
-ME
-ax
-gy
-Pv
-ny
-HJ
tC
tC
-Lt
+Pl
+Gh
+Zg
+OQ
+"}
+(33,1,1) = {"
+CM
+gN
+Ho
+kM
+vT
tC
+Xf
+wR
+ae
+GS
tC
-El
+Ek
+RK
tC
+yd
+Rs
+PV
+OQ
+"}
+(34,1,1) = {"
+CM
+gN
+yp
+mE
+JN
tC
-ro
-eY
-hg
-Ca
-SX
-dF
+tF
+sY
+Cj
ZO
-sj
-eX
-aX
-tv
-VR
-Pu
-jp
-av
-zK
-VO
-Kd
-sq
-Cr
-Lx
-sq
-aU
-TN
-Zu
-iO
-Po
-cV
+oO
+ib
+JQ
+tC
+Gs
+kr
+lm
+OQ
"}
-(12,1,1) = {"
-Al
-ME
-WP
-WA
-TH
-UJ
+(35,1,1) = {"
+CM
+gN
+IO
+qf
+To
tC
-FL
-up
-KG
tC
tC
tC
-GT
-gq
-PK
-Vc
-Uo
-Vc
-Vc
-Dd
-RG
-Gp
-lT
-Jw
-gE
-gE
-gE
-gE
-CL
-Do
-CL
-CL
-CL
-CL
-sq
-mA
-uR
-lV
-sq
-hY
-Rp
-"}
-(13,1,1) = {"
-CM
-zF
-ME
-IL
-CT
-dT
+Qh
tC
-mj
-wO
-iq
+XT
+Hr
tC
-lk
-iK
-an
-on
-Vc
-Vc
-YJ
-HN
-aL
-Dd
-Ln
-vT
-aR
-gE
-gE
-cZ
-qK
-gE
-bn
-TB
-qc
-JH
-ho
-CL
-HB
-SN
-Qv
-Hv
-vq
-cV
-CM
+Zz
+QW
+pb
+OQ
"}
-(14,1,1) = {"
+(36,1,1) = {"
CM
-CM
-Al
+gN
+jD
+Rf
+Pp
tC
+Oe
+eK
tC
+fD
tC
tC
tC
tC
+sS
+Zf
+CB
+OQ
+"}
+(37,1,1) = {"
+CM
+gN
+YP
+yV
+FV
tC
+YX
+It
+dG
+WR
+ub
+AL
+jn
tC
-Dd
-vw
-Bk
-Vc
-Vc
-hK
-Ic
-YP
-Vj
-Dd
-uD
-Au
-gE
-gE
-je
-TE
-rj
-gE
-Xz
-gd
-CL
-qy
-DQ
-CL
-zk
-rf
-yX
-ab
-Po
-cV
-CM
+dc
+PP
+YT
+OQ
"}
-(15,1,1) = {"
+(38,1,1) = {"
CM
-CM
-CM
-BP
+gN
+vl
+hV
+yJ
+tC
+ip
+zw
+iT
+wJ
+XS
+Kq
+FL
+tC
Xr
-Io
-bR
-Ib
-bg
-po
-Ij
-dz
-mY
-Vc
-Vc
-iX
-vx
-MU
-Ko
-dp
-Dd
-YE
-UO
-WJ
-Sn
-bE
-Cn
-dv
-gE
-is
-gJ
-CL
-Gl
-Xg
-CL
-tT
-wP
-Ew
-Ed
-sq
-sq
+io
+Em
+OQ
+"}
+(39,1,1) = {"
CM
+rS
+RR
+Gl
+AY
+tC
+Jt
+UK
+Rl
+hJ
+vI
+WA
+rN
+tC
+BP
+nv
+hr
+ea
"}
-(16,1,1) = {"
+(40,1,1) = {"
CM
CM
CM
-xD
-aA
-Wj
-dw
-Qy
-kr
-Ih
-vm
-Hc
-lu
-Vc
-uW
-XC
-Ro
-rv
-wo
-wo
-Dd
-jz
-RB
-gp
-dO
-Il
-DZ
-sn
-gE
-NI
-MJ
-CL
-Hy
-rA
-CL
-xC
-TY
-VA
-sq
-sq
CM
CM
-"}
-(17,1,1) = {"
+ME
+Al
+Ml
+PO
+ez
+RS
+GN
+Al
+si
CM
CM
CM
-MG
-YY
-bI
-gt
-Hp
-CZ
-es
-oo
-OQ
CM
-TR
-TR
-TR
-TR
-TR
+"}
+(41,1,1) = {"
CM
CM
-FY
-lu
-lu
-gE
-gE
-vQ
-PE
-JE
-gE
-NB
-Wc
-CL
-CL
-CL
-CL
-sq
-Js
-JV
-mv
-CO
CM
CM
-"}
-(18,1,1) = {"
CM
CM
+ME
+jE
+lz
+WK
+Bd
+Al
+ME
CM
-rS
-OQ
-OQ
-OQ
-OQ
-OQ
-OQ
-OQ
-ea
CM
CM
CM
CM
+"}
+(42,1,1) = {"
CM
CM
CM
@@ -6158,23 +6354,15 @@ CM
CM
CM
CM
-FY
-tf
-tf
-tf
-tf
-gE
-io
-io
-FY
+ME
+Al
+Al
+Al
+si
+CM
CM
CM
CM
-hY
-hY
-hY
-hY
-Rp
CM
CM
"}
diff --git a/_maps/shuttles/syndicate/syndicate_litieguai.dmm b/_maps/shuttles/syndicate/syndicate_litieguai.dmm
index e81231480dfb..a7e6bb4dbcf5 100644
--- a/_maps/shuttles/syndicate/syndicate_litieguai.dmm
+++ b/_maps/shuttles/syndicate/syndicate_litieguai.dmm
@@ -67,6 +67,12 @@
},
/turf/open/floor/plasteel/white,
/area/ship/cargo)
+"bz" = (
+/obj/machinery/light/small/directional/south,
+/obj/machinery/power/ship_gravity,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/ship/maintenance/port)
"bD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
@@ -1021,11 +1027,10 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 8
},
-/obj/structure/closet/secure_closet/wall{
+/obj/structure/closet/secure_closet/wall/directional/north{
icon_state = "sec_wall";
name = "firearms locker";
- req_access_txt = "5";
- pixel_y = 28
+ req_access_txt = "5"
},
/obj/item/ammo_box/magazine/m10mm/rubber,
/obj/item/ammo_box/magazine/m10mm/rubber,
@@ -1093,9 +1098,7 @@
/turf/open/floor/plasteel/freezer,
/area/ship/crew/toilet)
"wt" = (
-/obj/structure/closet/emcloset/wall{
- pixel_y = 28
- },
+/obj/structure/closet/emcloset/wall/directional/north,
/obj/effect/turf_decal/number/two,
/turf/open/floor/plating,
/area/ship/maintenance/starboard)
@@ -1379,7 +1382,6 @@
/area/ship/medical)
"zT" = (
/obj/effect/turf_decal/number/zero,
-/obj/machinery/light/small/directional/north,
/turf/open/floor/plating,
/area/ship/maintenance/starboard)
"Ah" = (
@@ -1403,16 +1405,14 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 8
},
-/obj/structure/closet/secure_closet/wall{
- dir = 1;
+/obj/structure/closet/secure_closet/wall/directional/south{
icon_state = "sec_wall";
name = "armor locker";
- req_access_txt = "5";
- pixel_y = -28
+ req_access_txt = "5"
},
-/obj/item/clothing/suit/armor/vest/marine/trauma,
-/obj/item/clothing/suit/armor/vest/marine/trauma,
-/obj/item/clothing/suit/armor/vest/marine/trauma,
+/obj/item/clothing/suit/armor/vest/trauma,
+/obj/item/clothing/suit/armor/vest/trauma,
+/obj/item/clothing/suit/armor/vest/trauma,
/obj/item/clothing/head/helmet/medical,
/obj/item/clothing/head/helmet/medical,
/obj/item/clothing/head/helmet/medical,
@@ -1490,12 +1490,10 @@
/obj/item/storage/belt/medical,
/obj/item/healthanalyzer/advanced,
/obj/item/hypospray/mkii/CMO,
-/obj/structure/closet/secure_closet/wall{
- dir = 4;
+/obj/structure/closet/secure_closet/wall/directional/west{
icon_state = "solgov_wall";
name = "chief medical officer's closet";
- req_access_txt = "40";
- pixel_x = -28
+ req_access_txt = "40"
},
/obj/item/storage/backpack/satchel/med,
/obj/item/defibrillator/compact/loaded,
@@ -1561,12 +1559,10 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 5
},
-/obj/structure/closet/secure_closet/wall{
- dir = 1;
+/obj/structure/closet/secure_closet/wall/directional/south{
icon_state = "sec_wall";
name = "clothing locker";
- req_access_txt = "5";
- pixel_y = -28
+ req_access_txt = "5"
},
/obj/item/clothing/under/syndicate/medic,
/obj/item/clothing/under/syndicate/medic,
@@ -1650,6 +1646,9 @@
/obj/effect/turf_decal/industrial/warning/corner{
dir = 8
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plating,
/area/ship/maintenance/port)
"DX" = (
@@ -2292,7 +2291,7 @@
/obj/structure/cable{
icon_state = "2-9"
},
-/turf/open/floor/plasteel/stairs/medium{
+/turf/open/floor/plasteel/stairs/mid{
dir = 1
},
/area/ship/storage/eva)
@@ -2392,11 +2391,10 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 10
},
-/obj/structure/closet/secure_closet/wall{
+/obj/structure/closet/secure_closet/wall/directional/north{
icon_state = "sec_wall";
name = "equipment locker";
- req_access_txt = "5";
- pixel_y = 28
+ req_access_txt = "5"
},
/obj/item/healthanalyzer/advanced,
/obj/item/healthanalyzer/advanced,
@@ -2790,6 +2788,10 @@
/obj/structure/window/reinforced/fulltile/shuttle,
/turf/open/floor/plating,
/area/ship/science)
+"VN" = (
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/plating,
+/area/ship/maintenance/starboard)
"WB" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
@@ -2842,12 +2844,10 @@
/obj/item/areaeditor/shuttle,
/obj/item/megaphone/command,
/obj/item/clothing/glasses/sunglasses,
-/obj/structure/closet/secure_closet/wall{
- dir = 4;
+/obj/structure/closet/secure_closet/wall/directional/west{
icon_state = "solgov_wall";
name = "captain's closet";
- req_access_txt = "20";
- pixel_x = -28
+ req_access_txt = "20"
},
/obj/item/gun/ballistic/revolver,
/obj/item/clothing/suit/armor/vest/capcarapace/cybersun,
@@ -2873,10 +2873,7 @@
/obj/machinery/atmospherics/components/binary/pump/on/layer2{
dir = 8
},
-/obj/structure/closet/firecloset/wall{
- dir = 1;
- pixel_y = -28
- },
+/obj/structure/closet/firecloset/wall/directional/south,
/turf/open/floor/plating,
/area/ship/maintenance/port)
"Xx" = (
@@ -2925,7 +2922,9 @@
dir = 4
},
/obj/item/storage/toolbox/electrical,
-/obj/machinery/light/small/directional/south,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
/turf/open/floor/plating,
/area/ship/maintenance/port)
"YA" = (
@@ -3158,7 +3157,7 @@ HU
ZC
XL
Yw
-ZC
+bz
fp
UG
vx
@@ -3172,7 +3171,7 @@ gL
UG
UG
Ti
-UO
+VN
zT
kh
UO
@@ -3182,7 +3181,7 @@ ZC
KS
Xu
ZC
-UG
+fp
UG
UG
Ra
@@ -3194,7 +3193,7 @@ tO
Ra
UG
UG
-UG
+Ti
UO
wt
xW
diff --git a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
index 79c693817dda..6d0b0b423e61 100644
--- a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
+++ b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
@@ -4,10 +4,7 @@
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/structure/closet/emcloset/wall{
- dir = 8;
- pixel_x = 28
- },
+/obj/structure/closet/emcloset/wall/directional/east,
/obj/item/clothing/suit/space/syndicate/black/engie,
/obj/item/clothing/head/helmet/space/syndicate/black/engie,
/turf/open/floor/plasteel/dark,
@@ -104,8 +101,8 @@
req_access = list(3,150)
},
/obj/item/clothing/under/syndicate/ngr/officer,
-/obj/item/clothing/suit/armor/vest/capcarapace/ngr_captain,
-/obj/item/clothing/head/ngrcap,
+/obj/item/clothing/suit/armor/ngr/captain,
+/obj/item/clothing/head/ngr/peaked,
/obj/item/clothing/shoes/combat,
/obj/item/megaphone/sec{
name = "syndicate megaphone"
@@ -135,10 +132,7 @@
/turf/open/floor/plating,
/area/ship/engineering/atmospherics)
"aG" = (
-/obj/structure/closet/secure_closet/wall{
- dir = 8;
- pixel_x = 28
- },
+/obj/structure/closet/secure_closet/wall/directional/east,
/obj/item/kitchen/knife,
/obj/item/cutting_board,
/obj/item/clothing/under/suit/waiter/syndicate,
@@ -410,6 +404,9 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel/dark,
/area/ship/engineering/atmospherics)
"cC" = (
@@ -1380,7 +1377,7 @@
/obj/item/clothing/under/syndicate/medic/skirt,
/obj/item/clothing/under/syndicate/medic,
/obj/item/clothing/head/helmet/medical,
-/obj/item/clothing/suit/armor/vest/marine/trauma,
+/obj/item/clothing/suit/armor/vest/trauma,
/obj/item/storage/belt/medical,
/obj/item/storage/belt/medical/webbing,
/obj/item/clothing/gloves/color/latex/nitrile/evil,
@@ -2323,9 +2320,7 @@
/obj/item/card/id/syndicate_command/lieutenant{
name = "lieutenant ID card"
},
-/obj/structure/closet/secure_closet/wall{
- dir = 4;
- pixel_x = -28;
+/obj/structure/closet/secure_closet/wall/directional/west{
name = "spare cards locker";
req_access = list(3,150)
},
@@ -2372,7 +2367,7 @@
dir = 8
},
/obj/machinery/suit_storage_unit/syndicate{
- suit_type = /obj/item/clothing/suit/space/hardsuit/syndi/sbg;
+ suit_type = /obj/item/clothing/suit/space/hardsuit/syndi/ngr;
name = "lieutenant's suit storage unit"
},
/turf/open/floor/mineral/plastitanium,
@@ -2428,10 +2423,7 @@
/obj/effect/turf_decal/corner/opaque/syndiered{
dir = 10
},
-/obj/structure/closet/firecloset/wall{
- dir = 1;
- pixel_y = -28
- },
+/obj/structure/closet/firecloset/wall/directional/south,
/obj/effect/turf_decal/borderfloorblack{
dir = 1
},
@@ -2568,11 +2560,8 @@
/obj/effect/turf_decal/corner/opaque/syndiered/half{
dir = 4
},
-/obj/machinery/computer/communications{
- dir = 8;
- req_access = list(151);
- set_obj_flags = "EMAGGED";
- icon_state = "computer-right"
+/obj/structure/frame/computer{
+ dir = 8
},
/turf/open/floor/mineral/plastitanium,
/area/ship/bridge)
@@ -4193,9 +4182,7 @@
/turf/open/floor/plasteel/dark,
/area/ship/engineering/atmospherics)
"yM" = (
-/obj/structure/chair/comfy/black{
- dir = 8
- },
+/obj/structure/chair/comfy/grey/directional/west,
/turf/open/floor/carpet/nanoweave/red,
/area/ship/crew/dorm/dormtwo)
"yN" = (
@@ -4272,7 +4259,7 @@
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/computer/helm{
dir = 8;
- icon_state = "computer-middle"
+ icon_state = "computer-right"
},
/obj/effect/turf_decal/corner/opaque/syndiered/half{
dir = 4
@@ -4685,8 +4672,7 @@
pixel_x = 6;
pixel_y = 1
},
-/obj/item/gun/ballistic/automatic/sniper_rifle/syndicate{
- spawnwithmagazine = 0;
+/obj/item/gun/ballistic/automatic/sniper_rifle/syndicate/no_mag{
pixel_x = -3;
pixel_y = 6
},
@@ -4781,10 +4767,7 @@
/obj/effect/turf_decal/corner/opaque/syndiered{
dir = 9
},
-/obj/structure/closet/firecloset/wall{
- dir = 4;
- pixel_x = -28
- },
+/obj/structure/closet/firecloset/wall/directional/west,
/obj/effect/turf_decal/borderfloorblack{
dir = 4
},
@@ -5037,7 +5020,7 @@
/obj/item/clothing/under/syndicate/medic/skirt,
/obj/item/clothing/under/syndicate/medic,
/obj/item/clothing/head/helmet/medical,
-/obj/item/clothing/suit/armor/vest/marine/trauma,
+/obj/item/clothing/suit/armor/vest/trauma,
/obj/item/antag_spawner/nuke_ops/borg_tele/medical/unlocked,
/obj/item/storage/belt/medical,
/obj/item/storage/belt/medical/webbing,
@@ -5212,10 +5195,7 @@
/obj/effect/turf_decal/corner/opaque/syndiered{
dir = 9
},
-/obj/structure/closet/emcloset/wall{
- dir = 4;
- pixel_x = -28
- },
+/obj/structure/closet/emcloset/wall/directional/west,
/obj/effect/turf_decal/borderfloorblack{
dir = 4
},
@@ -5628,16 +5608,6 @@
/area/ship/security)
"Gm" = (
/obj/structure/rack,
-/obj/item/gun/ballistic/automatic/ebr{
- pixel_x = -16;
- pixel_y = 7;
- spawnwithmagazine = 0
- },
-/obj/item/gun/ballistic/automatic/ebr{
- pixel_x = -9;
- pixel_y = 2;
- spawnwithmagazine = 0
- },
/obj/item/ammo_box/magazine/ebr{
pixel_x = 10;
pixel_y = -1
@@ -5652,6 +5622,11 @@
/obj/item/ammo_box/magazine/ebr{
pixel_y = -2
},
+/obj/item/gun/ballistic/automatic/ebr/no_mag{
+ pixel_x = -7;
+ pixel_y = 4
+ },
+/obj/item/gun/ballistic/automatic/ebr/no_mag,
/turf/open/floor/mineral/plastitanium,
/area/ship/security/armory)
"Gn" = (
@@ -5798,10 +5773,7 @@
/turf/open/floor/plasteel/mono/dark,
/area/ship/hallway/port)
"GN" = (
-/obj/structure/closet/emcloset/wall{
- dir = 4;
- pixel_x = -28
- },
+/obj/structure/closet/emcloset/wall/directional/west,
/obj/item/clothing/suit/space/syndicate,
/obj/item/clothing/suit/space/syndicate,
/obj/item/clothing/head/helmet/space/syndicate,
@@ -6119,10 +6091,6 @@
/obj/machinery/camera/autoname{
dir = 6
},
-/obj/item/reagent_containers/spray/syndicate{
- pixel_y = 11;
- pixel_x = -2
- },
/turf/open/floor/wood/walnut,
/area/ship/crew/janitor)
"IE" = (
@@ -6173,10 +6141,7 @@
/turf/open/floor/plasteel/telecomms_floor,
/area/ship/engineering/communications)
"IV" = (
-/obj/structure/closet/emcloset/wall{
- dir = 4;
- pixel_x = -28
- },
+/obj/structure/closet/emcloset/wall/directional/west,
/obj/item/clothing/suit/space/syndicate,
/obj/item/clothing/head/helmet/space/syndicate,
/obj/item/clothing/head/helmet/space/syndicate,
@@ -7103,6 +7068,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 5
},
+/obj/structure/extinguisher_cabinet/directional/south,
/turf/open/floor/plasteel/dark,
/area/ship/engineering/atmospherics)
"Pd" = (
@@ -7530,15 +7496,13 @@
/area/ship/hallway/aft)
"Rv" = (
/obj/structure/rack,
-/obj/item/gun/ballistic/shotgun/bulldog{
+/obj/item/gun/ballistic/shotgun/bulldog/no_mag{
pixel_x = -7;
- pixel_y = 7;
- spawnwithmagazine = 0
+ pixel_y = 7
},
-/obj/item/gun/ballistic/shotgun/bulldog{
+/obj/item/gun/ballistic/shotgun/bulldog/no_mag{
pixel_y = -3;
- pixel_x = 2;
- spawnwithmagazine = 0
+ pixel_x = 2
},
/obj/machinery/light/directional/north,
/obj/item/ammo_box/magazine/m12g{
@@ -7777,10 +7741,7 @@
"SA" = (
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer4,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/structure/closet/emcloset/wall{
- dir = 8;
- pixel_x = 28
- },
+/obj/structure/closet/emcloset/wall/directional/east,
/obj/item/clothing/suit/space/syndicate/black/engie,
/obj/item/clothing/head/helmet/space/syndicate/black/engie,
/turf/open/floor/plasteel/dark,
@@ -8157,7 +8118,8 @@
/turf/open/floor/plasteel/tech,
/area/ship/hallway/central)
"UB" = (
-/obj/structure/extinguisher_cabinet/directional/south,
+/obj/machinery/power/ship_gravity,
+/obj/structure/cable/yellow,
/turf/open/floor/plasteel/dark,
/area/ship/engineering/atmospherics)
"UC" = (
@@ -8340,9 +8302,8 @@
/obj/effect/turf_decal/trimline/opaque/orange/line{
dir = 5
},
-/obj/structure/closet/wall/orange{
- name = "Chemical Closet";
- pixel_y = 28
+/obj/structure/closet/wall/orange/directional/north{
+ name = "Chemical Closet"
},
/obj/item/storage/bag/chemistry,
/obj/item/reagent_containers/glass/beaker/large,
@@ -8573,9 +8534,7 @@
dir = 5
},
/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/closet/firecloset/wall{
- pixel_y = 28
- },
+/obj/structure/closet/firecloset/wall/directional/north,
/obj/effect/turf_decal/borderfloorblack,
/turf/open/floor/plasteel/tech,
/area/ship/hallway/starboard)
@@ -8874,19 +8833,16 @@
/area/ship/engineering/engine)
"YO" = (
/obj/structure/rack,
-/obj/item/gun/ballistic/automatic/smg/c20r{
+/obj/item/gun/ballistic/automatic/smg/c20r/no_mag{
pixel_x = 2;
- pixel_y = 8;
- spawnwithmagazine = 0
+ pixel_y = 8
},
-/obj/item/gun/ballistic/automatic/smg/c20r{
- pixel_y = 3;
- spawnwithmagazine = 0
+/obj/item/gun/ballistic/automatic/smg/c20r/no_mag{
+ pixel_y = 3
},
-/obj/item/gun/ballistic/automatic/smg/c20r{
+/obj/item/gun/ballistic/automatic/smg/c20r/no_mag{
pixel_y = -2;
- pixel_x = 3;
- spawnwithmagazine = 0
+ pixel_x = 3
},
/obj/item/ammo_box/magazine/smgm45,
/obj/item/ammo_box/magazine/smgm45,
diff --git a/_maps/templates/shelter_1.dmm b/_maps/templates/shelter_1.dmm
index f5b2e141f4c4..434e000defc8 100644
--- a/_maps/templates/shelter_1.dmm
+++ b/_maps/templates/shelter_1.dmm
@@ -50,9 +50,7 @@
/area/survivalpod)
"l" = (
/obj/structure/tubes,
-/obj/structure/chair/comfy/black{
- dir = 8
- },
+/obj/structure/chair/comfy/grey/directional/west,
/turf/open/floor/pod,
/area/survivalpod)
"m" = (
diff --git a/_maps/templates/shelter_2.dmm b/_maps/templates/shelter_2.dmm
index 4a6de9bbf07d..9c2571e6f5a5 100644
--- a/_maps/templates/shelter_2.dmm
+++ b/_maps/templates/shelter_2.dmm
@@ -72,7 +72,7 @@
/turf/open/floor/carpet/black,
/area/survivalpod)
"o" = (
-/obj/structure/chair/comfy/black,
+/obj/structure/chair/comfy/grey/directional/south,
/obj/item/cardboard_cutout{
desc = "A cardboard cutout of a xenomorph maid.";
icon_state = "cutout_lusty";
@@ -179,9 +179,7 @@
/turf/open/floor/carpet/black,
/area/survivalpod)
"B" = (
-/obj/structure/chair/comfy/black{
- dir = 1
- },
+/obj/structure/chair/comfy/grey/directional/north,
/turf/open/floor/carpet/black,
/area/survivalpod)
"C" = (
diff --git a/_maps/templates/shelter_3.dmm b/_maps/templates/shelter_3.dmm
index 402c5f04923c..dd4f6645a518 100644
--- a/_maps/templates/shelter_3.dmm
+++ b/_maps/templates/shelter_3.dmm
@@ -178,7 +178,7 @@
/turf/open/floor/pod/dark,
/area/survivalpod)
"D" = (
-/obj/structure/chair/comfy/black,
+/obj/structure/chair/comfy/grey/directional/south,
/turf/open/floor/carpet/black,
/area/survivalpod)
"E" = (
@@ -221,9 +221,7 @@
/turf/closed/wall/mineral/titanium/survival/nodiagonal,
/area/survivalpod)
"K" = (
-/obj/structure/chair/comfy/black{
- dir = 1
- },
+/obj/structure/chair/comfy/grey/directional/north,
/turf/open/floor/carpet/black,
/area/survivalpod)
"L" = (
diff --git a/check_regex.yaml b/check_regex.yaml
index dc1d4d05e71a..d03e15391975 100644
--- a/check_regex.yaml
+++ b/check_regex.yaml
@@ -29,7 +29,7 @@ standards:
- exactly: [1, "/area text paths", '"/area']
- exactly: [17, "/datum text paths", '"/datum']
- exactly: [4, "/mob text paths", '"/mob']
- - exactly: [44, "/obj text paths", '"/obj']
+ - exactly: [43, "/obj text paths", '"/obj']
- exactly: [0, "/turf text paths", '"/turf']
- exactly: [117, "text2path uses", "text2path"]
@@ -38,7 +38,7 @@ standards:
- exactly:
[
- 269,
+ 265,
"non-bitwise << uses",
'(?LOGS)"
-/// Displays "(SHOW)" in the chat, when clicked it tries to show atom(paper). First you need to set the request_state variable to TRUE for the paper.
+/// Displays "(SHOW)" in the chat, when clicked it tries to show atom(paper) or atom(photo). First you need to set the request_state variable to TRUE for the paper.
#define ADMIN_SHOW_PAPER(atom) "(SHOW)"
+#define ADMIN_SHOW_PHOTO(atom) "(PHOTO)"
#define ADMIN_PUNISHMENT_BREAK_BONES "Break all bones"
#define ADMIN_PUNISHMENT_LIGHTNING "Lightning bolt"
diff --git a/code/__DEFINES/blackmarket.dm b/code/__DEFINES/blackmarket.dm
index 5494c371db7b..042066df522d 100644
--- a/code/__DEFINES/blackmarket.dm
+++ b/code/__DEFINES/blackmarket.dm
@@ -3,8 +3,6 @@
// The BEST way of shipping items: accurate, "undetectable"
#define SHIPPING_METHOD_LTSRBT "LTSRBT"
-// Picks a random area to teleport the item to and gives you a minute to get there before it is sent.
-#define SHIPPING_METHOD_TELEPORT "Teleport"
-// Throws the item from somewhere at the station.
+// Throws the item from somewhere at the uplink.
#define SHIPPING_METHOD_LAUNCH "Launch"
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index c428e1e7dd53..5c6f14c887eb 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -3,7 +3,6 @@
#define COLOR_INPUT_DISABLED "#F0F0F0"
#define COLOR_INPUT_ENABLED "#D3B5B5"
-//BeginWS
#define COLOR_DARKMODE_DARKBACKGROUND "#383838"
#define COLOR_DARKMODE_BACKGROUND "#272727"
#define COLOR_DARKMODE_HEADER "#ffffff"
@@ -23,7 +22,6 @@
#define WOOD_COLOR_BLACK "#332521"
#define WOOD_COLOR_CHOCOLATE "#543C30"
#define WOOD_COLOR_YELLOW "#E3994E"
-//EndWS
#define COLOR_WHITE "#FFFFFF"
#define COLOR_OFF_WHITE "#FFF5ED"
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 7df3a453acfb..ad0754c85b21 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -133,52 +133,6 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun)))
#define EMBED_POINTY list("ignore_throwspeed_threshold" = TRUE)
#define EMBED_POINTY_SUPERIOR list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE)
-//Gun weapon weight
-/// Allows you to dual wield this gun and your offhand gun
-#define WEAPON_LIGHT 1
-/// Does not allow you to dual wield with this gun and your offhand gun
-#define WEAPON_MEDIUM 2
-/// You must wield the gun to fire this gun
-#define WEAPON_HEAVY 3
-//Gun trigger guards
-#define TRIGGER_GUARD_ALLOW_ALL -1
-#define TRIGGER_GUARD_NONE 0
-#define TRIGGER_GUARD_NORMAL 1
-//Gun bolt types
-///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted.
-/// Example: c20, shotguns, m90
-#define BOLT_TYPE_STANDARD 1
-///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed.
-/// Example: Some SMGs, the L6
-#define BOLT_TYPE_OPEN 2
-///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine.
-/// Example: Break action shotguns, revolvers
-#define BOLT_TYPE_NO_BOLT 3
-///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in.
-/// Example: Pistols with a slide lock, some SMGs
-#define BOLT_TYPE_LOCKING 4
-//Sawn off nerfs
-///accuracy penalty of sawn off guns
-#define SAWN_OFF_ACC_PENALTY 25
-///added recoil of sawn off guns
-#define SAWN_OFF_RECOIL 1
-
-//ammo box sprite defines
-///ammo box will always use provided icon state
-#define AMMO_BOX_ONE_SPRITE 0
-///ammo box will have a different state for each bullet; -
-#define AMMO_BOX_PER_BULLET 1
-///ammo box will have a different state for full and empty; -max_ammo and -0
-#define AMMO_BOX_FULL_EMPTY 2
-
-#define SUPPRESSED_NONE 0
-#define SUPPRESSED_QUIET 1 ///standard suppressed
-#define SUPPRESSED_VERY 2 /// no message
-
-//Projectile Reflect
-#define REFLECT_NORMAL (1<<0)
-#define REFLECT_FAKEPROJECTILE (1<<1)
-
//Object/Item sharpness
#define IS_BLUNT 0
#define IS_SHARP 1
@@ -214,23 +168,3 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun)))
//We will round to this value in damage calculations.
#define DAMAGE_PRECISION 0.1
-
-//bullet_act() return values
-#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting.
-#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting.
-#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default.
-
-#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle
-
-//Autofire component
-/// Compatible firemode is in the gun. Wait until it's held in the user hands.
-#define AUTOFIRE_STAT_IDLE (1<<0)
-/// Gun is active and in the user hands. Wait until user does a valid click.
-#define AUTOFIRE_STAT_ALERT (1<<1)
-/// Gun is shooting.
-#define AUTOFIRE_STAT_FIRING (1<<2)
-
-#define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown"
- #define COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS (1<<0)
-#define COMSIG_AUTOFIRE_SHOT "autofire_shot"
- #define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0)
diff --git a/code/__DEFINES/contracts.dm b/code/__DEFINES/contracts.dm
index c6e23394ba2d..0e80652f4f52 100644
--- a/code/__DEFINES/contracts.dm
+++ b/code/__DEFINES/contracts.dm
@@ -7,14 +7,6 @@
#define CONTRACT_KNOWLEDGE "knowledge"
#define CONTRACT_UNWILLING "unwilling"
-#define BANE_SALT "salt"
-#define BANE_LIGHT "light"
-#define BANE_IRON "iron"
-#define BANE_WHITECLOTHES "whiteclothes"
-#define BANE_SILVER "silver"
-#define BANE_HARVEST "harvest"
-#define BANE_TOOLBOX "toolbox"
-
#define OBLIGATION_FOOD "food"
#define OBLIGATION_FIDDLE "fiddle"
#define OBLIGATION_DANCEOFF "danceoff"
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 2b8dc67cb684..97049254cc10 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -224,19 +224,29 @@
#define COMSIG_LIVING_GET_PULLED "living_start_pulled"
/////////////////
-
-#define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area). Sent to "area-sensitive" movables, see __DEFINES/traits.dm for info.
-#define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area). Sent to "area-sensitive" movables, see __DEFINES/traits.dm for info.
-
-#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user)
-#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob)
- #define COMPONENT_ALLOW_EXAMINATE 1 //Allows the user to examinate regardless of client.eye.
-#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob)
-#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob)
-#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob)
-#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user)
+//from base of area/Entered(): (/area). Sent to "area-sensitive" movables, see __DEFINES/traits.dm for info.
+#define COMSIG_ENTER_AREA "enter_area"
+//from base of area/Exited(): (/area). Sent to "area-sensitive" movables, see __DEFINES/traits.dm for info.
+#define COMSIG_EXIT_AREA "exit_area"
+//from base of atom/Click(): (location, control, params, mob/user)
+#define COMSIG_CLICK "atom_click"
+//from base of atom/ShiftClick(): (/mob)
+#define COMSIG_CLICK_SHIFT "shift_click"
+//Allows the user to examinate regardless of client.eye.
+ #define COMPONENT_ALLOW_EXAMINATE 1
+//from base of atom/CtrlClickOn(): (/mob)
+#define COMSIG_CLICK_CTRL "ctrl_click"
+//from base of atom/AltClick(): (/mob)
+#define COMSIG_CLICK_ALT "alt_click"
+//from base of atom/CtrlShiftClick(/mob)
+#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click"
+///from base of atom/CtrlShiftRightClick(/mob)
+#define COMSIG_CLICK_CTRL_SHIFT_RIGHT "ctrl_shift_right_click"
+//from base of atom/MouseDrop(): (/atom/over, /mob/user)
+#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto"
#define COMPONENT_NO_MOUSEDROP 1
-#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user)
+//from base of atom/MouseDrop_T: (/atom/from, /mob/user)
+#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto"
///from base of area/proc/power_change(): ()
#define COMSIG_AREA_POWER_CHANGE "area_power_change"
@@ -377,6 +387,9 @@
/* #define SPEECH_IGNORE_SPAM 6
#define SPEECH_FORCED 7 */
+///from /mob/living/life()
+#define COMSIG_MOB_LIFE "mob_life"
+
///from /mob/say_dead(): (mob/speaker, message)
#define COMSIG_MOB_DEADSAY "mob_deadsay"
#define MOB_DEADSAY_SIGNAL_INTERCEPT (1<<0)
@@ -410,6 +423,8 @@
///from base of /obj/item/bodypart/proc/attach_limb(): (new_limb, special) allows you to fail limb attachment
#define COMSIG_LIVING_ATTACH_LIMB "living_attach_limb"
#define COMPONENT_NO_ATTACH 1
+///from base of /obj/item/bodypart/proc/drop_limb(): (special)
+#define COMSIG_LIVING_DROP_LIMB "living_drop_limb"
///from base of mob/living/set_buckled(): (new_buckled)
#define COMSIG_LIVING_SET_BUCKLED "living_set_buckled"
@@ -449,8 +464,6 @@
///From /datum/component/creamed/Initialize()
#define COMSIG_MOB_CREAMED "mob_creamed"
-///From /obj/item/gun/proc/check_botched()
-#define COMSIG_MOB_CLUMSY_SHOOT_FOOT "mob_clumsy_shoot_foot"
///When a carbon mob hugs someone, this is called on the carbon that is hugging. (mob/living/hugger, mob/living/hugged)
#define COMSIG_CARBON_HUG "carbon_hug"
@@ -537,10 +550,14 @@
#define COMSIG_TOOL_IN_USE "tool_in_use" ///from base of [/obj/item/proc/tool_check_callback]: (mob/living/user)
#define COMSIG_TOOL_START_USE "tool_start_use" ///from base of [/obj/item/proc/tool_start_check]: (mob/living/user)
#define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed" ///from [/obj/item/proc/disableEmbedding]:
-#define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/effect/mine/proc/triggermine]:
+#define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/item/mine/proc/trigger_mine]:
///from [/obj/structure/closet/supplypod/proc/endlaunch]:
#define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom"
+// Item mouse siganls
+#define COMSIG_ITEM_MOUSE_EXIT "item_mouse_exit" //from base of obj/item/MouseExited(): (location, control, params)
+#define COMSIG_ITEM_MOUSE_ENTER "item_mouse_enter" //from base of obj/item/MouseEntered(): (location, control, params)
+
///Called when an item is being offered, from [/obj/item/proc/on_offered(mob/living/carbon/offerer)]
#define COMSIG_ITEM_OFFERING "item_offering"
///Interrupts the offer proc
@@ -610,7 +627,7 @@
#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" // sent to targets during the process_hit proc of projectiles
#define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out" // sent to targets during the process_hit proc of projectiles
#define COMSIG_EMBED_TRY_FORCE "item_try_embed" // sent when trying to force an embed (mainly for projectiles, only used in the embed element)
-
+ #define COMPONENT_EMBED_SUCCESS (1<<1)
#define COMSIG_PELLET_CLOUD_INIT "pellet_cloud_init" // sent to targets during the process_hit proc of projectiles
// /obj/mecha signals
@@ -762,6 +779,13 @@
/// send when enabling/diabling an autofire component
#define COMSIG_GUN_DISABLE_AUTOFIRE "disable_autofire"
#define COMSIG_GUN_ENABLE_AUTOFIRE "enable_autofire"
+#define COMSIG_GUN_SET_AUTOFIRE_SPEED "set_autofire_speed"
+
+///sent when guns need to notify the gun hud to update. mostly for revolvers.
+#define COMSIG_UPDATE_AMMO_HUD "update_ammo_hud"
///called in /obj/item/gun/process_chamber (src)
#define COMSIG_GUN_CHAMBER_PROCESSED "gun_chamber_processed"
+
+///called when an elzu should unroot
+#define COMSIG_DIGOUT "dig_out"
diff --git a/code/__DEFINES/do_afters.dm b/code/__DEFINES/do_afters.dm
new file mode 100644
index 000000000000..456cf9404004
--- /dev/null
+++ b/code/__DEFINES/do_afters.dm
@@ -0,0 +1,4 @@
+#define DOAFTER_SOURCE_SURGERY "doafter_surgery"
+#define DOAFTER_SOURCE_MECHADRILL "doafter_mechadrill"
+#define DOAFTER_SOURCE_SURVIVALPEN "doafter_survivalpen"
+#define DOAFTER_SOURCE_GETTING_UP "doafter_gettingup"
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index e0ac4b177001..c27a78ffd2de 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -123,6 +123,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define FLOATING (1<<3)
/// When moving, will Cross()/Uncross() everything, but won't stop or Bump() anything.
#define PHASING (1<<4)
+#define THROWN (1<<5)
//Fire and Acid stuff, for resistance_flags
#define LAVA_PROOF (1<<0)
diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm
new file mode 100644
index 000000000000..dba7ce93afaf
--- /dev/null
+++ b/code/__DEFINES/guns.dm
@@ -0,0 +1,98 @@
+//Gun weapon weight
+/// Allows you to dual wield this gun and your offhand gun
+#define WEAPON_LIGHT 1
+/// Does not allow you to dual wield with this gun and your offhand gun
+#define WEAPON_MEDIUM 2
+/// You must wield the gun to fire this gun
+#define WEAPON_HEAVY 3
+/// You must FULLY wield (wait the full wield delay) the gun to fire this gun
+#define WEAPON_VERY_HEAVY 4
+//Gun trigger guards
+#define TRIGGER_GUARD_ALLOW_ALL -1
+#define TRIGGER_GUARD_NONE 0
+#define TRIGGER_GUARD_NORMAL 1
+//Gun bolt types
+///The gun has a closed bolt, when resting it's closed, and must be racked to get a bullet from a magazine. see: Every Fucking Videogame Gun Ever
+#define BOLT_TYPE_STANDARD 1
+///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed.
+/// Example: Some SMGs, the L6
+#define BOLT_TYPE_OPEN 2
+///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine.
+/// Example: Break action shotguns, revolvers
+#define BOLT_TYPE_NO_BOLT 3
+///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in.
+/// Example: Pistols with a slide lock, some SMGs
+#define BOLT_TYPE_LOCKING 4
+//Sawn off nerfs
+///accuracy penalty of sawn off guns
+#define SAWN_OFF_ACC_PENALTY 25
+///added recoil of sawn off guns
+#define SAWN_OFF_RECOIL 1
+
+//ammo box sprite defines
+///ammo box will always use provided icon state
+#define AMMO_BOX_ONE_SPRITE 0
+///ammo box will have a different state for each bullet; -
+#define AMMO_BOX_PER_BULLET 1
+///ammo box will have a different state for full and empty; -max_ammo and -0
+#define AMMO_BOX_FULL_EMPTY 2
+
+#define SUPPRESSED_NONE 0
+#define SUPPRESSED_QUIET 1 ///standard suppressed
+#define SUPPRESSED_VERY 2 /// no message
+
+//Autofire component
+/// Compatible firemode is in the gun. Wait until it's held in the user hands.
+#define AUTOFIRE_STAT_IDLE (1<<0)
+/// Gun is active and in the user hands. Wait until user does a valid click.
+#define AUTOFIRE_STAT_ALERT (1<<1)
+/// Gun is shooting.
+#define AUTOFIRE_STAT_FIRING (1<<2)
+
+#define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown"
+ #define COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS (1<<0)
+#define COMSIG_AUTOFIRE_SHOT "autofire_shot"
+ #define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0)
+
+#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6
+
+#define MANUFACTURER_NONE null
+#define MANUFACTURER_SHARPLITE "the Sharplite Defense logo"
+#define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo"
+#define MANUFACTURER_HUNTERSPRIDE "the Hunter's Pride Arms and Ammunition logo"
+#define MANUFACTURER_SOLARARMORIES "the Solarbundswaffenkammer emblem"
+#define MANUFACTURER_SCARBOROUGH "the Scarborough Arms logo"
+#define MANUFACTURER_EOEHOMA "the Eoehoma Firearms emblem"
+#define MANUFACTURER_NANOTRASEN_OLD "an outdated Nanotrasen logo"
+#define MANUFACTURER_NANOTRASEN "the Nanotrasen logo"
+#define MANUFACTURER_BRAZIL "a green flag with a blue circle and a yellow diamond around it"
+#define MANUFACTURER_INTEQ "an orange crest with the letters 'IRMG'"
+#define MANUFACTURER_MINUTEMAN "the Lanchester City Firearms Plant logo"
+#define MANUFACTURER_DONKCO "the Donk! Co. logo"
+#define MANUFACTURER_PGF "the Etherbor Industries emblem"
+#define MANUFACTURER_IMPORT "Lanchester Import Co."
+
+
+/////////////////
+// PROJECTILES //
+/////////////////
+
+//bullet_act() return values
+#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting.
+#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting.
+#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default.
+
+#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle
+
+//Projectile Reflect
+#define REFLECT_NORMAL (1<<0)
+#define REFLECT_FAKEPROJECTILE (1<<1)
+
+#define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan.
+#define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers.
+
+#define FIREMODE_SEMIAUTO "single"
+#define FIREMODE_BURST "burst"
+#define FIREMODE_FULLAUTO "auto"
+#define FIREMODE_OTHER "other"
+#define FIREMODE_OTHER_TWO "other2"
diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm
index 6c07dd234392..49395e9b397d 100644
--- a/code/__DEFINES/icon_smoothing.dm
+++ b/code/__DEFINES/icon_smoothing.dm
@@ -81,7 +81,6 @@ DEFINE_BITFIELD(smoothing_flags, list(
#define SMOOTH_GROUP_CLOSED_TURFS S_TURF(31) ///turf/closed
#define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(32) ///turf/closed/wall/material
#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(33) ///turf/closed/wall/r_wall/syndicate
-#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(34) ///turf/closed/indestructible/hotelwall
#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(35) ///turf/closed/mineral, /turf/closed/indestructible
#define SMOOTH_GROUP_BOSS_WALLS S_TURF(36) ///turf/closed/indestructible/riveted/boss
#define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(37) ///turf/closed/wall/mineral/titanium/survival
@@ -99,7 +98,6 @@ DEFINE_BITFIELD(smoothing_flags, list(
#define SMOOTH_GROUP_SILVER_WALLS S_OBJ(3) ///turf/closed/wall/mineral/silver, /obj/structure/falsewall/silver
#define SMOOTH_GROUP_DIAMOND_WALLS S_OBJ(4) ///turf/closed/wall/mineral/diamond, /obj/structure/falsewall/diamond
#define SMOOTH_GROUP_PLASMA_WALLS S_OBJ(5) ///turf/closed/wall/mineral/plasma, /obj/structure/falsewall/plasma
-#define SMOOTH_GROUP_BANANIUM_WALLS S_OBJ(6) ///turf/closed/wall/mineral/bananium, /obj/structure/falsewall/bananium
#define SMOOTH_GROUP_SANDSTONE_WALLS S_OBJ(7) ///turf/closed/wall/mineral/sandstone, /obj/structure/falsewall/sandstone
#define SMOOTH_GROUP_WOOD_WALLS S_OBJ(8) ///turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood
#define SMOOTH_GROUP_IRON_WALLS S_OBJ(9) ///turf/closed/wall/mineral/iron, /obj/structure/falsewall/iron
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index 79f178820285..64aa6aa52627 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -1,19 +1,5 @@
/*ALL DEFINES RELATED TO INVENTORY OBJECTS, MANAGEMENT, ETC, GO HERE*/
-//ITEM INVENTORY WEIGHT, FOR w_class
-/// Usually items smaller then a human hand, (e.g. playing cards, lighter, scalpel, coins/holochips)
-#define WEIGHT_CLASS_TINY 1
-/// Pockets can hold small and tiny items, (e.g. flashlight, multitool, grenades, GPS device)
-#define WEIGHT_CLASS_SMALL 2
-/// Standard backpacks can carry tiny, small & normal items, (e.g. fire extinguisher, stun baton, gas mask, metal sheets)
-#define WEIGHT_CLASS_NORMAL 3
-/// Items that can be weilded or equipped but not stored in an inventory, (e.g. defibrillator, backpack, space suits)
-#define WEIGHT_CLASS_BULKY 4
-/// Usually represents objects that require two hands to operate, (e.g. shotgun, two-handed melee weapons)
-#define WEIGHT_CLASS_HUGE 5
-/// Essentially means it cannot be picked up or placed in an inventory, (e.g. mech parts, safe)
-#define WEIGHT_CLASS_GIGANTIC 6
-
//Inventory depth: limits how many nested storage items you can access directly.
//1: stuff in mob, 2: stuff in backpack, 3: stuff in box in backpack, etc
#define INVENTORY_DEPTH 3
@@ -93,8 +79,10 @@
#define NO_VARIATION (1<<0)
#define DIGITIGRADE_VARIATION (1<<1)
#define DIGITIGRADE_VARIATION_NO_NEW_ICON (1<<2)
-#define VOX_VARIATION (1<<3)
-#define KEPORI_VARIATION (1<<4)
+#define DIGITIGRADE_VARIATION_SAME_ICON_FILE (1<<3) //intended for use with factional icon files for organization purposes, otherwise use either above. Ex of naming: a state called "nameof_thing" can be named "nameof_thing_digi"
+#define SNOUTED_VARIATION (1<<4) //Ex of naming: a state called "nameof_thing" can be named "nameof_thing_snouted"
+#define VOX_VARIATION (1<<5)
+#define KEPORI_VARIATION (1<<6)
#define NOT_DIGITIGRADE 0
#define FULL_DIGITIGRADE 1
@@ -186,5 +174,4 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list(
/obj/item/tank/internals/plasmaman,
/obj/item/toy)))
-//WS Port - Internals checker
#define GET_INTERNAL_SLOTS(C) list(C.head, C.wear_mask)
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index c0a4d30aba8b..2ba7553f823c 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -73,12 +73,13 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isskeleton(A) (is_species(A, /datum/species/skeleton))
#define ismoth(A) (is_species(A, /datum/species/moth))
#define ishumanbasic(A) (is_species(A, /datum/species/human) && !is_species(A, /datum/species/human/krokodil_addict))
-#define isethereal(A) (is_species(A, /datum/species/ethereal))
+#define iselzuose(A) (is_species(A, /datum/species/elzuose))
#define isvampire(A) (is_species(A,/datum/species/vampire))
#define isdullahan(A) (is_species(A, /datum/species/dullahan))
#define iskepori(A) (is_species(A, /datum/species/kepori))
#define isipc(A) (is_species(A, /datum/species/ipc))
#define isspiderperson(A) (is_species(A, /datum/species/spider))
+#define isvox(A) (is_species(A, /datum/species/vox))
//more carbon mobs
#define ismonkey(A) (istype(A, /mob/living/carbon/monkey))
@@ -167,7 +168,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isgrenade(A) (istype(A, /obj/item/grenade))
-#define islandmine(A) (istype(A, /obj/effect/mine))
+#define islandmine(A) (istype(A, /obj/item/mine))
#define issupplypod(A) (istype(A, /obj/structure/closet/supplypod))
diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm
index 97b9c9d82aad..50a16edc350a 100644
--- a/code/__DEFINES/keybinding.dm
+++ b/code/__DEFINES/keybinding.dm
@@ -31,6 +31,7 @@
#define COMSIG_KB_CLIENT_GETHELP_DOWN "keybinding_client_gethelp_down"
#define COMSIG_KB_CLIENT_SCREENSHOT_DOWN "keybinding_client_screenshot_down"
#define COMSIG_KB_CLIENT_MINIMALHUD_DOWN "keybinding_client_minimalhud_down"
+#define COMSIG_KB_CLIENT_FULLSCREEN_DOWN "keybinding_client_fullscreen_down"
//Communication
#define COMSIG_KB_CLIENT_OOC_DOWN "keybinding_client_ooc_down"
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index fd61f4f1123b..d021558901f4 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -130,6 +130,9 @@
#define CAMERA_STATIC_LAYER 19
#define CAMERA_STATIC_RENDER_TARGET "CAMERA_STATIC_PLANE"
+///Wants to be part of the game plane, but also wants to draw above literally everything else
+#define HIGH_GAME_PLANE 30
+
//HUD layer defines
#define FULLSCREEN_PLANE 31
@@ -152,12 +155,22 @@
#define HUD_PLANE 42
#define HUD_LAYER 42
#define HUD_RENDER_TARGET "HUD_PLANE"
-#define ABOVE_HUD_PLANE 43
-#define ABOVE_HUD_LAYER 43
+#define VOLUMETRIC_STORAGE_BOX_PLANE 44
+#define VOLUMETRIC_STORAGE_BOX_LAYER 44
+#define VOLUMETRIC_STORAGE_BOX_RENDER_TARGET "VOLUME_STORAGE_BOX_PLANE"
+
+#define VOLUMETRIC_STORAGE_ITEM_PLANE 46
+#define VOLUMETRIC_STORAGE_ITEM_LAYER 46
+#define VOLUMETRIC_STORAGE_ACTIVE_ITEM_LAYER 48
+#define VOLUMETRIC_STORAGE_ACTIVE_ITEM_PLANE 48
+#define VOLUMETRIC_STORAGE_ITEM_RENDER_TARGET "VOLUME_STORAGE_ITEM_PLANE"
+
+#define ABOVE_HUD_PLANE 50
+#define ABOVE_HUD_LAYER 50
#define ABOVE_HUD_RENDER_TARGET "ABOVE_HUD_PLANE"
-#define SPLASHSCREEN_LAYER 54
-#define SPLASHSCREEN_PLANE 54
+#define SPLASHSCREEN_LAYER 75
+#define SPLASHSCREEN_PLANE 75
#define ADMIN_POPUP_LAYER 1
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index d47980b59c6b..ddd395d3879a 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -445,11 +445,6 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define FALL_NO_MESSAGE (1<<1) //Used to suppress the "[A] falls through [old_turf]" messages where it'd make little sense at all, like going downstairs.
#define FALL_STOP_INTERCEPTING (1<<2) //Used in situations where halting the whole "intercept" loop would be better, like supermatter dusting (and thus deleting) the atom.
-//Religion
-
-#define HOLY_ROLE_PRIEST 1 //default priestly role
-#define HOLY_ROLE_HIGHPRIEST 2 //the one who designates the religion
-
#define ALIGNMENT_GOOD "good"
#define ALIGNMENT_NEUT "neutral"
#define ALIGNMENT_EVIL "evil"
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index ad9d5ae5abc8..f5c382c15c29 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -28,6 +28,13 @@
#define BLOOD_VOLUME_BAD 224
#define BLOOD_VOLUME_SURVIVE 122
+// Bloodloss
+#define BLOOD_LOSS_MAXIMUM 30
+#define BLOOD_LOSS_DAMAGE_MAXIMUM 2
+#define BLOOD_LOSS_DAMAGE_BASE 0.013
+#define BLOOD_CAUTERIZATION_RATIO 10
+#define BLOOD_CAUTERIZATION_DAMAGE_RATIO 300
+
//Sizes of mobs, used by mob/living/var/mob_size
#define MOB_SIZE_TINY 0
#define MOB_SIZE_SMALL 1
@@ -76,7 +83,7 @@
#define SPECIES_ANDROID "android"
#define SPECIES_CORPORATE "corporate"
#define SPECIES_DULLAHAN "dullahan"
-#define SPECIES_ETHEREAL "ethereal"
+#define SPECIES_ELZUOSE "elzuose"
#define SPECIES_FLYPERSON "fly"
#define SPECIES_HUMAN "human"
#define SPECIES_IPC "ipc"
@@ -84,7 +91,7 @@
#define SPECIES_SLIMEPERSON "slime_person"
#define SPECIES_LUMINESCENT "luminescent"
#define SPECIES_STARGAZER "stargazer"
-#define SPECIES_LIZARD "lizard"
+#define SPECIES_SARATHI "sarathi"
#define SPECIES_ASHWALKER "ashwalker"
#define SPECIES_KOBOLD "kobold"
#define SPECIES_MONKEY "monkey"
@@ -117,7 +124,7 @@
//Species bitflags for sprite sheets. If this somehow ever gets above 23 we have larger problems.
#define FLAG_HUMAN (1<<0)
#define FLAG_IPC (1<<1)
-#define FLAG_ETHEREAL (1<<2)
+#define FLAG_ELZUOSE (1<<2)
#define FLAG_PLASMAMAN (1<<3)
#define FLAG_MOTH (1<<4)
#define FLAG_LIZARD (1<<5)
@@ -128,10 +135,11 @@
#define BODYTYPE_ORGANIC (1<<0)
#define BODYTYPE_ROBOTIC (1<<1)
#define BODYTYPE_HUMANOID (1<<2) //Everything
-#define BODYTYPE_BOXHEAD (1<<3) //TV Head
-#define BODYTYPE_DIGITIGRADE (1<<4) //Cancer
-#define BODYTYPE_KEPORI (1<<5) //Just Kepori
-#define BODYTYPE_VOX (1<<6) //Big Vox
+#define BODYTYPE_SNOUT (1<<3) //Snouts
+#define BODYTYPE_BOXHEAD (1<<4) //TV Head
+#define BODYTYPE_DIGITIGRADE (1<<5) //Lizard legs
+#define BODYTYPE_KEPORI (1<<6) //Just Kepori
+#define BODYTYPE_VOX (1<<7) //Big Vox
// Health/damage defines
#define MAX_LIVING_HEALTH 100
@@ -244,14 +252,14 @@
//Charge levels for Ethereals
//WS Begin -- Ethereal Charge Scaling
-#define ETHEREAL_CHARGE_SCALING_MULTIPLIER 20
-#define ETHEREAL_CHARGE_NONE (0 * ETHEREAL_CHARGE_SCALING_MULTIPLIER)
-#define ETHEREAL_CHARGE_LOWPOWER (20 * ETHEREAL_CHARGE_SCALING_MULTIPLIER)
-#define ETHEREAL_CHARGE_NORMAL (50 * ETHEREAL_CHARGE_SCALING_MULTIPLIER)
-#define ETHEREAL_CHARGE_ALMOSTFULL (75 * ETHEREAL_CHARGE_SCALING_MULTIPLIER)
-#define ETHEREAL_CHARGE_FULL (100 * ETHEREAL_CHARGE_SCALING_MULTIPLIER)
-#define ETHEREAL_CHARGE_OVERLOAD (125 * ETHEREAL_CHARGE_SCALING_MULTIPLIER)
-#define ETHEREAL_CHARGE_DANGEROUS (150 * ETHEREAL_CHARGE_SCALING_MULTIPLIER)
+#define ELZUOSE_CHARGE_SCALING_MULTIPLIER 20
+#define ELZUOSE_CHARGE_NONE (0 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
+#define ELZUOSE_CHARGE_LOWPOWER (20 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
+#define ELZUOSE_CHARGE_NORMAL (50 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
+#define ELZUOSE_CHARGE_ALMOSTFULL (75 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
+#define ELZUOSE_CHARGE_FULL (100 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
+#define ELZUOSE_CHARGE_OVERLOAD (125 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
+#define ELZUOSE_CHARGE_DANGEROUS (150 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
//WS End
//Slime evolution threshold. Controls how fast slimes can split/grow
@@ -335,7 +343,7 @@
#define SHADOW_SPECIES_LIGHT_THRESHOLD 0.2
//MINOR TWEAKS/MISC
-#define AGE_MIN 17 //youngest a character can be
+#define AGE_MIN 18 //youngest a character can be
#define AGE_MAX 85 //oldest a character can be
#define AGE_MINOR 20 //legal age of space drinking and smoking
#define WIZARD_AGE_MIN 30 //youngest a wizard can be
@@ -345,7 +353,7 @@
#define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you
#define HUNGER_FACTOR 0.1 //factor at which mob nutrition decreases
-#define ETHEREAL_CHARGE_FACTOR (0.05 * ETHEREAL_CHARGE_SCALING_MULTIPLIER) //factor at which ethereal's charge decreases
+#define ELZUOSE_CHARGE_FACTOR (0.05 * ELZUOSE_CHARGE_SCALING_MULTIPLIER) //factor at which ethereal's charge decreases
#define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default.
#define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism
@@ -395,7 +403,11 @@
#define WABBAJACK (1<<6)
#define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return;
-#define INTERACTING_WITH(X, Y) (Y in X.do_afters)
+
+#define DOING_INTERACTION(user, interaction_key) (LAZYACCESS(user.do_afters, interaction_key))
+#define DOING_INTERACTION_LIMIT(user, interaction_key, max_interaction_count) ((LAZYACCESS(user.do_afters, interaction_key) || 0) >= max_interaction_count)
+#define DOING_INTERACTION_WITH_TARGET(user, target) (LAZYACCESS(user.do_afters, target))
+#define DOING_INTERACTION_WITH_TARGET_LIMIT(user, target, max_interaction_count) ((LAZYACCESS(user.do_afters, target) || 0) >= max_interaction_count)
/// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine()
#define EXAMINE_MORE_TIME 1 SECONDS
diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm
index 865470774039..d9ca63008c1d 100644
--- a/code/__DEFINES/obj_flags.dm
+++ b/code/__DEFINES/obj_flags.dm
@@ -33,6 +33,7 @@
#define IN_STORAGE (1<<11) //is this item in the storage item, such as backpack? used for tooltips
#define SURGICAL_TOOL (1<<12) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes)
#define EYE_STAB (1<<13) /// Item can be used to eyestab
+#define NO_PIXEL_RANDOM_DROP (1<<14) //if dropped, it wont have a randomized pixel_x/pixel_y
// Flags for the clothing_flags var on /obj/item/clothing
diff --git a/code/__DEFINES/power.dm b/code/__DEFINES/power.dm
index a95fec219552..29d6e72dffa5 100644
--- a/code/__DEFINES/power.dm
+++ b/code/__DEFINES/power.dm
@@ -12,3 +12,16 @@
#define TESLA_DEFAULT_POWER 1738260
#define TESLA_MINI_POWER 869130
+
+#define LIGHT_DRAW 10 // mulitplied by brightness, typically 4-8
+
+#define IDLE_DRAW_MINIMAL 50 // 20x = 1kw, used for small things and computers on stand-by
+#define IDLE_DRAW_LOW 200 //5x = 1kw, used for always-active computers
+#define IDLE_DRAW_MEDIUM 500 //2x = 1kw
+#define IDLE_DRAW_HIGH 1000 //1kw
+
+#define ACTIVE_DRAW_MINIMAL 200 //5x = 1kw
+#define ACTIVE_DRAW_LOW 500 //2x = 1kw
+#define ACTIVE_DRAW_MEDIUM 1000 //microwaves use this
+#define ACTIVE_DRAW_HIGH 2000
+#define ACTIVE_DRAW_EXTREME 5000 //highest this value should be in most cases
diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm
index 7bbdcf7233b6..96e7ab6e0578 100644
--- a/code/__DEFINES/radio.dm
+++ b/code/__DEFINES/radio.dm
@@ -35,6 +35,10 @@
#define RADIO_KEY_MINUTEMEN "m"
#define RADIO_TOKEN_MINUTEMEN ":m"
+#define RADIO_CHANNEL_PGF "PGF"
+#define RADIO_KEY_PGF "g"
+#define RADIO_TOKEN_PGF ":g"
+
#define RADIO_CHANNEL_INTEQ "Inteq"
#define RADIO_KEY_INTEQ "q"
#define RADIO_TOKEN_INTEQ ":q"
@@ -59,6 +63,7 @@
#define FREQ_CENTCOM 1337 // CentCom comms frequency, gray
#define FREQ_SOLGOV 1345 // SolGov comms frequency, dark blue WS ADDITION
#define FREQ_INTEQ 1347 // Inteq comms frequency, light brown
+#define FREQ_PGF 1349 // PGF comms frequency, lime green
#define FREQ_NANOTRASEN 1351 // Nanotrasen comms frequency, plum
#define FREQ_COMMAND 1353 // Command comms frequency, gold
#define FREQ_MINUTEMEN 1355 // Minutemen comms frequency, soft blue
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 361a24697a39..9e253563fe89 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -39,8 +39,6 @@
#define ROLE_LAVALAND "Lavaland"
#define ROLE_INTERNAL_AFFAIRS "Internal Affairs Agent"
#define ROLE_FAMILIES "Familes Antagonists"
-#define ROLE_SYNDICATE_CYBERSUN "Cybersun Space Syndicate" //Ghost role syndi from Forgottenship ruin
-#define ROLE_SYNDICATE_CYBERSUN_CAPTAIN "Cybersun Space Syndicate Captain" //Forgottenship captain syndie
#define ROLE_BORER "borer"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm
index a470b9087b2e..96d322285dfc 100644
--- a/code/__DEFINES/say.dm
+++ b/code/__DEFINES/say.dm
@@ -96,6 +96,8 @@
//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
#define MAX_MESSAGE_LEN 1024
+#define MAX_FLAVOR_LEN 1024
+#define MAX_SHORTFLAVOR_LEN 100
#define MAX_NAME_LEN 42
#define MAX_BROADCAST_LEN 512
#define MAX_CHARTER_LEN 80
diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm
index a0ce649dd04d..ba4589985015 100644
--- a/code/__DEFINES/sight.dm
+++ b/code/__DEFINES/sight.dm
@@ -13,6 +13,8 @@
#define INVISIBILITY_OBSERVER 60
#define SEE_INVISIBLE_OBSERVER 60
+#define INVISIBILITY_INVINISMIN 80 //invisible admins
+
#define INVISIBILITY_MAXIMUM 100 //the maximum allowed for "real" objects
#define INVISIBILITY_ABSTRACT 101 //only used for abstract objects (e.g. spacevine_controller), things that are not really there.
diff --git a/code/__DEFINES/species_clothing_defines.dm b/code/__DEFINES/species_clothing_defines.dm
index df8c2db1afc8..517579192634 100644
--- a/code/__DEFINES/species_clothing_defines.dm
+++ b/code/__DEFINES/species_clothing_defines.dm
@@ -31,10 +31,12 @@
#define KEPORI_UNIFORM_PATH 'icons/mob/species/kepori/onmob_uniform_kepori.dmi'
#define KEPORI_SHOES_PATH 'icons/mob/species/kepori/onmob_feet_kepori.dmi'
#define KEPORI_SUIT_PATH 'icons/mob/species/kepori/onmob_suit_kepori.dmi'
+#define KEPORI_EARS_PATH 'icons/mob/species/kepori/onmob_ears_kepori.dmi'
#define KEPORI_MASK_PATH 'icons/mob/species/kepori/onmob_mask_kepori.dmi'
#define KEPORI_HEAD_PATH 'icons/mob/species/kepori/onmob_head_kepori.dmi'
+#define KEPORI_GLASSES_PATH 'icons/mob/species/kepori/onmob_eyes_kepori.dmi'
#define KEPORI_GLOVES_PATH 'icons/mob/species/kepori/onmob_hands_kepori.dmi'
-//#define KEPORI_BELT_PATH 'icons/mob/species/kepori/onmob_belt_kepori.dmi'
-#define KEPORI_UNDERWEAR_TORSO_PATH 'icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi'
-#define KEPORI_UNDERWEAR_LEGS_PATH 'icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi'
-#define KEPORI_UNDERWEAR_SOCKS_PATH 'icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi'
+#define KEPORI_BELT_PATH 'icons/mob/species/kepori/onmob_belt_kepori.dmi'
+#define KEPORI_UNDERWEAR_TORSO_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi'
+#define KEPORI_UNDERWEAR_LEGS_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi'
+#define KEPORI_UNDERWEAR_SOCKS_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi'
diff --git a/code/__DEFINES/storage.dm b/code/__DEFINES/storage.dm
new file mode 100644
index 000000000000..cb657520e33f
--- /dev/null
+++ b/code/__DEFINES/storage.dm
@@ -0,0 +1,88 @@
+// storage_flags variable on /datum/component/storage
+
+// Storage limits. These can be combined (and usually are combined).
+/// Check max_items and contents.len when trying to insert
+#define STORAGE_LIMIT_MAX_ITEMS (1<<0)
+/// Check max_combined_w_class.
+#define STORAGE_LIMIT_COMBINED_W_CLASS (1<<1)
+/// Use the new volume system. Will automatically force rendering to use the new volume/baystation scaling UI so this is kind of incompatible with stuff like stack storage etc etc.
+#define STORAGE_LIMIT_VOLUME (1<<2)
+/// Use max_w_class
+#define STORAGE_LIMIT_MAX_W_CLASS (1<<3)
+
+#define STORAGE_FLAGS_LEGACY_DEFAULT (STORAGE_LIMIT_MAX_ITEMS | STORAGE_LIMIT_COMBINED_W_CLASS | STORAGE_LIMIT_MAX_W_CLASS)
+#define STORAGE_FLAGS_VOLUME_DEFAULT (STORAGE_LIMIT_VOLUME | STORAGE_LIMIT_MAX_W_CLASS)
+
+// UI defines
+/// Size of volumetric box icon
+#define VOLUMETRIC_STORAGE_BOX_ICON_SIZE 32
+/// Size of EACH left/right border icon for volumetric boxes
+#define VOLUMETRIC_STORAGE_BOX_BORDER_SIZE 1
+/// Minimum pixels an item must have in volumetric scaled storage UI
+#define MINIMUM_PIXELS_PER_ITEM 8
+/// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups.
+#define MAXIMUM_VOLUMETRIC_ITEMS 256
+/// How much padding to give between items
+#define VOLUMETRIC_STORAGE_ITEM_PADDING 3
+/// How much padding to give to edges
+#define VOLUMETRIC_STORAGE_EDGE_PADDING 1
+
+//ITEM INVENTORY WEIGHT, FOR w_class
+/// Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money
+#define WEIGHT_CLASS_TINY 1
+/// Fits within a small pocket, ex: Flashlight, Multitool, Grenades, GPS Device
+#define WEIGHT_CLASS_SMALL 2
+/// Can be carried in one hand comfortably, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets
+#define WEIGHT_CLASS_NORMAL 3
+/// Items that can be wielded or equipped, (e.g. defibrillator, space suits). Often fits inside backpacks.
+#define WEIGHT_CLASS_BULKY 4
+/// Usually represents objects that require two hands to operate, (e.g. shotgun, two-handed melee weapons) May fit on some inventory slots
+#define WEIGHT_CLASS_HUGE 5
+/// Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe - Can not fit in Boh
+#define WEIGHT_CLASS_GIGANTIC 6
+
+// PLEASE KEEP ALL VOLUME DEFINES IN THIS FILE, it's going to be hell to keep track of them later.
+#define DEFAULT_VOLUME_TINY 1
+#define DEFAULT_VOLUME_SMALL 2
+#define DEFAULT_VOLUME_NORMAL 6
+#define DEFAULT_VOLUME_BULKY 12
+#define DEFAULT_VOLUME_HUGE 24
+#define DEFAULT_VOLUME_GIGANTIC 48
+
+GLOBAL_LIST_INIT(default_weight_class_to_volume, list(
+ "[WEIGHT_CLASS_TINY]" = DEFAULT_VOLUME_TINY,
+ "[WEIGHT_CLASS_SMALL]" = DEFAULT_VOLUME_SMALL,
+ "[WEIGHT_CLASS_NORMAL]" = DEFAULT_VOLUME_NORMAL,
+ "[WEIGHT_CLASS_BULKY]" = DEFAULT_VOLUME_BULKY,
+ "[WEIGHT_CLASS_HUGE]" = DEFAULT_VOLUME_HUGE,
+ "[WEIGHT_CLASS_GIGANTIC]" = DEFAULT_VOLUME_GIGANTIC
+ ))
+
+/// Macro for automatically getting the volume of an item from its w_class.
+#define AUTO_SCALE_VOLUME(w_class) (GLOB.default_weight_class_to_volume["[w_class]"])
+/// Macro for automatically getting the volume of a storage item from its max_w_class and max_combined_w_class.
+#define AUTO_SCALE_STORAGE_VOLUME(w_class, max_combined_w_class) (AUTO_SCALE_VOLUME(w_class) * (max_combined_w_class / w_class))
+
+// Let's keep all of this in one place. given what we put above anyways..
+
+// volume amount for items
+#define ITEM_VOLUME_DISK DEFAULT_VOLUME_TINY
+#define ITEM_VOLUME_CONTAINER_M 12 //makes nested toolboxes & toolbelts less efficient
+#define ITEM_VOLUME_MOB 40//prevents mob stacking
+
+// #define SAMPLE_VOLUME_AMOUNT 2
+
+// max_weight_class for storages
+//
+#define MAX_WEIGHT_CLASS_S_CONTAINER WEIGHT_CLASS_SMALL
+#define MAX_WEIGHT_CLASS_M_CONTAINER WEIGHT_CLASS_NORMAL
+#define MAX_WEIGHT_CLASS_BACKPACK WEIGHT_CLASS_NORMAL
+#define MAX_WEIGHT_CLASS_DUFFEL WEIGHT_CLASS_BULKY
+
+// max_volume for storages
+#define STORAGE_VOLUME_CONTAINER_S DEFAULT_VOLUME_NORMAL //3 small items
+#define STORAGE_VOLUME_CONTAINER_M (DEFAULT_VOLUME_NORMAL * 2) //6 small items
+#define STORAGE_VOLUME_SATCHEL (DEFAULT_VOLUME_NORMAL * 4) //4 normal items
+#define STORAGE_VOLUME_BACKPACK (DEFAULT_VOLUME_NORMAL * 6) //6 normal items, or 3 bulky items
+#define STORAGE_VOLUME_DUFFLEBAG (DEFAULT_VOLUME_NORMAL * 8) // 2 huge items, or 4 bulky items
+#define STORAGE_VOLUME_BAG_OF_HOLDING (DEFAULT_VOLUME_NORMAL * 9) //1.5X backpack
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 629755487849..36aa57e48625 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -174,6 +174,7 @@
#define FIRE_PRIORITY_PARALLAX 65
#define FIRE_PRIORITY_INSTRUMENTS 80
#define FIRE_PRIORITY_MOBS 100
+#define FIRE_PRIORITY_MOVABLE_PHYSICS 105
#define FIRE_PRIORITY_TGUI 110
#define FIRE_PRIORITY_TICKER 200
#define FIRE_PRIORITY_ATMOS_ADJACENCY 300
diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm
index a4fb6d40be73..e2c89df90e9b 100644
--- a/code/__DEFINES/tgs.dm
+++ b/code/__DEFINES/tgs.dm
@@ -1,6 +1,6 @@
// tgstation-server DMAPI
-#define TGS_DMAPI_VERSION "7.1.1"
+#define TGS_DMAPI_VERSION "7.1.2"
// All functions and datums outside this document are subject to change with any version and should not be relied on.
@@ -312,6 +312,7 @@
var/datum/tgs_chat_embed/structure/embed
/datum/tgs_message_content/New(text)
+ ..()
if(!istext(text))
TGS_ERROR_LOG("[/datum/tgs_message_content] created with no text!")
text = null
@@ -354,6 +355,7 @@
var/proxy_url
/datum/tgs_chat_embed/media/New(url)
+ ..()
if(!istext(url))
CRASH("[/datum/tgs_chat_embed/media] created with no url!")
@@ -367,6 +369,7 @@
var/proxy_icon_url
/datum/tgs_chat_embed/footer/New(text)
+ ..()
if(!istext(text))
CRASH("[/datum/tgs_chat_embed/footer] created with no text!")
@@ -383,6 +386,7 @@
var/proxy_icon_url
/datum/tgs_chat_embed/provider/author/New(name)
+ ..()
if(!istext(name))
CRASH("[/datum/tgs_chat_embed/provider/author] created with no name!")
@@ -395,6 +399,7 @@
var/is_inline
/datum/tgs_chat_embed/field/New(name, value)
+ ..()
if(!istext(name))
CRASH("[/datum/tgs_chat_embed/field] created with no name!")
@@ -510,7 +515,7 @@
/*
The MIT License
-Copyright (c) 2017-2023 Jordan Brown
+Copyright (c) 2017-2024 Jordan Brown
Permission is hereby granted, free of charge,
to any person obtaining a copy of this software and
diff --git a/code/__DEFINES/timed_action.dm b/code/__DEFINES/timed_action.dm
new file mode 100644
index 000000000000..90572cdc5416
--- /dev/null
+++ b/code/__DEFINES/timed_action.dm
@@ -0,0 +1,10 @@
+// timed_action_flags parameter for 'proc/do_after'
+
+// The user can move freely without canceling the do_after
+#define IGNORE_USER_LOC_CHANGE (1<<0)
+// The target can move freely without canceling the do_after
+#define IGNORE_TARGET_LOC_CHANGE (1<<1)
+/// Can do the action even if the item is no longer being held
+#define IGNORE_HELD_ITEM (1<<2)
+/// Can do the action even if the mob is incapacitated
+#define IGNORE_INCAPACITATED (1<<3)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 72123b78268c..f88f0c9d791c 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -294,8 +294,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_NIGHT_VISION "night_vision"
#define TRAIT_LIGHT_STEP "light_step"
#define TRAIT_SPIRITUAL "spiritual"
-#define TRAIT_FAN_CLOWN "fan_clown"
-#define TRAIT_FAN_MIME "fan_mime"
#define TRAIT_FAN_RILENA "fan_rilena"
#define TRAIT_VORACIOUS "voracious"
#define TRAIT_SELF_AWARE "self_aware"
diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm
index 2ac0032b77bd..5d9522b18ee4 100644
--- a/code/__DEFINES/vv.dm
+++ b/code/__DEFINES/vv.dm
@@ -11,6 +11,7 @@
#define VV_TYPE "Custom Typepath"
#define VV_FILE "File"
#define VV_LIST "List"
+#define VV_COLOR "Color"
#define VV_NEW_ATOM "New Atom"
#define VV_NEW_DATUM "New Datum"
#define VV_NEW_TYPE "New Custom Typepath"
diff --git a/code/__DEFINES/wires.dm b/code/__DEFINES/wires.dm
index 5623b5f52b4a..5c35c1f6b5a9 100644
--- a/code/__DEFINES/wires.dm
+++ b/code/__DEFINES/wires.dm
@@ -51,4 +51,8 @@
#define WIRE_PRIZEVEND "Emergency Prize Vend"
#define WIRE_RESETOWNER "Reset Owner"
#define WIRE_AGELIMIT "Age Limit"
+#define WIRE_PIN "Trigger Pin"
+#define WIRE_FUSE "Fuse"
+#define WIRE_RESET "Factory Reset"
+#define WIRE_DELAYBOOM "Delayed Boom"
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index 376e023940de..f603e85292ad 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -16,7 +16,7 @@
#define LAZYREMOVE(L, I) if(L) { L -= I; if(!length(L)) { L = null; } }
#define LAZYADD(L, I) if(!L) { L = list(); } L += I;
#define LAZYOR(L, I) if(!L) { L = list(); } L |= I;
-#define LAZYFIND(L, V) L ? L.Find(V) : 0
+#define LAZYFIND(L, V) (L ? L.Find(V) : 0)
#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= length(L) ? L[I] : null) : L[I]) : null)
#define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V;
#define LAZYISIN(L, V) (L ? (V in L) : FALSE)
@@ -24,7 +24,7 @@
#define LAZYCLEARLIST(L) if(L) L.Cut()
#define SANITIZE_LIST(L) (islist(L) ? L : list())
#define reverseList(L) reverseRange(L.Copy())
-#define LAZYADDASSOC(L, K, V) if(!L) { L = list(); } L[K] += list(V);
+#define LAZYADDASSOC(L, K, V) if(!L) { L = list(); } L[K] += V;
#define LAZYADDASSOCLIST(L, K, V) if(!L) { L = list(); } L[K] += list(V);
#define LAZYREMOVEASSOC(L, K, V) if(L) { if(L[K]) { L[K] -= V; if(!length(L[K])) L -= K; } if(!length(L)) L = null; }
#define LAZYACCESSASSOC(L, I, K) L ? L[I] ? L[I][K] ? L[I][K] : null : null : null
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index e44755574eea..5eb2686b2118 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -42,6 +42,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_spinneret, GLOB.spider_spinneret_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_feathers, GLOB.kepori_feathers_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_body_feathers, GLOB.kepori_body_feathers_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_head_feathers, GLOB.kepori_head_feathers_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_tail_feathers, GLOB.kepori_tail_feathers_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_head_quills, GLOB.vox_head_quills_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_neck_quills, GLOB.vox_neck_quills_list)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index fdeadc13b61a..6a3028443dcc 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -108,6 +108,7 @@
"ipc_chassis" = pick(GLOB.ipc_chassis_list),
"ipc_screen" = pick(GLOB.ipc_screens_list),
"kepori_body_feathers" = pick(GLOB.kepori_body_feathers_list),
+ "kepori_head_feathers" = pick(GLOB.kepori_head_feathers_list),
"kepori_feathers" = pick(GLOB.kepori_feathers_list),
"kepori_tail_feathers" = pick(GLOB.kepori_tail_feathers_list),
"legs" = "Normal Legs",
@@ -171,13 +172,6 @@
if(!findname(.))
break
-/proc/random_unique_moth_name(attempts_to_find_unique_name=10)
- for(var/i in 1 to attempts_to_find_unique_name)
- . = capitalize(pick(GLOB.moth_first)) + " " + capitalize(pick(GLOB.moth_last))
-
- if(!findname(.))
- break
-
/proc/random_unique_squid_name(attempts_to_find_unique_name=10)
for(var/i in 1 to attempts_to_find_unique_name)
. = capitalize(squid_name())
@@ -217,6 +211,12 @@ GLOBAL_LIST_INIT(skin_tones, sortList(list(
"african2"
)))
+/proc/pick_species_adjective(mob/living/carbon/human/H)
+ if(isipc(H))
+ return pick(GLOB.ipc_preference_adjectives)
+ else
+ return pick(GLOB.preference_adjectives)
+
GLOBAL_LIST_EMPTY(species_list)
/proc/age2agedescription(age)
@@ -242,61 +242,6 @@ GLOBAL_LIST_EMPTY(species_list)
else
return "unknown"
-///Timed action involving two mobs, the user and the target.
-/proc/do_mob(mob/user , mob/target, time = 3 SECONDS, uninterruptible = FALSE, progress = TRUE, datum/callback/extra_checks = null, ignore_loc_change = FALSE)
- if(!user || !target)
- return FALSE
-
- if(target && INTERACTING_WITH(user, target))
- to_chat(user, "You're already interacting with [target]!")
- return
-
- var/user_loc = user.loc
-
- var/drifting = FALSE
- if(!user.Process_Spacemove(0) && user.inertia_dir)
- drifting = TRUE
-
- var/target_loc = target.loc
-
- LAZYADD(user.do_afters, target)
- LAZYADD(target.targeted_by, user)
- var/holding = user.get_active_held_item()
- var/datum/progressbar/progbar
- if (progress)
- progbar = new(user, time, target)
-
- var/endtime = world.time+time
- var/starttime = world.time
- . = TRUE
- while (world.time < endtime)
- stoplag(1)
- if(!QDELETED(progbar))
- progbar.update(world.time - starttime)
- if(QDELETED(user) || QDELETED(target))
- . = FALSE
- break
- if(uninterruptible)
- continue
-
- if(drifting && !user.inertia_dir)
- drifting = FALSE
- user_loc = user.loc
-
-
- if(!ignore_loc_change && ((!drifting && user.loc != user_loc) || target.loc != target_loc))
- . = FALSE
- break
-
- if(user.get_active_held_item() != holding || user.incapacitated() || (extra_checks && !extra_checks.Invoke()))
- . = FALSE
- break
- if(!QDELETED(progbar))
- progbar.end_progress()
- if(!QDELETED(target))
- LAZYREMOVE(user.do_afters, target)
- LAZYREMOVE(target.targeted_by, user)
-
//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action
/mob/proc/break_do_after_checks(list/checked_health, check_clicks)
if(check_clicks && next_move > world.time)
@@ -311,24 +256,40 @@ GLOBAL_LIST_EMPTY(species_list)
checked_health["health"] = health
return ..()
-///Timed action involving one mob user. Target is optional.
-/proc/do_after(mob/user, delay, needhand = TRUE, atom/target = null, progress = TRUE, datum/callback/extra_checks = null)
+/**
+ * Timed action involving one mob user. A target can also be specified, but it is optional.
+ *
+ * Checks that `user` does not move, change hands, get stunned, etc. for the
+ * given `delay`. Returns `TRUE` on success or `FALSE` on failure.
+ *
+ * Arguments:
+ * * user - the primary "user" of the do_after.
+ * * delay - how long the do_after takes. Defaults to 3 SECONDS.
+ * * target - the (optional) target mob of the do_after. If they move/cease to exist, the do_after is cancelled.
+ * * timed_action_flags - optional flags to override certain do_after checks (see DEFINES/timed_action.dm).
+ * * progress - if TRUE, a progress bar is displayed.
+ * * extra_checks - a callback that can be used to add extra checks to the do_after. Returning false in this callback will cancel the do_after.
+ */
+/proc/do_after(mob/user, delay = 3 SECONDS, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1, hidden = FALSE)
if(!user)
return FALSE
+ if(!isnum(delay))
+ CRASH("do_after was passed a non-number delay: [delay || "null"].")
- if(target && INTERACTING_WITH(user, target))
+ if(target && DOING_INTERACTION_WITH_TARGET(user, target))
to_chat(user, "You're already interacting with [target]!")
return
- var/atom/Tloc = null
- if(target && !isturf(target))
- Tloc = target.loc
-
- if(target)
- LAZYADD(user.do_afters, target)
- LAZYADD(target.targeted_by, user)
+ if(!interaction_key && target)
+ interaction_key = target //Use the direct ref to the target
+ if(interaction_key) //Do we have a interaction_key now?
+ var/current_interaction_count = LAZYACCESS(user.do_afters, interaction_key) || 0
+ if(current_interaction_count >= max_interact_count) //We are at our peak
+ return
+ LAZYSET(user.do_afters, interaction_key, current_interaction_count + 1)
- var/atom/Uloc = user.loc
+ var/atom/user_loc = user.loc
+ var/atom/target_loc = target?.loc
var/drifting = FALSE
if(!user.Process_Spacemove(0) && user.inertia_dir)
@@ -336,132 +297,59 @@ GLOBAL_LIST_EMPTY(species_list)
var/holding = user.get_active_held_item()
- var/holdingnull = TRUE //User's hand started out empty, check for an empty hand
- if(holding)
- holdingnull = FALSE //Users hand started holding something, check to see if it's still holding that
-
delay *= user.do_after_coefficent()
var/datum/progressbar/progbar
+ var/datum/cogbar/cog
+
if(progress)
- progbar = new(user, delay, target || user)
+ if(user.client)
+ progbar = new(user, delay, target || user)
+
+ if(!hidden && delay >= 1 SECONDS)
+ cog = new(user)
var/endtime = world.time + delay
var/starttime = world.time
. = TRUE
while (world.time < endtime)
stoplag(1)
+
if(!QDELETED(progbar))
progbar.update(world.time - starttime)
if(drifting && !user.inertia_dir)
drifting = FALSE
- Uloc = user.loc
+ user_loc = user.loc
- if(QDELETED(user) || user.stat || (!drifting && user.loc != Uloc) || (extra_checks && !extra_checks.Invoke()))
+ // Check flags
+ if(QDELETED(user) \
+ || (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \
+ || (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \
+ || (!(timed_action_flags & IGNORE_INCAPACITATED) && HAS_TRAIT(user, TRAIT_INCAPACITATED)) \
+ || (extra_checks && !extra_checks.Invoke()))
. = FALSE
break
- if(isliving(user))
- var/mob/living/L = user
- if(L.IsStun() || L.IsParalyzed())
- . = FALSE
- break
-
- if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc))
- if((Uloc != Tloc || Tloc != user) && !drifting)
- . = FALSE
- break
-
- if(target && !(target in user.do_afters))
+ // If we have a target, we check for them moving here. We don't care about it if we're drifting or we ignore target loc change
+ if(target && (user != target) && \
+ (QDELETED(target) \
+ || (!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE) && target.loc != target_loc)))
. = FALSE
break
- if(needhand)
- //This might seem like an odd check, but you can still need a hand even when it's empty
- //i.e the hand is used to pull some item/tool out of the construction
- if(!holdingnull)
- if(!holding)
- . = FALSE
- break
- if(user.get_active_held_item() != holding)
- . = FALSE
- break
if(!QDELETED(progbar))
progbar.end_progress()
- if(!QDELETED(target))
- LAZYREMOVE(user.do_afters, target)
- LAZYREMOVE(target.targeted_by, user)
+ cog?.remove()
+
+ if(interaction_key)
+ LAZYREMOVE(user.do_afters, interaction_key)
/mob/proc/do_after_coefficent() // This gets added to the delay on a do_after, default 1
. = 1
return
-///Timed action involving at least one mob user and a list of targets.
-/proc/do_after_mob(mob/user, list/targets, time = 3 SECONDS, uninterruptible = FALSE, progress = TRUE, datum/callback/extra_checks)
- if(!user)
- return FALSE
- if(!islist(targets))
- targets = list(targets)
- if(!length(targets))
- return FALSE
-
- for(var/i in targets)
- var/mob/living/target = i
- if(INTERACTING_WITH(user, target))
- to_chat(user, "You're already interacting with [target]!")
- return
-
-
- var/user_loc = user.loc
-
- var/drifting = FALSE
- if(!user.Process_Spacemove(0) && user.inertia_dir)
- drifting = TRUE
-
- var/list/originalloc = list()
- for(var/atom/target in targets)
- originalloc[target] = target.loc
- LAZYADD(user.do_afters, target)
- LAZYADD(target.targeted_by, user)
-
- var/holding = user.get_active_held_item()
- var/datum/progressbar/progbar
- if(progress)
- progbar = new(user, time, targets[1])
-
- var/endtime = world.time + time
- var/starttime = world.time
- . = TRUE
- mainloop:
- while(world.time < endtime)
- stoplag(1)
- if(!QDELETED(progbar))
- progbar.update(world.time - starttime)
- if(QDELETED(user) || !targets)
- . = FALSE
- break
- if(uninterruptible)
- continue
-
- if(drifting && !user.inertia_dir)
- drifting = FALSE
- user_loc = user.loc
-
- for(var/atom/target in targets)
- if((!drifting && user_loc != user.loc) || QDELETED(target) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || (extra_checks && !extra_checks.Invoke()))
- . = FALSE
- break mainloop
- if(!QDELETED(progbar))
- progbar.end_progress()
-
- for(var/thing in targets)
- var/atom/target = thing
- if(!QDELETED(target))
- LAZYREMOVE(user.do_afters, target)
- LAZYREMOVE(target.targeted_by, user)
-
/proc/is_species(A, species_datum)
. = FALSE
if(ishuman(A))
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index e34b48a357e2..7054c051f707 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -7,9 +7,6 @@
/proc/plasmaman_name()
return "[pick(GLOB.plasmaman_names)] \Roman[rand(1,99)]"
-/proc/moth_name()
- return "[pick(GLOB.moth_first)] [pick(GLOB.moth_last)]"
-
/proc/squid_name()
return "[pick(GLOB.squid_names)][pick("-", "", " ")][capitalize(pick(GLOB.squid_names) + pick(GLOB.squid_names))]"
@@ -236,49 +233,52 @@ GLOBAL_DATUM(syndicate_code_response_regex, /regex)
else
. += ", "
+#define FACTION_SYNDICATE "Syndicate"
+ #define FACTION_NGR "New Gorlex Republic"
+ #define FACTION_CYBERSUN "CyberSun"
+ #define FACTION_SUNS "Student-Union of Naturalistic Sciences"
+#define FACTION_SOLGOV "SolGov"
+#define FACTION_SRM "Saint-Roumain Militia"
+#define FACTION_INTEQ "Inteq Risk Management Group"
+#define FACTION_CLIP "CLIP Minutemen"
+#define FACTION_NT "Nanotrasen"
+ #define FACTION_NS_LOGI "N+S Logistics"
+ #define FACTION_VIGILITAS "Vigilitas Interstellar"
+#define FACTION_FRONTIER "Frontiersmen Fleet"
+#define FACTION_PGF "Pan-Gezenan Federation"
+#define FACTION_INDEPENDENT "Independent"
+
+#define PREFIX_SYNDICATE list("SEV", "SSV")
+ #define PREFIX_NGR list("NGRV")
+ #define PREFIX_CYBERSUN list("CSSV")
+ #define PREFIX_SUNS list("SUNS")
+#define PREFIX_SOLGOV list("SCSV")
+#define PREFIX_SRM list("SRSV")
+#define PREFIX_INTEQ list("IRMV")
+#define PREFIX_CLIP list("CMSV", "CMGSV")
+#define PREFIX_NT list("NTSV")
+ #define PREFIX_NS_LOGI list("NSSV")
+ #define PREFIX_VIGILITAS list("VISV")
+#define PREFIX_FRONTIER list("FFV")
+#define PREFIX_PGF list("PGF", "PGFMC", "PGFN")
+#define PREFIX_INDEPENDENT list("SV", "IMV", "ISV")
+
/// List of all ship factions to their prefixes.
GLOBAL_LIST_INIT(ship_faction_to_prefixes, list(
- "Syndicate" = list(
- "SEV",
- "SSV",
- ),
- "New Gorlex Republic" = list(
- "NGRV",
- ),
- "CyberSun" = list(
- "CSSV",
- ),
- "Student-Union of Naturalistic Sciences" = list(
- "SUNS",
- ),
- "SolGov" = list(
- "SCSV",
- ),
- "Saint-Roumain Militia" = list(
- "SRSV",
- ),
- "Independent" = list(
- "SV",
- "IMV",
- "ISV",
- "XSV",
- ),
- "Inteq Risk Management Group" = list(
- "IRMV",
- ),
- "CLIP Minutemen" = list(
- "CMSV",
- "CMGSV",
- ),
- "Nanotrasen" = list(
- "NTSV",
- ),
- "Frontiersmen Fleet" = list(
- "FFV",
- ),
- "Saint-Roumaine Militia" = list(
- "SRSV",
- ),
+ FACTION_SYNDICATE = PREFIX_SYNDICATE,
+ FACTION_NGR = PREFIX_NGR,
+ FACTION_CYBERSUN = PREFIX_CYBERSUN,
+ FACTION_SUNS = PREFIX_SUNS,
+ FACTION_SOLGOV = PREFIX_SOLGOV,
+ FACTION_SRM = PREFIX_SRM,
+ FACTION_INTEQ = PREFIX_INTEQ,
+ FACTION_CLIP = PREFIX_CLIP,
+ FACTION_NT = PREFIX_NT,
+ FACTION_NS_LOGI = PREFIX_NS_LOGI,
+ FACTION_VIGILITAS = PREFIX_VIGILITAS,
+ FACTION_FRONTIER = PREFIX_FRONTIER,
+ FACTION_PGF = PREFIX_PGF,
+ FACTION_INDEPENDENT = PREFIX_INDEPENDENT
))
/proc/ship_prefix_to_faction(prefix)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 8e9a1dbc9979..c8c7b63d0a09 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1329,44 +1329,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
temp = ((temp + (temp>>3))&29127) % 63 //070707
return temp
-//same as do_mob except for movables and it allows both to drift and doesn't draw progressbar
-/proc/do_atom(atom/movable/user , atom/movable/target, time = 30, uninterruptible = 0,datum/callback/extra_checks = null)
- if(!user || !target)
- return TRUE
- var/user_loc = user.loc
-
- var/drifting = FALSE
- if(!user.Process_Spacemove(0) && user.inertia_dir)
- drifting = TRUE
-
- var/target_drifting = FALSE
- if(!target.Process_Spacemove(0) && target.inertia_dir)
- target_drifting = TRUE
-
- var/target_loc = target.loc
-
- var/endtime = world.time+time
- . = TRUE
- while (world.time < endtime)
- stoplag(1)
- if(QDELETED(user) || QDELETED(target))
- . = 0
- break
- if(uninterruptible)
- continue
-
- if(drifting && !user.inertia_dir)
- drifting = FALSE
- user_loc = user.loc
-
- if(target_drifting && !target.inertia_dir)
- target_drifting = FALSE
- target_loc = target.loc
-
- if((!drifting && user.loc != user_loc) || (!target_drifting && target.loc != target_loc) || (extra_checks && !extra_checks.Invoke()))
- . = FALSE
- break
-
//returns a GUID like identifier (using a mostly made up record format)
//guids are not on their own suitable for access or security tokens, as most of their bits are predictable.
// (But may make a nice salt to one)
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index 406f0bb0b101..bbfb0d3a74c5 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -152,6 +152,7 @@ DEFINE_BITFIELD(item_flags, list(
"NOBLUDGEON" = NOBLUDGEON,
"NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION,
"SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND,
+ "NO_PIXEL_RANDOM_DROP" = NO_PIXEL_RANDOM_DROP,
))
DEFINE_BITFIELD(machine_stat, list(
@@ -190,6 +191,7 @@ DEFINE_BITFIELD(movement_type, list(
"GROUND" = GROUND,
"PHASING" = PHASING,
"VENTCRAWLING" = VENTCRAWLING,
+ "THROWN" = THROWN,
))
DEFINE_BITFIELD(obj_flags, list(
@@ -263,6 +265,14 @@ DEFINE_BITFIELD(zap_flags, list(
"ZAP_OBJ_DAMAGE" = ZAP_OBJ_DAMAGE,
))
+
+DEFINE_BITFIELD(storage_flags, list(
+ "STORAGE_LIMIT_MAX_ITEMS" = STORAGE_LIMIT_MAX_ITEMS,
+ "STORAGE_LIMIT_MAX_W_CLASS" = STORAGE_LIMIT_MAX_W_CLASS,
+ "STORAGE_LIMIT_COMBINED_W_CLASS" = STORAGE_LIMIT_COMBINED_W_CLASS,
+ "STORAGE_LIMIT_VOLUME" = STORAGE_LIMIT_VOLUME,
+))
+
DEFINE_BITFIELD(bodytype, list(
"BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC,
"BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC,
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 479e43e34543..f9edbc500142 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -46,6 +46,7 @@ GLOBAL_LIST_EMPTY(spider_legs_list)
GLOBAL_LIST_EMPTY(spider_spinneret_list)
GLOBAL_LIST_EMPTY(kepori_feathers_list)
GLOBAL_LIST_EMPTY(kepori_body_feathers_list)
+GLOBAL_LIST_EMPTY(kepori_head_feathers_list)
GLOBAL_LIST_EMPTY(kepori_tail_feathers_list)
GLOBAL_LIST_EMPTY(vox_head_quills_list)
GLOBAL_LIST_EMPTY(vox_neck_quills_list)
@@ -189,6 +190,22 @@ GLOBAL_LIST_INIT(exowearlist, list(PREF_NOEXOWEAR, PREF_EXOWEAR, PREF_ALTEXOWEAR
#define UPLINK_PEN "Pen" //like a real spy!
GLOBAL_LIST_INIT(uplink_spawn_loc_list, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN))
+//favorite cigarette brand
+#define PREF_CIG_SPACE "Space Cigarettes"
+#define PREF_CIG_DROMEDARY "DromedaryCo Cigarettes"
+#define PREF_CIG_UPLIFT "Uplift Smooth Cigarettes"
+#define PREF_CIG_ROBUST "Robust Cigarettes"
+#define PREF_CIG_ROBUSTGOLD "Robust Gold Cigarettes"
+#define PREF_CIG_CARP "Carp Classic Cigarettes"
+#define PREF_CIG_MIDORI "Midori Taboko Rollies"
+#define PREF_CIGAR "Premium Cigars"
+#define PREF_CIGAR_SOLAR "Solarian Cigars"
+#define PREF_CIGAR_COHIBA "Cohiba Cigars"
+#define PREF_VAPE "Vape Pen"
+#define PREF_PIPE "Fancy Pipe"
+
+GLOBAL_LIST_INIT(valid_smoke_types, sortList(list(PREF_CIG_SPACE, PREF_CIG_DROMEDARY, PREF_CIG_UPLIFT, PREF_CIG_ROBUST, PREF_CIG_ROBUSTGOLD, PREF_CIG_CARP, PREF_CIG_MIDORI, PREF_CIGAR, PREF_CIGAR_SOLAR, PREF_CIGAR_COHIBA, PREF_VAPE, PREF_PIPE)))
+
//Female Uniforms
GLOBAL_LIST_EMPTY(female_clothing_icons)
//Alternate species icons
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 0091b88fa15f..59f25efe9823 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items
) = 1,
list(//misc
- /obj/item/radio/off = 1,
+ /obj/item/radio = 1,
/obj/item/extinguisher = 1,
/obj/item/tank/internals/emergency_oxygen = 1,
/obj/item/bodybag = 1,
diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm
index ecc1acb6f0e1..888def7a7182 100644
--- a/code/_globalvars/lists/names.dm
+++ b/code/_globalvars/lists/names.dm
@@ -14,8 +14,6 @@ GLOBAL_LIST_INIT(lizard_names_female, world.file2list("strings/names/lizard_fema
GLOBAL_LIST_INIT(clown_names, world.file2list("strings/names/clown.txt"))
GLOBAL_LIST_INIT(mime_names, world.file2list("strings/names/mime.txt"))
GLOBAL_LIST_INIT(carp_names, world.file2list("strings/names/carp.txt"))
-GLOBAL_LIST_INIT(moth_first, world.file2list("strings/names/moth_first.txt"))
-GLOBAL_LIST_INIT(moth_last, world.file2list("strings/names/moth_last.txt"))
GLOBAL_LIST_INIT(plasmaman_names, world.file2list("strings/names/plasmaman.txt"))
GLOBAL_LIST_INIT(squid_names, world.file2list("strings/names/squid.txt"))
GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt"))
@@ -27,6 +25,8 @@ GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt"))
GLOBAL_LIST_INIT(ing_verbs, world.file2list("strings/names/ing_verbs.txt"))
GLOBAL_LIST_INIT(adverbs, world.file2list("strings/names/adverbs.txt"))
GLOBAL_LIST_INIT(adjectives, world.file2list("strings/names/adjectives.txt"))
+GLOBAL_LIST_INIT(preference_adjectives, world.file2list("strings/preference_adjectives.txt"))
+GLOBAL_LIST_INIT(ipc_preference_adjectives, world.file2list("strings/ipc_preference_adjectives.txt"))
GLOBAL_LIST_INIT(dream_strings, world.file2list("strings/dreamstrings.txt"))
//loaded on startup because of "
//would include in rsc if ' was used
@@ -41,11 +41,6 @@ List of configurable names in preferences and their metadata
),
*/
GLOBAL_LIST_INIT(preferences_custom_names, list(
- "human" = list("pref_name" = "Backup Human", "qdesc" = "backup human name, used in the event you are assigned a command role as another species", "group" = "backup_human", "allow_null" = FALSE),
- "clown" = list("pref_name" = "Clown" , "qdesc" = "clown name", "group" = "fun", "allow_null" = FALSE),
- "mime" = list("pref_name" = "Mime", "qdesc" = "mime name" , "group" = "fun", "allow_null" = FALSE),
"cyborg" = list("pref_name" = "Cyborg", "qdesc" = "cyborg name (Leave empty to use default naming scheme)", "group" = "silicons", "allow_null" = TRUE),
"ai" = list("pref_name" = "AI", "qdesc" = "ai name", "group" = "silicons", "allow_null" = FALSE),
- "religion" = list("pref_name" = "Chaplain religion", "qdesc" = "religion" , "group" = "chaplain", "allow_null" = FALSE),
- "deity" = list("pref_name" = "Chaplain deity", "qdesc" = "deity", "group" = "chaplain", "allow_null" = FALSE)
- ))
+))
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index ac54c7a39b33..7ee53ec1f37b 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -1,42 +1,75 @@
-GLOBAL_LIST_EMPTY(cable_list) //Index for all cables, so that powernets don't have to look through the entire world all the time
-GLOBAL_LIST_EMPTY(portals) //list of all /obj/effect/portal
-GLOBAL_LIST_EMPTY(airlocks) //list of all airlocks
-GLOBAL_LIST_EMPTY(mechas_list) //list of all mechs. Used by hostile mobs target tracking.
-GLOBAL_LIST_EMPTY(machines) //NOTE: this is a list of ALL machines now. The processing machines list is SSmachine.processing !
-GLOBAL_LIST_EMPTY(navbeacons) //list of all bot nagivation beacons, used for patrolling.
-GLOBAL_LIST_EMPTY(teleportbeacons) //list of all tracking beacons used by teleporters
-GLOBAL_LIST_EMPTY(deliverybeacons) //list of all MULEbot delivery beacons.
-GLOBAL_LIST_EMPTY(deliverybeacontags) //list of all tags associated with delivery beacons.
-GLOBAL_LIST_EMPTY(wayfindingbeacons) //list of all navigation beacons used by wayfinding pinpointers
+/// Index for all cables, so that powernets don't have to look through the entire world all the time
+GLOBAL_LIST_EMPTY(cable_list)
+/// list of all /obj/effect/portal
+GLOBAL_LIST_EMPTY(portals)
+/// List of all airlocks
+GLOBAL_LIST_EMPTY(airlocks)
+/// List of all mechs. Used by hostile mobs target tracking.
+GLOBAL_LIST_EMPTY(mechas_list)
+/// NOTE: this is a list of ALL machines now. The processing machines list is SSmachine.processing!
+GLOBAL_LIST_EMPTY(machines)
+/// List of all bot nagivation beacons, used for patrolling.
+GLOBAL_LIST_EMPTY(navbeacons)
+/// List of all tracking beacons used by teleporters
+GLOBAL_LIST_EMPTY(teleportbeacons)
+/// List of all MULEbot delivery beacons.
+GLOBAL_LIST_EMPTY(deliverybeacons)
+/// List of all tags associated with delivery beacons.
+GLOBAL_LIST_EMPTY(deliverybeacontags)
+/// List of all navigation beacons used by wayfinding pinpointers
+GLOBAL_LIST_EMPTY(wayfindingbeacons)
+/// List of all navigation beacons used by wayfinding pinpointers
GLOBAL_LIST_EMPTY(nuke_list)
-GLOBAL_LIST_EMPTY(alarmdisplay) //list of all machines or programs that can display station alerts
-GLOBAL_LIST_EMPTY(singularities) //list of all singularities on the station (actually technically all engines)
-GLOBAL_LIST_EMPTY(fax_machines) //list of all fax machines
+/// List of all machines or programs that can display station alerts
+GLOBAL_LIST_EMPTY(alarmdisplay)
+/// List of all singularities (actually technically all engines)
+GLOBAL_LIST_EMPTY(singularities)
+/// List of all fax machines
+GLOBAL_LIST_EMPTY(fax_machines)
+/// List of all /datum/chemical_reaction datums. Used during chemical reactions
+GLOBAL_LIST(chemical_reactions_list)
+/// List of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
+GLOBAL_LIST(chemical_reagents_list)
+/// List of all /datum/material datums indexed by material id.
+GLOBAL_LIST_EMPTY(materials_list)
+/// List of all /datum/tech datums indexed by id.
+GLOBAL_LIST_EMPTY(tech_list)
+/// List of all surgeries by name, associated with their path.
+GLOBAL_LIST_EMPTY(surgeries_list)
+/// List of all table craft recipes
+GLOBAL_LIST_EMPTY(crafting_recipes)
+/// List of Rapid Construction Devices.
+GLOBAL_LIST_EMPTY(rcd_list)
+/// List of all Area Power Controller machines, separate from machines for powernet speeeeeeed.
+GLOBAL_LIST_EMPTY(apcs_list)
+/// List of all current implants that are tracked to work out what sort of trek everyone is on.
+GLOBAL_LIST_EMPTY(tracked_implants)
+/// List of implants the prisoner console can track and send inject commands too
+GLOBAL_LIST_EMPTY(tracked_chem_implants)
+/// List of points of interest for observe/follow
+GLOBAL_LIST_EMPTY(poi_list)
+/// List of all pinpointers. Used to change stuff they are pointing to all at once.
+GLOBAL_LIST_EMPTY(pinpointer_list)
+/// List of all zombie_infection organs, for any mass "animation"
+GLOBAL_LIST_EMPTY(zombie_infection_list)
+/// List of all meteors.
+GLOBAL_LIST_EMPTY(meteor_list)
+/// List of active radio jammers
+GLOBAL_LIST_EMPTY(active_jammers)
-GLOBAL_LIST(chemical_reactions_list) //list of all /datum/chemical_reaction datums. Used during chemical reactions
-GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
-GLOBAL_LIST_EMPTY(materials_list) //list of all /datum/material datums indexed by material id.
-GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id.
-GLOBAL_LIST_EMPTY(surgeries_list) //list of all surgeries by name, associated with their path.
-GLOBAL_LIST_EMPTY(crafting_recipes) //list of all table craft recipes
-GLOBAL_LIST_EMPTY(rcd_list) //list of Rapid Construction Devices.
-GLOBAL_LIST_EMPTY(apcs_list) //list of all Area Power Controller machines, separate from machines for powernet speeeeeeed.
-GLOBAL_LIST_EMPTY(tracked_implants) //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
-GLOBAL_LIST_EMPTY(tracked_chem_implants) //list of implants the prisoner console can track and send inject commands too
-GLOBAL_LIST_EMPTY(poi_list) //list of points of interest for observe/follow
-GLOBAL_LIST_EMPTY(pinpointer_list) //list of all pinpointers. Used to change stuff they are pointing to all at once.
-GLOBAL_LIST_EMPTY(zombie_infection_list) // A list of all zombie_infection organs, for any mass "animation"
-GLOBAL_LIST_EMPTY(meteor_list) // List of all meteors.
-GLOBAL_LIST_EMPTY(active_jammers) // List of active radio jammers
GLOBAL_LIST_EMPTY(ladders)
+
GLOBAL_LIST_EMPTY(trophy_cases)
-///This is a global list of all signs you can change an existing sign or new sign backing to, when using a pen on them.
+
+/// This is a global list of all signs you can change an existing sign or new sign backing to, when using a pen on them.
GLOBAL_LIST_EMPTY(editable_sign_types)
GLOBAL_LIST_EMPTY(wire_color_directory)
+
GLOBAL_LIST_EMPTY(wire_name_directory)
GLOBAL_LIST_EMPTY(ai_status_displays)
-
-GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects
-GLOBAL_LIST_EMPTY(alert_consoles) // Station alert consoles, /obj/machinery/computer/station_alert
+/// List of All mob_spawn objects
+GLOBAL_LIST_EMPTY(mob_spawners)
+/// List of Station alert consoles, /obj/machinery/computer/station_alert
+GLOBAL_LIST_EMPTY(alert_consoles)
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index dbc3607129f4..5f5c26731d15 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -125,8 +125,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NIGHT_VISION" = TRAIT_NIGHT_VISION,
"TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP,
"TRAIT_SPIRITUAL" = TRAIT_SPIRITUAL,
- "TRAIT_FAN_CLOWN" = TRAIT_FAN_CLOWN,
- "TRAIT_FAN_MIME" = TRAIT_FAN_MIME,
"TRAIT_VORACIOUS" = TRAIT_VORACIOUS,
"TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE,
"TRAIT_FREERUNNING" = TRAIT_FREERUNNING,
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 81ce3ceec1eb..993026c0d5e0 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -356,7 +356,6 @@
/**
* Control+Shift click
- * Unused except for AI
*/
/mob/proc/CtrlShiftClickOn(atom/A)
A.CtrlShiftClick(src)
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 8615b9a9aa6d..ef1f614809fe 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -241,20 +241,20 @@
user.swap_hand(held_index)
return TRUE
-/atom/movable/screen/close
- name = "close"
- layer = ABOVE_HUD_LAYER
- plane = ABOVE_HUD_PLANE
- icon_state = "backpack_close"
+// /atom/movable/screen/close
+// name = "close"
+// layer = ABOVE_HUD_LAYER
+// plane = ABOVE_HUD_PLANE
+// icon_state = "backpack_close"
-/atom/movable/screen/close/Initialize(mapload, new_master)
- . = ..()
- master = new_master
+// /atom/movable/screen/close/Initialize(mapload, new_master)
+// . = ..()
+// master = new_master
-/atom/movable/screen/close/Click()
- var/datum/component/storage/S = master
- S.hide_from(usr)
- return TRUE
+// /atom/movable/screen/close/Click()
+// var/datum/component/storage/S = master
+// S.hide_from(usr)
+// return TRUE
/atom/movable/screen/drop
name = "drop"
@@ -437,30 +437,6 @@
icon_state = "[base_icon_state][user.resting ? 0 : null]"
return ..()
-/atom/movable/screen/storage
- name = "storage"
- icon_state = "block"
- screen_loc = "7,7 to 10,8"
- layer = HUD_LAYER
- plane = HUD_PLANE
-
-/atom/movable/screen/storage/Initialize(mapload, new_master)
- . = ..()
- master = new_master
-
-/atom/movable/screen/storage/Click(location, control, params)
- if(world.time <= usr.next_move)
- return TRUE
- if(usr.incapacitated())
- return TRUE
- if (ismecha(usr.loc)) // stops inventory actions in a mech
- return TRUE
- if(master)
- var/obj/item/I = usr.get_active_held_item()
- if(I)
- master.attackby(null, I, usr, params)
- return TRUE
-
/atom/movable/screen/throw_catch
name = "throw/catch"
icon = 'icons/hud/screen_midnight.dmi'
diff --git a/code/_onclick/hud/storage.dm b/code/_onclick/hud/storage.dm
new file mode 100644
index 000000000000..c10375df4e8b
--- /dev/null
+++ b/code/_onclick/hud/storage.dm
@@ -0,0 +1,198 @@
+/atom/movable/screen/storage
+ name = "storage"
+ var/insertion_click = FALSE
+
+/atom/movable/screen/storage/Initialize(mapload, new_master)
+ . = ..()
+ master = new_master
+
+/atom/movable/screen/storage/Click(location, control, params)
+ if(!insertion_click)
+ return ..()
+ if(hud?.mymob && (hud.mymob != usr))
+ return
+ // just redirect clicks
+ if(master)
+ var/obj/item/I = usr.get_active_held_item()
+ if(I)
+ master.attackby(null, I, usr, params)
+ return TRUE
+
+/atom/movable/screen/storage/boxes
+ name = "storage"
+ icon_state = "block"
+ screen_loc = "7,7 to 10,8"
+ layer = HUD_LAYER
+ plane = HUD_PLANE
+ insertion_click = TRUE
+
+/atom/movable/screen/storage/close
+ name = "close"
+ layer = ABOVE_HUD_LAYER
+ plane = ABOVE_HUD_PLANE
+ icon_state = "backpack_close"
+
+/atom/movable/screen/storage/close/Click()
+ var/datum/component/storage/S = master
+ S.close(usr)
+ return TRUE
+
+/atom/movable/screen/storage/left
+ icon_state = "storage_start"
+ insertion_click = TRUE
+
+/atom/movable/screen/storage/right
+ icon_state = "storage_end"
+ insertion_click = TRUE
+
+/atom/movable/screen/storage/continuous
+ icon_state = "storage_continue"
+ insertion_click = TRUE
+
+/atom/movable/screen/storage/volumetric_box
+ icon_state = "stored_continue"
+ layer = VOLUMETRIC_STORAGE_BOX_LAYER
+ plane = VOLUMETRIC_STORAGE_BOX_PLANE
+ var/obj/item/our_item
+
+/atom/movable/screen/storage/volumetric_box/Initialize(mapload, new_master, obj/item/our_item)
+ src.our_item = our_item
+ RegisterSignal(our_item, COMSIG_ITEM_MOUSE_ENTER, PROC_REF(on_item_mouse_enter))
+ RegisterSignal(our_item, COMSIG_ITEM_MOUSE_EXIT, PROC_REF(on_item_mouse_exit))
+ return ..()
+
+/atom/movable/screen/storage/volumetric_box/Destroy()
+ makeItemInactive()
+ our_item = null
+ return ..()
+
+/atom/movable/screen/storage/volumetric_box/Click(location, control, params)
+ return our_item.Click(location, control, params)
+
+/atom/movable/screen/storage/volumetric_box/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params)
+ return our_item.MouseDrop(over, src_location, over_location, src_control, over_control, params)
+
+/atom/movable/screen/storage/volumetric_box/MouseExited(location, control, params)
+ makeItemInactive()
+
+/atom/movable/screen/storage/volumetric_box/MouseEntered(location, control, params)
+ . = ..()
+ makeItemActive()
+
+/atom/movable/screen/storage/volumetric_box/proc/on_item_mouse_enter()
+ makeItemActive()
+
+/atom/movable/screen/storage/volumetric_box/proc/on_item_mouse_exit()
+ makeItemInactive()
+
+/atom/movable/screen/storage/volumetric_box/proc/makeItemInactive()
+ return
+
+/atom/movable/screen/storage/volumetric_box/proc/makeItemActive()
+ return
+
+/atom/movable/screen/storage/volumetric_box/center
+ icon_state = "stored_continue"
+ var/atom/movable/screen/storage/volumetric_edge/stored_left/left
+ var/atom/movable/screen/storage/volumetric_edge/stored_right/right
+ var/atom/movable/screen/storage/item_holder/holder
+ var/pixel_size
+
+/atom/movable/screen/storage/volumetric_box/center/Initialize(mapload, new_master, our_item)
+ left = new(null, src, our_item)
+ right = new(null, src, our_item)
+ return ..()
+
+/atom/movable/screen/storage/volumetric_box/center/Destroy()
+ QDEL_NULL(left)
+ QDEL_NULL(right)
+ vis_contents.Cut()
+ if(holder)
+ QDEL_NULL(holder)
+ return ..()
+
+/atom/movable/screen/storage/volumetric_box/center/proc/on_screen_objects()
+ return list(src)
+
+
+//Sets the size of this box screen object and regenerates its left/right borders. This includes the actual border's size!
+/atom/movable/screen/storage/volumetric_box/center/proc/set_pixel_size(pixels)
+ if(pixel_size == pixels)
+ return
+ pixel_size = pixels
+ cut_overlays()
+ vis_contents.Cut()
+ //our icon size is 32 pixels.
+ var/multiplier = (pixels - (VOLUMETRIC_STORAGE_BOX_BORDER_SIZE * 2)) / VOLUMETRIC_STORAGE_BOX_ICON_SIZE
+ transform = matrix(multiplier, 0, 0, 0, 1, 0)
+ if(our_item)
+ if(holder)
+ qdel(holder)
+ holder = new(null, src, our_item)
+ holder.transform = matrix(1 / multiplier, 0, 0, 0, 1, 0)
+ holder.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ holder.appearance_flags &= ~RESET_TRANSFORM
+ makeItemInactive()
+ vis_contents += holder
+ left.pixel_x = -((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) - VOLUMETRIC_STORAGE_BOX_BORDER_SIZE
+ right.pixel_x = ((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) + VOLUMETRIC_STORAGE_BOX_BORDER_SIZE
+ add_overlay(left)
+ add_overlay(right)
+
+/atom/movable/screen/storage/volumetric_box/center/makeItemInactive()
+ if(!holder)
+ return
+ holder.layer = VOLUMETRIC_STORAGE_ITEM_LAYER
+ holder.plane = VOLUMETRIC_STORAGE_ITEM_PLANE
+
+/atom/movable/screen/storage/volumetric_box/center/makeItemActive()
+ if(!holder)
+ return
+ holder.our_item.layer = VOLUMETRIC_STORAGE_ACTIVE_ITEM_LAYER //make sure we display infront of the others!
+ holder.our_item.plane = VOLUMETRIC_STORAGE_ACTIVE_ITEM_PLANE
+
+/atom/movable/screen/storage/volumetric_edge
+ layer = VOLUMETRIC_STORAGE_BOX_LAYER
+ plane = VOLUMETRIC_STORAGE_BOX_PLANE
+
+/atom/movable/screen/storage/volumetric_edge/Initialize(mapload, master, our_item)
+ src.master = master
+ return ..()
+
+/atom/movable/screen/storage/volumetric_edge/Click(location, control, params)
+ return master.Click(location, control, params)
+
+/atom/movable/screen/storage/volumetric_edge/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params)
+ return master.MouseDrop(over, src_location, over_location, src_control, over_control, params)
+
+/atom/movable/screen/storage/volumetric_edge/MouseExited(location, control, params)
+ return master.MouseExited(location, control, params)
+
+/atom/movable/screen/storage/volumetric_edge/MouseEntered(location, control, params)
+ . = ..()
+ return master.MouseEntered(location, control, params)
+
+/atom/movable/screen/storage/volumetric_edge/stored_left
+ icon_state = "stored_start"
+ appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM // Yes I know RESET_TRANSFORM is in APPEARANCE_UI but we're hard-asserting this incase someone changes it.
+
+/atom/movable/screen/storage/volumetric_edge/stored_right
+ icon_state = "stored_end"
+ appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM
+
+/atom/movable/screen/storage/item_holder
+ var/obj/item/our_item
+ vis_flags = NONE
+
+/atom/movable/screen/storage/item_holder/Initialize(mapload, new_master, obj/item/I)
+ . = ..()
+ our_item = I
+ vis_contents += I
+
+/atom/movable/screen/storage/item_holder/Destroy()
+ vis_contents.Cut()
+ our_item = null
+ return ..()
+
+/atom/movable/screen/storage/item_holder/Click(location, control, params)
+ return our_item.Click(location, control, params)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 1cf0585c0ed4..58b9604e585a 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -153,7 +153,7 @@
var/armor_value = run_armor_check(attack_flag = "melee", armour_penetration = I.armour_penetration) //WS Edit - Simplemobs can have armor
send_item_attack_message(I, user)
if(I.force)
- apply_damage(I.force, I.damtype, break_modifier = I.force, blocked = armor_value) //Bone break modifier = item force
+ apply_damage(I.force, I.damtype, break_modifier = I.force, blocked = armor_value, sharpness = I.get_sharpness()) //Bone break modifier = item force
if(I.damtype == BRUTE)
if(prob(33))
I.add_mob_blood(src)
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index 8a37777e2bf2..2ac0b06b74d6 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -142,6 +142,8 @@ SUBSYSTEM_DEF(blackbox)
record_feedback("tally", "radio_usage", 1, "pirate")
if(FREQ_SYNDICATE)
record_feedback("tally", "radio_usage", 1, "syndicate")
+ if(FREQ_PGF)
+ record_feedback("tally", "radio_usage", 1, "pgf")
if(FREQ_CENTCOM)
record_feedback("tally", "radio_usage", 1, "centcom")
if(FREQ_SOLGOV) //WS Edit - SolGov Rep
diff --git a/code/controllers/subsystem/blackmarket.dm b/code/controllers/subsystem/blackmarket.dm
index 6014259278d7..cbd07fcd8fda 100644
--- a/code/controllers/subsystem/blackmarket.dm
+++ b/code/controllers/subsystem/blackmarket.dm
@@ -5,8 +5,8 @@ SUBSYSTEM_DEF(blackmarket)
/// Descriptions for each shipping methods.
var/shipping_method_descriptions = list(
- SHIPPING_METHOD_LAUNCH="Launches the item at your coordinates from across deep space, cheap but you might not recieve your item at all.",
- SHIPPING_METHOD_LTSRBT="Long-To-Short-Range-Bluespace-Transceiver, a machine that prepares items at a remote storage location and then teleports them to the location of the uplink."
+ SHIPPING_METHOD_LAUNCH="Launches the item at your coordinates from across deep space. Cheap, but you might not recieve your item at all. We recommend being stationary in space, away from any large structures, for best results.",
+ SHIPPING_METHOD_LTSRBT="Long-To-Short-Range-Bluespace-Transceiver, a machine that prepares items at a remote storage location and then teleports them to the location of the LTRSBT."
)
/// List of all existing markets.
@@ -29,7 +29,8 @@ SUBSYSTEM_DEF(blackmarket)
if(!markets[M])
stack_trace("SSblackmarket: Item [I] available in market that does not exist.")
continue
- markets[M].add_item(item)
+ markets[M].add_item(item, FALSE)
+
qdel(I)
. = ..()
@@ -47,22 +48,10 @@ SUBSYSTEM_DEF(blackmarket)
switch(purchase.method)
// Find a ltsrbt pad and make it handle the shipping.
if(SHIPPING_METHOD_LTSRBT)
- if(!telepads.len)
- continue
- // Prioritize pads that don't have a cooldown active.
- var/free_pad_found = FALSE
- for(var/obj/machinery/ltsrbt/pad in telepads)
- if(pad.recharge_cooldown)
- continue
- pad.add_to_queue(purchase)
- queued_purchases -= purchase
- free_pad_found = TRUE
- break
-
- if(free_pad_found)
+ if(!purchase.uplink.target)
continue
- var/obj/machinery/ltsrbt/pad = pick(telepads)
+ var/obj/machinery/ltsrbt/pad = purchase.uplink.target
to_chat(recursive_loc_check(purchase.uplink.loc, /mob), "[purchase.uplink] flashes a message noting that the order is being processed by [pad].")
@@ -76,7 +65,7 @@ SUBSYSTEM_DEF(blackmarket)
var/pickedloc = vlevel.get_side_turf(startSide)
var/atom/movable/item = purchase.entry.spawn_item(pickedloc)
- item.throw_at(purchase.uplink, 3, 3, spin = FALSE)
+ item.safe_throw_at(purchase.uplink, 3, 3, spin = FALSE)
to_chat(recursive_loc_check(purchase.uplink.loc, /mob), "[purchase.uplink] flashes a message noting the order is being launched at your coordinates from [dir2text(startSide)].")
@@ -96,7 +85,7 @@ SUBSYSTEM_DEF(blackmarket)
/// Used to add /datum/blackmarket_purchase to queued_purchases var. Returns TRUE when queued.
/datum/controller/subsystem/blackmarket/proc/queue_item(datum/blackmarket_purchase/P)
- if(P.method == SHIPPING_METHOD_LTSRBT && !telepads.len)
+ if(P.method == SHIPPING_METHOD_LTSRBT && !P.uplink.target)
return FALSE
queued_purchases += P
return TRUE
diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm
index 30cc6d4d5a3a..236a2a8b9aec 100644
--- a/code/controllers/subsystem/economy.dm
+++ b/code/controllers/subsystem/economy.dm
@@ -3,53 +3,18 @@ SUBSYSTEM_DEF(economy)
init_order = INIT_ORDER_ECONOMY
flags = SS_NO_FIRE
runlevels = RUNLEVEL_GAME
- var/roundstart_paychecks = 5
- var/budget_pool = 35000
- var/list/department_accounts = list(ACCOUNT_CIV = ACCOUNT_CIV_NAME,
- ACCOUNT_ENG = ACCOUNT_ENG_NAME,
- ACCOUNT_SCI = ACCOUNT_SCI_NAME,
- ACCOUNT_MED = ACCOUNT_MED_NAME,
- ACCOUNT_SRV = ACCOUNT_SRV_NAME,
- ACCOUNT_CAR = ACCOUNT_CAR_NAME,
- ACCOUNT_SEC = ACCOUNT_SEC_NAME)
- var/list/generated_accounts = list()
- var/full_ancap = FALSE // Enables extra money charges for things that normally would be free, such as sleepers/cryo/cloning.
- //Take care when enabling, as players will NOT respond well if the economy is set up for low cash flows.
- var/slime_bounty = list("grey" = 10,
- // tier 1
- "orange" = 100,
- "metal" = 100,
- "blue" = 100,
- "purple" = 100,
- // tier 2
- "dark purple" = 500,
- "dark blue" = 500,
- "green" = 500,
- "silver" = 500,
- "gold" = 500,
- "yellow" = 500,
- "red" = 500,
- "pink" = 500,
- // tier 3
- "cerulean" = 750,
- "sepia" = 750,
- "bluespace" = 750,
- "pyrite" = 750,
- "light pink" = 750,
- "oil" = 750,
- "adamantine" = 750,
- // tier 4
- "rainbow" = 1000)
- var/list/bank_accounts = list() //List of normal accounts (not department accounts)
- var/list/dep_cards = list()
-/datum/controller/subsystem/economy/Initialize(timeofday)
- var/budget_to_hand_out = round(budget_pool / department_accounts.len)
- for(var/A in department_accounts)
- new /datum/bank_account/department(A, budget_to_hand_out)
- return ..()
+ ///List of normal accounts (not ship accounts)
+ var/list/bank_accounts = list()
+ ///Total amount of physical money in the game
+ var/physical_money = 0
+ ///Total amount of money in bank accounts
+ var/bank_money = 0
-/datum/controller/subsystem/economy/proc/get_dep_account(dep_id)
- for(var/datum/bank_account/department/D in generated_accounts)
- if(D.department_id == dep_id)
- return D
+/datum/controller/subsystem/economy/stat_entry(msg)
+ msg += "{"
+ msg += "PH: [physical_money]|"
+ msg += "BN: [bank_money]|"
+ msg += "TOT: [physical_money + bank_money]"
+ msg += "}"
+ return ..()
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index 32f404c936a6..dc55c7ca0755 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -102,7 +102,7 @@ SUBSYSTEM_DEF(events)
// Why the heck is this here! Took me so damn long to find!
/client/proc/forceEvent()
set name = "Trigger Event"
- set category = "Admin.Events"
+ set category = "Event"
if(!holder ||!check_rights(R_FUN))
return
diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm
index f163553f5f9b..3e044a441c0a 100644
--- a/code/controllers/subsystem/explosions.dm
+++ b/code/controllers/subsystem/explosions.dm
@@ -164,7 +164,7 @@ SUBSYSTEM_DEF(explosions)
// 5 explosion power is a (0, 1, 3) explosion.
// 1 explosion power is a (0, 0, 1) explosion.
-/proc/explosion(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = TRUE, ignorecap = FALSE, flame_range = 0, silent = FALSE, smoke = FALSE)
+/proc/explosion(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = TRUE, ignorecap = FALSE, flame_range = 0, silent = FALSE, smoke = FALSE, gentle = FALSE)
. = SSexplosions.explode(arglist(args))
#define CREAK_DELAY 5 SECONDS //Time taken for the creak to play after explosion, if applicable.
@@ -177,7 +177,7 @@ SUBSYSTEM_DEF(explosions)
#define FREQ_UPPER 40 //The upper limit for the randomly selected frequency.
#define FREQ_LOWER 25 //The lower of the above.
-/datum/controller/subsystem/explosions/proc/explode(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog, ignorecap, flame_range, silent, smoke)
+/datum/controller/subsystem/explosions/proc/explode(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog, ignorecap, flame_range, silent, smoke, gentle)
epicenter = get_turf(epicenter)
if(!epicenter)
return
@@ -550,6 +550,8 @@ SUBSYSTEM_DEF(explosions)
var/throw_dir = L[2]
var/max_range = L[3]
for(var/atom/movable/A in T)
+ if(QDELETED(A))
+ continue
if(!A.anchored && A.move_resist != INFINITY)
var/atom_throw_range = rand(throw_range, max_range)
var/turf/throw_at = get_ranged_target_turf(A, throw_dir, atom_throw_range)
diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm
index 4440d1c17b33..e8285abafde1 100644
--- a/code/controllers/subsystem/machines.dm
+++ b/code/controllers/subsystem/machines.dm
@@ -47,10 +47,7 @@ SUBSYSTEM_DEF(machines)
while(currentrun.len)
var/obj/machinery/thing = currentrun[currentrun.len]
currentrun.len--
- if(!QDELETED(thing) && thing.process(seconds) != PROCESS_KILL)
- if(thing.use_power)
- thing.auto_use_power() //add back the power state
- else
+ if(QDELETED(thing) || thing.process(seconds) == PROCESS_KILL)
processing -= thing
if (!QDELETED(thing))
thing.datum_flags &= ~DF_ISPROCESSING
diff --git a/code/controllers/subsystem/overmap.dm b/code/controllers/subsystem/overmap.dm
index b96a4944c812..1304eeeb34ea 100644
--- a/code/controllers/subsystem/overmap.dm
+++ b/code/controllers/subsystem/overmap.dm
@@ -133,7 +133,7 @@ SUBSYSTEM_DEF(overmap)
spawn_ruin_levels()
spawn_outpost()
- spawn_initial_ships()
+ //spawn_initial_ships()
/**
* VERY Simple random generation for overmap events, spawns the event in a random turf and sometimes spreads it out similar to ores
@@ -212,6 +212,7 @@ SUBSYSTEM_DEF(overmap)
new found_type(location)
return
+/*
/datum/controller/subsystem/overmap/proc/spawn_initial_ships()
#ifndef UNIT_TESTS
var/datum/map_template/shuttle/selected_template = SSmapping.maplist[pick(SSmapping.maplist)]
@@ -224,10 +225,11 @@ SUBSYSTEM_DEF(overmap)
query_round_map_name.Execute()
qdel(query_round_map_name)
#endif
+*/
/**
* Spawns a controlled ship with the passed template at the template's preferred spawn location.
- * Inteded for ship purchases, etc.
+ * Intended for ship purchases, etc.
*/
/datum/controller/subsystem/overmap/proc/spawn_ship_at_start(datum/map_template/shuttle/template)
//Should never happen, but just in case. This'll delay the next spawn until the current one is done.
@@ -274,7 +276,7 @@ SUBSYSTEM_DEF(overmap)
var/datum/map_zone/mapzone = SSmapping.create_map_zone(encounter_name)
var/datum/virtual_level/vlevel = SSmapping.create_virtual_level(
encounter_name,
- list(ZTRAIT_MINING = TRUE, ZTRAIT_BASETURF = dynamic_datum.default_baseturf),
+ list(ZTRAIT_MINING = TRUE, ZTRAIT_BASETURF = dynamic_datum.default_baseturf, ZTRAIT_GRAVITY = dynamic_datum.gravity),
mapzone,
dynamic_datum.vlevel_width,
dynamic_datum.vlevel_height,
diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm
index 7c2bf71cad6a..b7ef35e63663 100644
--- a/code/controllers/subsystem/pai.dm
+++ b/code/controllers/subsystem/pai.dm
@@ -146,7 +146,7 @@ SUBSYSTEM_DEF(pai)
continue
if(!(ROLE_PAI in G.client.prefs.be_special))
continue
- to_chat(G, "[user] is requesting a pAI personality! Use the pAI button to submit yourself as one.")
+ to_chat(G, "[user.real_name] is requesting a pAI personality! Use the pAI button to submit yourself as one.")
addtimer(CALLBACK(src, PROC_REF(spam_again)), spam_delay)
var/list/available = list()
for(var/datum/paiCandidate/c in SSpai.candidates)
diff --git a/code/controllers/subsystem/processing/movable_physics.dm b/code/controllers/subsystem/processing/movable_physics.dm
new file mode 100644
index 000000000000..65015edbd668
--- /dev/null
+++ b/code/controllers/subsystem/processing/movable_physics.dm
@@ -0,0 +1,24 @@
+///Real fast ticking subsystem for moving movables via modifying pixel_x/y/z
+PROCESSING_SUBSYSTEM_DEF(movablephysics)
+ name = "Movable Physics"
+ wait = 0.05 SECONDS
+ stat_tag = "MP"
+ priority = FIRE_PRIORITY_MOVABLE_PHYSICS
+
+/datum/controller/subsystem/processing/movablephysics/fire(resumed = FALSE)
+ if (!resumed)
+ currentrun = processing.Copy()
+ //cache for sanic speed (lists are references anyways)
+ var/list/current_run = currentrun
+
+ while(current_run.len)
+ var/datum/component/thing = current_run[current_run.len]
+ current_run.len--
+ if(QDELETED(thing))
+ processing -= thing
+ else
+ if(thing.process(wait * 0.1) == PROCESS_KILL)
+ // fully stop so that a future START_PROCESSING will work
+ STOP_PROCESSING(src, thing)
+ if (MC_TICK_CHECK)
+ return
diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm
index 9dc117783af9..c6f9e4404c07 100644
--- a/code/controllers/subsystem/processing/quirks.dm
+++ b/code/controllers/subsystem/processing/quirks.dm
@@ -23,7 +23,6 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
list("Ageusia","Vegetarian","Deviant Tastes"), \
list("Ananas Affinity","Ananas Aversion"), \
list("Alcohol Tolerance","Light Drinker"), \
- list("Clown Fan","Mime Fan", "RILENA Super Fan"), \
list("Bad Touch", "Friendly"))
species_blacklist = list("Blood Deficiency" = list(SPECIES_IPC, SPECIES_JELLYPERSON, SPECIES_PLASMAMAN, SPECIES_VAMPIRE))
diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm
index 0260e952d10d..e8cd514eb48b 100644
--- a/code/controllers/subsystem/throwing.dm
+++ b/code/controllers/subsystem/throwing.dm
@@ -47,7 +47,7 @@ SUBSYSTEM_DEF(throwing)
/datum/thrownthing
var/atom/movable/thrownthing
- var/atom/target
+ var/datum/weakref/initial_target
var/turf/target_turf
var/target_zone
var/init_dir
@@ -71,12 +71,13 @@ SUBSYSTEM_DEF(throwing)
var/last_move = 0
-/datum/thrownthing/New(thrownthing, target, target_turf, init_dir, maxrange, speed, thrower, diagonals_first, force, gentle, callback, target_zone)
+/datum/thrownthing/New(thrownthing, target, init_dir, maxrange, speed, thrower, diagonals_first, force, gentle, callback, target_zone)
. = ..()
src.thrownthing = thrownthing
RegisterSignal(thrownthing, COMSIG_PARENT_QDELETING, PROC_REF(on_thrownthing_qdel))
- src.target = target
- src.target_turf = target_turf
+ src.target_turf = get_turf(target)
+ if(target_turf != target)
+ src.initial_target = WEAKREF(target)
src.init_dir = init_dir
src.maxrange = maxrange
src.speed = speed
@@ -87,14 +88,13 @@ SUBSYSTEM_DEF(throwing)
src.callback = callback
src.target_zone = target_zone
-
/datum/thrownthing/Destroy()
SSthrowing.processing -= thrownthing
SSthrowing.currentrun -= thrownthing
thrownthing.throwing = null
thrownthing = null
- target = null
thrower = null
+ initial_target = null
if(callback)
QDEL_NULL(callback) //It stores a reference to the thrownthing, its source. Let's clean that.
return ..()
@@ -109,6 +109,7 @@ SUBSYSTEM_DEF(throwing)
/datum/thrownthing/proc/tick()
var/atom/movable/AM = thrownthing
+ AM.setMovetype(AM.movement_type | THROWN)
if (!isturf(AM.loc) || !AM.throwing)
finalize()
return
@@ -117,9 +118,17 @@ SUBSYSTEM_DEF(throwing)
delayed_time += world.time - last_move
return
- if (dist_travelled && hitcheck()) //to catch sneaky things moving on our tile while we slept
- finalize()
- return
+ var/atom/movable/actual_target = initial_target?.resolve()
+
+ if(dist_travelled) //to catch sneaky things moving on our tile while we slept
+ for(var/atom/movable/obstacle as anything in get_turf(thrownthing))
+ if (obstacle == thrownthing || (obstacle == thrower && !ismob(thrownthing)))
+ continue
+ if(obstacle.pass_flags_self & LETPASSTHROW)
+ continue
+ if (obstacle == actual_target || (obstacle.density && !(obstacle.flags_1 & ON_BORDER_1)))
+ finalize(TRUE, obstacle)
+ return
var/atom/step
@@ -146,10 +155,15 @@ SUBSYSTEM_DEF(throwing)
finalize()
return
- AM.Move(step, get_dir(AM, step), DELAY_TO_GLIDE_SIZE(1 / speed))
+ if(!AM.Move(step, get_dir(AM, step), DELAY_TO_GLIDE_SIZE(1 / speed))) // we hit something during our move...
+ if(AM.throwing) // ...but finalize() wasn't called on Bump() because of a higher level definition that doesn't always call parent.
+ finalize()
+ return
- if (!AM.throwing) // we hit something during our move
- finalize(hit = TRUE)
+ dist_travelled++
+
+ if(actual_target && !(actual_target.pass_flags_self & LETPASSTHROW) && actual_target.loc == AM.loc) // we crossed a movable with no density (e.g. a mouse or APC) we intend to hit anyway.
+ finalize(TRUE, actual_target)
return
dist_travelled++
@@ -158,18 +172,19 @@ SUBSYSTEM_DEF(throwing)
finalize()
return
-/datum/thrownthing/proc/finalize(hit = FALSE, target=null)
+//If the target hasent been hit search for it in the turf we landed on.
+/datum/thrownthing/proc/finalize(hit = FALSE, target = null)
set waitfor = FALSE
//done throwing, either because it hit something or it finished moving
if(!thrownthing)
return
thrownthing.throwing = null
+ thrownthing.setMovetype(thrownthing.movement_type & ~THROWN)
if (!hit)
- for (var/thing in get_turf(thrownthing)) //looking for our target on the turf we land on.
- var/atom/A = thing
- if (A == target)
+ for (var/atom/movable/obstacle as anything in get_turf(thrownthing)) //looking for our target on the turf we land on.
+ if (obstacle == target)
hit = TRUE
- thrownthing.throw_impact(A, src)
+ thrownthing.throw_impact(obstacle, src)
if(QDELETED(thrownthing)) //throw_impact can delete things, such as glasses smashing
return //deletion should already be handled by on_thrownthing_qdel()
break
@@ -195,15 +210,3 @@ SUBSYSTEM_DEF(throwing)
T.zFall(thrownthing)
qdel(src)
-
-/datum/thrownthing/proc/hit_atom(atom/A)
- finalize(hit=TRUE, target=A)
-
-/datum/thrownthing/proc/hitcheck()
- for (var/thing in get_turf(thrownthing))
- var/atom/movable/AM = thing
- if (AM == thrownthing || (AM == thrower && !ismob(thrownthing)))
- continue
- if (AM.density && !(AM.pass_flags_self & LETPASSTHROW) && !(AM.flags_1 & ON_BORDER_1))
- finalize(hit=TRUE, target=AM)
- return TRUE
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index 1e697327c844..25ae750eb0d3 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -41,7 +41,7 @@ SUBSYSTEM_DEF(traumas)
"spiders" = typecacheof(list(/mob/living/simple_animal/hostile/poison/giant_spider)),
"security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)),
"lizards" = typecacheof(list(/mob/living/simple_animal/hostile/lizard)),
- "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)),
+ "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/human/skeleton)),
"snakes" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/poison/snake)),
"robots" = typecacheof(list(/mob/living/silicon/robot, /mob/living/silicon/ai,
/mob/living/simple_animal/drone, /mob/living/simple_animal/bot, /mob/living/simple_animal/hostile/swarmer)),
@@ -90,10 +90,10 @@ SUBSYSTEM_DEF(traumas)
/obj/item/clothing/under/rank/command/captain, /obj/item/clothing/under/rank/security/head_of_security,
/obj/item/clothing/under/rank/engineering/chief_engineer, /obj/item/clothing/under/rank/medical/chief_medical_officer,
/obj/item/clothing/under/rank/command/head_of_personnel, /obj/item/clothing/under/rank/rnd/research_director,
- /obj/item/clothing/under/rank/security/head_of_security/alt,//WS Edit - Better security jumpsuit sprites
+ /obj/item/clothing/under/rank/security/head_of_security/alt,
/obj/item/clothing/under/rank/rnd/research_director/alt, /obj/item/clothing/under/rank/rnd/research_director/turtleneck,
- /obj/item/clothing/under/rank/command/captain/parade, /obj/item/clothing/under/rank/security/head_of_security/parade,
- /obj/item/clothing/under/rank/security/head_of_security/parade/female, //WS Edit - Better Command Uniforms
+ /obj/item/clothing/under/rank/security/head_of_security/parade,
+ /obj/item/clothing/under/rank/security/head_of_security/parade/female,
/obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/melee/baton/abductor,
/obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer,
/obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom/official,
@@ -128,11 +128,10 @@ SUBSYSTEM_DEF(traumas)
/obj/item/melee/cultblade, /obj/item/cult_bastard,
/obj/item/restraints/legcuffs/bola/cult, /obj/item/clothing/suit/space/hardsuit/cult,
/obj/item/clothing/suit/hooded/cultrobes, /obj/item/clothing/head/hooded/cult_hoodie, /obj/effect/rune,
- /obj/item/stack/sheet/runed_metal, /obj/machinery/door/airlock/cult, /obj/singularity/narsie,
+ /obj/machinery/door/airlock/cult, /obj/singularity/narsie,
/obj/item/soulstone,
/obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard, /obj/item/spellbook, /obj/item/staff,
/obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/wizard,
- /obj/item/gun/magic/staff, /obj/item/gun/magic/wand,
/obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain)),
"aliens" = typecacheof(list(
@@ -149,8 +148,7 @@ SUBSYSTEM_DEF(traumas)
"birds" = typecacheof(list(
/obj/item/clothing/mask/gas/plaguedoctor, /obj/item/reagent_containers/food/snacks/cracker,
/obj/item/clothing/suit/chickensuit, /obj/item/clothing/head/chicken,
- /obj/item/clothing/suit/toggle/owlwings, /obj/item/clothing/under/costume/owl, /obj/item/clothing/mask/gas/owl_mask,
- /obj/item/clothing/head/helmet/space/freedom, /obj/item/clothing/suit/space/freedom)),
+ /obj/item/clothing/suit/toggle/owlwings, /obj/item/clothing/under/costume/owl, /obj/item/clothing/mask/gas/owl_mask)),
"anime" = typecacheof(list(
/obj/item/clothing/under/costume/schoolgirl, /obj/item/katana, /obj/item/reagent_containers/food/snacks/sashimi,
diff --git a/code/datums/action.dm b/code/datums/action.dm
index ff03b689085d..de13fc002dde 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -207,6 +207,7 @@
/datum/action/item_action/toggle_firemode
name = "Toggle Firemode"
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
/datum/action/item_action/rcl_col
name = "Change Cable Color"
diff --git a/code/datums/blood_type.dm b/code/datums/blood_type.dm
index 3fb4e4198566..847a7d0b55db 100644
--- a/code/datums/blood_type.dm
+++ b/code/datums/blood_type.dm
@@ -52,10 +52,10 @@
color = "#009696"
compatible_types = list(/datum/blood_type/lizard)
-/datum/blood_type/elzuosa
+/datum/blood_type/elzuose
name = "E"
color = "#7fff7f"
- compatible_types = list(/datum/blood_type/elzuosa)
+ compatible_types = list(/datum/blood_type/elzuose)
/datum/blood_type/synthetic //Blood for synthetic/robotic species
name = "Coolant"
diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm
index c27e0bd1b7ae..60b4db1d1ce9 100644
--- a/code/datums/chatmessage.dm
+++ b/code/datums/chatmessage.dm
@@ -182,7 +182,7 @@
message.maptext = complete_text
// View the message
- LAZYADDASSOC(owned_by.seen_messages, message_loc, src)
+ LAZYADDASSOCLIST(owned_by.seen_messages, message_loc, src)
owned_by.images |= message
animate(message, alpha = 255, time = CHAT_MESSAGE_SPAWN_TIME)
diff --git a/code/datums/cogbar.dm b/code/datums/cogbar.dm
new file mode 100644
index 000000000000..c03daa33a6ab
--- /dev/null
+++ b/code/datums/cogbar.dm
@@ -0,0 +1,88 @@
+#define COGBAR_ANIMATION_TIME (0.5 SECONDS)
+
+/**
+ * ### Cogbar
+ * Represents that the user is busy doing something.
+ */
+/datum/cogbar
+ /// Who's doing the thing
+ var/mob/user
+ /// The user client
+ var/client/user_client
+ /// The visible element to other players
+ var/obj/effect/overlay/vis/cog
+ /// The blank image that overlaps the cog - hides it from the source user
+ var/image/blank
+ /// The offset of the icon
+ //var/offset_y
+
+
+/datum/cogbar/New(mob/user)
+ src.user = user
+ src.user_client = user.client
+
+//Porting oversized icon offsets later, they have too many other unported dependencies. sorry zephyr
+ //var/list/icon_offsets = user.get_oversized_icon_offsets()
+ //offset_y = icon_offsets["y"]
+
+ add_cog_to_user()
+
+ RegisterSignal(user, COMSIG_PARENT_QDELETING, PROC_REF(on_user_delete))
+
+
+/datum/cogbar/Destroy()
+ if(user)
+ SSvis_overlays.remove_vis_overlay(user, user.managed_vis_overlays)
+ user_client?.images -= blank
+
+ user = null
+ user_client = null
+ cog = null
+ QDEL_NULL(blank)
+
+ return ..()
+
+
+/// Adds the cog to the user, visible by other players
+/datum/cogbar/proc/add_cog_to_user()
+ cog = SSvis_overlays.add_vis_overlay(user,
+ icon = 'icons/effects/progressbar.dmi',
+ iconstate = "cog",
+ plane = HIGH_GAME_PLANE,
+ add_appearance_flags = APPEARANCE_UI_IGNORE_ALPHA,
+ unique = TRUE,
+ alpha = 0,
+ )
+ cog.pixel_y = world.icon_size// + offset_y
+ animate(cog, alpha = 255, time = COGBAR_ANIMATION_TIME)
+
+ if(isnull(user_client))
+ return
+
+ blank = image('icons/blanks/32x32.dmi', cog, "nothing")
+ blank.plane = HIGH_GAME_PLANE
+ blank.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
+ blank.override = TRUE
+
+ user_client.images += blank
+
+
+/// Removes the cog from the user
+/datum/cogbar/proc/remove()
+ if(isnull(cog))
+ qdel(src)
+ return
+
+ animate(cog, alpha = 0, time = COGBAR_ANIMATION_TIME)
+
+ QDEL_IN(src, COGBAR_ANIMATION_TIME)
+
+
+/// When the user is deleted, remove the cog
+/datum/cogbar/proc/on_user_delete(datum/source)
+ SIGNAL_HANDLER
+
+ qdel(src)
+
+
+#undef COGBAR_ANIMATION_TIME
diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm
index 1d16391a18e1..d76504787b04 100644
--- a/code/datums/components/_component.dm
+++ b/code/datums/components/_component.dm
@@ -321,10 +321,12 @@
// all the objects that are receiving the signal get the signal this final time.
// AKA: No you can't cancel the signal reception of another object by doing an unregister in the same signal.
var/list/queued_calls = list()
- for(var/datum/listening_datum as anything in target)
- queued_calls[listening_datum] = listening_datum.signal_procs[src][sigtype]
- for(var/datum/listening_datum as anything in queued_calls)
- . |= call(listening_datum, queued_calls[listening_datum])(arglist(arguments))
+ // This should be faster than doing `var/datum/listening_datum as anything in target` as it does not implicitly copy the list
+ for(var/i in 1 to length(target))
+ var/datum/listening_datum = target[i]
+ queued_calls.Add(listening_datum, listening_datum.signal_procs[src][sigtype])
+ for(var/i in 1 to length(queued_calls) step 2)
+ . |= call(queued_calls[i], queued_calls[i + 1])(arglist(arguments))
// The type arg is casted so initial works, you shouldn't be passing a real instance into this
/**
diff --git a/code/datums/components/bandage.dm b/code/datums/components/bandage.dm
new file mode 100644
index 000000000000..16f6a2f0b059
--- /dev/null
+++ b/code/datums/components/bandage.dm
@@ -0,0 +1,60 @@
+#define TREATMENT_DAMAGE_MOD 2
+
+/datum/component/bandage
+ /// How fast do we stop bleeding?
+ var/bleed_reduction = 0
+ /// How many healing ticks will this bandage apply? Reduced by incoming damage and current bleeding
+ var/lifespan = 300
+ var/bandage_name = "gauze"
+ /// The person this bandage is applied to
+ var/mob/living/mummy
+
+/datum/component/bandage/Initialize(_bleed_reduction, _lifespan, _bandage_name)
+ if(!istype(parent, /obj/item/bodypart))
+ return COMPONENT_INCOMPATIBLE
+ var/obj/item/bodypart/BP = parent
+ mummy = BP.owner
+ if(!mummy)
+ return COMPONENT_INCOMPATIBLE
+ if(_bleed_reduction)
+ bleed_reduction = _bleed_reduction
+ if(_lifespan)
+ lifespan = _lifespan
+ if(_bandage_name)
+ bandage_name = _bandage_name
+ RegisterSignal(mummy, COMSIG_MOB_APPLY_DAMGE, PROC_REF(check_damage))
+ RegisterSignal(mummy, COMSIG_MOB_LIFE, PROC_REF(bandage_effects))
+ RegisterSignal(parent, COMSIG_LIVING_DROP_LIMB, PROC_REF(drop_bandage))
+
+/// Checks if damage to the owner is applied to this limb and reduces lifespan (perforated bandages dont work as well)
+/datum/component/bandage/proc/check_damage(attacker, damage, damagetype = BRUTE, def_zone = null)
+ SIGNAL_HANDLER
+
+ if(parent != mummy.get_bodypart(check_zone(def_zone)))
+ return
+ lifespan -= damage / 100 * initial(lifespan) * TREATMENT_DAMAGE_MOD //take incoming damage as a % of durability
+ if(lifespan <= 0)
+ drop_bandage()
+
+/// Handles healing effects and passive lifespan usage
+/datum/component/bandage/proc/bandage_effects()
+ SIGNAL_HANDLER
+
+ var/obj/item/bodypart/heal_target = parent
+ lifespan -= 1 + heal_target.bleeding // particularly nasty bleeding can burn through dressing faster
+ heal_target.adjust_bleeding(-bleed_reduction)
+ if(lifespan <= 0 || !heal_target.bleeding) //remove treatment once it's no longer able to treat
+ drop_bandage(TRUE)
+
+/// Handles deleting the component when the bandage runs out of lifespan or finishes healing. Special = bandage didn't get torn off
+/datum/component/bandage/proc/drop_bandage(special = FALSE)
+ SIGNAL_HANDLER
+
+ var/obj/item/bodypart/BP = parent
+ if(special)
+ to_chat(mummy, span_notice("The [bandage_name] on your [parse_zone(BP.body_zone)] has [BP.bleeding ? "done what it can" : "stopped the bleeding"]."))
+ else
+ to_chat(mummy, span_warning("The [bandage_name] on your [parse_zone(BP.body_zone)] is damaged beyond use!"))
+ qdel(src)
+
+#undef TREATMENT_DAMAGE_MOD
diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm
index 6923760a7705..3032a98dc85c 100644
--- a/code/datums/components/butchering.dm
+++ b/code/datums/components/butchering.dm
@@ -51,10 +51,14 @@
/datum/component/butchering/proc/startButcher(obj/item/source, mob/living/M, mob/living/user)
to_chat(user, "You begin to butcher [M]...")
playsound(M.loc, butcher_sound, 50, TRUE, -1)
- if(do_mob(user, M, speed) && M.Adjacent(source))
+ if(do_after(user, speed, M) && M.Adjacent(source))
Butcher(user, M)
/datum/component/butchering/proc/startNeckSlice(obj/item/source, mob/living/carbon/human/H, mob/living/user)
+ if(DOING_INTERACTION_WITH_TARGET(user, H))
+ to_chat(user, "You're already interacting with [H]!")
+ return
+
user.visible_message("[user] is slitting [H]'s throat!", \
"You start slicing [H]'s throat!", \
"You hear a cutting noise!", ignored_mobs = H)
@@ -63,17 +67,23 @@
log_combat(user, H, "starts slicing the throat of")
playsound(H.loc, butcher_sound, 50, TRUE, -1)
- if(do_mob(user, H, clamp(500 / source.force, 30, 100)) && H.Adjacent(source))
+ if(do_after(user, clamp(500 / source.force, 30, 100), H) && H.Adjacent(source))
if(H.has_status_effect(/datum/status_effect/neck_slice))
user.show_message("[H]'s neck has already been already cut, you can't make the bleeding any worse!", MSG_VISUAL, \
"Their neck has already been already cut, you can't make the bleeding any worse!")
return
+ var/obj/item/bodypart/throat_in_question = H.get_bodypart(BODY_ZONE_HEAD)
+ if(!throat_in_question)
+ user.show_message("[H]... doesn't have a neck.", MSG_VISUAL, \
+ "They don't seem to have a neck to cut.")
+ return
+
H.visible_message("[user] slits [H]'s throat!", \
"[user] slits your throat...")
log_combat(user, H, "finishes slicing the throat of")
H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD)
- H.bleed_rate = clamp(H.bleed_rate + 20, 0, 30)
+ throat_in_question.adjust_bleeding(20)
H.apply_status_effect(/datum/status_effect/neck_slice)
/datum/component/butchering/proc/Butcher(mob/living/butcher, mob/living/meat)
diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm
index 9ec90bf09eac..95bbae56a904 100644
--- a/code/datums/components/crafting/recipes.dm
+++ b/code/datums/components/crafting/recipes.dm
@@ -16,6 +16,7 @@
if(!(result in reqs))
blacklist += result
+
/**
* Run custom pre-craft checks for this recipe
*
@@ -24,1112 +25,3 @@
*/
/datum/crafting_recipe/proc/check_requirements(mob/user, list/collected_requirements)
return TRUE
-
-/datum/crafting_recipe/IED
- name = "IED"
- result = /obj/item/grenade/iedcasing
- reqs = list(/datum/reagent/fuel = 50,
- /obj/item/stack/cable_coil = 1,
- /obj/item/assembly/igniter = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans = 1)
- parts = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1)
- time = 15
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/lance
- name = "Explosive Lance (Grenade)"
- result = /obj/item/spear/explosive
- reqs = list(/obj/item/spear = 1,
- /obj/item/grenade = 1)
- blacklist = list(/obj/item/spear/bonespear)
- parts = list(/obj/item/spear = 1,
- /obj/item/grenade = 1)
- time = 15
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/strobeshield
- name = "Strobe Shield"
- result = /obj/item/shield/riot/flash
- reqs = list(/obj/item/wallframe/flasher = 1,
- /obj/item/assembly/flash/handheld = 1,
- /obj/item/shield/riot = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/strobeshield/New()
- ..()
- blacklist |= subtypesof(/obj/item/shield/riot/)
-
-/datum/crafting_recipe/molotov
- name = "Molotov"
- result = /obj/item/reagent_containers/food/drinks/bottle/molotov
- reqs = list(/obj/item/reagent_containers/glass/rag = 1,
- /obj/item/reagent_containers/food/drinks/bottle = 1)
- parts = list(/obj/item/reagent_containers/food/drinks/bottle = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/stunprod
- name = "Stunprod"
- result = /obj/item/melee/baton/cattleprod
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/stack/rods = 1,
- /obj/item/assembly/igniter = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/teleprod
- name = "Teleprod"
- result = /obj/item/melee/baton/cattleprod/teleprod
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/stack/rods = 1,
- /obj/item/assembly/igniter = 1,
- /obj/item/stack/ore/bluespace_crystal = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/bola
- name = "Bola"
- result = /obj/item/restraints/legcuffs/bola
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/stack/sheet/metal = 6)
- time = 20//15 faster than crafting them by hand!
- category= CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/gonbola
- name = "Gonbola"
- result = /obj/item/restraints/legcuffs/bola/gonbola
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/stack/sheet/metal = 6,
- /obj/item/stack/sheet/animalhide/gondola = 1)
- time = 40
- category= CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/ed209
- name = "ED209"
- result = /mob/living/simple_animal/bot/secbot/ed209
- reqs = list(/obj/item/robot_suit = 1,
- /obj/item/clothing/head/helmet = 1,
- /obj/item/clothing/suit/armor/vest = 1,
- /obj/item/bodypart/leg/left/robot = 1,
- /obj/item/bodypart/leg/right/robot = 1,
- /obj/item/stack/sheet/metal = 1,
- /obj/item/stack/cable_coil = 1,
- /obj/item/gun/energy/disabler = 1,
- /obj/item/assembly/prox_sensor = 1)
- tools = list(TOOL_WELDER, TOOL_SCREWDRIVER)
- time = 60
- category = CAT_ROBOT
-
-/datum/crafting_recipe/secbot
- name = "Secbot"
- result = /mob/living/simple_animal/bot/secbot
- reqs = list(/obj/item/assembly/signaler = 1,
- /obj/item/clothing/head/helmet/sec = 1,
- /obj/item/melee/baton = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
- tools = list(TOOL_WELDER)
- time = 60
- category = CAT_ROBOT
-
-/datum/crafting_recipe/cleanbot
- name = "Cleanbot"
- result = /mob/living/simple_animal/bot/cleanbot
- reqs = list(/obj/item/reagent_containers/glass/bucket = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
- time = 40
- category = CAT_ROBOT
-
-/datum/crafting_recipe/floorbot
- name = "Floorbot"
- result = /mob/living/simple_animal/bot/floorbot
- reqs = list(/obj/item/storage/toolbox = 1,
- /obj/item/stack/tile/plasteel = 10,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
- time = 40
- category = CAT_ROBOT
-
-/datum/crafting_recipe/medbot
- name = "Medbot"
- result = /mob/living/simple_animal/bot/medbot
- reqs = list(/obj/item/healthanalyzer = 1,
- /obj/item/storage/firstaid = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
- time = 40
- category = CAT_ROBOT
-
-/datum/crafting_recipe/honkbot
- name = "Honkbot"
- result = /mob/living/simple_animal/bot/honkbot
- reqs = list(/obj/item/storage/box/clown = 1,
- /obj/item/bodypart/r_arm/robot = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/bikehorn/ = 1)
- time = 40
- category = CAT_ROBOT
-
-/datum/crafting_recipe/Firebot
- name = "Firebot"
- result = /mob/living/simple_animal/bot/firebot
- reqs = list(/obj/item/extinguisher = 1,
- /obj/item/bodypart/r_arm/robot = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/clothing/head/hardhat/red = 1)
- time = 40
- category = CAT_ROBOT
-
-/datum/crafting_recipe/Vibebot
- name = "Vibebot"
- result = /mob/living/simple_animal/bot/vibebot
- reqs = list(/obj/item/light/bulb = 2,
- /obj/item/bodypart/head/robot = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/toy/crayon = 1)
- time = 40
- category = CAT_ROBOT
-
-/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
- name = "Pneumatic Cannon"
- result = /obj/item/pneumatic_cannon/ghetto
- tools = list(TOOL_WELDER, TOOL_WRENCH)
- reqs = list(/obj/item/stack/sheet/metal = 4,
- /obj/item/stack/packageWrap = 8,
- /obj/item/pipe = 2)
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/flamethrower
- name = "Flamethrower"
- result = /obj/item/flamethrower
- reqs = list(/obj/item/weldingtool = 1,
- /obj/item/assembly/igniter = 1,
- /obj/item/stack/rods = 1)
- parts = list(/obj/item/assembly/igniter = 1,
- /obj/item/weldingtool = 1)
- tools = list(TOOL_SCREWDRIVER)
- time = 10
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/meteorslug
- name = "Meteorslug Shell"
- result = /obj/item/ammo_casing/shotgun/meteorslug
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/rcd_ammo = 1,
- /obj/item/stock_parts/manipulator = 2)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/pulseslug
- name = "Pulse Slug Shell"
- result = /obj/item/ammo_casing/shotgun/pulseslug
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/capacitor/adv = 2,
- /obj/item/stock_parts/micro_laser/ultra = 1)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/dragonsbreath
- name = "Dragonsbreath Shell"
- result = /obj/item/ammo_casing/shotgun/dragonsbreath
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/frag12
- name = "FRAG-12 Shell"
- result = /obj/item/ammo_casing/shotgun/frag12
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /datum/reagent/glycerol = 5,
- /datum/reagent/toxin/acid = 5,
- /datum/reagent/toxin/acid/fluacid = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/ionslug
- name = "Ion Scatter Shell"
- result = /obj/item/ammo_casing/shotgun/ion
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/micro_laser/ultra = 1,
- /obj/item/stock_parts/subspace/crystal = 1)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/improvisedslug
- name = "Improvised Shotgun Shell"
- result = /obj/item/ammo_casing/shotgun/improvised
- reqs = list(/obj/item/stack/sheet/metal = 2,
- /obj/item/stack/cable_coil = 1,
- /datum/reagent/fuel = 10)
- tools = list(TOOL_SCREWDRIVER)
- time = 12
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/laserscatter
- name = "Scatter Laser Shell"
- result = /obj/item/ammo_casing/shotgun/laserscatter
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/capacitor/adv = 1,
- /obj/item/stock_parts/micro_laser/high = 1)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/ishotgun
- name = "Improvised Shotgun"
- result = /obj/item/gun/ballistic/shotgun/doublebarrel/improvised
- reqs = list(/obj/item/weaponcrafting/receiver = 1,
- /obj/item/pipe = 1,
- /obj/item/weaponcrafting/stock = 1,
- /obj/item/stack/packageWrap = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/chainsaw
- name = "Chainsaw"
- result = /obj/item/chainsaw
- reqs = list(/obj/item/circular_saw = 1,
- /obj/item/stack/cable_coil = 3,
- /obj/item/stack/sheet/plasteel = 5)
- tools = list(TOOL_WELDER)
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/spear
- name = "Spear"
- result = /obj/item/spear
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/shard = 1,
- /obj/item/stack/rods = 1)
- parts = list(/obj/item/shard = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/spooky_camera
- name = "Camera Obscura"
- result = /obj/item/camera/spooky
- time = 15
- reqs = list(/obj/item/camera = 1,
- /datum/reagent/water/holywater = 10)
- parts = list(/obj/item/camera = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/skateboard
- name = "Skateboard"
- result = /obj/vehicle/ridden/scooter/skateboard
- time = 60
- reqs = list(/obj/item/stack/sheet/metal = 5,
- /obj/item/stack/rods = 10)
- category = CAT_MISC
-
-/datum/crafting_recipe/scooter
- name = "Scooter"
- result = /obj/vehicle/ridden/scooter
- time = 65
- reqs = list(/obj/item/stack/sheet/metal = 5,
- /obj/item/stack/rods = 12)
- category = CAT_MISC
-
-/datum/crafting_recipe/wheelchair
- name = "Wheelchair"
- result = /obj/vehicle/ridden/wheelchair
- reqs = list(/obj/item/stack/sheet/metal = 4,
- /obj/item/stack/rods = 6)
- time = 100
- category = CAT_MISC
-
-/datum/crafting_recipe/motorized_wheelchair
- name = "Motorized Wheelchair"
- result = /obj/vehicle/ridden/wheelchair/motorized
- reqs = list(/obj/item/stack/sheet/metal = 10,
- /obj/item/stack/rods = 8,
- /obj/item/stock_parts/manipulator = 2,
- /obj/item/stock_parts/capacitor = 1)
- parts = list(/obj/item/stock_parts/manipulator = 2,
- /obj/item/stock_parts/capacitor = 1)
- tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH)
- time = 200
- category = CAT_MISC
-
-/datum/crafting_recipe/mousetrap
- name = "Mouse Trap"
- result = /obj/item/assembly/mousetrap
- time = 10
- reqs = list(/obj/item/stack/sheet/cardboard = 1,
- /obj/item/stack/rods = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/papersack
- name = "Paper Sack"
- result = /obj/item/storage/box/papersack
- time = 10
- reqs = list(/obj/item/paper = 5)
- category = CAT_MISC
-
-
-/datum/crafting_recipe/flashlight_eyes
- name = "Flashlight Eyes"
- result = /obj/item/organ/eyes/robotic/flashlight
- time = 10
- reqs = list(
- /obj/item/flashlight = 2,
- /obj/item/restraints/handcuffs/cable = 1
- )
- category = CAT_MISC
-
-/datum/crafting_recipe/paperframes
- name = "Paper Frames"
- result = /obj/item/stack/sheet/paperframes/five
- time = 10
- reqs = list(/obj/item/stack/sheet/mineral/wood = 5, /obj/item/paper = 20)
- category = CAT_MISC
-
-/datum/crafting_recipe/naturalpaper
- name = "Hand-Pressed Paper"
- time = 30
- reqs = list(/datum/reagent/water = 50, /obj/item/stack/sheet/mineral/wood = 1)
- tools = list(/obj/item/hatchet)
- result = /obj/item/paper_bin/bundlenatural
- category = CAT_MISC
-
-/datum/crafting_recipe/toysword
- name = "Toy Sword"
- reqs = list(/obj/item/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
- result = /obj/item/toy/sword
- category = CAT_MISC
-
-/datum/crafting_recipe/blackcarpet
- name = "Black Carpet"
- reqs = list(/obj/item/stack/tile/carpet = 50, /obj/item/toy/crayon/black = 1)
- result = /obj/item/stack/tile/carpet/black/fifty
- category = CAT_MISC
-
-/datum/crafting_recipe/curtain
- name = "Curtains"
- reqs = list(/obj/item/stack/sheet/cotton/cloth = 4, /obj/item/stack/rods = 1)
- result = /obj/structure/curtain/cloth
- category = CAT_MISC
-
-/datum/crafting_recipe/showercurtain
- name = "Shower Curtains"
- reqs = list(/obj/item/stack/sheet/cotton/cloth = 2, /obj/item/stack/sheet/plastic = 2, /obj/item/stack/rods = 1)
- result = /obj/structure/curtain
- category = CAT_MISC
-
-/datum/crafting_recipe/extendohand
- name = "Extendo-Hand"
- reqs = list(/obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1)
- result = /obj/item/extendohand
- category = CAT_MISC
-
-/datum/crafting_recipe/chemical_payload
- name = "Chemical Payload (C4)"
- result = /obj/item/bombcore/chemical
- reqs = list(
- /obj/item/stock_parts/matter_bin = 1,
- /obj/item/grenade/c4 = 1,
- /obj/item/grenade/chem_grenade = 2
- )
- parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
- time = 30
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/chemical_payload2
- name = "Chemical Payload (Gibtonite)"
- result = /obj/item/bombcore/chemical
- reqs = list(
- /obj/item/stock_parts/matter_bin = 1,
- /obj/item/gibtonite = 1,
- /obj/item/grenade/chem_grenade = 2
- )
- parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/bonearmor
- name = "Bone Armor"
- result = /obj/item/clothing/suit/armor/bone
- time = 30
- reqs = list(/obj/item/stack/sheet/bone = 6)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonetalisman
- name = "Bone Talisman"
- result = /obj/item/clothing/accessory/talisman
- time = 20
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/stack/sheet/sinew = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonenecklace
- name = "Hunter's Necklace"
- result = /obj/item/clothing/accessory/wolftalisman
- time = 35
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/stack/sheet/sinew = 3,
- /obj/item/crusher_trophy/wolf_ear = 2,
- /obj/item/crusher_trophy/fang = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonecodpiece
- name = "Skull Codpiece"
- result = /obj/item/clothing/accessory/skullcodpiece
- time = 20
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/crusher_trophy/legion_skull = 1,
- /obj/item/stack/sheet/animalhide/goliath_hide = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonestaff
- name = "Legion Staff"
- result = /obj/item/legion_staff
- time = 35
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/crusher_trophy/legion_skull = 2,\
- /obj/item/crusher_trophy/dwarf_skull = 1,
- /obj/item/organ/regenerative_core/legion = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/skilt
- name = "Sinew Kilt"
- result = /obj/item/clothing/accessory/skilt
- time = 20
- reqs = list(/obj/item/stack/sheet/bone = 1,
- /obj/item/stack/sheet/sinew = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bracers
- name = "Bone Bracers"
- result = /obj/item/clothing/gloves/bracer
- time = 20
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/stack/sheet/sinew = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/skullhelm
- name = "Skull Helmet"
- result = /obj/item/clothing/head/helmet/skull
- time = 30
- reqs = list(/obj/item/stack/sheet/bone = 4)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/goliathcloak
- name = "Goliath Cloak"
- result = /obj/item/clothing/suit/hooded/cloak/goliath
- time = 50
- reqs = list(/obj/item/stack/sheet/leather = 2,
- /obj/item/stack/sheet/sinew = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/drakecloak
- name = "Ash Drake Armour"
- result = /obj/item/clothing/suit/hooded/cloak/drake
- time = 60
- reqs = list(/obj/item/stack/sheet/bone = 10,
- /obj/item/stack/sheet/sinew = 2,
- /obj/item/stack/sheet/animalhide/ashdrake = 5)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/firebrand
- name = "Firebrand"
- result = /obj/item/match/firebrand
- time = 100 //Long construction time. Making fire is hard work.
- reqs = list(/obj/item/stack/sheet/mineral/wood = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/gold_horn
- name = "Golden Bike Horn"
- result = /obj/item/bikehorn/golden
- time = 20
- reqs = list(/obj/item/stack/sheet/mineral/bananium = 5,
- /obj/item/bikehorn = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/bonedagger
- name = "Bone Dagger"
- result = /obj/item/kitchen/knife/combat/bone
- time = 20
- reqs = list(/obj/item/stack/sheet/bone = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonespear
- name = "Bone Spear"
- result = /obj/item/spear/bonespear
- time = 30
- reqs = list(/obj/item/stack/sheet/bone = 4,
- /obj/item/stack/sheet/sinew = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/boneaxe
- name = "Bone Axe"
- result = /obj/item/fireaxe/boneaxe
- time = 50
- reqs = list(/obj/item/stack/sheet/bone = 6,
- /obj/item/stack/sheet/sinew = 3)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonfire
- name = "Bonfire"
- time = 60
- reqs = list(/obj/item/grown/log = 5)
- parts = list(/obj/item/grown/log = 5)
- blacklist = list(/obj/item/grown/log/steel)
- result = /obj/structure/bonfire
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/rake //Category resorting incoming
- name = "Rake"
- time = 30
- reqs = list(/obj/item/stack/sheet/mineral/wood = 5)
- result = /obj/item/cultivator/rake
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/woodbucket
- name = "Wooden Bucket"
- time = 30
- reqs = list(/obj/item/stack/sheet/mineral/wood = 3)
- result = /obj/item/reagent_containers/glass/bucket/wooden
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/headpike
- name = "Spike Head (Glass Spear)"
- time = 65
- reqs = list(/obj/item/spear = 1,
- /obj/item/bodypart/head = 1)
- parts = list(/obj/item/bodypart/head = 1,
- /obj/item/spear = 1)
- blacklist = list(/obj/item/spear/explosive, /obj/item/spear/bonespear)
- result = /obj/structure/headpike
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/legionpike
- name = "Legion on a Spear"
- time = 55
- reqs = list(/obj/item/spear = 1,
- /obj/item/organ/regenerative_core = 1,
- /obj/item/crusher_trophy/legion_skull = 2)
- result = /obj/structure/legionpike
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/tribal_torch
- name = "Tribal Torch"
- result = /obj/item/candle/tribal_torch
- time = 30
- reqs = list(/obj/item/stack/sheet/mineral/wood = 4)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/headpikebone
- name = "Spike Head (Bone Spear)"
- time = 65
- reqs = list(/obj/item/spear/bonespear = 1,
- /obj/item/bodypart/head = 1)
- parts = list(/obj/item/bodypart/head = 1,
- /obj/item/spear/bonespear = 1)
- result = /obj/structure/headpike/bone
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/pressureplate
- name = "Pressure Plate"
- result = /obj/item/pressure_plate
- time = 5
- reqs = list(/obj/item/stack/sheet/metal = 1,
- /obj/item/stack/tile/plasteel = 1,
- /obj/item/stack/cable_coil = 2,
- /obj/item/assembly/igniter = 1)
- category = CAT_MISC
-
-
-/datum/crafting_recipe/rcl
- name = "Makeshift Rapid Pipe Cleaner Layer"
- result = /obj/item/rcl/ghetto
- time = 40
- tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH)
- reqs = list(/obj/item/stack/sheet/metal = 15)
- category = CAT_MISC
-
-/datum/crafting_recipe/mummy
- name = "Mummification Bandages (Mask)"
- result = /obj/item/clothing/mask/mummy
- time = 10
- tools = list(/obj/item/nullrod/egyptian)
- reqs = list(/obj/item/stack/sheet/cotton/cloth = 2)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/mummy/body
- name = "Mummification Bandages (Body)"
- result = /obj/item/clothing/under/costume/mummy
- reqs = list(/obj/item/stack/sheet/cotton/cloth = 5)
-
-/datum/crafting_recipe/chaplain_hood
- name = "Follower Hoodie"
- result = /obj/item/clothing/suit/hooded/chaplain_hoodie
- time = 10
- tools = list(/obj/item/clothing/suit/hooded/chaplain_hoodie, /obj/item/storage/book/bible)
- reqs = list(/obj/item/stack/sheet/cotton/cloth = 4)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/guillotine
- name = "Guillotine"
- result = /obj/structure/guillotine
- time = 150 // Building a functioning guillotine takes time
- reqs = list(/obj/item/stack/sheet/plasteel = 3,
- /obj/item/stack/sheet/mineral/wood = 20,
- /obj/item/stack/cable_coil = 10)
- tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
- category = CAT_MISC
-
-/datum/crafting_recipe/aitater
- name = "intelliTater"
- result = /obj/item/aicard/aitater
- time = 30
- tools = list(TOOL_WIRECUTTER)
- reqs = list(/obj/item/aicard = 1,
- /obj/item/reagent_containers/food/snacks/grown/potato = 1,
- /obj/item/stack/cable_coil = 5)
- category = CAT_MISC
-
-/datum/crafting_recipe/aitater/check_requirements(mob/user, list/collected_requirements)
- var/obj/item/aicard/aicard = collected_requirements[/obj/item/aicard][1]
- if(!aicard.AI)
- return TRUE
-
- to_chat(user, "You can't craft an intelliTater with an AI in the card!")
- return FALSE
-
-/datum/crafting_recipe/aispook
- name = "intelliLantern"
- result = /obj/item/aicard/aispook
- time = 30
- tools = list(TOOL_WIRECUTTER)
- reqs = list(/obj/item/aicard = 1,
- /obj/item/reagent_containers/food/snacks/grown/pumpkin = 1,
- /obj/item/stack/cable_coil = 5)
- category = CAT_MISC
-
-/datum/crafting_recipe/ghettojetpack
- name = "Improvised Jetpack"
- result = /obj/item/tank/jetpack/improvised
- time = 30
- reqs = list(/obj/item/tank/internals/oxygen = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = MAXCOIL)
- category = CAT_MISC
- tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER)
-
-/datum/crafting_recipe/multiduct
- name = "Multi-layer duct"
- result = /obj/machinery/duct/multilayered
- time = 5
- reqs = list(/obj/item/stack/ducts = 5)
- category = CAT_MISC
- tools = list(TOOL_WELDER)
-
-/datum/crafting_recipe/rib
- name = "Collosal Rib"
- always_availible = FALSE
- reqs = list(
- /obj/item/stack/sheet/bone = 10,
- /datum/reagent/fuel/oil = 5)
- result = /obj/structure/statue/bone/rib
- subcategory = CAT_PRIMAL
-
-/datum/crafting_recipe/skull
- name = "Skull Carving"
- always_availible = FALSE
- reqs = list(
- /obj/item/stack/sheet/bone = 6,
- /datum/reagent/fuel/oil = 5)
- result = /obj/structure/statue/bone/skull
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/halfskull
- name = "Cracked Skull Carving"
- always_availible = FALSE
- reqs = list(
- /obj/item/stack/sheet/bone = 3,
- /datum/reagent/fuel/oil = 5)
- result = /obj/structure/statue/bone/skull/half
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/boneshovel
- name = "Serrated Bone Shovel"
- always_availible = FALSE
- reqs = list(
- /obj/item/stack/sheet/bone = 4,
- /datum/reagent/fuel/oil = 5,
- /obj/item/shovel/spade = 1)
- result = /obj/item/shovel/serrated
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/lasso
- name = "Bone Lasso"
- reqs = list(
- /obj/item/stack/sheet/bone = 1,
- /obj/item/stack/sheet/sinew = 5)
- result = /obj/item/key/lasso
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/gripperoffbrand
- name = "Improvised Gripper Gloves"
- reqs = list(
- /obj/item/clothing/gloves/fingerless = 1,
- /obj/item/stack/tape = 1)
- result = /obj/item/clothing/gloves/tackler/offbrand
- category = CAT_CLOTHING
-
-/*WS edit - Normal BoH
-/datum/crafting_recipe/boh
- name = "Bag of Holding"
- reqs = list(
- /obj/item/bag_of_holding_inert = 1,
- /obj/item/assembly/signaler/anomaly/bluespace = 1)
- result = /obj/item/storage/backpack/holding
- category = CAT_CLOTHING
-*/
-
-/datum/crafting_recipe/ipickaxe
- name = "Improvised Pickaxe"
- reqs = list(
- /obj/item/crowbar = 1,
- /obj/item/kitchen/knife = 1,
- /obj/item/stack/tape = 1)
- result = /obj/item/pickaxe/improvised
- category = CAT_MISC
-
-/datum/crafting_recipe/chem_scanner
- name = "Reagent Scanner"
- time = 30
- tools = list(TOOL_WIRECUTTER, TOOL_SCREWDRIVER)
- reqs = list(
- /obj/item/healthanalyzer = 1,
- /obj/item/stack/cable_coil = 5,
- /obj/item/stock_parts/scanning_module = 1)
- result = /obj/item/reagent_scanner
- category = CAT_MISC
-
-/datum/crafting_recipe/filter
- name = "Seperatory Funnel"
- time = 40
- tools = list(TOOL_WELDER, TOOL_WIRECUTTER)
- reqs = list(
- /obj/item/stack/cable_coil = 1,
- /obj/item/reagent_containers/glass/beaker = 3)
- result = /obj/item/reagent_containers/glass/filter
- category = CAT_MISC
-
-/datum/crafting_recipe/dragonspear
- name = "Dragonslayer's Spear"
- result = /obj/item/spear/dragonspear
- time = 45
- reqs = list(/obj/item/crusher_trophy/ash_spike = 1,
- /obj/item/crusher_trophy/tail_spike = 2,
- /obj/item/stack/sheet/bone = 5,
- /obj/item/stack/sheet/sinew = 3)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/splint
- name = "Makeshift Splint"
- reqs = list(
- /obj/item/stack/rods = 2,
- /obj/item/stack/sheet/cotton/cloth = 4)
- result = /obj/item/stack/medical/splint/ghetto
- category = CAT_MISC
-
-/datum/crafting_recipe/cwzippo
- name = "Clockwork Zippo"
- reqs = list(
- /obj/item/lighter = 1,
- /obj/item/stack/tile/bronze = 5)
- result = /obj/item/lighter/clockwork
- category = CAT_MISC
-
-/datum/crafting_recipe/pipebow
- name = "Pipe Bow"
- result = /obj/item/gun/ballistic/bow/pipe
- reqs = list(/obj/item/pipe = 5,
- /obj/item/stack/sheet/plastic = 15,
- /obj/item/weaponcrafting/silkstring = 10)
- time = 450
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/arrow
- name = "Arrow"
- result = /obj/item/ammo_casing/caseless/arrow/wood
- time = 30
- reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
- /obj/item/stack/sheet/silk = 1,
- /obj/item/stack/rods = 1) //1 metal sheet = 2 rods= 2 arrows
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/bone_arrow
- name = "Bone Arrow"
- result = /obj/item/ammo_casing/caseless/arrow/bone
- time = 30
- reqs = list(/obj/item/stack/sheet/bone = 1,
- /obj/item/stack/sheet/sinew = 1,
- /obj/item/ammo_casing/caseless/arrow/ash = 1)
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/ashen_arrow
- name = "Fire hardened arrow"
- result = /obj/item/ammo_casing/caseless/arrow/ash
- tools = list(TOOL_WELDER)
- time = 30
- reqs = list(/obj/item/ammo_casing/caseless/arrow/wood = 1)
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/bronze_arrow
- name = "Bronze arrow"
- result = /obj/item/ammo_casing/caseless/arrow/bronze
- time = 30
- reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
- /obj/item/stack/tile/bronze = 1,
- /obj/item/stack/sheet/silk = 1)
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/heavybonearmor
- name = "Heavy Bone Armor"
- result = /obj/item/clothing/suit/hooded/cloak/bone
- time = 60
- reqs = list(/obj/item/stack/sheet/bone = 8,
- /obj/item/stack/sheet/sinew = 3)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/watcherbola
- name = "Watcher Bola"
- result = /obj/item/restraints/legcuffs/bola/watcher
- time = 30
- reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 2,
- /obj/item/restraints/handcuffs/cable/sinew = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/goliathshield
- name = "Goliath shield"
- result = /obj/item/shield/riot/goliath
- time = 60
- reqs = list(/obj/item/stack/sheet/bone = 4,
- /obj/item/stack/sheet/animalhide/goliath_hide = 3)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonesword
- name = "Bone Sword"
- result = /obj/item/claymore/bone
- time = 40
- reqs = list(/obj/item/stack/sheet/bone = 3,
- /obj/item/stack/sheet/sinew = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/hunterbelt
- name = "Hunters Belt"
- result = /obj/item/storage/belt/mining/primitive
- time = 20
- reqs = list(/obj/item/stack/sheet/sinew = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/quiver
- name = "Quiver"
- result = /obj/item/storage/bag/quiver/empty
- time = 80
- reqs = list(/obj/item/stack/sheet/leather = 3,
- /obj/item/stack/sheet/sinew = 4)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bone_bow
- name = "Bone Bow"
- result = /obj/item/gun/ballistic/bow/ashen
- time = 200
- reqs = list(/obj/item/stack/sheet/bone = 8,
- /obj/item/stack/sheet/sinew = 4)
- category = CAT_PRIMAL
-/datum/crafting_recipe/boneclub
- name = "Bone Club"
- result = /obj/item/melee/baseball_bat/bone
- time = 40
- reqs = list(/obj/item/stack/sheet/bone = 6)
- category = CAT_PRIMAL
-/datum/crafting_recipe/polarbearcloak
- name = "Polar Cloak"
- result = /obj/item/clothing/suit/hooded/cloak/goliath/polar
- time = 50
- reqs = list(/obj/item/stack/sheet/leather = 2,
- /obj/item/stack/sheet/sinew = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 2)
- blacklist = list(/obj/item/stack/sheet/animalhide/goliath_hide)
- category = CAT_PRIMAL
-/datum/crafting_recipe/portableseedextractor
- name = "Portable seed extractor"
- reqs = list(
- /obj/item/storage/bag/plants = 1,
- /obj/item/plant_analyzer = 1,
- /obj/item/stock_parts/manipulator = 1,
- /obj/item/stack/cable_coil = 2)
- result = /obj/item/storage/bag/plants/portaseeder //this will probably mean that you can craft portable seed extractors into themselves, sending the other materials into the void, but we still don't have a solution for recipes involving radios stealing your headset, so this is officially not my problem. "no, Tills-The-Soil, adding more analyzers and micro-manipulators to your portable seed extractor does not make it make more seeds. in fact it does exactly nothing."
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- category = CAT_MISC
-
-/datum/crafting_recipe/zip_pistol
- name = "Zip Pistol"
- result = /obj/item/gun/ballistic/automatic/zip_pistol
- reqs = list(/obj/item/stack/rods = 4,
- /obj/item/pipe = 1,
- /obj/item/stack/cable_coil = 15,
- /obj/item/weaponcrafting/receiver = 1,
- /obj/item/floor_painter = 1,
- /obj/item/stack/packageWrap = 10)
- tools = list(TOOL_SCREWDRIVER)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/scrap_armor
- name = "Scrap Armor"
- result = /obj/item/clothing/suit/armor/vest/scrap_armor
- time = 60
- reqs = list(
- /obj/item/stack/sheet/metal = 10,
- /obj/item/stack/cable_coil = 20,
- )
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/umbrellared
- name = "Red Drink Umbrella"
- result = /obj/item/garnish/umbrellared
- time = 1 SECONDS
- tools = list(/obj/item/toy/crayon/spraycan)
- reqs = list(
- /obj/item/paper = 1,
- /obj/item/stack/rods = 1)
- category = CAT_DRINK
-
-/datum/crafting_recipe/umbrellablue
- name = "Blue Drink Umbrella"
- result = /obj/item/garnish/umbrellablue
- time = 1 SECONDS
- tools = list(/obj/item/toy/crayon/spraycan)
- reqs = list(
- /obj/item/paper = 1,
- /obj/item/stack/rods = 1)
- category = CAT_DRINK
-
-/datum/crafting_recipe/umbrellagreen
- name = "Green Drink Umbrella"
- result = /obj/item/garnish/umbrellagreen
- time = 1 SECONDS
- tools = list(/obj/item/toy/crayon/spraycan)
- reqs = list(
- /obj/item/paper = 1,
- /obj/item/stack/rods = 1)
- category = CAT_DRINK
-
-/datum/crafting_recipe/ash_garnish
- name = "Ash Garnish"
- result = /obj/item/garnish/ash
- reqs = list(/datum/reagent/ash = 10)
- time = 5
- category = CAT_DRINK
-
-/datum/crafting_recipe/salt_garnish
- name = "Salt Garnish"
- result = /obj/item/garnish/salt
- reqs = list(/datum/reagent/consumable/sodiumchloride = 10)
- time = 5
- category = CAT_DRINK
-
-/datum/crafting_recipe/crystalamulet
- name = "Crystal Amulet"
- result = /obj/item/clothing/neck/crystal_amulet
- time = 4 SECONDS
- reqs = list(/obj/item/strange_crystal = 3)
- category = CAT_MISC
-
-/datum/crafting_recipe/crystalspear
- name = "Crystal Spear"
- result = /obj/item/spear/crystal
- time = 4 SECONDS
- reqs = list(/obj/item/strange_crystal = 2)
- category = CAT_MISC
-
-/datum/crafting_recipe/freezer
- name = "Freezer"
- result = /obj/structure/closet/crate/freezer
- time = 2 SECONDS
- reqs = list(/datum/reagent/consumable/ice = 25,
- /obj/item/stack/sheet/metal = 2)
- category = CAT_MISC
-
-/datum/crafting_recipe/aquarium
- name = "Aquarium"
- result = /obj/structure/aquarium
- time = 10 SECONDS
- reqs = list(/obj/item/stack/sheet/metal = 15,
- /obj/item/stack/sheet/glass = 10,
- /obj/item/aquarium_kit = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/mothplush
- name = "Moth Plushie"
- result = /obj/item/toy/plush/moth
- reqs = list(/obj/item/stack/sheet/animalhide/mothroach = 1,
- /obj/item/organ/heart = 1,
- /obj/item/stack/sheet/cotton/cloth = 3)
- category = CAT_MISC
-
-/datum/crafting_recipe/breakawayflask
- name = "Breakaway Flask"
- result = /obj/item/reagent_containers/food/drinks/breakawayflask
- time = 5 SECONDS
- reqs = list(/obj/item/stack/sheet/glass = 5,
- /obj/item/stack/sheet/mineral/plasma = 1)
- tools = list(TOOL_WELDER)
- category = CAT_DRINK
-
-/datum/crafting_recipe/fermenting_barrel
- name = "Wooden Barrel"
- result = /obj/structure/fermenting_barrel
- reqs = list(/obj/item/stack/sheet/mineral/wood = 8)
- time = 50
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/distiller
- name = "Distiller"
- result = /obj/structure/fermenting_barrel/distiller
- reqs = list(/obj/item/stack/sheet/mineral/wood = 8, /obj/item/stack/sheet/metal = 5, /datum/reagent/srm_bacteria = 30)
- time = 50
- category = CAT_PRIMAL
diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/recipes/clothing.dm
similarity index 69%
rename from code/datums/components/crafting/tailoring.dm
rename to code/datums/components/crafting/recipes/clothing.dm
index 4caaa55ded29..95b37502bcaf 100644
--- a/code/datums/components/crafting/tailoring.dm
+++ b/code/datums/components/crafting/recipes/clothing.dm
@@ -73,14 +73,6 @@
)
category = CAT_CLOTHING
-/datum/crafting_recipe/hudsunsecremoval
- name = "Security HUD removal"
- result = /obj/item/clothing/glasses/sunglasses
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1)
- category = CAT_CLOTHING
-
/datum/crafting_recipe/hudsunmed
name = "Medical HUDsunglasses"
result = /obj/item/clothing/glasses/hud/health/sunglasses
@@ -93,14 +85,6 @@
)
category = CAT_CLOTHING
-/datum/crafting_recipe/hudsunmedremoval
- name = "Medical HUD removal"
- result = /obj/item/clothing/glasses/sunglasses
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/hud/health/sunglasses = 1)
- category = CAT_CLOTHING
-
/datum/crafting_recipe/hudsundiag
name = "Diagnostic HUDsunglasses"
result = /obj/item/clothing/glasses/hud/diagnostic/sunglasses
@@ -113,14 +97,6 @@
)
category = CAT_CLOTHING
-/datum/crafting_recipe/hudsundiagremoval
- name = "Diagnostic HUD removal"
- result = /obj/item/clothing/glasses/sunglasses
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/hud/diagnostic/sunglasses = 1)
- category = CAT_CLOTHING
-
/datum/crafting_recipe/sciencesunglasses
name = "Science Sunglasses"
result = /obj/item/clothing/glasses/sunglasses/chemical
@@ -133,14 +109,6 @@
)
category = CAT_CLOTHING
-/datum/crafting_recipe/sciencesunglassesremoval
- name = "Science Sunglasses Dissemble"
- result = /obj/item/clothing/glasses/sunglasses
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/sunglasses/reagent = 1)
- category = CAT_CLOTHING
-
/datum/crafting_recipe/medhudglasses // The prescription HUD glasses. This long to have them... #Lianvee
name = "MedicalHUD Prescription Glasses"
result = /obj/item/clothing/glasses/hud/health/prescription
@@ -153,14 +121,6 @@
)
category = CAT_CLOTHING
-/datum/crafting_recipe/medhudglassesremoval
- name = "MedicalHUD Prescription Glasses Disassembly"
- result = /obj/item/clothing/glasses/regular
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/hud/health/prescription = 1)
- category = CAT_CLOTHING
-
/datum/crafting_recipe/sechudglasses
name = "SecurityHUD Prescription Glasses"
result = /obj/item/clothing/glasses/hud/security/prescription
@@ -173,14 +133,6 @@
)
category = CAT_CLOTHING
-/datum/crafting_recipe/sechudglassesremoval
- name = "SecurityHUD Prescription Glasses Disassembly"
- result = /obj/item/clothing/glasses/regular
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/hud/security/prescription = 1)
- category = CAT_CLOTHING
-
/datum/crafting_recipe/mesonglasses
name = "Meson Prescription Glasses"
result = /obj/item/clothing/glasses/meson/prescription
@@ -193,14 +145,6 @@
)
category = CAT_CLOTHING
-/datum/crafting_recipe/mesonglassesremoval
- name = "Meson Prescription Glasses Disassembly"
- result = /obj/item/clothing/glasses/regular
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/meson/prescription = 1)
- category = CAT_CLOTHING
-
/datum/crafting_recipe/scienceglasses
name = "Science Prescription Glasses"
result = /obj/item/clothing/glasses/science/prescription
@@ -213,14 +157,6 @@
)
category = CAT_CLOTHING
-/datum/crafting_recipe/scienceglassesremoval
- name = "Science Prescription Glasses Disassembly"
- result = /obj/item/clothing/glasses/regular
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/science/prescription = 1)
- category = CAT_CLOTHING
-
// Misc.
/datum/crafting_recipe/ghostsheet
name = "Ghost Sheet"
@@ -236,3 +172,21 @@
reqs = list(/obj/item/stack/sheet/leather = 2)
time = 45
category = CAT_CLOTHING
+
+/datum/crafting_recipe/gripperoffbrand
+ name = "Improvised Gripper Gloves"
+ reqs = list(
+ /obj/item/clothing/gloves/fingerless = 1,
+ /obj/item/stack/tape = 1)
+ result = /obj/item/clothing/gloves/tackler/offbrand
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/scrap_armor
+ name = "Scrap Armor"
+ result = /obj/item/clothing/suit/armor/vest/scrap_armor
+ time = 60
+ reqs = list(
+ /obj/item/stack/sheet/metal = 10,
+ /obj/item/stack/cable_coil = 20,
+ )
+ category = CAT_CLOTHING
diff --git a/code/datums/components/crafting/recipes/drink.dm b/code/datums/components/crafting/recipes/drink.dm
new file mode 100644
index 000000000000..5ca6d14814c1
--- /dev/null
+++ b/code/datums/components/crafting/recipes/drink.dm
@@ -0,0 +1,52 @@
+/datum/crafting_recipe/umbrellared
+ name = "Red Drink Umbrella"
+ result = /obj/item/garnish/umbrellared
+ time = 1 SECONDS
+ tools = list(/obj/item/toy/crayon/spraycan)
+ reqs = list(
+ /obj/item/paper = 1,
+ /obj/item/stack/rods = 1)
+ category = CAT_DRINK
+
+/datum/crafting_recipe/umbrellablue
+ name = "Blue Drink Umbrella"
+ result = /obj/item/garnish/umbrellablue
+ time = 1 SECONDS
+ tools = list(/obj/item/toy/crayon/spraycan)
+ reqs = list(
+ /obj/item/paper = 1,
+ /obj/item/stack/rods = 1)
+ category = CAT_DRINK
+
+/datum/crafting_recipe/umbrellagreen
+ name = "Green Drink Umbrella"
+ result = /obj/item/garnish/umbrellagreen
+ time = 1 SECONDS
+ tools = list(/obj/item/toy/crayon/spraycan)
+ reqs = list(
+ /obj/item/paper = 1,
+ /obj/item/stack/rods = 1)
+ category = CAT_DRINK
+
+/datum/crafting_recipe/ash_garnish
+ name = "Ash Garnish"
+ result = /obj/item/garnish/ash
+ reqs = list(/datum/reagent/ash = 10)
+ time = 5
+ category = CAT_DRINK
+
+/datum/crafting_recipe/salt_garnish
+ name = "Salt Garnish"
+ result = /obj/item/garnish/salt
+ reqs = list(/datum/reagent/consumable/sodiumchloride = 10)
+ time = 5
+ category = CAT_DRINK
+
+/datum/crafting_recipe/breakawayflask
+ name = "Breakaway Flask"
+ result = /obj/item/reagent_containers/food/drinks/breakawayflask
+ time = 5 SECONDS
+ reqs = list(/obj/item/stack/sheet/glass = 5,
+ /obj/item/stack/sheet/mineral/plasma = 1)
+ tools = list(TOOL_WELDER)
+ category = CAT_DRINK
diff --git a/code/datums/components/crafting/recipes/misc.dm b/code/datums/components/crafting/recipes/misc.dm
new file mode 100644
index 000000000000..0ed4acb5be78
--- /dev/null
+++ b/code/datums/components/crafting/recipes/misc.dm
@@ -0,0 +1,220 @@
+/datum/crafting_recipe/skateboard
+ name = "Skateboard"
+ result = /obj/vehicle/ridden/scooter/skateboard
+ time = 60
+ reqs = list(/obj/item/stack/sheet/metal = 5,
+ /obj/item/stack/rods = 10)
+ category = CAT_MISC
+
+/datum/crafting_recipe/scooter
+ name = "Scooter"
+ result = /obj/vehicle/ridden/scooter
+ time = 65
+ reqs = list(/obj/item/stack/sheet/metal = 5,
+ /obj/item/stack/rods = 12)
+ category = CAT_MISC
+
+/datum/crafting_recipe/wheelchair
+ name = "Wheelchair"
+ result = /obj/vehicle/ridden/wheelchair
+ reqs = list(/obj/item/stack/sheet/metal = 4,
+ /obj/item/stack/rods = 6)
+ time = 100
+ category = CAT_MISC
+
+/datum/crafting_recipe/motorized_wheelchair
+ name = "Motorized Wheelchair"
+ result = /obj/vehicle/ridden/wheelchair/motorized
+ reqs = list(/obj/item/stack/sheet/metal = 10,
+ /obj/item/stack/rods = 8,
+ /obj/item/stock_parts/manipulator = 2,
+ /obj/item/stock_parts/capacitor = 1)
+ parts = list(/obj/item/stock_parts/manipulator = 2,
+ /obj/item/stock_parts/capacitor = 1)
+ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH)
+ time = 200
+ category = CAT_MISC
+
+/datum/crafting_recipe/mousetrap
+ name = "Mouse Trap"
+ result = /obj/item/assembly/mousetrap
+ time = 10
+ reqs = list(/obj/item/stack/sheet/cardboard = 1,
+ /obj/item/stack/rods = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/papersack
+ name = "Paper Sack"
+ result = /obj/item/storage/box/papersack
+ time = 10
+ reqs = list(/obj/item/paper = 5)
+ category = CAT_MISC
+
+/datum/crafting_recipe/flashlight_eyes
+ name = "Flashlight Eyes"
+ result = /obj/item/organ/eyes/robotic/flashlight
+ time = 10
+ reqs = list(
+ /obj/item/flashlight = 2,
+ /obj/item/restraints/handcuffs/cable = 1
+ )
+ category = CAT_MISC
+
+/datum/crafting_recipe/paperframes
+ name = "Paper Frames"
+ result = /obj/item/stack/sheet/paperframes/five
+ time = 10
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 5, /obj/item/paper = 20)
+ category = CAT_MISC
+
+/datum/crafting_recipe/naturalpaper
+ name = "Hand-Pressed Paper"
+ time = 30
+ reqs = list(/datum/reagent/water = 50, /obj/item/stack/sheet/mineral/wood = 1)
+ tools = list(/obj/item/hatchet)
+ result = /obj/item/paper_bin/bundlenatural
+ category = CAT_MISC
+
+/datum/crafting_recipe/curtain
+ name = "Curtains"
+ reqs = list(/obj/item/stack/sheet/cotton/cloth = 4, /obj/item/stack/rods = 1)
+ result = /obj/structure/curtain/cloth
+ category = CAT_MISC
+
+/datum/crafting_recipe/showercurtain
+ name = "Shower Curtains"
+ reqs = list(/obj/item/stack/sheet/cotton/cloth = 2, /obj/item/stack/sheet/plastic = 2, /obj/item/stack/rods = 1)
+ result = /obj/structure/curtain
+ category = CAT_MISC
+
+/datum/crafting_recipe/extendohand
+ name = "Extendo-Hand"
+ reqs = list(/obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1)
+ result = /obj/item/extendohand
+ category = CAT_MISC
+
+/datum/crafting_recipe/pressureplate
+ name = "Pressure Plate"
+ result = /obj/item/pressure_plate
+ time = 5
+ reqs = list(/obj/item/stack/sheet/metal = 1,
+ /obj/item/stack/tile/plasteel = 1,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/assembly/igniter = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/rcl
+ name = "Makeshift Rapid Pipe Cleaner Layer"
+ result = /obj/item/rcl/ghetto
+ time = 40
+ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH)
+ reqs = list(/obj/item/stack/sheet/metal = 15)
+ category = CAT_MISC
+
+/datum/crafting_recipe/guillotine
+ name = "Guillotine"
+ result = /obj/structure/guillotine
+ time = 150 // Building a functioning guillotine takes time
+ reqs = list(/obj/item/stack/sheet/plasteel = 3,
+ /obj/item/stack/sheet/mineral/wood = 20,
+ /obj/item/stack/cable_coil = 10)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
+ category = CAT_MISC
+
+/datum/crafting_recipe/ghettojetpack
+ name = "Improvised Jetpack"
+ result = /obj/item/tank/jetpack/improvised
+ time = 30
+ reqs = list(/obj/item/tank/internals/oxygen = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = MAXCOIL)
+ category = CAT_MISC
+ tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER)
+
+/datum/crafting_recipe/multiduct
+ name = "Multi-layer duct"
+ result = /obj/machinery/duct/multilayered
+ time = 5
+ reqs = list(/obj/item/stack/ducts = 5)
+ category = CAT_MISC
+ tools = list(TOOL_WELDER)
+
+/datum/crafting_recipe/ipickaxe
+ name = "Improvised Pickaxe"
+ reqs = list(
+ /obj/item/crowbar = 1,
+ /obj/item/kitchen/knife = 1,
+ /obj/item/stack/tape = 1)
+ result = /obj/item/pickaxe/improvised
+ category = CAT_MISC
+
+/datum/crafting_recipe/chem_scanner
+ name = "Reagent Scanner"
+ time = 30
+ tools = list(TOOL_WIRECUTTER, TOOL_SCREWDRIVER)
+ reqs = list(
+ /obj/item/healthanalyzer = 1,
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/stock_parts/scanning_module = 1)
+ result = /obj/item/reagent_scanner
+ category = CAT_MISC
+
+/datum/crafting_recipe/filter
+ name = "Seperatory Funnel"
+ time = 40
+ tools = list(TOOL_WELDER, TOOL_WIRECUTTER)
+ reqs = list(
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/reagent_containers/glass/beaker = 3)
+ result = /obj/item/reagent_containers/glass/filter
+ category = CAT_MISC
+
+/datum/crafting_recipe/splint
+ name = "Makeshift Splint"
+ reqs = list(
+ /obj/item/stack/rods = 2,
+ /obj/item/stack/sheet/cotton/cloth = 4)
+ result = /obj/item/stack/medical/splint/ghetto
+ category = CAT_MISC
+
+/datum/crafting_recipe/portableseedextractor
+ name = "Portable seed extractor"
+ reqs = list(
+ /obj/item/storage/bag/plants = 1,
+ /obj/item/plant_analyzer = 1,
+ /obj/item/stock_parts/manipulator = 1,
+ /obj/item/stack/cable_coil = 2)
+ result = /obj/item/storage/bag/plants/portaseeder //this will probably mean that you can craft portable seed extractors into themselves, sending the other materials into the void, but we still don't have a solution for recipes involving radios stealing your headset, so this is officially not my problem. "no, Tills-The-Soil, adding more analyzers and micro-manipulators to your portable seed extractor does not make it make more seeds. in fact it does exactly nothing."
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ category = CAT_MISC
+
+/datum/crafting_recipe/freezer
+ name = "Freezer"
+ result = /obj/structure/closet/crate/freezer
+ time = 2 SECONDS
+ reqs = list(/datum/reagent/consumable/ice = 25,
+ /obj/item/stack/sheet/metal = 2)
+ category = CAT_MISC
+
+/datum/crafting_recipe/aquarium
+ name = "Aquarium"
+ result = /obj/structure/aquarium
+ time = 10 SECONDS
+ reqs = list(/obj/item/stack/sheet/metal = 15,
+ /obj/item/stack/sheet/glass = 10,
+ /obj/item/aquarium_kit = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/mothplush
+ name = "Moth Plushie"
+ result = /obj/item/toy/plush/moth
+ reqs = list(/obj/item/stack/sheet/animalhide/mothroach = 1,
+ /obj/item/organ/heart = 1,
+ /obj/item/stack/sheet/cotton/cloth = 3)
+ category = CAT_MISC
+
+/datum/crafting_recipe/candorupgrade
+ name = "Candor Upgrade"
+ result = /obj/item/gun/ballistic/automatic/pistol/candor/phenex
+ reqs = list(/obj/item/stack/sheet/mineral/hidden = 4,
+ /obj/item/gun/ballistic/automatic/pistol/candor = 1)
+ category = CAT_MISC
diff --git a/code/datums/components/crafting/recipes/robot.dm b/code/datums/components/crafting/recipes/robot.dm
new file mode 100644
index 000000000000..a5558682e86b
--- /dev/null
+++ b/code/datums/components/crafting/recipes/robot.dm
@@ -0,0 +1,86 @@
+/datum/crafting_recipe/ed209
+ name = "ED209"
+ result = /mob/living/simple_animal/bot/secbot/ed209
+ reqs = list(/obj/item/robot_suit = 1,
+ /obj/item/clothing/head/helmet = 1,
+ /obj/item/clothing/suit/armor/vest = 1,
+ /obj/item/bodypart/leg/left/robot = 1,
+ /obj/item/bodypart/leg/right/robot = 1,
+ /obj/item/stack/sheet/metal = 1,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/gun/energy/disabler = 1,
+ /obj/item/assembly/prox_sensor = 1)
+ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER)
+ time = 60
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/secbot
+ name = "Secbot"
+ result = /mob/living/simple_animal/bot/secbot
+ reqs = list(/obj/item/assembly/signaler = 1,
+ /obj/item/clothing/head/helmet/sec = 1,
+ /obj/item/melee/baton = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/bodypart/r_arm/robot = 1)
+ tools = list(TOOL_WELDER)
+ time = 60
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/cleanbot
+ name = "Cleanbot"
+ result = /mob/living/simple_animal/bot/cleanbot
+ reqs = list(/obj/item/reagent_containers/glass/bucket = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/bodypart/r_arm/robot = 1)
+ time = 40
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/floorbot
+ name = "Floorbot"
+ result = /mob/living/simple_animal/bot/floorbot
+ reqs = list(/obj/item/storage/toolbox = 1,
+ /obj/item/stack/tile/plasteel = 10,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/bodypart/r_arm/robot = 1)
+ time = 40
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/medbot
+ name = "Medbot"
+ result = /mob/living/simple_animal/bot/medbot
+ reqs = list(/obj/item/healthanalyzer = 1,
+ /obj/item/storage/firstaid = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/bodypart/r_arm/robot = 1)
+ time = 40
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/honkbot
+ name = "Honkbot"
+ result = /mob/living/simple_animal/bot/honkbot
+ reqs = list(/obj/item/storage/box/clown = 1,
+ /obj/item/bodypart/r_arm/robot = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/bikehorn/ = 1)
+ time = 40
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/Firebot
+ name = "Firebot"
+ result = /mob/living/simple_animal/bot/firebot
+ reqs = list(/obj/item/extinguisher = 1,
+ /obj/item/bodypart/r_arm/robot = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/clothing/head/hardhat/red = 1)
+ time = 40
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/Vibebot
+ name = "Vibebot"
+ result = /mob/living/simple_animal/bot/vibebot
+ reqs = list(/obj/item/light/bulb = 2,
+ /obj/item/bodypart/head/robot = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/toy/crayon = 1)
+ time = 40
+ category = CAT_ROBOT
diff --git a/code/datums/components/crafting/recipes/tribal.dm b/code/datums/components/crafting/recipes/tribal.dm
new file mode 100644
index 000000000000..83e5c03722bc
--- /dev/null
+++ b/code/datums/components/crafting/recipes/tribal.dm
@@ -0,0 +1,236 @@
+/datum/crafting_recipe/bonetalisman
+ name = "Bone Talisman"
+ result = /obj/item/clothing/accessory/talisman
+ time = 20
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonenecklace
+ name = "Hunter's Necklace"
+ result = /obj/item/clothing/accessory/wolftalisman
+ time = 35
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 3,
+ /obj/item/mob_trophy/wolf_ear = 2,
+ /obj/item/mob_trophy/fang = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonecodpiece
+ name = "Skull Codpiece"
+ result = /obj/item/clothing/accessory/skullcodpiece
+ time = 20
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/mob_trophy/legion_skull = 1,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/skilt
+ name = "Sinew Kilt"
+ result = /obj/item/clothing/accessory/skilt
+ time = 20
+ reqs = list(/obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/sheet/sinew = 2)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bracers
+ name = "Bone Bracers"
+ result = /obj/item/clothing/gloves/bracer
+ time = 20
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/goliathcloak
+ name = "Goliath Cloak"
+ result = /obj/item/clothing/suit/hooded/cloak/goliath
+ time = 50
+ reqs = list(/obj/item/stack/sheet/leather = 2,
+ /obj/item/stack/sheet/sinew = 2,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/drakecloak
+ name = "Ash Drake Armour"
+ result = /obj/item/clothing/suit/hooded/cloak/drake
+ time = 60
+ reqs = list(/obj/item/stack/sheet/bone = 10,
+ /obj/item/stack/sheet/sinew = 2,
+ /obj/item/stack/sheet/animalhide/ashdrake = 5)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonespear
+ name = "Bone Spear"
+ result = /obj/item/spear/bonespear
+ time = 30
+ reqs = list(/obj/item/stack/sheet/bone = 4,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/boneaxe
+ name = "Bone Axe"
+ result = /obj/item/fireaxe/boneaxe
+ time = 50
+ reqs = list(/obj/item/stack/sheet/bone = 6,
+ /obj/item/stack/sheet/sinew = 3)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonfire
+ name = "Bonfire"
+ time = 60
+ reqs = list(/obj/item/grown/log = 5)
+ parts = list(/obj/item/grown/log = 5)
+ blacklist = list(/obj/item/grown/log/steel)
+ result = /obj/structure/bonfire
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/headpike
+ name = "Spike Head (Glass Spear)"
+ time = 65
+ reqs = list(/obj/item/spear = 1,
+ /obj/item/bodypart/head = 1)
+ parts = list(/obj/item/bodypart/head = 1,
+ /obj/item/spear = 1)
+ blacklist = list(/obj/item/spear/explosive, /obj/item/spear/bonespear)
+ result = /obj/structure/headpike
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/headpikebone
+ name = "Spike Head (Bone Spear)"
+ time = 65
+ reqs = list(/obj/item/spear/bonespear = 1,
+ /obj/item/bodypart/head = 1)
+ parts = list(/obj/item/bodypart/head = 1,
+ /obj/item/spear/bonespear = 1)
+ result = /obj/structure/headpike/bone
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/lasso
+ name = "Bone Lasso"
+ reqs = list(
+ /obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/sheet/sinew = 5)
+ result = /obj/item/key/lasso
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/heavybonearmor
+ name = "Heavy Bone Armor"
+ result = /obj/item/clothing/suit/hooded/cloak/bone
+ time = 60
+ reqs = list(/obj/item/stack/sheet/bone = 8,
+ /obj/item/stack/sheet/sinew = 3)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/watcherbola
+ name = "Watcher Bola"
+ result = /obj/item/restraints/legcuffs/bola/watcher
+ time = 30
+ reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 2,
+ /obj/item/restraints/handcuffs/cable/sinew = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/goliathshield
+ name = "Goliath shield"
+ result = /obj/item/shield/riot/goliath
+ time = 60
+ reqs = list(/obj/item/stack/sheet/bone = 4,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 3)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonesword
+ name = "Bone Sword"
+ result = /obj/item/claymore/bone
+ time = 40
+ reqs = list(/obj/item/stack/sheet/bone = 3,
+ /obj/item/stack/sheet/sinew = 2)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/hunterbelt
+ name = "Hunters Belt"
+ result = /obj/item/storage/belt/mining/primitive
+ time = 20
+ reqs = list(/obj/item/stack/sheet/sinew = 2,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 2)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/quiver
+ name = "Quiver"
+ result = /obj/item/storage/bag/quiver/empty
+ time = 80
+ reqs = list(/obj/item/stack/sheet/leather = 3,
+ /obj/item/stack/sheet/sinew = 4)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bone_bow
+ name = "Bone Bow"
+ result = /obj/item/gun/ballistic/bow/ashen
+ time = 200
+ reqs = list(/obj/item/stack/sheet/bone = 8,
+ /obj/item/stack/sheet/sinew = 4)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/polarbearcloak
+ name = "Polar Cloak"
+ result = /obj/item/clothing/suit/hooded/cloak/goliath/polar
+ time = 50
+ reqs = list(/obj/item/stack/sheet/leather = 2,
+ /obj/item/stack/sheet/sinew = 2,
+ /obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 2)
+ blacklist = list(/obj/item/stack/sheet/animalhide/goliath_hide)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/distiller
+ name = "Distiller"
+ result = /obj/structure/fermenting_barrel/distiller
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 8, /obj/item/stack/sheet/metal = 5, /datum/reagent/srm_bacteria = 30)
+ time = 50
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/crystalamulet
+ name = "Crystal Amulet"
+ result = /obj/item/clothing/neck/crystal_amulet
+ time = 4 SECONDS
+ reqs = list(/obj/item/strange_crystal = 3)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/crystalspear
+ name = "Crystal Spear"
+ result = /obj/item/spear/crystal
+ time = 4 SECONDS
+ reqs = list(/obj/item/strange_crystal = 2)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/mushroom_bowl
+ name = "Mushroom Bowl"
+ result = /obj/item/reagent_containers/glass/bowl/mushroom_bowl
+ reqs = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings = 5)
+ time = 30
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/charcoal_stylus
+ name = "Charcoal Stylus"
+ result = /obj/item/pen/charcoal
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 1, /datum/reagent/ash = 30)
+ time = 30
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/mushroom_mortar
+ name = "Mushroom Mortar"
+ result = /obj/item/reagent_containers/glass/mortar/mushroom
+ reqs = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings = 5)
+ time = 30
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/oar
+ name = "Goliath Bone Oar"
+ result = /obj/item/oar
+ reqs = list(/obj/item/stack/sheet/bone = 2)
+ time = 15
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/boat
+ name = "Goliath Hide Boat"
+ result = /obj/vehicle/ridden/lavaboat
+ reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 3)
+ time = 50
+ category = CAT_PRIMAL
diff --git a/code/datums/components/crafting/recipes/weapon.dm b/code/datums/components/crafting/recipes/weapon.dm
new file mode 100644
index 000000000000..c1dde04b3650
--- /dev/null
+++ b/code/datums/components/crafting/recipes/weapon.dm
@@ -0,0 +1,317 @@
+/datum/crafting_recipe/IED
+ name = "IED"
+ result = /obj/item/grenade/iedcasing
+ reqs = list(/datum/reagent/fuel = 50,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/reagent_containers/food/drinks/soda_cans = 1)
+ parts = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1)
+ time = 15
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/lance
+ name = "Explosive Lance (Grenade)"
+ result = /obj/item/spear/explosive
+ reqs = list(/obj/item/spear = 1,
+ /obj/item/grenade = 1)
+ blacklist = list(/obj/item/spear/bonespear)
+ parts = list(/obj/item/spear = 1,
+ /obj/item/grenade = 1)
+ time = 15
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/strobeshield
+ name = "Strobe Shield"
+ result = /obj/item/shield/riot/flash
+ reqs = list(/obj/item/wallframe/flasher = 1,
+ /obj/item/assembly/flash/handheld = 1,
+ /obj/item/shield/riot = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/strobeshield/New()
+ ..()
+ blacklist |= subtypesof(/obj/item/shield/riot/)
+
+/datum/crafting_recipe/molotov
+ name = "Molotov"
+ result = /obj/item/reagent_containers/food/drinks/bottle/molotov
+ reqs = list(/obj/item/reagent_containers/glass/rag = 1,
+ /obj/item/reagent_containers/food/drinks/bottle = 1)
+ parts = list(/obj/item/reagent_containers/food/drinks/bottle = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/stunprod
+ name = "Stunprod"
+ result = /obj/item/melee/baton/cattleprod
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/stack/rods = 1,
+ /obj/item/assembly/igniter = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/teleprod
+ name = "Teleprod"
+ result = /obj/item/melee/baton/cattleprod/teleprod
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/stack/rods = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/stack/ore/bluespace_crystal = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/bola
+ name = "Bola"
+ result = /obj/item/restraints/legcuffs/bola
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/stack/sheet/metal = 6)
+ time = 20//15 faster than crafting them by hand!
+ category= CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/gonbola
+ name = "Gonbola"
+ result = /obj/item/restraints/legcuffs/bola/gonbola
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/stack/sheet/metal = 6,
+ /obj/item/stack/sheet/animalhide/gondola = 1)
+ time = 40
+ category= CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
+ name = "Pneumatic Cannon"
+ result = /obj/item/pneumatic_cannon/ghetto
+ tools = list(TOOL_WELDER, TOOL_WRENCH)
+ reqs = list(/obj/item/stack/sheet/metal = 4,
+ /obj/item/stack/packageWrap = 8,
+ /obj/item/pipe = 2)
+ time = 50
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/flamethrower
+ name = "Flamethrower"
+ result = /obj/item/flamethrower
+ reqs = list(/obj/item/weldingtool = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/stack/rods = 1)
+ parts = list(/obj/item/assembly/igniter = 1,
+ /obj/item/weldingtool = 1)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 10
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/meteorslug
+ name = "Meteorslug Shell"
+ result = /obj/item/ammo_casing/shotgun/meteorslug
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/rcd_ammo = 1,
+ /obj/item/stock_parts/manipulator = 2)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/pulseslug
+ name = "Pulse Slug Shell"
+ result = /obj/item/ammo_casing/shotgun/pulseslug
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/stock_parts/capacitor = 3,
+ /obj/item/stock_parts/micro_laser = 1,
+ /obj/item/stock_parts/cell = 1,
+ /datum/reagent/lithium = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/dragonsbreath
+ name = "Dragonsbreath Shell"
+ result = /obj/item/ammo_casing/shotgun/dragonsbreath
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 10)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/frag12
+ name = "FRAG-12 Shell"
+ result = /obj/item/ammo_casing/shotgun/frag12
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /datum/reagent/glycerol = 5,
+ /datum/reagent/toxin/acid = 5,
+ /datum/reagent/toxin/acid/fluacid = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/ionslug
+ name = "Ion Scatter Shell"
+ result = /obj/item/ammo_casing/shotgun/ion
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/stock_parts/micro_laser = 2,
+ /obj/item/stock_parts/capacitor = 2,
+ /obj/item/stock_parts/scanning_module = 1,
+ /datum/reagent/iron = 5,
+ /datum/reagent/uranium = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/improvisedslug
+ name = "Improvised Shotgun Shell"
+ result = /obj/item/ammo_casing/shotgun/improvised
+ reqs = list(/obj/item/stack/sheet/metal = 2,
+ /obj/item/stack/cable_coil = 1,
+ /datum/reagent/fuel = 10)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 12
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/laserscatter
+ name = "Scatter Laser Shell"
+ result = /obj/item/ammo_casing/shotgun/laserscatter
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/stock_parts/capacitor = 1,
+ /obj/item/stock_parts/micro_laser = 3,
+ /obj/item/stock_parts/cell = 1,
+ /datum/reagent/lithium = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/ishotgun
+ name = "Improvised Shotgun"
+ result = /obj/item/gun/ballistic/shotgun/doublebarrel/improvised
+ reqs = list(/obj/item/weaponcrafting/receiver = 1,
+ /obj/item/pipe = 1,
+ /obj/item/weaponcrafting/stock = 1,
+ /obj/item/stack/packageWrap = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 100
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/chainsaw
+ name = "Chainsaw"
+ result = /obj/item/chainsaw
+ reqs = list(/obj/item/circular_saw = 1,
+ /obj/item/stack/cable_coil = 3,
+ /obj/item/stack/sheet/plasteel = 5)
+ tools = list(TOOL_WELDER)
+ time = 50
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/spear
+ name = "Spear"
+ result = /obj/item/spear
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/shard = 1,
+ /obj/item/stack/rods = 1)
+ parts = list(/obj/item/shard = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/chemical_payload
+ name = "Chemical Payload (C4)"
+ result = /obj/item/bombcore/chemical
+ reqs = list(
+ /obj/item/stock_parts/matter_bin = 1,
+ /obj/item/grenade/c4 = 1,
+ /obj/item/grenade/chem_grenade = 2
+ )
+ parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
+ time = 30
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/chemical_payload2
+ name = "Chemical Payload (Gibtonite)"
+ result = /obj/item/bombcore/chemical
+ reqs = list(
+ /obj/item/stock_parts/matter_bin = 1,
+ /obj/item/gibtonite = 1,
+ /obj/item/grenade/chem_grenade = 2
+ )
+ parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
+ time = 50
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/pipebow
+ name = "Pipe Bow"
+ result = /obj/item/gun/ballistic/bow/pipe
+ reqs = list(/obj/item/pipe = 5,
+ /obj/item/stack/sheet/plastic = 15,
+ /obj/item/weaponcrafting/silkstring = 10)
+ time = 450
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/arrow
+ name = "Arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/wood
+ time = 30
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
+ /obj/item/stack/sheet/silk = 1,
+ /obj/item/stack/rods = 1) //1 metal sheet = 2 rods= 2 arrows
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/bone_arrow
+ name = "Bone Arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/bone
+ time = 30
+ reqs = list(/obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/sheet/sinew = 1,
+ /obj/item/ammo_casing/caseless/arrow/ash = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/ashen_arrow
+ name = "Fire hardened arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/ash
+ tools = list(TOOL_WELDER)
+ time = 30
+ reqs = list(/obj/item/ammo_casing/caseless/arrow/wood = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/bronze_arrow
+ name = "Bronze arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/bronze
+ time = 30
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
+ /obj/item/stack/tile/bronze = 1,
+ /obj/item/stack/sheet/silk = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/zip_pistol
+ name = "Zip Pistol"
+ result = /obj/item/gun/ballistic/automatic/zip_pistol
+ reqs = list(/obj/item/stack/rods = 4,
+ /obj/item/pipe = 1,
+ /obj/item/stack/cable_coil = 15,
+ /obj/item/weaponcrafting/receiver = 1,
+ /obj/item/floor_painter = 1,
+ /obj/item/stack/packageWrap = 10)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 100
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm
index 3a047d082868..cf0199d05e18 100644
--- a/code/datums/components/edible.dm
+++ b/code/datums/components/edible.dm
@@ -115,7 +115,7 @@ Behavior that's still missing from this component that original food items had t
. = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose
if(eater == feeder)//If you're eating it yourself.
- if(!do_mob(feeder, eater, eat_time)) //Gotta pass the minimal eat time
+ if(!do_after(feeder, eat_time, eater)) //Gotta pass the minimal eat time
return
var/eatverb = pick(eatverbs)
if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS))
@@ -143,7 +143,7 @@ Behavior that's still missing from this component that original food items had t
eater.visible_message("[feeder] cannot force any more of [parent] down [eater]'s throat!", \
"[feeder] cannot force any more of [parent] down your throat!")
return
- if(!do_mob(feeder, eater)) //Wait 3 seconds before you can feed
+ if(!do_after(feeder, target = eater)) //Wait 3 seconds before you can feed
return
log_combat(feeder, eater, "fed", owner.reagents.log_list())
diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm
index ec1ee58735f9..8cabee42d21c 100644
--- a/code/datums/components/fantasy/suffixes.dm
+++ b/code/datums/components/fantasy/suffixes.dm
@@ -131,11 +131,7 @@
/obj/projectile/bullet/honker = 15,
/obj/projectile/temp = 15,
/obj/projectile/ion = 15,
- /obj/projectile/magic/door = 15,
- /obj/projectile/magic/locker = 15,
- /obj/projectile/magic/fetch = 15,
/obj/projectile/beam/emitter = 15,
- /obj/projectile/magic/flying = 15,
/obj/projectile/energy/net = 15,
/obj/projectile/bullet/incendiary/c9mm = 15,
/obj/projectile/temp/hot = 15,
diff --git a/code/datums/components/forensics.dm b/code/datums/components/forensics.dm
index 3c006073304c..6f2a34e50ea5 100644
--- a/code/datums/components/forensics.dm
+++ b/code/datums/components/forensics.dm
@@ -192,4 +192,4 @@
return
if(isitem(parent))
var/obj/item/I = parent
- I.AddElement(/datum/element/decal/blood, initial(I.icon) || I.icon, initial(I.icon_state) || I.icon_state, _color = get_blood_dna_color(blood_DNA))
+ I.AddElement(/datum/element/decal/blood, I.icon, I.icon_state, _color = get_blood_dna_color(blood_DNA))
diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm
index 177093a49fef..f3050c7ab76c 100644
--- a/code/datums/components/fullauto.dm
+++ b/code/datums/components/fullauto.dm
@@ -8,7 +8,7 @@
var/turf/target_loc //For dealing with locking on targets due to BYOND engine limitations (the mouse input only happening when mouse moves).
var/autofire_stat = AUTOFIRE_STAT_IDLE
var/mouse_parameters
- var/autofire_shot_delay = 0.3 SECONDS //Time between individual shots.
+ var/autofire_shot_delay = 0.1 SECONDS //Time between individual shots.
var/mouse_status = AUTOFIRE_MOUSEUP //This seems hacky but there can be two MouseDown() without a MouseUp() in between if the user holds click and uses alt+tab, printscreen or similar.
var/enabled = TRUE
@@ -22,6 +22,7 @@
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(wake_up))
RegisterSignal(parent, COMSIG_GUN_DISABLE_AUTOFIRE, PROC_REF(disable_autofire))
RegisterSignal(parent, COMSIG_GUN_ENABLE_AUTOFIRE, PROC_REF(enable_autofire))
+ RegisterSignal(parent, COMSIG_GUN_SET_AUTOFIRE_SPEED, PROC_REF(set_autofire_speed))
if(_autofire_shot_delay)
autofire_shot_delay = _autofire_shot_delay
if(autofire_stat == AUTOFIRE_STAT_IDLE && ismob(gun.loc))
@@ -161,7 +162,7 @@
if(isgun(parent))
var/obj/item/gun/shoota = parent
- if(!shoota.on_autofire_start(shooter)) //This is needed because the minigun has a do_after before firing and signals are async.
+ if(!shoota.on_autofire_start(shooter=shooter)) //This is needed because the minigun has a do_after before firing and signals are async.
stop_autofiring()
return
if(autofire_stat != AUTOFIRE_STAT_FIRING)
@@ -242,12 +243,12 @@
// Gun procs.
-/obj/item/gun/proc/on_autofire_start(mob/living/shooter)
- if(semicd || shooter.stat || !can_trigger_gun(shooter))
- return FALSE
- if(!can_shoot())
- shoot_with_empty_chamber(shooter)
+/obj/item/gun/proc/on_autofire_start(datum/source, atom/target, mob/living/shooter, params)
+ if(current_cooldown || shooter.stat)
return FALSE
+ if(!can_shoot()) //we call pre_fire so bolts/slides work correctly
+ INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params)
+ return NONE
if(weapon_weight == WEAPON_HEAVY && (!wielded))
to_chat(shooter, "You need a more secure grip to fire [src]!")
return FALSE
@@ -262,32 +263,29 @@
/obj/item/gun/proc/do_autofire(datum/source, atom/target, mob/living/shooter, params)
SIGNAL_HANDLER
- if(semicd || shooter.incapacitated())
+ if(current_cooldown || shooter.incapacitated())
return NONE
if(weapon_weight == WEAPON_HEAVY && (!wielded))
to_chat(shooter, "You need a more secure grip to fire [src]!")
return NONE
- if(!can_shoot())
- shoot_with_empty_chamber(shooter)
+ if(!can_shoot()) //we stop if we cant shoot but also calling pre_fire so the bolt works correctly if it's a weird open bolt weapon.
+ INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params)
return NONE
INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params)
return COMPONENT_AUTOFIRE_SHOT_SUCCESS //All is well, we can continue shooting.
/obj/item/gun/proc/do_autofire_shot(datum/source, atom/target, mob/living/shooter, params)
- var/obj/item/gun/akimbo_gun = shooter.get_inactive_held_item()
- var/bonus_spread = 0
- if(istype(akimbo_gun) && weapon_weight < WEAPON_MEDIUM)
- if(akimbo_gun.weapon_weight < WEAPON_MEDIUM && akimbo_gun.can_trigger_gun(shooter))
- bonus_spread = dual_wield_spread
- addtimer(CALLBACK(akimbo_gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, shooter, TRUE, params, null, bonus_spread), 1)
- process_fire(target, shooter, TRUE, params, null, bonus_spread)
-
-/datum/component/automatic_fire/proc/disable_autofire()
+ pre_fire(target, shooter, TRUE, params, null) //dual wielding is handled here
+
+/datum/component/automatic_fire/proc/disable_autofire(datum/source)
enabled = FALSE
-/datum/component/automatic_fire/proc/enable_autofire()
+/datum/component/automatic_fire/proc/enable_autofire(datum/source)
enabled = TRUE
+/datum/component/automatic_fire/proc/set_autofire_speed(datum/source, newspeed)
+ autofire_shot_delay = newspeed
+
#undef AUTOFIRE_MOUSEUP
#undef AUTOFIRE_MOUSEDOWN
diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm
index 2865865c98ab..85701e9c7626 100644
--- a/code/datums/components/gunpoint.dm
+++ b/code/datums/components/gunpoint.dm
@@ -40,7 +40,7 @@
if(istype(weapon, /obj/item/gun/ballistic/rocketlauncher) && weapon.chambered)
shooter.client.give_award(/datum/award/achievement/misc/rocket_holdup, shooter)
- target.do_alert_animation(target)
+ target.do_alert_animation()
target.playsound_local(target.loc, 'sound/machines/chime.ogg', 50, TRUE)
SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "gunpoint", /datum/mood_event/gunpoint)
@@ -126,10 +126,7 @@
if(weapon.chambered && weapon.chambered.BB)
weapon.chambered.BB.damage *= damage_mult
- if(weapon.check_botched(shooter))
- return
-
- weapon.process_fire(target, shooter)
+ weapon.pre_fire(target, shooter)
qdel(src)
/datum/component/gunpoint/proc/cancel()
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index de334598f141..3434c741dba8 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -321,7 +321,7 @@
/datum/component/mood/proc/HandleNutrition()
var/mob/living/L = parent
- if(isethereal(L))
+ if(iselzuose(L))
HandleCharge(L)
if(HAS_TRAIT(L, TRAIT_NOHUNGER))
return FALSE //no mood events for nutrition
@@ -338,19 +338,19 @@
add_event(null, "nutrition", /datum/mood_event/starving)
/datum/component/mood/proc/HandleCharge(mob/living/carbon/human/H)
- var/datum/species/ethereal/E = H.dna.species
+ var/datum/species/elzuose/E = H.dna.species
switch(E.get_charge(H))
- if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER)
+ if(ELZUOSE_CHARGE_NONE to ELZUOSE_CHARGE_LOWPOWER)
add_event(null, "charge", /datum/mood_event/decharged)
- if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL)
+ if(ELZUOSE_CHARGE_LOWPOWER to ELZUOSE_CHARGE_NORMAL)
add_event(null, "charge", /datum/mood_event/lowpower)
- if(ETHEREAL_CHARGE_NORMAL to ETHEREAL_CHARGE_ALMOSTFULL)
+ if(ELZUOSE_CHARGE_NORMAL to ELZUOSE_CHARGE_ALMOSTFULL)
clear_event(null, "charge")
- if(ETHEREAL_CHARGE_ALMOSTFULL to ETHEREAL_CHARGE_FULL)
+ if(ELZUOSE_CHARGE_ALMOSTFULL to ELZUOSE_CHARGE_FULL)
add_event(null, "charge", /datum/mood_event/charged)
- if(ETHEREAL_CHARGE_FULL to ETHEREAL_CHARGE_OVERLOAD)
+ if(ELZUOSE_CHARGE_FULL to ELZUOSE_CHARGE_OVERLOAD)
add_event(null, "charge", /datum/mood_event/overcharged)
- if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS)
+ if(ELZUOSE_CHARGE_OVERLOAD to ELZUOSE_CHARGE_DANGEROUS)
add_event(null, "charge", /datum/mood_event/supercharged)
/datum/component/mood/proc/check_area_mood(datum/source, area/A)
diff --git a/code/datums/components/movable_physics.dm b/code/datums/components/movable_physics.dm
new file mode 100644
index 000000000000..114cac29f24b
--- /dev/null
+++ b/code/datums/components/movable_physics.dm
@@ -0,0 +1,151 @@
+#define PHYSICS_GRAV_STANDARD 9.80665
+
+///Remove the component as soon as there's zero velocity, useful for movables that will no longer move after being initially moved (blood splatters)
+#define QDEL_WHEN_NO_MOVEMENT (1<<0)
+
+///Stores information related to the movable's physics and keeping track of relevant signals to trigger movement
+/datum/component/movable_physics
+ ///Modifies the pixel_x/pixel_y of an object every process()
+ var/horizontal_velocity
+ ///Modifies the pixel_z of an object every process(), movables aren't Move()'d into another turf if pixel_z exceeds 16, so try not to supply a super high vertical value if you don't want the movable to clip through multiple turfs
+ var/vertical_velocity
+ ///The horizontal_velocity is reduced by this every process(), this doesn't take into account the object being in the air vs gravity pushing it against the ground
+ var/horizontal_friction
+ ///The vertical_velocity is reduced by this every process()
+ var/z_gravity
+ ///The pixel_z that the object will no longer be influenced by gravity for a 32x32 turf, keep this value between -16 to 0 so it's visuals matches up with it physically being in the turf
+ var/z_floor
+ ///The angle of the path the object takes on the x/y plane
+ var/angle_of_movement
+ ///Flags for turning on certain physic properties, see the top of the file for more information on flags
+ var/physic_flags
+ ///The cached animate_movement of the parent; any kind of gliding when doing Move() makes the physics look derpy, so we'll just make Move() be instant
+ var/cached_animate_movement
+ ///The sound effect to play when bouncing off of something
+ var/bounce_sound
+
+ var/numbounce = 1
+
+/datum/component/movable_physics/Initialize(_horizontal_velocity = 0, _vertical_velocity = 0, _horizontal_friction = 0, _z_gravity = 0, _z_floor = 0, _angle_of_movement = 0, _physic_flags = 0, _bounce_sound)
+ . = ..()
+ if(!ismovable(parent))
+ return COMPONENT_INCOMPATIBLE
+ RegisterSignal(parent, COMSIG_MOVABLE_IMPACT, PROC_REF(throw_impact_ricochet), override = TRUE)
+ horizontal_velocity = _horizontal_velocity
+ vertical_velocity = _vertical_velocity
+ horizontal_friction = _horizontal_friction
+ z_gravity = _z_gravity
+ z_floor = _z_floor
+ angle_of_movement = _angle_of_movement
+ physic_flags = _physic_flags
+ bounce_sound = _bounce_sound
+ if(vertical_velocity || horizontal_velocity)
+ start_movement()
+
+///Let's get moving
+/datum/component/movable_physics/proc/start_movement()
+ var/atom/movable/moving_atom = parent
+ cached_animate_movement = moving_atom.animate_movement
+ moving_atom.animate_movement = NO_STEPS
+ START_PROCESSING(SSmovablephysics, src)
+ moving_atom.SpinAnimation(speed = 1 SECONDS, loops = 1)
+
+///Alright it's time to stop
+/datum/component/movable_physics/proc/stop_movement()
+ var/atom/movable/moving_atom = parent
+ moving_atom.animate_movement = cached_animate_movement
+ STOP_PROCESSING(SSmovablephysics, src)
+ if(physic_flags & QDEL_WHEN_NO_MOVEMENT)
+ qdel(src)
+
+/datum/component/movable_physics/UnregisterFromParent()
+ UnregisterSignal(parent, COMSIG_MOVABLE_IMPACT)
+
+/datum/component/movable_physics/proc/throw_impact_ricochet(datum/source, atom/hit_atom, datum/thrownthing/throwingdatum)
+ SIGNAL_HANDLER
+ var/atom/movable/atom_source = source
+ ricochet(atom_source, Get_Angle(atom_source, throwingdatum.target_turf))
+
+/datum/component/movable_physics/proc/z_floor_bounce(atom/movable/moving_atom)
+ angle_of_movement += rand(-3000, 3000) / 100
+ var/turf/a_turf = get_turf(moving_atom)
+ if(istype(moving_atom, /obj/item/ammo_casing) && !bounce_sound)
+ playsound(moving_atom, a_turf.bullet_bounce_sound, 50, TRUE)
+ else
+ playsound(moving_atom, bounce_sound, 50, TRUE)
+ moving_atom.SpinAnimation(speed = 1 SECONDS / numbounce, loops = 1)
+ moving_atom.pixel_z = z_floor
+ horizontal_velocity = max(0, horizontal_velocity + (vertical_velocity * -0.8))
+ vertical_velocity = max(0, ((vertical_velocity * -0.8) - 0.2))
+ numbounce += 0.5
+
+/datum/component/movable_physics/proc/ricochet(atom/movable/moving_atom, bounce_angle)
+ angle_of_movement = ((180 - bounce_angle) - angle_of_movement)
+ if(angle_of_movement < 0)
+ angle_of_movement += 360
+ //var/turf/a_turf = get_turf(moving_atom)
+ //playsound(src, a_turf.bullet_bounce_sound, 50, TRUE)
+
+/datum/component/movable_physics/proc/fix_angle(angle, atom/moving_atom)//fixes an angle below 0 or above 360
+ if(!(angle_of_movement > 360) && !(angle_of_movement < 0))
+ return angle //early return if it doesn't need to change
+ var/new_angle
+ if(angle_of_movement > 360)
+ new_angle = angle_of_movement - 360
+ if(angle_of_movement < 0)
+ new_angle = angle_of_movement + 360
+ return new_angle
+
+/datum/component/movable_physics/process(delta_time)
+ var/atom/movable/moving_atom = parent
+ var/turf/location = get_turf(moving_atom)
+
+ angle_of_movement = fix_angle(angle_of_movement, moving_atom)
+ if(horizontal_velocity <= 0 && moving_atom.pixel_z == 0)
+ horizontal_velocity = 0
+ stop_movement()
+ return
+
+ moving_atom.pixel_x += (horizontal_velocity * (sin(angle_of_movement)))
+ moving_atom.pixel_y += (horizontal_velocity * (cos(angle_of_movement)))
+
+ horizontal_velocity = max(0, horizontal_velocity - horizontal_friction)
+
+ moving_atom.pixel_z = max(z_floor, moving_atom.pixel_z + vertical_velocity)
+ if(moving_atom.pixel_z > z_floor)
+ vertical_velocity -= (z_gravity * 0.05)
+
+ if(moving_atom.pixel_z <= z_floor && (vertical_velocity != 0) && moving_atom.has_gravity(location)) //z bounce
+ z_floor_bounce(moving_atom)
+
+ if(moving_atom.pixel_x > 16)
+ if(moving_atom.Move(get_step(moving_atom, EAST)))
+ moving_atom.pixel_x = -16
+ else
+ moving_atom.pixel_x = 16
+ ricochet(moving_atom, 0)
+ return
+
+ if(moving_atom.pixel_x < -16)
+ if(moving_atom.Move(get_step(moving_atom, WEST)))
+ moving_atom.pixel_x = 16
+ else
+ moving_atom.pixel_x = -16
+ ricochet(moving_atom, 0)
+ return
+
+ if(moving_atom.pixel_y > 16)
+ if(moving_atom.Move(get_step(moving_atom, NORTH)))
+ moving_atom.pixel_y = -16
+ else
+ moving_atom.pixel_y = 16
+ ricochet(moving_atom, 180)
+ return
+
+ if(moving_atom.pixel_y < -16)
+ if(moving_atom.Move(get_step(moving_atom, SOUTH)))
+ moving_atom.pixel_y = 16
+ else
+ moving_atom.pixel_y = -16
+ ricochet(moving_atom, 180)
+
diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm
index e7f5174c9102..19b1e2094993 100644
--- a/code/datums/components/pellet_cloud.dm
+++ b/code/datums/components/pellet_cloud.dm
@@ -1,20 +1,19 @@
-/*
- * This component is used when you want to create a bunch of shrapnel or projectiles (say, shrapnel from a fragmentation grenade, or buckshot from a shotgun) from a central point,
- * without necessarily printing a separate message for every single impact. This component should be instantiated right when you need it (like the moment of firing), then activated
- * by signal.
- *
- * Pellet cloud currently works on two classes of sources: directed (ammo casings), and circular (grenades, landmines).
- * -Directed: This means you're shooting multiple pellets, like buckshot. If an ammo casing is defined as having multiple pellets, it will automatically create a pellet cloud
- * and call COMSIG_PELLET_CLOUD_INIT (see [/obj/item/ammo_casing/proc/fire_casing]). Thus, the only projectiles fired will be the ones fired here.
- * The magnitude var controls how many pellets are created.
- * -Circular: This results in a big spray of shrapnel flying all around the detonation point when the grenade fires COMSIG_GRENADE_PRIME or landmine triggers COMSIG_MINE_TRIGGERED.
- * The magnitude var controls how big the detonation radius is (the bigger the magnitude, the more shrapnel is created). Grenades can be covered with bodies to reduce shrapnel output.
- *
- * Once all of the fired projectiles either hit a target or disappear due to ranging out/whatever else, we resolve the list of all the things we hit and print aggregate messages so we get
- * one "You're hit by 6 buckshot pellets" vs 6x "You're hit by the buckshot blah blah" messages.
- *
- * Note that this is how all guns handle shooting ammo casings with multiple pellets, in case such a thing comes up.
-*/
+
+ //This component is used when you want to create a bunch of shrapnel or projectiles (say, shrapnel from a fragmentation grenade, or buckshot from a shotgun) from a central point,
+ //without necessarily printing a separate message for every single impact. This component should be instantiated right when you need it (like the moment of firing), then activated
+ //by signal.
+
+ //Pellet cloud currently works on two classes of sources: directed (ammo casings), and circular (grenades, landmines).
+ //Directed: This means you're shooting multiple pellets, like buckshot. If an ammo casing is defined as having multiple pellets, it will automatically create a pellet cloud
+ //and call COMSIG_PELLET_CLOUD_INIT (see [/obj/item/ammo_casing/proc/fire_casing]). Thus, the only projectiles fired will be the ones fired here.
+ //The magnitude var controls how many pellets are created.
+ //Circular: This results in a big spray of shrapnel flying all around the detonation point when the grenade fires COMSIG_GRENADE_PRIME or landmine triggers COMSIG_MINE_TRIGGERED.
+ //The magnitude var controls how big the detonation radius is (the bigger the magnitude, the more shrapnel is created). Grenades can be covered with bodies to reduce shrapnel output.
+
+ //Once all of the fired projectiles either hit a target or disappear due to ranging out/whatever else, we resolve the list of all the things we hit and print aggregate messages so we get
+ //one "You're hit by 6 buckshot pellets" vs 6x "You're hit by the buckshot blah blah" messages.
+
+ //Note that this is how all guns handle shooting ammo casings with multiple pellets, in case such a thing comes up.
/datum/component/pellet_cloud
/// What's the projectile path of the shrapnel we're shooting?
@@ -83,12 +82,13 @@
/datum/component/pellet_cloud/UnregisterFromParent()
UnregisterSignal(parent, list(COMSIG_PARENT_PREQDELETED, COMSIG_PELLET_CLOUD_INIT, COMSIG_GRENADE_PRIME, COMSIG_GRENADE_ARMED, COMSIG_MOVABLE_MOVED, COMSIG_MINE_TRIGGERED, COMSIG_ITEM_DROPPED))
-/**
- * create_casing_pellets() is for directed pellet clouds for ammo casings that have multiple pellets (buckshot and scatter lasers for instance)
- *
- * Honestly this is mostly just a rehash of [/obj/item/ammo_casing/proc/fire_casing()] for pellet counts > 1, except this lets us tamper with the pellets and hook onto them for tracking purposes.
- * The arguments really don't matter, this proc is triggered by COMSIG_PELLET_CLOUD_INIT which is only for this really, it's just a big mess of the state vars we need for doing the stuff over here.
- */
+
+//create_casing_pellets() is for directed pellet clouds for ammo casings that have multiple pellets (buckshot and scatter lasers for instance)
+//
+//Honestly this is mostly just a rehash of [/obj/item/ammo_casing/proc/fire_casing()] for pellet counts > 1, except this lets us tamper with the pellets and hook onto them for tracking purposes.
+//The arguments really don't matter, this proc is triggered by COMSIG_PELLET_CLOUD_INIT which is only for this really, it's just a big mess of the state vars we need for doing the stuff over here.
+
+
/datum/component/pellet_cloud/proc/create_casing_pellets(obj/item/ammo_casing/shell, atom/target, mob/living/user, fired_from, randomspread, spread, zone_override, params, distro)
shooter = user
var/targloc = get_turf(target)
@@ -111,16 +111,27 @@
if(i != num_pellets)
shell.newshot()
-/**
- * create_blast_pellets() is for when we have a central point we want to shred the surroundings of with a ring of shrapnel, namely frag grenades and landmines.
- *
- * Note that grenades have extra handling for someone throwing themselves/being thrown on top of it, while landmines do not (obviously, it's a landmine!). See [/datum/component/pellet_cloud/proc/handle_martyrs()]
- */
-/datum/component/pellet_cloud/proc/create_blast_pellets(obj/O, mob/living/lanced_by)
+//create_blast_pellets() is for when we have a central point we want to shred the surroundings of with a ring of shrapnel, namely frag grenades and landmines.
+
+//Note that grenades have extra handling for someone throwing themselves/being thrown on top of it, see [/datum/component/pellet_cloud/proc/handle_martyrs]
+//Landmines just have a small check for [/obj/item/mine/pressure/explosive/shrapnel/var/shred_triggerer], and spawn extra shrapnel for them if so
+
+//Arguments:
+////O- Our parent, the thing making the shrapnel obviously (grenade or landmine)
+////punishable_triggerer- For grenade lances or people who step on the landmines (if we shred the triggerer), we spawn extra shrapnel for them in addition to the normal spread
+//
+/datum/component/pellet_cloud/proc/create_blast_pellets(obj/O, mob/living/punishable_triggerer)
var/atom/A = parent
if(isgrenade(parent)) // handle_martyrs can reduce the radius and thus the number of pellets we produce if someone dives on top of a frag grenade
- handle_martyrs(lanced_by) // note that we can modify radius in this proc
+ handle_martyrs(punishable_triggerer) // note that we can modify radius in this proc
+ else if(istype(parent, /obj/item/mine/pressure/explosive))
+ var/obj/item/mine/pressure/explosive/triggered_mine = parent
+ if(triggered_mine.shred_triggerer && istype(punishable_triggerer)) // free shrapnel for the idiot who stepped on it if we're a mine that shreds the triggerer
+ pellet_delta += radius // so they don't count against the later total
+ if(punishable_triggerer.loc == triggered_mine.loc)//only trigger this if they're actually on the tile
+ for(var/i in 1 to radius)
+ pew(punishable_triggerer, TRUE)
if(radius < 1)
return
@@ -132,27 +143,27 @@
var/turf/shootat_turf = T
pew(shootat_turf)
-/**
- * handle_martyrs() is used for grenades that shoot shrapnel to check if anyone threw themselves/were thrown on top of the grenade, thus absorbing a good chunk of the shrapnel
- *
- * Between the time the grenade is armed and the actual detonation, we set var/list/bodies to the list of mobs currently on the new tile, as if the grenade landed on top of them, tracking if any of them move off the tile and removing them from the "under" list
- * Once the grenade detonates, handle_martyrs() is called and gets all the new mobs on the tile, and add the ones not in var/list/bodies to var/list/martyrs
- * We then iterate through the martyrs and reduce the shrapnel magnitude for each mob on top of it, shredding each of them with some of the shrapnel they helped absorb. This can snuff out all of the shrapnel if there's enough bodies
- *
- * Note we track anyone who's alive and client'd when they get shredded in var/list/purple_hearts, for achievement checking later
- */
-/datum/component/pellet_cloud/proc/handle_martyrs(mob/living/lanced_by)
+
+// handle_martyrs() is used for grenades that shoot shrapnel to check if anyone threw themselves/were thrown on top of the grenade, thus absorbing a good chunk of the shrapnel
+//
+// Between the time the grenade is armed and the actual detonation, we set var/list/bodies to the list of mobs currently on the new tile, as if the grenade landed on top of them, tracking if any of them move off the tile and removing them from the "under" list
+// Once the grenade detonates, handle_martyrs() is called and gets all the new mobs on the tile, and add the ones not in var/list/bodies to var/list/martyrs
+// We then iterate through the martyrs and reduce the shrapnel magnitude for each mob on top of it, shredding each of them with some of the shrapnel they helped absorb. This can snuff out all of the shrapnel if there's enough bodies
+
+// Note we track anyone who's alive and client'd when they get shredded in var/list/purple_hearts, for achievement checking later
+
+/datum/component/pellet_cloud/proc/handle_martyrs(mob/living/punishable_triggerer)
var/magnitude_absorbed
var/list/martyrs = list()
var/self_harm_radius_mult = 3
- if(lanced_by && prob(60))
- to_chat(lanced_by, "Your plan to whack someone with a grenade on a stick backfires on you, literally!")
+ if(punishable_triggerer && prob(60))
+ to_chat(punishable_triggerer, "Your plan to whack someone with a grenade on a stick backfires on you, literally!")
self_harm_radius_mult = 1 // we'll still give the guy who got hit some extra shredding, but not 3*radius
pellet_delta += radius
for(var/i in 1 to radius)
- pew(lanced_by) // thought you could be tricky and lance someone with no ill effects!!
+ pew(punishable_triggerer) // thought you could be tricky and lance someone with no ill effects!!
for(var/mob/living/body in get_turf(parent))
if(body == shooter)
@@ -209,11 +220,11 @@
finalize()
/// Minor convenience function for creating each shrapnel piece with circle explosions, mostly stolen from the MIRV component
-/datum/component/pellet_cloud/proc/pew(atom/target, spread=0)
+/datum/component/pellet_cloud/proc/pew(atom/target, landmine_victim)
var/obj/projectile/P = new projectile_type(get_turf(parent))
//Shooting Code:
- P.spread = spread
+ P.spread = 0
P.original = target
P.fired_from = parent
P.firer = parent // don't hit ourself that would be really annoying
@@ -224,6 +235,8 @@
RegisterSignal(P, list(COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PARENT_QDELETING), PROC_REF(pellet_range))
pellets += P
P.fire()
+ if(landmine_victim)
+ P.process_hit(get_turf(target), target)
///All of our pellets are accounted for, time to go target by target and tell them how many things they got hit by.
/datum/component/pellet_cloud/proc/finalize()
@@ -286,7 +299,9 @@
/// Someone who was originally "under" the grenade has moved off the tile and is now eligible for being a martyr and "covering" it
/datum/component/pellet_cloud/proc/on_target_qdel(atom/target)
+ SIGNAL_HANDLER
+
UnregisterSignal(target, COMSIG_PARENT_QDELETING)
targets_hit -= target
LAZYREMOVE(bodies, target)
- purple_hearts -= target
+ LAZYREMOVE(purple_hearts, target)
diff --git a/code/datums/components/pricetag.dm b/code/datums/components/pricetag.dm
index bf81a595c2be..01a89ea0a754 100644
--- a/code/datums/components/pricetag.dm
+++ b/code/datums/components/pricetag.dm
@@ -23,7 +23,7 @@
var/price = item_value
if(price)
var/adjusted_value = price*(profit_ratio/100)
- owner.adjust_money(adjusted_value)
+ owner.adjust_money(adjusted_value, "pricetag")
owner.bank_card_talk("Sale recorded. [adjusted_value] credits added to account.")
return TRUE
diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm
index de61c13ae295..2f3aa79749b2 100644
--- a/code/datums/components/remote_materials.dm
+++ b/code/datums/components/remote_materials.dm
@@ -52,7 +52,7 @@ handles linking back and forth.
/datum/material/diamond,
/datum/material/plasma,
/datum/material/uranium,
- /datum/material/bananium,
+ /datum/material/hellstone,
/datum/material/titanium,
/datum/material/bluespace,
/datum/material/plastic,
diff --git a/code/datums/components/sitcomlaughter.dm b/code/datums/components/sitcomlaughter.dm
index 8dfef21b749d..8a5c32d2e2d1 100644
--- a/code/datums/components/sitcomlaughter.dm
+++ b/code/datums/components/sitcomlaughter.dm
@@ -1,6 +1,6 @@
/datum/component/wearertargeting/sitcomlaughter
valid_slots = list(ITEM_SLOT_HANDS, ITEM_SLOT_BELT, ITEM_SLOT_ID, ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET, ITEM_SLOT_SUITSTORE, ITEM_SLOT_DEX_STORAGE)
- signals = list(COMSIG_MOB_CREAMED, COMSIG_ON_CARBON_SLIP, COMSIG_ON_VENDOR_CRUSH, COMSIG_MOB_CLUMSY_SHOOT_FOOT)
+ signals = list(COMSIG_MOB_CREAMED, COMSIG_ON_CARBON_SLIP, COMSIG_ON_VENDOR_CRUSH)
proctype = PROC_REF(EngageInComedy)
mobtype = /mob/living
///Sounds used for when user has a sitcom action occur
diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm
index c0a9bd162209..160b72fa9566 100644
--- a/code/datums/components/storage/concrete/_concrete.dm
+++ b/code/datums/components/storage/concrete/_concrete.dm
@@ -57,7 +57,7 @@
_contents_limbo = null
if(_user_limbo)
for(var/i in _user_limbo)
- show_to(i)
+ ui_show(i)
_user_limbo = null
/datum/component/storage/concrete/_insert_physical_item(obj/item/I, override = FALSE)
diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm
index bd0a59f85f42..ce224d44e4e5 100644
--- a/code/datums/components/storage/concrete/pockets.dm
+++ b/code/datums/components/storage/concrete/pockets.dm
@@ -83,10 +83,16 @@
/datum/component/storage/concrete/pockets/helmet/Initialize()
. = ..()
set_holdable(list(
- /obj/item/reagent_containers/food/drinks/bottle/vodka,
- /obj/item/reagent_containers/food/drinks/bottle/molotov,
- /obj/item/reagent_containers/food/drinks/drinkingglass,
- /obj/item/ammo_box/magazine/illestren_a850r
+ /obj/item/clothing/glasses/cold,
+ /obj/item/clothing/glasses/heat,
+ /obj/item/clothing/glasses/welding,
+ /obj/item/clothing/glasses/thermal,
+ /obj/item/clothing/glasses/night,
+ /obj/item/clothing/glasses/hud/health/night,
+ /obj/item/clothing/glasses/hud/security/night,
+ /obj/item/clothing/glasses/hud/security/sunglasses/inteq,
+ /obj/item/ammo_casing,
+ /obj/item/ammo_box/magazine/illestren_a850r,
))
/datum/component/storage/concrete/pockets/holster
diff --git a/code/datums/components/storage/concrete/rped.dm b/code/datums/components/storage/concrete/rped.dm
index 455eb985f090..58a520d3a7bd 100644
--- a/code/datums/components/storage/concrete/rped.dm
+++ b/code/datums/components/storage/concrete/rped.dm
@@ -6,6 +6,7 @@
max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 100
max_items = 50
+ storage_flags = STORAGE_FLAGS_LEGACY_DEFAULT
display_numerical_stacking = TRUE
/datum/component/storage/concrete/rped/can_be_inserted(obj/item/I, stop_messages, mob/M)
diff --git a/code/datums/components/storage/concrete/stack.dm b/code/datums/components/storage/concrete/stack.dm
index 319d1d4b3d41..19ea4fa58584 100644
--- a/code/datums/components/storage/concrete/stack.dm
+++ b/code/datums/components/storage/concrete/stack.dm
@@ -1,6 +1,7 @@
//Stack-only storage.
/datum/component/storage/concrete/stack
display_numerical_stacking = TRUE
+ storage_flags = STORAGE_FLAGS_LEGACY_DEFAULT
var/max_combined_stack_amount = 300
max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = WEIGHT_CLASS_NORMAL * 14
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index ced0b0e79ff7..5724d4327bee 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -26,9 +26,16 @@
var/locked = FALSE //when locked nothing can see inside or use it.
var/locked_flavor = "locked" //prevents tochat messages related to locked from sending
- var/max_w_class = WEIGHT_CLASS_SMALL //max size of objects that will fit.
- var/max_combined_w_class = 14 //max combined sizes of objects that will fit.
- var/max_items = 7 //max number of objects that will fit.
+ /// Storage flags, including what kinds of limiters we use for how many items we can hold
+ var/storage_flags = STORAGE_FLAGS_LEGACY_DEFAULT
+ /// Max w_class we can hold. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] and [STORAGE_LIMIT_VOLUME]
+ var/max_w_class = WEIGHT_CLASS_SMALL
+ /// Max combined w_class. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS]
+ var/max_combined_w_class = WEIGHT_CLASS_SMALL * 7
+ /// Max items we can hold. Applies to [STORAGE_LIMIT_MAX_ITEMS]
+ var/max_items = 7
+ /// Max volume we can hold. Applies to [STORAGE_LIMIT_VOLUME]. Auto scaled on New() if unset.
+ var/max_volume
var/emp_shielded = FALSE
@@ -44,8 +51,8 @@
var/display_numerical_stacking = FALSE //stack things of the same type and show as a single object with a number.
- var/atom/movable/screen/storage/boxes //storage display object
- var/atom/movable/screen/close/closer //close button object
+ /// Ui objects by person. mob = list(objects)
+ var/list/ui_by_mob = list()
var/allow_big_nesting = FALSE //allow storage objects of the same or greater size.
@@ -58,19 +65,20 @@
var/screen_max_columns = 7 //These two determine maximum screen sizes.
var/screen_max_rows = INFINITY
var/screen_pixel_x = 16 //These two are pixel values for screen loc of boxes and closer
- var/screen_pixel_y = 16
+ var/screen_pixel_y = 25
var/screen_start_x = 4 //These two are where the storage starts being rendered, screen_loc wise.
var/screen_start_y = 2
//End
+ var/limited_random_access = FALSE //Quick if statement in accessible_items to determine if we care at all about what people can access at once.
+ var/limited_random_access_stack_position = 0 //If >0, can only access top items
+ var/limited_random_access_stack_bottom_up = FALSE
+
/datum/component/storage/Initialize(datum/component/storage/concrete/master)
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
if(master)
change_master(master)
- boxes = new(null, src)
- closer = new(null, src)
- orient2hud()
RegisterSignal(parent, COMSIG_CONTAINS_STORAGE, PROC_REF(on_check))
RegisterSignal(parent, COMSIG_IS_STORAGE_LOCKED, PROC_REF(check_locked))
@@ -113,11 +121,16 @@
/datum/component/storage/Destroy()
close_all()
- QDEL_NULL(boxes)
- QDEL_NULL(closer)
+ wipe_ui_objects()
LAZYCLEARLIST(is_using)
return ..()
+/datum/component/storage/proc/wipe_ui_objects()
+ for(var/i in ui_by_mob)
+ var/list/objects = ui_by_mob[i]
+ QDEL_LIST(objects)
+ ui_by_mob.Cut()
+
/datum/component/storage/PreTransfer()
update_actions()
@@ -171,6 +184,19 @@
var/datum/component/storage/concrete/master = master()
return master? master.real_location() : null
+//What players can access
+//this proc can probably eat a refactor at some point.
+/datum/component/storage/proc/accessible_items(random_access = TRUE)
+ var/list/contents = contents()
+ if(contents)
+ if(limited_random_access && random_access)
+ if(limited_random_access_stack_position && (length(contents) > limited_random_access_stack_position))
+ if(limited_random_access_stack_bottom_up)
+ contents.Cut(1, limited_random_access_stack_position + 1)
+ else
+ contents.Cut(1, length(contents) - limited_random_access_stack_position + 1)
+ return contents
+
/datum/component/storage/proc/canreach_react(datum/source, list/next)
SIGNAL_HANDLER
@@ -189,7 +215,7 @@
var/atom/A = parent
for(var/mob/living/L in can_see_contents())
if(!L.CanReach(A))
- hide_from(L)
+ ui_hide(L)
/datum/component/storage/proc/attack_self(datum/source, mob/M)
SIGNAL_HANDLER
@@ -227,6 +253,9 @@
if(!len)
to_chat(M, "You failed to pick up anything with [parent]!")
return
+ if(I.anchored)
+ to_chat(M, "\The [I] is stuck to the ground and cannot be picked up by [parent]!")
+ return
var/datum/progressbar/progress = new(M, len, I.loc)
var/list/rejections = list()
while(do_after(M, 10, TRUE, parent, FALSE, CALLBACK(src, PROC_REF(handle_mass_pickup), things, I.loc, rejections, progress)))
@@ -287,7 +316,7 @@
var/turf/T = get_turf(A)
var/list/things = contents()
var/datum/progressbar/progress = new(M, length(things), T)
- while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, PROC_REF(mass_remove_from_storage), T, things, progress)))
+ while (do_after(M, 1 SECONDS, T, NONE, FALSE, CALLBACK(src, PROC_REF(mass_remove_from_storage), T, things, progress)))
stoplag(1)
progress.end_progress()
@@ -312,7 +341,7 @@
if(!_target)
_target = get_turf(parent)
if(usr)
- hide_from(usr)
+ ui_hide(usr)
var/list/contents = contents()
var/atom/real_location = real_location()
for(var/obj/item/I in contents)
@@ -328,109 +357,12 @@
if(locked)
close_all()
-/datum/component/storage/proc/_process_numerical_display()
- . = list()
- var/atom/real_location = real_location()
- for(var/obj/item/I in real_location.contents)
- if(QDELETED(I))
- continue
- if(!.["[I.type]-[I.name]"])
- .["[I.type]-[I.name]"] = new /datum/numbered_display(I, 1)
- else
- var/datum/numbered_display/ND = .["[I.type]-[I.name]"]
- ND.number++
-
-//This proc determines the size of the inventory to be displayed. Please touch it only if you know what you're doing.
-/datum/component/storage/proc/orient2hud()
- var/atom/real_location = real_location()
- var/adjusted_contents = real_location.contents.len
-
- //Numbered contents display
- var/list/datum/numbered_display/numbered_contents
- if(display_numerical_stacking)
- numbered_contents = _process_numerical_display()
- adjusted_contents = numbered_contents.len
-
- var/columns = clamp(max_items, 1, screen_max_columns)
- var/rows = clamp(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows)
- standard_orient_objs(rows, columns, numbered_contents)
-
-//This proc draws out the inventory and places the items on it. It uses the standard position.
-/datum/component/storage/proc/standard_orient_objs(rows, cols, list/obj/item/numerical_display_contents)
- boxes.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+cols-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]"
- var/cx = screen_start_x
- var/cy = screen_start_y
- if(islist(numerical_display_contents))
- for(var/type in numerical_display_contents)
- var/datum/numbered_display/ND = numerical_display_contents[type]
- ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE
- ND.sample_object.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]"
- ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]"
- ND.sample_object.layer = ABOVE_HUD_LAYER
- ND.sample_object.plane = ABOVE_HUD_PLANE
- cx++
- if(cx - screen_start_x >= cols)
- cx = screen_start_x
- cy++
- if(cy - screen_start_y >= rows)
- break
- else
- var/atom/real_location = real_location()
- for(var/obj/O in real_location)
- if(QDELETED(O))
- continue
- O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip"
- O.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]"
- O.maptext = ""
- O.layer = ABOVE_HUD_LAYER
- O.plane = ABOVE_HUD_PLANE
- cx++
- if(cx - screen_start_x >= cols)
- cx = screen_start_x
- cy++
- if(cy - screen_start_y >= rows)
- break
- closer.screen_loc = "[screen_start_x + cols]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]"
-
-/datum/component/storage/proc/show_to(mob/M)
- if(!M.client)
- return FALSE
- var/atom/real_location = real_location()
- if(M.active_storage != src && (M.stat == CONSCIOUS))
- for(var/obj/item/I in real_location)
- if(I.on_found(M))
- return FALSE
- if(M.active_storage)
- M.active_storage.hide_from(M)
- orient2hud()
- M.client.screen |= boxes
- M.client.screen |= closer
- M.client.screen |= real_location.contents
- M.set_active_storage(src)
- LAZYOR(is_using, M)
- RegisterSignal(M, COMSIG_PARENT_QDELETING, PROC_REF(mob_deleted))
- return TRUE
-
/datum/component/storage/proc/mob_deleted(datum/source)
SIGNAL_HANDLER
- hide_from(source)
-
-/datum/component/storage/proc/hide_from(mob/M)
- if(M.active_storage == src)
- M.set_active_storage(null)
- LAZYREMOVE(is_using, M)
-
- UnregisterSignal(M, COMSIG_PARENT_QDELETING)
- if(!M.client)
- return TRUE
- var/atom/real_location = real_location()
- M.client.screen -= boxes
- M.client.screen -= closer
- M.client.screen -= real_location.contents
- return TRUE
+ ui_hide(source)
/datum/component/storage/proc/close(mob/M)
- hide_from(M)
+ ui_hide(M)
/datum/component/storage/proc/close_all()
SIGNAL_HANDLER
@@ -448,25 +380,6 @@
var/datum/component/storage/concrete/master = master()
master.emp_act(source, severity)
-//This proc draws out the inventory and places the items on it. tx and ty are the upper left tile and mx, my are the bottm right.
-//The numbers are calculated from the bottom-left The bottom-left slot being 1,1.
-/datum/component/storage/proc/orient_objs(tx, ty, mx, my)
- var/atom/real_location = real_location()
- var/cx = tx
- var/cy = ty
- boxes.screen_loc = "[tx]:,[ty] to [mx],[my]"
- for(var/obj/O in real_location)
- if(QDELETED(O))
- continue
- O.screen_loc = "[cx],[cy]"
- O.layer = ABOVE_HUD_LAYER
- O.plane = ABOVE_HUD_PLANE
- cx++
- if(cx > mx)
- cx = tx
- cy--
- closer.screen_loc = "[mx+1],[my]"
-
//Resets something that is being removed from storage.
/datum/component/storage/proc/_removal_reset(atom/movable/thing)
if(!istype(thing))
@@ -477,9 +390,7 @@
return master._removal_reset(thing)
/datum/component/storage/proc/_remove_and_refresh(datum/source, atom/movable/thing)
- SIGNAL_HANDLER
-
- _removal_reset(thing)
+ _removal_reset(thing) // THIS NEEDS TO HAPPEN AFTER SO LAYERING DOESN'T BREAK!
refresh_mob_views()
//Call this proc to handle the removal of an item from the storage item. The item will be moved to the new_location target, if that is null it's being deleted
@@ -496,7 +407,7 @@
var/list/seeing = can_see_contents()
for(var/i in seeing)
- show_to(i)
+ ui_show(i)
return TRUE
/datum/component/storage/proc/can_see_contents()
@@ -615,7 +526,7 @@
if(force || M.CanReach(parent, view_only = TRUE))
if(use_sound && !silent)
playsound(A, use_sound, 50, TRUE, -5)
- show_to(M)
+ ui_show(M)
/datum/component/storage/proc/mousedrop_receive(datum/source, atom/movable/O, mob/M)
SIGNAL_HANDLER
@@ -644,10 +555,6 @@
host.add_fingerprint(M)
to_chat(M, "[host] seems to be [locked_flavor]!")
return FALSE
- if(real_location.contents.len >= max_items)
- if(!stop_messages)
- to_chat(M, "[host] is full, make some space!")
- return FALSE //Storage item is full
if(length(can_hold))
if(!is_type_in_typecache(I, can_hold))
if(!stop_messages)
@@ -657,22 +564,34 @@
if(!stop_messages)
to_chat(M, "[host] cannot hold [I]!")
return FALSE
- if(I.w_class > max_w_class && !is_type_in_typecache(I, exception_hold))
- if(!stop_messages)
- to_chat(M, "[I] is too big for [host]!")
- return FALSE
- var/datum/component/storage/biggerfish = real_location.loc.GetComponent(/datum/component/storage)
- if(biggerfish && biggerfish.max_w_class < max_w_class)//return false if we are inside of another container, and that container has a smaller max_w_class than us (like if we're a bag in a box)
- if(!stop_messages)
- to_chat(M, "[I] can't fit in [host] while [real_location.loc] is in the way!")
- return FALSE
- var/sum_w_class = I.w_class
- for(var/obj/item/_I in real_location)
- sum_w_class += _I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it.
- if(sum_w_class > max_combined_w_class)
- if(!stop_messages)
- to_chat(M, "[I] won't fit in [host], make some space!")
- return FALSE
+ // STORAGE LIMITS
+ if(storage_flags & STORAGE_LIMIT_MAX_ITEMS)
+ if(real_location.contents.len >= max_items)
+ if(!stop_messages)
+ to_chat(M, "[host] has too much junk in it, make some space!")
+ return FALSE //Storage item is full
+ if(storage_flags & STORAGE_LIMIT_MAX_W_CLASS)
+ if(I.w_class > max_w_class)
+ if(!stop_messages)
+ to_chat(M, "[I] is much too long for [host]!")
+ return FALSE
+ if(storage_flags & STORAGE_LIMIT_COMBINED_W_CLASS)
+ var/sum_w_class = I.w_class
+ for(var/obj/item/_I in real_location)
+ sum_w_class += _I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it.
+ if(sum_w_class > max_combined_w_class)
+ if(!stop_messages)
+ to_chat(M, "[I] won't fit in [host], make some space!")
+ return FALSE
+ if(storage_flags & STORAGE_LIMIT_VOLUME)
+ var/sum_volume = I.get_w_volume()
+ for(var/obj/item/_I in real_location)
+ sum_volume += _I.get_w_volume()
+ if(sum_volume > get_max_volume())
+ if(!stop_messages)
+ to_chat(M, "[I] is too large to fit in [host], make some space!")
+ return FALSE
+ /////////////////
if(isitem(host))
var/obj/item/IP = host
var/datum/component/storage/STR_I = I.GetComponent(/datum/component/storage)
@@ -822,7 +741,7 @@
if(locked)
to_chat(user, "[parent] seems to be [locked_flavor]!")
else
- show_to(user)
+ ui_show(user)
if(use_sound)
playsound(A, use_sound, 50, TRUE, -5)
@@ -848,7 +767,7 @@
/datum/component/storage/proc/signal_hide_attempt(datum/source, mob/target)
SIGNAL_HANDLER
- return hide_from(target)
+ return ui_hide(target)
/datum/component/storage/proc/on_alt_click(datum/source, mob/user)
SIGNAL_HANDLER
@@ -893,3 +812,7 @@
to_chat(user, "[parent] now picks up all items in a tile at once.")
if(COLLECT_ONE)
to_chat(user, "[parent] now picks up one item at a time.")
+
+//Gets our max volume
+/datum/component/storage/proc/get_max_volume()
+ return max_volume || AUTO_SCALE_STORAGE_VOLUME(max_w_class, max_combined_w_class)
diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm
new file mode 100644
index 000000000000..e3e4c126d730
--- /dev/null
+++ b/code/datums/components/storage/ui.dm
@@ -0,0 +1,253 @@
+// Generates a list of numbered_display datums for the numerical display system.
+/datum/component/storage/proc/_process_numerical_display()
+ . = list()
+ for(var/obj/item/I in accessible_items())
+ if(QDELETED(I))
+ continue
+ if(!.[I.type])
+ .[I.type] = new /datum/numbered_display(I, 1, src)
+ else
+ var/datum/numbered_display/ND = .[I.type]
+ ND.number++
+
+// Orients all objects in legacy mode, and returns the objects to show to the user.
+/datum/component/storage/proc/orient2hud_legacy(mob/user, maxcolumns)
+ . = list()
+ var/list/accessible_contents = accessible_items()
+ var/adjusted_contents = length(accessible_contents)
+ var/atom/movable/screen/storage/close/ui_close
+ var/atom/movable/screen/storage/boxes/ui_boxes
+
+ //Numbered contents display
+ var/list/datum/numbered_display/numbered_contents
+ if(display_numerical_stacking)
+ numbered_contents = _process_numerical_display()
+ adjusted_contents = numbered_contents.len
+
+ var/columns = limited_random_access_stack_position == 0 ? clamp(max_items, 1, maxcolumns ? maxcolumns : screen_max_columns) : clamp(limited_random_access_stack_position, 1, maxcolumns ? maxcolumns : screen_max_columns)
+ var/rows = clamp(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows)
+
+ // First, boxes.
+ ui_boxes = get_ui_boxes()
+ ui_boxes.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+columns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]"
+ . += ui_boxes
+ // Then, closer.
+ ui_close = get_ui_close()
+ ui_close.screen_loc = "[screen_start_x + columns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]"
+ . += ui_close
+ // Then orient the actual items.
+ var/cx = screen_start_x
+ var/cy = screen_start_y
+ if(islist(numbered_contents))
+ for(var/type in numbered_contents)
+ var/datum/numbered_display/ND = numbered_contents[type]
+ ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE
+ ND.sample_object.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]"
+ ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]"
+ ND.sample_object.layer = ABOVE_HUD_LAYER
+ ND.sample_object.plane = ABOVE_HUD_PLANE
+ . += ND.sample_object
+ cx++
+ if(cx - screen_start_x >= columns)
+ cx = screen_start_x
+ cy++
+ if(cy - screen_start_y >= rows)
+ break
+ else
+ for(var/obj/O in accessible_items())
+ if(QDELETED(O))
+ continue
+ var/atom/movable/screen/storage/item_holder/D = new(null, src, O)
+ D.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip"
+ D.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]"
+ O.maptext = ""
+ O.layer = ABOVE_HUD_LAYER
+ O.plane = ABOVE_HUD_PLANE
+ . += D
+ cx++
+ if(cx - screen_start_x >= columns)
+ cx = screen_start_x
+ cy++
+ if(cy - screen_start_y >= rows)
+ break
+
+// Orients all objects in .. volumetric mode. Does not support numerical display!
+/datum/component/storage/proc/orient2hud_volumetric(mob/user, maxcolumns)
+ . = list()
+ var/atom/movable/screen/storage/left/ui_left
+ var/atom/movable/screen/storage/continuous/ui_continuous
+ var/atom/movable/screen/storage/close/ui_close
+
+ // Generate ui_item_blocks for missing ones and render+orient.
+ var/list/atom/contents = accessible_items()
+ // our volume
+ var/our_volume = get_max_volume()
+ var/horizontal_pixels = (maxcolumns * world.icon_size) - (VOLUMETRIC_STORAGE_EDGE_PADDING * 2)
+ var/max_horizontal_pixels = horizontal_pixels * screen_max_rows
+ // sigh loopmania time
+ var/used = 0
+ // define outside for performance
+ var/volume
+ var/list/volume_by_item = list()
+ var/list/percentage_by_item = list()
+ for(var/obj/item/I in contents)
+ if(QDELETED(I))
+ continue
+ volume = I.get_w_volume()
+ used += volume
+ volume_by_item[I] = volume
+ percentage_by_item[I] = volume / get_max_volume()
+ var/padding_pixels = ((length(percentage_by_item) - 1) * VOLUMETRIC_STORAGE_ITEM_PADDING) + VOLUMETRIC_STORAGE_EDGE_PADDING * 2
+ var/min_pixels = (MINIMUM_PIXELS_PER_ITEM * length(percentage_by_item)) + padding_pixels
+ // do the check for fallback for when someone has too much gamer gear
+ if((min_pixels) > (max_horizontal_pixels + 4)) // 4 pixel grace zone
+ to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!")
+ return orient2hud_legacy(user, maxcolumns)
+ // after this point we are sure we can somehow fit all items into our max number of rows.
+
+ // determine rows
+ var/rows = clamp(CEILING(min_pixels / horizontal_pixels, 1), 1, screen_max_rows)
+
+ var/overrun = FALSE
+ if(used > our_volume)
+ // congratulations we are now in overrun mode. everything will be crammed to minimum storage pixels.
+ to_chat(user, "[parent] rendered in overrun mode due to more items inside than the maximum volume supports.")
+ overrun = TRUE
+
+ // how much we are using
+ var/using_horizontal_pixels = horizontal_pixels * rows
+
+ // item padding
+ using_horizontal_pixels -= padding_pixels
+
+ // define outside for marginal performance boost
+ var/obj/item/I
+ // start at this pixel from screen_start_x.
+ var/current_pixel = VOLUMETRIC_STORAGE_EDGE_PADDING
+ var/first = TRUE
+ var/row = 1
+
+ for(var/i in percentage_by_item)
+ I = i
+ var/percent = percentage_by_item[I]
+ var/atom/movable/screen/storage/volumetric_box/center/B = new /atom/movable/screen/storage/volumetric_box/center(null, src, I)
+ // SNOWFLAKE: force it to icon until we unfuck storage/click passing
+ I.mouse_opacity = MOUSE_OPACITY_ICON
+ var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(using_horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM)
+ var/addrow = FALSE
+ if(CEILING(pixels_to_use, 1) >= FLOOR(horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING, 1))
+ pixels_to_use = horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING
+ addrow = TRUE
+
+ // now that we have pixels_to_use, place our thing and add it to the returned list.
+ B.screen_loc = "[screen_start_x]:[round(current_pixel + (pixels_to_use * 0.5) + (first? 0 : VOLUMETRIC_STORAGE_ITEM_PADDING), 1)],[screen_start_y+row-1]:[screen_pixel_y]"
+ // add the used pixels to pixel after we place the object
+ current_pixel += pixels_to_use + (first? 0 : VOLUMETRIC_STORAGE_ITEM_PADDING)
+ first = FALSE //apply padding to everything after this
+
+ // set various things
+ B.set_pixel_size(pixels_to_use)
+ B.name = I.name
+
+ // finally add our things.
+ . += B.on_screen_objects()
+
+ // go up a row if needed
+ if(addrow)
+ row++
+ first = TRUE //first in the row, don't apply between-item padding.
+ current_pixel = VOLUMETRIC_STORAGE_EDGE_PADDING
+
+ // Then, continuous section.
+ ui_continuous = get_ui_continuous()
+ ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]"
+ . += ui_continuous
+ // Then, left.
+ ui_left = get_ui_left()
+ ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x]:[screen_pixel_x - 2],[screen_start_y+rows-1]:[screen_pixel_y]"
+ . += ui_left
+ // Then, closer, which is also our right element.
+ ui_close = get_ui_close()
+ ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y + row - 1]:[screen_pixel_y]"
+ . += ui_close
+
+
+// Shows our UI to a mob.
+/datum/component/storage/proc/ui_show(mob/M)
+ if(!M.client)
+ return FALSE
+ if(ui_by_mob[M] || LAZYFIND(is_using, M))
+ // something went horribly wrong
+ // hide first
+ ui_hide(M)
+ var/list/cview = getviewsize(M.client.view)
+ // in tiles
+ var/maxallowedscreensize = cview[1]-8
+ // we got screen size, register signal
+ RegisterSignal(M, COMSIG_PARENT_QDELETING, PROC_REF(on_logout), override = TRUE)
+ if(M.active_storage != src)
+ if(M.active_storage)
+ M.active_storage.ui_hide(M)
+ M.active_storage = src
+ LAZYOR(is_using, M)
+ if(volumetric_ui())
+ //new volumetric ui bay-style
+ var/list/objects = orient2hud_volumetric(M, maxallowedscreensize)
+ M.client.screen |= objects
+ ui_by_mob[M] = objects
+ else
+ //old ui
+ var/list/objects = orient2hud_legacy(M, maxallowedscreensize)
+ M.client.screen |= objects
+ ui_by_mob[M] = objects
+ return TRUE
+
+// VV hooked to ensure no lingering screen objects.
+/datum/component/storage/vv_edit_var(var_name, var_value)
+ var/list/old
+ if(var_name == NAMEOF(src, storage_flags))
+ old = is_using.Copy()
+ for(var/i in is_using)
+ ui_hide(i)
+ . = ..()
+ if(old)
+ for(var/i in old)
+ ui_show(i)
+
+// Proc triggered by signal to ensure logging out clients don't linger.
+/datum/component/storage/proc/on_logout(datum/source, client/C)
+ ui_hide(source)
+
+// Hides our UI from a mob
+/datum/component/storage/proc/ui_hide(mob/M)
+ if(!M.client)
+ return TRUE
+ UnregisterSignal(M, list(COMSIG_PARENT_QDELETING))
+ M.client.screen -= ui_by_mob[M]
+ var/list/objects = ui_by_mob[M]
+ QDEL_LIST(objects)
+ if(M.active_storage == src)
+ M.active_storage = null
+ LAZYREMOVE(is_using, M)
+ return TRUE
+
+// Returns TRUE if we are using volumetric UI instead of box UI
+/datum/component/storage/proc/volumetric_ui()
+ var/atom/real_location = real_location()
+ return (storage_flags & STORAGE_LIMIT_VOLUME) && (length(real_location.contents) <= MAXIMUM_VOLUMETRIC_ITEMS) && !display_numerical_stacking
+
+// Gets our ui_boxes, making it if it doesn't exist.
+/datum/component/storage/proc/get_ui_boxes()
+ return new /atom/movable/screen/storage/boxes(null, src)
+
+// Gets our ui_left, making it if it doesn't exist.
+/datum/component/storage/proc/get_ui_left()
+ return new /atom/movable/screen/storage/left(null, src)
+
+// Gets our ui_close, making it if it doesn't exist.
+/datum/component/storage/proc/get_ui_close()
+ return new /atom/movable/screen/storage/close(null, src)
+
+// Gets our ui_continuous, making it if it doesn't exist.
+/datum/component/storage/proc/get_ui_continuous()
+ return new /atom/movable/screen/storage/continuous(null, src)
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 342fbe9e722e..0103be96ce03 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -48,33 +48,6 @@
c.dataId = ++securityCrimeCounter
return c
-/datum/datacore/proc/addCitation(id = "", datum/data/crime/crime)
- for(var/datum/data/record/R in security)
- if(R.fields["id"] == id)
- var/list/crimes = R.fields["citation"]
- crimes |= crime
- return
-
-/datum/datacore/proc/removeCitation(id, cDataId)
- for(var/datum/data/record/R in security)
- if(R.fields["id"] == id)
- var/list/crimes = R.fields["citation"]
- for(var/datum/data/crime/crime in crimes)
- if(crime.dataId == text2num(cDataId))
- crimes -= crime
- return
-
-/datum/datacore/proc/payCitation(id, cDataId, amount)
- for(var/datum/data/record/R in security)
- if(R.fields["id"] == id)
- var/list/crimes = R.fields["citation"]
- for(var/datum/data/crime/crime in crimes)
- if(crime.dataId == text2num(cDataId))
- crime.paid = crime.paid + amount
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_SEC)
- D.adjust_money(amount)
- return
-
/**
* Adds crime to security record.
*
@@ -282,7 +255,6 @@
S.fields["id"] = id
S.fields["name"] = H.real_name
S.fields["criminal"] = "None"
- S.fields["citation"] = list()
S.fields["crim"] = list()
S.fields["notes"] = "No notes."
security += S
diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm
index da8ad0d69a59..1924d92428e4 100644
--- a/code/datums/diseases/advance/presets.dm
+++ b/code/datums/diseases/advance/presets.dm
@@ -16,14 +16,6 @@
symptoms = list(new/datum/symptom/cough)
..()
-/datum/disease/advance/necropolis
- copy_type = /datum/disease/advance
-
-/datum/disease/advance/necropolis/New()
- name = "Necropolis Seed"
- symptoms = list(new/datum/symptom/necroseed)
- ..()
-
//Randomly generated Disease, for virus crates and events
/datum/disease/advance/random
name = "Experimental Disease"
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index f6cd5698d73d..5f18f6c78a91 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -63,7 +63,7 @@ Bonus
if(bleed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate += 5 * power
+ H.cause_bleeding(5 * power)
return 1
/*
diff --git a/code/datums/diseases/advance/symptoms/necropolis.dm b/code/datums/diseases/advance/symptoms/necropolis.dm
deleted file mode 100644
index 9626b944124d..000000000000
--- a/code/datums/diseases/advance/symptoms/necropolis.dm
+++ /dev/null
@@ -1,113 +0,0 @@
-/datum/symptom/necroseed
- name = "Necropolis Seed"
- desc = "An infantile form of the root of Lavaland's tendrils. Forms a symbiotic bond with the host, making them stronger and hardier, at the cost of speed. Should the disease be cured, the host will be severely weakened."
- stealth = 0
- resistance = 3
- stage_speed = -10
- transmittable = -3
- level = 9
- base_message_chance = 3
- severity = 0
- symptom_delay_min = 1
- symptom_delay_max = 1
- var/color = "#302f20"
- var/tendrils = FALSE
- var/chest = FALSE
- var/fireproof = FALSE
- threshold_descs = list(
- "Resistance 15" = "The area near the host roils with paralyzing tendrils.",
- "Resistance 20" = "Host becomes immune to heat, ash, and lava. Removes movespeed debuff. Hail to the necropolis!",
- )
- var/list/cached_tentacle_turfs
- var/turf/last_location
- var/tentacle_recheck_cooldown = 100
-
-/datum/symptom/necroseed/Start(datum/disease/advance/A)
- . = ..()
- if(!.)
- return
- if(A.totalResistance() >= 15)
- tendrils = TRUE
- if(A.totalResistance() >= 20)
- fireproof = TRUE
-
-/datum/symptom/necroseed/Activate(datum/disease/advance/A)
- . = ..()
- if(!.)
- return
- var/mob/living/carbon/M = A.affected_mob
- switch(A.stage)
- if(1, 2)
- if(tendrils)
- tendril(A)
- if(prob(base_message_chance))
- to_chat(M, "Your skin feels scaly.")
- if(3, 4)
- if(tendrils)
- tendril(A)
- if(prob(base_message_chance))
- to_chat(M, "[pick("Your skin is hard.", "You feel stronger.", "You feel powerful.", "You feel your muscles growing stiff.", "You feel warm.")]")
- if(5)
- if(tendrils)
- tendril(A)
- M.dna.species.punchdamagelow = 15
- M.dna.species.punchdamagehigh = 20
- M.dna.species.punchstunthreshold = 18
- M.dna.species.brutemod = 0.6
- M.dna.species.burnmod = 0.6
- M.dna.species.heatmod = 0.6
- M.add_atom_colour(color, FIXED_COLOUR_PRIORITY)
- M.add_movespeed_modifier(/datum/movespeed_modifier/necropolis, update=TRUE)
- ADD_TRAIT(M, TRAIT_PIERCEIMMUNE, DISEASE_TRAIT)
- if(fireproof)
- to_chat(M, "[pick("You taste primordial ash.", "The necropolis whispers sweet nothings to you.", "You feel like a god.")]")
- ADD_TRAIT(M, TRAIT_RESISTHEAT, DISEASE_TRAIT)
- ADD_TRAIT(M, TRAIT_RESISTHIGHPRESSURE, DISEASE_TRAIT)
- M.weather_immunities |= "ash"
- M.weather_immunities |= "lava"
- M.remove_movespeed_modifier(/datum/movespeed_modifier/necropolis)
- else
- if(prob(base_message_chance))
- to_chat(M, "[pick("Your skin has become a hardened carapace.", "Your strength is superhuman.", "You feel invincible.")]")
- if(tendrils)
- tendril(A)
- return
-
-/datum/symptom/necroseed/proc/tendril(datum/disease/advance/A)
- . = A.affected_mob
- var/mob/living/loc = A.affected_mob.loc
- if(isturf(loc))
- if(!LAZYLEN(cached_tentacle_turfs) || loc != last_location || tentacle_recheck_cooldown <= world.time)
- LAZYCLEARLIST(cached_tentacle_turfs)
- last_location = loc
- tentacle_recheck_cooldown = world.time + initial(tentacle_recheck_cooldown)
- for(var/turf/open/T in orange(4, loc))
- LAZYADD(cached_tentacle_turfs, T)
- for(var/t in cached_tentacle_turfs)
- if(isopenturf(t))
- if(prob(10))
- new /obj/effect/temp_visual/goliath_tentacle(t, .)
- else
- cached_tentacle_turfs -= t
-
-/datum/symptom/necroseed/End(datum/disease/advance/A)
- . = ..()
- if(!.)
- return
- var/mob/living/carbon/M = A.affected_mob
- to_chat(M, "You feel weakened as the necropolis' blessing leaves your body.")
- M.remove_movespeed_modifier(/datum/movespeed_modifier/necropolis)
- M.dna.species.punchdamagelow = initial(M.dna.species.punchdamagelow)
- M.dna.species.punchdamagehigh = initial(M.dna.species.punchdamagehigh)
- M.dna.species.punchstunthreshold = initial(M.dna.species.punchstunthreshold)
- M.remove_atom_colour(color, FIXED_COLOUR_PRIORITY)
- M.dna.species.brutemod /= 0.6
- M.dna.species.burnmod /= 0.6
- M.dna.species.heatmod /= 0.6
- REMOVE_TRAIT(M, TRAIT_PIERCEIMMUNE, DISEASE_TRAIT)
- if(fireproof)
- REMOVE_TRAIT(M, TRAIT_RESISTHIGHPRESSURE, DISEASE_TRAIT)
- REMOVE_TRAIT(M, TRAIT_RESISTHEAT, DISEASE_TRAIT)
- M.weather_immunities -= "ash"
- M.weather_immunities -= "lava"
-
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index dde90dd5dbe8..abd20fd29212 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -659,8 +659,6 @@
O.Remove(src)
visible_message("[src] vomits up their [O.name]!", "You vomit up your [O.name]") //no "vomit up your the heart"
O.forceMove(drop_location())
- if(prob(20))
- O.animate_atom_living()
if(9 to 10)
ForceContractDisease(new/datum/disease/gastrolosis())
to_chat(src, "Oh, I actually feel quite alright!")
diff --git a/code/datums/elements/decals/blood.dm b/code/datums/elements/decals/blood.dm
index 85f75bef2416..0a3ca8ce59a3 100644
--- a/code/datums/elements/decals/blood.dm
+++ b/code/datums/elements/decals/blood.dm
@@ -6,9 +6,11 @@
. = ..()
RegisterSignal(target, COMSIG_ATOM_GET_EXAMINE_NAME, PROC_REF(get_examine_name), TRUE)
+ RegisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED), PROC_REF(redraw), TRUE)
/datum/element/decal/blood/Detach(atom/source, force)
UnregisterSignal(source, COMSIG_ATOM_GET_EXAMINE_NAME)
+ UnregisterSignal(source, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED))
return ..()
/datum/element/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, source)
@@ -30,3 +32,11 @@
override[EXAMINE_POSITION_ARTICLE] = A.gender == PLURAL? "some" : "a"
override[EXAMINE_POSITION_BEFORE] = " blood-stained "
return COMPONENT_EXNAME_CHANGED
+
+///this is probably quite bad, let me know if you have a better solution for this -S
+/datum/element/decal/blood/proc/redraw(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ var/atom/bloodsource = source
+ Detach(source)
+ bloodsource.AddElement(/datum/element/decal/blood, bloodsource.icon, bloodsource.icon_state, _color = get_blood_dna_color(bloodsource.return_blood_DNA()))
diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm
index 9b427b6b80c5..11072c771bab 100644
--- a/code/datums/elements/embed.dm
+++ b/code/datums/elements/embed.dm
@@ -176,23 +176,20 @@
* If we hit a valid target (carbon or closed turf), we create the shrapnel_type object and immediately call tryEmbed() on it, targeting what we impacted. That will lead
* it to call tryForceEmbed() on its own embed element (it's out of our hands here, our projectile is done), where it will run through all the checks it needs to.
*/
-/datum/element/embed/proc/checkEmbedProjectile(obj/projectile/P, atom/movable/firer, atom/hit)
+/datum/element/embed/proc/checkEmbedProjectile(obj/projectile/P, atom/movable/firer, atom/hit, angle, hit_zone)
SIGNAL_HANDLER
- if(!iscarbon(hit) && !isclosedturf(hit))
+ if(!iscarbon(hit))
Detach(P)
return // we don't care
var/obj/item/payload = new payload_type(get_turf(hit))
- var/did_embed
- if(iscarbon(hit))
- var/mob/living/carbon/C = hit
- var/obj/item/bodypart/limb = C.get_bodypart(C.check_limb_hit(P.def_zone))
- did_embed = payload.tryEmbed(limb)
- else
- did_embed = payload.tryEmbed(hit)
+ var/mob/living/carbon/C = hit
+ var/obj/item/bodypart/limb = C.get_bodypart(hit_zone)
+ if(!limb)
+ limb = C.get_bodypart()
- if(!did_embed)
+ if(!payload.tryEmbed(limb))
payload.failedEmbed()
Detach(P)
@@ -213,7 +210,6 @@
var/obj/item/bodypart/limb
var/mob/living/carbon/C
- var/turf/closed/T
if(!forced && !prob(embed_chance))
return
@@ -225,11 +221,8 @@
hit_zone = limb.body_zone
else if(isbodypart(target))
limb = target
+ hit_zone = limb.body_zone
C = limb.owner
- else if(isclosedturf(target))
- T = target
if(C)
return checkEmbedMob(I, C, hit_zone, forced=TRUE)
- else if(T)
- return checkEmbedOther(I, T, forced=TRUE)
diff --git a/code/datums/elements/world_icon.dm b/code/datums/elements/world_icon.dm
new file mode 100644
index 000000000000..bcb0129c6c68
--- /dev/null
+++ b/code/datums/elements/world_icon.dm
@@ -0,0 +1,121 @@
+/////////////////////////////////////////////////////////////
+////////// WORLD ICON ELEMENT DIRECTORY //////////
+/////////////////////////////////////////////////////////////
+//PORTED FROM MOJAVE SUN//
+
+// Slap onto something to give it a world icon that differs from the inventory one (allows for realistically sized objects and all that) //
+// To fix 25/06/2021 : Blood Decals, Mutable Overlays and other baked in bitch ass overlays that need to be remade when the icon changes //
+// Fixed 07/05/2022: Now you can deal with the above by handling everything with attached_proc instead
+// Fixed 12/04/2023: Icon states, Needs major tuning up by someone who can properly make it work
+
+/datum/element/world_icon
+ id_arg_index = 2
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ //If we want COMPLEX world icon behavior, this proc will handle icon updating when the item is NOT in the inventory.
+ //I just assumed that the default update_icon is for inventory sprites because ss13 basically focuses on how the sprites
+ //look on your hand, not how they realistically look in the world.
+ var/attached_proc
+ /// Only used if attached_proc doesn't exist, simply changes the icon of target to this when it's in the inventory
+ var/inventory_icon
+ /// Only used if attached_proc doesn't exist, simply changes the icon of target to this when it's NOT in the inventory
+ var/world_icon
+ /// Only used when inventory state icon is different from original
+ var/inventory_icon_state
+ /// Only used when world state icon is different from original, pretty much just the original "icon_state" but if you for some reason need to flip the standard icon states for this element around you can use this
+ var/world_icon_state
+
+/datum/element/world_icon/Attach(obj/item/target, attached_proc, world_icon, inventory_icon, world_icon_state, inventory_icon_state)
+ . = ..()
+ if(!istype(target))
+ return ELEMENT_INCOMPATIBLE
+
+ src.attached_proc = attached_proc
+ src.world_icon = world_icon
+ src.world_icon_state = world_icon_state
+ src.inventory_icon = inventory_icon
+ src.inventory_icon_state = inventory_icon_state
+ RegisterSignal(target, COMSIG_ATOM_UPDATE_ICON, PROC_REF(update_icon))
+ RegisterSignal(target, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(update_icon_state))
+ RegisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_STORAGE_ENTERED, COMSIG_ITEM_DROPPED, COMSIG_STORAGE_EXITED), PROC_REF(inventory_updated))
+ target.update_appearance(UPDATE_ICON)
+ target.update_appearance(UPDATE_ICON_STATE)
+
+/datum/element/world_icon/Detach(obj/item/source)
+ . = ..()
+ UnregisterSignal(source, COMSIG_ATOM_UPDATE_ICON)
+ UnregisterSignal(source, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(update_icon_state))
+ UnregisterSignal(source, list(COMSIG_ITEM_EQUIPPED, COMSIG_STORAGE_ENTERED, COMSIG_ITEM_DROPPED, COMSIG_STORAGE_EXITED))
+ source.update_appearance(UPDATE_ICON)
+ source.update_appearance(UPDATE_ICON_STATE)
+
+/datum/element/world_icon/proc/update_icon(obj/item/source, updates)
+ SIGNAL_HANDLER
+
+ if((source.item_flags & IN_INVENTORY) || (source.loc && SEND_SIGNAL(source.loc, COMSIG_CONTAINS_STORAGE)))
+ if(attached_proc)
+ return
+ return default_inventory_icon(source)
+
+ if(attached_proc)
+ return call(source, attached_proc)(updates)
+ else
+ return default_world_icon(source)
+
+/datum/element/world_icon/proc/update_icon_state(obj/item/source, updates)
+ SIGNAL_HANDLER
+
+ if((source.item_flags & IN_INVENTORY) || (source.loc && SEND_SIGNAL(source.loc, COMSIG_CONTAINS_STORAGE)))
+ if(attached_proc)
+ return
+ return default_inventory_icon_state(source)
+
+ if(attached_proc)
+ return call(source, attached_proc)(updates)
+ else
+ return default_world_icon_state(source)
+
+/datum/element/world_icon/proc/inventory_updated(obj/item/source)
+ SIGNAL_HANDLER
+
+ source.update_appearance(UPDATE_ICON)
+ source.update_appearance(UPDATE_ICON_STATE)
+
+/datum/element/world_icon/proc/default_inventory_icon(obj/item/source)
+ SIGNAL_HANDLER
+
+ source.icon = inventory_icon
+
+/datum/element/world_icon/proc/default_world_icon(obj/item/source)
+ SIGNAL_HANDLER
+
+ source.icon = world_icon
+
+/datum/element/world_icon/proc/default_inventory_icon_state(obj/item/source)
+ SIGNAL_HANDLER
+
+ if(!inventory_icon_state)
+ source.icon_state = source.icon_state
+ return
+
+ INVOKE_ASYNC(src, PROC_REF(check_inventory_state), source)
+
+/datum/element/world_icon/proc/default_world_icon_state(obj/item/source)
+ SIGNAL_HANDLER
+
+ if(!world_icon_state)
+ source.icon_state = source.icon_state
+ return
+
+ INVOKE_ASYNC(src, PROC_REF(check_world_icon_state), source)
+
+/datum/element/world_icon/proc/check_inventory_state(obj/item/source)
+ SIGNAL_HANDLER
+
+ inventory_icon_state = source.inventory_state
+ source.icon_state = inventory_icon_state
+
+/datum/element/world_icon/proc/check_world_icon_state(obj/item/source)
+ SIGNAL_HANDLER
+
+ world_icon_state = source.world_state
+ source.icon_state = world_icon_state
diff --git a/code/datums/ert.dm b/code/datums/ert.dm
index ff11057704c4..0c5227e41074 100644
--- a/code/datums/ert.dm
+++ b/code/datums/ert.dm
@@ -257,10 +257,16 @@
/datum/ert/frontier/assault
leader_role = /datum/antagonist/ert/frontier/leader
- roles = list(/datum/antagonist/ert/frontier, /datum/antagonist/ert/frontier/medic, /datum/antagonist/ert/frontier/engineer)
+ roles = list(/datum/antagonist/ert/frontier/better, /datum/antagonist/ert/frontier/medic, /datum/antagonist/ert/frontier/engineer)
rename_team = "Assault Frontiersmen Team"
polldesc = "a well armed squad of pirates"
+/datum/ert/frontier/unarmed //use for finer control of pirate's armaments
+ leader_role = /datum/antagonist/ert/frontier/leader/unnarmed
+ roles = list(/datum/antagonist/ert/frontier/unnarmed)
+ rename_team = "Unnarmed Frontiersmen Team"
+ polldesc = "a custom squad of pirates"
+
/datum/ert/independent
teamsize = 3
opendoors = FALSE
diff --git a/code/datums/guestbook.dm b/code/datums/guestbook.dm
new file mode 100644
index 000000000000..99104f09d715
--- /dev/null
+++ b/code/datums/guestbook.dm
@@ -0,0 +1,148 @@
+/**
+ * THE GUESTBOOK DATUM // ripped straight from mojave.
+ *
+ * Essentially, this datum handles the people that a given human knows,
+ * to handle getting the correct names on examine and saycode.
+ */
+/datum/guestbook
+ /// Associative list of known guests, real_name = known_name
+ var/list/known_names
+
+/datum/guestbook/Destroy(force)
+ known_names = null
+ return ..()
+
+/datum/guestbook/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "Guestbook", "[user.real_name]'s Guestbook")
+ ui.set_autoupdate(FALSE)
+ ui.open()
+
+/datum/guestbook/ui_state(mob/user)
+ return GLOB.always_state
+
+/datum/guestbook/ui_data(mob/user)
+ var/list/data = list()
+ var/list/names = list()
+ for(var/real_name in known_names)
+ var/given_name = LAZYACCESS(known_names, real_name)
+ names += list(list("real_name" = real_name, "given_name" = given_name))
+ data["names"] = names
+ return data
+
+/datum/guestbook/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return .
+ switch(action)
+ if("rename_guest")
+ var/real_name = params["real_name"]
+ var/new_name = params["new_name"]
+ new_name = reject_bad_name(new_name, max_length = 42)
+ if(!new_name)
+ to_chat(usr, span_warning("That's a pretty terrible name. You can do better."))
+ return FALSE
+ if(!rename_guest(usr, null, real_name, new_name, silent = FALSE))
+ return FALSE
+ return TRUE
+ if("delete_guest")
+ var/real_name = params["real_name"]
+ if(!remove_guest(usr, null, real_name, silent = FALSE))
+ return FALSE
+ return TRUE
+
+/datum/guestbook/proc/try_add_guest(mob/user, mob/living/carbon/human/guest, silent = FALSE)
+ if(user == guest)
+ if(!silent)
+ to_chat(user, span_warning("That's you! You already know yourself plenty."))
+ return FALSE
+ if(!visibility_checks(user, guest, silent))
+ return FALSE
+ var/given_name = input(user, "What name do you want to give to [guest]?", "Guestbook Name", guest.get_visible_name())
+ if(!given_name)
+ if(!silent)
+ to_chat(user, span_warning("Nevermind."))
+ return FALSE
+ given_name = reject_bad_name(given_name)
+ if(!given_name)
+ if(!silent)
+ to_chat(user, span_warning("That's a pretty terrible name. You can do better."))
+ return FALSE
+ if(!visibility_checks(user, guest, silent))
+ return FALSE
+ var/face_name = guest.get_face_name("ForgetMeNot")
+ if(LAZYACCESS(known_names, face_name))
+ if(!rename_guest(user, guest, face_name, given_name, silent))
+ return FALSE
+ else
+ if(!add_guest(user, guest, face_name, given_name, silent))
+ return FALSE
+ return TRUE
+
+/datum/guestbook/proc/add_guest(mob/user, mob/living/carbon/guest, real_name, given_name, silent = TRUE)
+ //Already exists, should be handled by rename_guest()
+ var/existing_name = LAZYACCESS(known_names, real_name)
+ if(existing_name)
+ if(!silent)
+ to_chat(user, span_warning("You already know them as \"[existing_name]\"."))
+ return FALSE
+ LAZYADDASSOC(known_names, real_name, given_name)
+ if(!silent)
+ to_chat(user, span_notice("You memorize the face of [guest] as \"[given_name]\"."))
+ return TRUE
+
+/datum/guestbook/proc/rename_guest(mob/user, mob/living/carbon/guest, real_name, given_name, silent = TRUE)
+ var/old_name = LAZYACCESS(known_names, real_name)
+ if(!old_name)
+ return FALSE
+ known_names[real_name] = given_name
+ if(!silent)
+ to_chat(user, span_notice("You re-memorize the face of \"[old_name]\" as \"[given_name]\"."))
+ return TRUE
+
+/datum/guestbook/proc/try_remove_guest(mob/user, mob/living/carbon/human/guest, silent = FALSE)
+ if(user == guest)
+ if(!silent)
+ to_chat(user, span_warning("That's you! You'll never forget yourself."))
+ return
+ if(!visibility_checks(user, guest, silent))
+ return FALSE
+ var/face_name = guest.get_face_name("ForgetMeNot")
+ if(!remove_guest(user, guest, face_name, silent))
+ return FALSE
+ return TRUE
+
+/datum/guestbook/proc/remove_guest(mob/user, mob/living/carbon/guest, real_name, silent = TRUE)
+ //Already exists, should be handled by rename_guest()
+ var/existing_name = LAZYACCESS(known_names, real_name)
+ if(!existing_name)
+ if(!silent)
+ to_chat(user, span_warning("You don't know them in the first place."))
+ return FALSE
+ LAZYREMOVE(known_names, real_name)
+ if(!silent)
+ to_chat(user, span_notice("You forget the face of \"[existing_name]\"."))
+ return TRUE
+
+/datum/guestbook/proc/get_known_name(mob/user, mob/living/carbon/guest, real_name)
+ if(user == guest || isAdminObserver(user))
+ return real_name
+ return LAZYACCESS(known_names, real_name)
+
+/datum/guestbook/proc/visibility_checks(mob/user, mob/living/carbon/human/guest, silent = FALSE)
+ if(QDELETED(guest))
+ if(!silent)
+ to_chat(user, span_warning("What?"))
+ return FALSE
+ var/visible_name = guest.get_visible_name("")
+ var/face_name = guest.get_face_name("")
+ if(!visible_name || !face_name)
+ if(!silent)
+ to_chat(user, span_warning("You can't see their face very well!"))
+ return FALSE
+ if(get_dist(user, guest) > 4)
+ if(!silent)
+ to_chat(user, span_warning("You need to take a closer look at them!"))
+ return FALSE
+ return TRUE
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 721444281653..c5f907f9c31d 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -462,303 +462,3 @@
NAME Blackbox Automated Message
SAY Connection lost. Dumping audio logs to disk.
DELAY 50"}
-
-/obj/item/disk/holodisk/rube/disk1
- name = "Gustus Amort on how to be a successful Engineer 1: Overview"
- desc = "A guide by Gustus Amort on running the Rube Goldberg Class Vessel. This seems to be disk 1."
- preset_image_type = /datum/preset_holoimage/engineer/ce
- preset_record_text = {"
- NAME Gustus Amort
- SAY Hello and welcome to your new-ish Rube Goldberg-class space faring vessel!
- DELAY 30
- NAME Mary Polish
- PRESET /datum/preset_holoimage/engineer/atmos
- SAY Oh are you going to tell them about how to set up the atmos on this?
- DELAY 2
- NAME Gustus Amort
- PRESET /datum/preset_holoimage/engineer/ce
- SAY Yes, we'll get to that. I'm doing the intro.
- SOUND explosion
- SOUND sparks
- DELAY 30
- SAY God Dammit! Who the hell was watching the burn mix?!
- SOUND spark
- DELAY 30
- NAME Mary Polish
- PRESET /datum/preset_holoimage/engineer/atmos
- SAY That was Jamie, they were testing out that Supermatter we had in the back.
- DELAY 30
- NAME Gustus Amort
- PRESET /datum/preset_holoimage/engineer/ce
- SAY GOD DAMMIT I SAID TO WAIT. Tell him to turn it the fuck off.
- DELAY 30
- NAME Mary Polish
- PRESET /datum/preset_holoimage/engineer/atmos
- SAY On it Sir.
- DELAY 30
- NAME Gustus Amort
- PRESET /datum/preset_holoimage/engineer/ce
- SAY Alright. I have to go cleanup. Disk 2 is general operation.
- DELAY 30
- SAY Disk 3 is Atmos Setup
- DELAY 30
- SAY Disk 4 is Burnmix Setup
- DELAY 30
- SAY Disk 5 is TEG Setup
- DELAY 30
- SAY And Disk 6 is everything else.
-
- "}
-
-/obj/item/disk/holodisk/rube/disk2
- name = "Gustus Amort on how to be a successful Engineer 2: General Operations"
- desc = "A guide by Gustus Amort on general operations of the Rube Goldberg Class Vessel. This seems to be disk 2."
- preset_image_type = /datum/preset_holoimage/engineer/ce
- preset_record_text = {"
- NAME Gustus Amort
- SAY Alright welcome to disk 2-
- SOUND explosion
- DELAY 15
- SAY Anyway, general operations. You'll need to run a tight shift to keep this puppy floating.
- DELAY 30
- SAY This ship is equipped with a lot of equipment, almost anything you could want or need as an Engineer.
- SOUND spark
- DELAY 30
- SAY Sadly the budget did not allow for a good handful of this equipment to be installed properly.
- DELAY 30
- SAY To start you'll want to set up your atmospherics system. Air and burn mix primarily. You'll learn that on Disk 3 and 4.
- DELAY 30
- SAY After you-
- SOUND spark
- DELAY 30
- SAY You'll want to make sure your power is good. You'll need to set up the TEG in the back. Disk 5 for that.
- DELAY 30
- SAY Once that's all out of the way, you'll ned to make sure this puppy can move around right?
- DELAY 30
- SAY That's simple turning on the thrusters. Eh- You'll learn that in disk 6.
- DELAY 30
- SAY Finally, once the ship is operational, that's where we get the fun. You'll find a good number of circuits in storage.
- DELAY 30
- SAY Your miners will need you to build their equipment, their vendor and Ore redemption. You do want them to be able to work right?
- DELAY 30
- SAY This will be continued in-
- SOUND explosion
- DELAY 30
- SAY Ok... Yeah Disk 3.
- DELAY 30
-
- "}
-
-/obj/item/disk/holodisk/rube/disk3
- name = "Gustus Amort on how to be a successful Engineer 3: Atmos"
- desc = "A guide by Gustus Amort on setting up Atmos in the Rube Goldberg Class Vessel. This seems to be disk 3."
- preset_image_type = /datum/preset_holoimage/engineer/ce
- preset_record_text = {"
- NAME Gustus Amort
- SAY Alright, now that you know what you have to do, here's how to get started!
- SOUND spark
- DELAY 10
- SAY I'll be handing this one off to our Atmos Tech, Ms. Polish.
- DELAY 30
- NAME Mary Polish
- PRESET /datum/preset_holoimage/engineer/atmos
- SAY Hello! This is Mary! So your Chief Engineer just told you to set up atmos huh?
- DELAY 30
- SAY Well I'm sure you're well acquainted with the ins and out sof fluid dynamics. But just in case!
- DELAY 30
- SAY To start you'll want to get your gas supplies ready. It's the same procoess for all of them.
- DELAY 30
- SAY You'll need to put on your hardsuit and get an oxygen tank, so suit up!
- DELAY 30
- SAY Then you'll go into each chamber and do the following:
- DELAY 30
- SAY 1: Wrench the portable canister into the connector.
- DELAY 30
- SAY 2: Turn on the pump, and max the pressure.
- DELAY 30
- SAY 3: Open the portable canister, no need to touch the pressure control.
- DELAY 30
- SAY Once that's all done your chambers should be ready to go! That is, all but the mix chamber.
- DELAY 30
- SAY For the ship air, simply turn on the pump labeled Air Mix to Air Supply. Don't mess with the pressure.
- DELAY 30
- SAY For everything else, you can adjust the pumps coming from each chamber to move it out.
- DELAY 30
- SAY See you on disk-
- SOUND explosion
- DELAY 30
- SAY 4- IT WASN'T MY FAULT.
- "}
-
-/obj/item/disk/holodisk/rube/disk4
- name = "Gustus Amort on how to be a successful Engineer 4: Plasma and Burn Mix"
- desc = "A guide by Gustus Amort on plasma and burn mixes. This seems to be disk 4."
- preset_image_type = /datum/preset_holoimage/engineer/ce
- preset_record_text = {"
- NAME Gustus Amort
- SAY Thank you Mary, go clean up that mess with Jamie and I'll take it from here.
- DELAY 30
- SAY Now that you've set up oxygen and made your gases accessible to the mixer, it's time to get to work.
- DELAY 30
- SAY You'll need to pump your plasma out of the chamber at max volume, set the pump accordingly. Same for O2.
- DELAY 30
- SAY Before you start the burn mix, you'll want to supply your thrusters. Simply turn on the pump labeled Plasma to Thrusters.
- DELAY 30
- SAY You may wish to alter the output pressure here, but I find 1 or 200 kpa is just fine.
- DELAY 30
- SAY You'll want to set up your thrusters properly later. To do so you'll want to go to the north thruster room.
- DELAY 30
- SAY You'll notice there are pumps in leading to the plasma thrusters. Simply turn them on and adjust pressure to max.
- DELAY 30
- SAY Thrusters can wait for later however, time for the burn mix.
- DELAY 30
- SAY The O2 and Plasma pipes lead to a gas mixer preset to a 30 70 mix.
- DELAY 30
- SAY A proper burn mix can range from 60 percent plasma to 80 percent plasma, with the rest as oxygen.
- DELAY 30
- SAY If you want a different setup than a simple burnmix, you'll need to redo the piping in atmos.
- DELAY 30
- SAY Once you set your mixer to on it'll go to the mix chamber. Turn the pump labeled Gas Mix to Gas Chamber to max pressure and on.
- DELAY 30
- SAY Then you'll want to turn the mix tank scrubber to siphoning mode on extended range via the air alarm. You'll need an ID for this.
- DELAY 30
- SAY The mix chamber scrubber is typically Scrubber 1 on the console in atmos. But double check before adjusting. It should be the only one off by default.
- DELAY 30
- SAY Once your mix chamber is full of the burn mix, set the pump labeled Mix Chamber to Engine to 2000 KPA and on. Then you're done!
- DELAY 30
- SAY But that's standard stuff re-
- SOUND explosion
- SOUND explosion
- DELAY 30
- SAY Is it ove-
- SOUND explosion
- DELAY 30
- SAY Of course. Disk 5 is next.
-
- "}
-
-/obj/item/disk/holodisk/rube/disk5
- name = "Gustus Amort on how to be a successful Engineer 5: TEG"
- desc = "A guide by Gustus Amort on operation the Rube Goldberg TEG. This seems to be disk 5."
- preset_image_type = /datum/preset_holoimage/engineer/ce
- preset_record_text = {"
- NAME Gustus Amort
- SAY Alright we're finally handing it off to- JAMIE WHAT THE FUCK DID YOU DO?
- SOUND explosion
- SOUND spark
- DELAY 30
- SAY God dammit Jamie, alright just fucking turn the pipe off and vent it. Start from square one come on.
- DELAY 30
- SAY We've done this a hundred times now. Why do you always turn your shit on early?
- DELAY 30
- NAME Jamie Coldwell
- PRESET /datum/preset_holoimage/engineer
- SAY Well Chief, you see, I was trying to see if I could set it up with some plasma from the tanks in the shed, and the SM-
- DELAY 30
- NAME Gustus Amort
- PRESET /datum/preset_holoimage/engineer/ce
- SAY GOOD LORD YOU TRIED TO WHAT? No no no no no no no no. Just. Let me set it up. We'll fuck with the SM when we get planetside.
- DELAY 30
- SAY Alright so if you happen to have a not too bright engineer working your TEG-
- NAME Jamie Coldwell
- PRESET /datum/preset_holoimage/engineer
- DELAY 30
- SAY Hey!
- NAME Gustus Amort
- PRESET /datum/preset_holoimage/engineer/ce
- DELAY 30
- SAY Shut up Jamie. Anyway, you'll want to vent your chamber. That button is next to the service door behind the TEG.
- DELAY 30
- SAY Check the gas monitoring computer see when the chamber hits 0 KPA. Then shut the emergency hatch.
- DELAY 30
- SAY You'll need to make sure your TEG circulators are correctly set. Incoming is the cold loop, outgoing is the hot loop.
- DELAY 30
- SAY To change them you'll want to open the hatches with a scredriver and hit them with a multitool.
- DELAY 30
- SAY When you're all done, screw them back up and wrench the centerpiece, the thermoelectric generator.
- DELAY 30
- SAY Next you'll want to set the pump pressures. Do this before you turn them on.
- DELAY 30
- SAY Turn the pump labeled Engine Mix to Engine to 1000 KPA.
- DELAY 30
- SAY Turn the next pump after that to 610 KPA. It'll be placed directly in front of the cold loop going into the chamber.
- DELAY 30
- SAY Turn the next pump leading into the hot loop ciruclator to 710 KPA. And the TEG Waste Disposals Pump to max KPA.
- DELAY 30
- SAY Now you need to flood the chamber. Turn on Engine Mix to Engine, and the connected to the cold loop.
- DELAY 30
- SAY once the chamber filled up to a few thousand KPA, which you can check on the computer, you'll need to ignite it.
- DELAY 30
- SAY The igniters don't work very well, their button is behind the tables but in case that doesn't work...
- DELAY 30
- SAY Turn a welder on, there are a few on the table, and throw it in the disposals unit. Make sure to flush!
- DELAY 30
- SAY finally you have a burn mix roaring and ready! Turn on the remaining two pumps and you should be good to go!
- DELAY 30
- SAY Congratulations, you've set up the TEG! See! That wasn't so hard Jamie! Make sure to set your SMES's!
- DELAY 30
-
- "}
-
-
-/obj/item/disk/holodisk/rube/disk6
- name = "Gustus Amort on how to be a successful Engineer 6: What now?"
- desc = "A guide by Gustus Amort on what to do next! This seems to be disk 6."
- preset_image_type = /datum/preset_holoimage/engineer/ce
- preset_record_text = {"
- NAME Gustus Amort
- SAY Now that you've got your ship working like a well oiled pile of congregated circuits, you're probably wondering what to do next!
- DELAY 30
- SAY Lucky for you, there's a whole storage unit of things to do! You'll have materials waiting at your disposal.
- DELAY 30
- SAY Primarily speaking, you'll be set to land on a planet of your choice and set up shop.
- DELAY 30
- SAY You have a wire running out through storage and up to the dock doors.
- DELAY 30
- SAY My recommendation is to use this wire to run power out to your new colony, beachhouse, or factory whatever.
- DELAY 30
- SAY Other than that, you'll need to upgrade your machines, communicate with other ships for research components, and keep your bloodthirsty miner happy.
- DELAY 30
- SAY Good Luck! This is Gustus Amort signi- IS THAT A FUCKING BUBBLEGUM?
- SOUND explosion
-
- "}
-
-
-
-
-/obj/item/disk/holodisk/rube/disk7
- name = "Larry Triangles guide on how to be the last man standing."
- desc = "Gustus Amort didn't mention a disk 7? Maybe someone else made this one?"
- preset_image_type = /datum/preset_holoimage/miner
- preset_record_text = {"
- NAME Larry Triangles
- SAY Hey guys it is absolutely wonderful to hit you up today. Today we'll be going over how to not die in the horrid wastes of space.
- DELAY 30
- SAY Sadly, you got strande do this shithole ship with barely any supplies. How terrible for you!
- DELAY 30
- SAY No weapons, no KA, no nothing. Not even a drill! Just your wits and your basic tools.
- DELAY 30
- SAY Lucky for you, there are a few things around the ship that'll help you.
- DELAY 30
- SAY First is medicine. If you can't find your way to medbay, then you're a dead motherfucker anyway.
- DELAY 30
- SAY There's a wall nanomed in there, as well as some blood bags. Best to be prepared!
- DELAY 30
- SAY Next is a melee weapon. And you got the best one available, the Fire Axe! It's just up at the end of atmos.
- DELAY 30
- SAY Now finally the piece of resistance. Your boss has a very special item in their locker. A gun.
- DELAY 30
- SAY But not just any gun! A fucking lever action action 38 cal hunting rifle! They also have ammo and a design disk.
- DELAY 30
- SAY Now you'll either need to kiss ass or break in. I prefer breaking in while the boss is distracted.
- DELAY 30
- SAY Engineers aren't the only ones with the tools to break open lockers you know.
- DELAY 30
- SAY Your boss left you emitters, plasma, tools, portable generators, and a spare power source to bust that shit open!
- DELAY 30
- SAY Once you got all that it's time to bitch and moan until they build you your ore redemption machine and supply vendor!
- DELAY 30
- SAY Now excuse me, I'm gonna go punk my captain with a bubblegum I found outside.
-
- "}
diff --git a/code/datums/keybinding/client.dm b/code/datums/keybinding/client.dm
index e4b940c7f722..3e78c4ac4c23 100644
--- a/code/datums/keybinding/client.dm
+++ b/code/datums/keybinding/client.dm
@@ -45,3 +45,39 @@
return
user.mob.button_pressed_F12()
return TRUE
+
+/client
+ var/fullscreen = FALSE
+/datum/keybinding/client/t_fullscreen
+ hotkey_keys = list("F11")
+ name = "change_fullscreen"
+ full_name = "Toggle Fullscreen"
+ description = "Change window to Fullscreen or back"
+ keybind_signal = COMSIG_KB_CLIENT_FULLSCREEN_DOWN
+
+/datum/keybinding/client/t_fullscreen/down(client/C)
+ . = ..()
+ C.toggle_fullscreen()
+
+
+/client/verb/toggle_fullscreen()
+ set name = "Toggle Fullscreen"
+ set category = "OOC"
+
+ fullscreen = !fullscreen
+
+ if (fullscreen)
+ winset(usr, "mainwindow", "on-size=")
+ winset(usr, "mainwindow", "titlebar=false")
+ winset(usr, "mainwindow", "can-resize=false")
+ winset(usr, "mainwindow", "menu=")
+ winset(usr, "mainwindow", "is-maximized=false")
+ winset(usr, "mainwindow", "is-maximized=true")
+ else
+ winset(usr, "mainwindow", "titlebar=true")
+ winset(usr, "mainwindow", "can-resize=true")
+ winset(usr, "mainwindow", "menu=menu")
+ winset(usr, "mainwindow", "is-maximized=false")
+ winset(usr, "mainwindow", "on-size=fitviewport")
+
+ fit_viewport()
diff --git a/code/datums/mapgen/planetary/AsteroidGenerator.dm b/code/datums/mapgen/planetary/AsteroidGenerator.dm
index c2f7a5340097..737194b5ee28 100644
--- a/code/datums/mapgen/planetary/AsteroidGenerator.dm
+++ b/code/datums/mapgen/planetary/AsteroidGenerator.dm
@@ -114,7 +114,10 @@
/obj/structure/geyser/random = 1,
/obj/structure/spawner/mining/goliath = 1,
/obj/structure/spawner/mining = 1,
- /obj/structure/spawner/mining/hivelord = 1
+ /obj/structure/spawner/mining/hivelord = 1,
+ /obj/structure/vein/asteroid = 5,
+ /obj/structure/vein/classtwo/asteroid = 10,
+ /obj/structure/vein/classthree/asteroid = 5
)
mob_spawn_list = list(
@@ -157,8 +160,11 @@
)
feature_spawn_list = list(
- /obj/structure/geyser/random = 1,
- /obj/structure/spawner/mining/carp = 1
+ /obj/structure/geyser/random = 5,
+ /obj/structure/spawner/mining/carp = 5,
+ /obj/structure/vein/asteroid = 10,
+ /obj/structure/vein/classtwo/asteroid = 15,
+ /obj/structure/vein/classthree/asteroid = 12
)
mob_spawn_list = list(
diff --git a/code/datums/mapgen/planetary/LavaGenerator.dm b/code/datums/mapgen/planetary/LavaGenerator.dm
index c244f3ef2560..ef66cca1103f 100644
--- a/code/datums/mapgen/planetary/LavaGenerator.dm
+++ b/code/datums/mapgen/planetary/LavaGenerator.dm
@@ -84,7 +84,7 @@
/datum/biome/lavaland
open_turf_types = list(
- /turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit = 1
+ /turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit = 1,
)
flora_spawn_chance = 1
flora_spawn_list = list(
@@ -93,17 +93,22 @@
/obj/structure/flora/ash/fern = 5,
/obj/structure/flora/ash/fireblossom = 1,
/obj/structure/flora/ash/puce = 5,
+ /obj/item/mine/pressure/explosive/rusty/live = 1,
)
feature_spawn_chance = 0.3
feature_spawn_list = list(
+ /obj/structure/flora/rock/hell = 20,
+ /obj/structure/elite_tumor = 4,
+ /obj/structure/geyser/random = 4,
+ /obj/effect/spawner/lootdrop/anomaly/lava = 2,
/obj/structure/flora/rock/hell = 14,
/obj/structure/vein = 5,
/obj/structure/vein/classtwo = 2,
/obj/structure/elite_tumor = 2,
/obj/structure/geyser/random = 2,
/obj/structure/vein/classthree = 1,
+ /obj/effect/spawner/minefield = 1,
/obj/effect/spawner/lootdrop/anomaly/lava = 1,
-
)
mob_spawn_chance = 4
mob_spawn_list = list(
@@ -250,14 +255,17 @@
/obj/structure/flora/ash/cacti = 1,
/obj/structure/flora/ash/tall_shroom = 2,
/obj/structure/flora/ash/fern = 2,
- /obj/structure/flora/ash/puce = 2
+ /obj/structure/flora/ash/puce = 2,
+ /obj/item/mine/proximity/explosive/live = 1,
+ /obj/item/mine/pressure/explosive/rusty/live = 1
)
/datum/biome/cave/lavaland/rocky
open_turf_types = list(/turf/open/floor/plating/asteroid/purple = 1)
flora_spawn_list = list(
- /obj/structure/flora/rock/pile/lava = 1,
- /obj/structure/flora/rock/lava = 1
+ /obj/structure/flora/rock/pile/lava = 3,
+ /obj/structure/flora/rock/lava = 3,
+ /obj/item/mine/pressure/explosive/rusty/live = 1
)
flora_spawn_chance = 5
@@ -271,6 +279,7 @@
/obj/structure/flora/ash/cap_shroom = 2,
/obj/structure/flora/ash/stem_shroom = 2,
/obj/structure/flora/ash/cacti = 1,
+ /obj/item/mine/pressure/explosive/rusty/live = 1,
/obj/structure/flora/ash/tall_shroom = 2
)
diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm
index 95e1273bb9d7..c675c87714f5 100644
--- a/code/datums/mapgen/planetary/RockGenerator.dm
+++ b/code/datums/mapgen/planetary/RockGenerator.dm
@@ -91,6 +91,7 @@
/obj/structure/vein/classtwo = 40,
/obj/effect/spawner/lootdrop/anomaly/rock = 10,
/obj/structure/vein/classthree = 10,
+ /obj/effect/spawner/minefield = 2,
/obj/effect/spawner/lootdrop/anomaly/big = 1 //get out of here stalker
)
@@ -98,10 +99,11 @@
mob_spawn_chance = 3
flora_spawn_list = list(
- /obj/structure/flora/rock/rockplanet = 3,
- /obj/structure/flora/tree/cactus = 4,
- /obj/structure/flora/ash/cacti = 1,
- /obj/structure/flora/ash/garden/arid = 1,
+ /obj/structure/flora/rock/rockplanet = 6,
+ /obj/structure/flora/tree/cactus = 8,
+ /obj/structure/flora/ash/cacti = 2,
+ /obj/structure/flora/ash/garden/arid = 2,
+ /obj/item/mine/pressure/explosive/rusty/live = 1
)
mob_spawn_list = list(
@@ -136,6 +138,7 @@
/obj/structure/flora/ash/cacti = 2,
/obj/structure/flora/grass/rockplanet/dead = 8,
/obj/structure/flora/ash/garden/arid = 1,
+ /obj/item/mine/pressure/explosive/rusty/live = 1
)
/datum/biome/cave/rock
@@ -143,10 +146,12 @@
open_turf_types = list(/turf/open/floor/plating/asteroid/rockplanet/cracked = 1)
flora_spawn_chance = 4
flora_spawn_list = list(
- /obj/structure/flora/rock/rockplanet = 4,
- /obj/structure/flora/rock/pile/rockplanet = 4,
- /obj/structure/flora/ash/fern = 2,
- /obj/structure/flora/ash/puce = 1,
+ /obj/structure/flora/rock/rockplanet = 8,
+ /obj/structure/flora/rock/pile/rockplanet = 8,
+ /obj/structure/flora/ash/fern = 4,
+ /obj/structure/flora/ash/puce = 2,
+ /obj/item/mine/pressure/explosive/rusty/live = 1,
+ /obj/item/mine/proximity/explosive/live = 1,
)
feature_spawn_chance = 0.5
feature_spawn_list = list(
@@ -155,6 +160,7 @@
/obj/structure/vein/classtwo = 2,
/obj/structure/elite_tumor = 1,
/obj/structure/vein/classthree = 1,
+ /obj/effect/spawner/minefield = 1,
/obj/structure/spawner/ice_moon/rockplanet = 4,
/obj/effect/spawner/lootdrop/anomaly/rock/cave = 1,
)
@@ -172,11 +178,13 @@
open_turf_types = list(/turf/open/floor/plating/asteroid/rockplanet/cracked = 1)
flora_spawn_chance = 5
flora_spawn_list = list(
- /obj/structure/flora/rock/rockplanet = 4,
- /obj/structure/flora/rock/pile/rockplanet = 4,
- /obj/structure/flora/ash/fern = 4,
- /obj/structure/flora/ash/puce = 2,
- /obj/structure/flora/ash/garden/arid = 1,
+ /obj/structure/flora/rock/rockplanet = 8,
+ /obj/structure/flora/rock/pile/rockplanet = 8,
+ /obj/structure/flora/ash/fern = 6,
+ /obj/structure/flora/ash/puce = 4,
+ /obj/structure/flora/ash/garden/arid = 2,
+ /obj/item/mine/proximity/explosive/live = 1,
+ /obj/item/mine/pressure/explosive/rusty/live = 1
)
mob_spawn_list = list(
/mob/living/simple_animal/hostile/netherworld/asteroid = 30,
diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm
index 442daa0c7705..91fad1430a47 100644
--- a/code/datums/mapgen/planetary/SandGenerator.dm
+++ b/code/datums/mapgen/planetary/SandGenerator.dm
@@ -103,7 +103,7 @@
/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50,
/mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40,
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30,
- /mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random = 25,
+ /mob/living/simple_animal/hostile/human/hermit/survivor/random = 25,
)
/datum/biome/sand/wasteland
@@ -135,7 +135,7 @@
)
mob_spawn_chance = 1
mob_spawn_list = list(
- /mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random = 1,
+ /mob/living/simple_animal/hostile/human/hermit/survivor/random = 1,
)
/datum/biome/sand/grass/dead
@@ -169,7 +169,7 @@
/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 40,
/mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 30,
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 20,
- /mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random = 40,
+ /mob/living/simple_animal/hostile/human/hermit/survivor/random = 40,
)
/datum/biome/sand/acid //plains
diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm
index a066647a0e4d..8489cbb970ba 100644
--- a/code/datums/mapgen/planetary/SnowGenerator.dm
+++ b/code/datums/mapgen/planetary/SnowGenerator.dm
@@ -90,12 +90,13 @@
/turf/open/floor/plating/asteroid/snow/lit = 25
)
flora_spawn_list = list(
- /obj/structure/flora/tree/pine = 2,
- /obj/structure/flora/rock/icy = 2,
- /obj/structure/flora/rock/pile/icy = 2,
- /obj/structure/flora/grass/both = 6,
- /obj/structure/flora/ash/chilly = 2,
- /obj/structure/flora/ash/garden/frigid = 1,
+ /obj/structure/flora/tree/pine = 4,
+ /obj/structure/flora/rock/icy = 4,
+ /obj/structure/flora/rock/pile/icy = 4,
+ /obj/structure/flora/grass/both = 12,
+ /obj/structure/flora/ash/chilly = 4,
+ /obj/structure/flora/ash/garden/frigid = 2,
+ /obj/item/mine/pressure/explosive/rusty/live = 1
)
flora_spawn_chance = 10
mob_spawn_chance = 1
@@ -118,6 +119,7 @@
/obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50,
/obj/structure/spawner/ice_moon/demonic_portal/high_threat = 13,
/obj/structure/vein/ice = 25,
+ /obj/effect/spawner/minefield = 2,
/obj/structure/vein/ice/classtwo = 50,
/obj/structure/vein/ice/classthree = 10,
)
@@ -148,9 +150,10 @@
/datum/biome/snow/forest
flora_spawn_chance = 15
flora_spawn_list = list(
- /obj/structure/flora/tree/pine = 10,
- /obj/structure/flora/tree/dead = 3,
- /obj/structure/flora/grass/both = 4
+ /obj/structure/flora/tree/pine = 20,
+ /obj/structure/flora/tree/dead = 6,
+ /obj/structure/flora/grass/both = 8,
+ /obj/item/mine/pressure/explosive/rusty/live = 1,
)
/datum/biome/snow/forest/dense
@@ -159,6 +162,7 @@
/obj/structure/flora/tree/pine = 20,
/obj/structure/flora/grass/both = 6,
/obj/structure/flora/tree/dead = 3,
+ /obj/item/mine/pressure/explosive/rusty/live = 1,
)
/datum/biome/arctic
@@ -242,15 +246,17 @@
)
flora_spawn_chance = 6
flora_spawn_list = list(
- /obj/structure/flora/grass/both = 5,
- /obj/structure/flora/rock/pile/icy = 1,
- /obj/structure/flora/rock/icy = 1,
- /obj/structure/flora/ash/space = 1,
- /obj/structure/flora/ash/leaf_shroom = 1,
- /obj/structure/flora/ash/cap_shroom = 1,
- /obj/structure/flora/ash/stem_shroom = 1,
- /obj/structure/flora/ash/puce = 1,
- /obj/structure/flora/ash/garden/frigid = 1,
+ /obj/structure/flora/grass/both = 10,
+ /obj/structure/flora/rock/pile/icy = 2,
+ /obj/structure/flora/rock/icy = 2,
+ /obj/structure/flora/ash/space = 2,
+ /obj/structure/flora/ash/leaf_shroom = 2,
+ /obj/structure/flora/ash/cap_shroom = 2,
+ /obj/structure/flora/ash/stem_shroom = 2,
+ /obj/structure/flora/ash/puce = 2,
+ /obj/structure/flora/ash/garden/frigid = 2,
+ /obj/item/mine/proximity/explosive/live = 1,
+ /obj/item/mine/pressure/explosive/rusty/live = 1
)
closed_turf_types = list(
/turf/closed/mineral/random/snow = 1
@@ -279,6 +285,7 @@
/obj/structure/vein/ice = 30,
/obj/structure/vein/ice/classtwo = 50,
/obj/structure/vein/ice/classthree = 6,
+ /obj/effect/spawner/minefield = 2,
)
/datum/biome/cave/snow/thawed
@@ -317,9 +324,10 @@
)
flora_spawn_chance = 3
flora_spawn_list = list(
- /obj/structure/flora/ash/leaf_shroom = 1,
- /obj/structure/flora/ash/cap_shroom = 1,
- /obj/structure/flora/ash/stem_shroom = 1,
+ /obj/structure/flora/ash/leaf_shroom = 3,
+ /obj/structure/flora/ash/cap_shroom = 3,
+ /obj/structure/flora/ash/stem_shroom = 3,
+ /obj/item/mine/pressure/explosive/fire/live = 1,
)
feature_spawn_chance = 0.2
diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm
index d0243740bc3b..c6e1244be129 100644
--- a/code/datums/mapgen/planetary/WasteGenerator.dm
+++ b/code/datums/mapgen/planetary/WasteGenerator.dm
@@ -125,7 +125,9 @@
//the illusive shrapnel plant
- /obj/effect/mine/shrapnel/human_only = 10
+ /obj/item/mine/pressure/explosive/shrapnel/live = 30,
+ /obj/effect/spawner/lootdrop/mine = 8,
+ /obj/effect/spawner/minefield = 2
)
feature_spawn_list = list(
@@ -202,7 +204,9 @@
/obj/effect/spawner/lootdrop/maintenance/four = 20,
/obj/structure/flora/ash/garden/waste = 300,
/obj/structure/flora/ash/glowshroom = 1800,
- /obj/effect/mine/shrapnel/human_only = 10
+ /obj/item/mine/pressure/explosive/shrapnel/live = 30,
+ /obj/effect/spawner/lootdrop/mine = 8,
+ /obj/effect/spawner/minefield = 2
)
/datum/biome/waste/tar_bed //tar colorings
@@ -246,7 +250,10 @@
/obj/structure/closet/crate/secure/loot = 30,
/obj/effect/spawner/lootdrop/waste/atmos_can = 180,
/obj/effect/spawner/lootdrop/waste/atmos_can/rare = 1,
- /obj/effect/spawner/lootdrop/waste/salvageable = 300
+ /obj/effect/spawner/lootdrop/waste/salvageable = 300,
+ /obj/item/mine/pressure/explosive/rad/live = 30,
+ /obj/effect/spawner/lootdrop/mine = 8,
+ /obj/effect/spawner/minefield = 2
)
mob_spawn_list = list( //nor organics, more biased towards hivebots though
/mob/living/simple_animal/hostile/hivebot/wasteplanet/strong = 80,
@@ -308,7 +315,9 @@
/obj/effect/spawner/lootdrop/waste/salvageable = 400,
/obj/structure/flora/ash/garden/waste = 70,
/obj/structure/flora/ash/glowshroom = 400, //more common in caves
- /obj/effect/mine/shrapnel/human_only = 10
+ /obj/item/mine/pressure/explosive/rad/live = 10,
+ /obj/effect/spawner/lootdrop/mine = 8,
+ /obj/effect/spawner/minefield = 2
)
feature_spawn_list = list(
@@ -362,7 +371,10 @@
/obj/effect/spawner/lootdrop/maintenance/two = 50,
/obj/effect/spawner/lootdrop/maintenance/three = 100,
/obj/effect/spawner/lootdrop/maintenance/four = 200,
- /obj/structure/flora/ash/glowshroom = 1800
+ /obj/structure/flora/ash/glowshroom = 1800,
+ /obj/item/mine/pressure/explosive/rad/live = 30,
+ /obj/effect/spawner/lootdrop/mine = 8,
+ /obj/effect/spawner/minefield = 2
)
feature_spawn_chance = 12
@@ -397,6 +409,9 @@
/obj/effect/spawner/lootdrop/maintenance/three = 20,
/obj/effect/spawner/lootdrop/maintenance/four = 40,
/obj/effect/spawner/lootdrop/waste/salvageable = 80,
+ /obj/item/mine/proximity/spawner/manhack/live = 40,
+ /obj/effect/spawner/lootdrop/mine = 8,
+ /obj/effect/spawner/minefield/manhack = 2
)
mob_spawn_list = list( //nor organics, more biased towards hivebots though
/mob/living/simple_animal/hostile/hivebot/wasteplanet/strong = 80,
@@ -427,7 +442,8 @@
/obj/effect/spawner/lootdrop/maintenance/three = 10,
/obj/effect/spawner/lootdrop/maintenance/four = 20,
/obj/effect/spawner/lootdrop/waste/salvageable = 40,
- /obj/structure/foamedmetal = 100
+ /obj/structure/foamedmetal = 100,
+ /obj/item/mine/proximity/spawner/manhack/live = 20
)
mob_spawn_list = list( //Whoops! All hivebots!
/mob/living/simple_animal/hostile/hivebot/wasteplanet/strong = 80,
@@ -440,6 +456,7 @@
/obj/structure/spawner/wasteplanet/hivebot/low_threat = 20,
/obj/structure/spawner/wasteplanet/hivebot/medium_threat = 10,
/obj/structure/spawner/wasteplanet/hivebot/high_threat = 5,
- /obj/structure/spawner/wasteplanet/hivebot/extreme_threat = 2
+ /obj/structure/spawner/wasteplanet/hivebot/extreme_threat = 2,
+ /obj/effect/spawner/minefield/manhack = 2
)
feature_spawn_chance = 2 //hivebot biomes should have their dongles
diff --git a/code/datums/mapgen/single_biome/WasteplanetCaves.dm b/code/datums/mapgen/single_biome/WasteplanetCaves.dm
index 472a5cf4d54b..08f63ba3149a 100644
--- a/code/datums/mapgen/single_biome/WasteplanetCaves.dm
+++ b/code/datums/mapgen/single_biome/WasteplanetCaves.dm
@@ -39,10 +39,12 @@
/obj/structure/salvageable/circuit_imprinter = 8,
/obj/structure/salvageable/destructive_analyzer = 8,
/obj/structure/salvageable/server = 8,
+ /obj/item/mine/pressure/explosive/rusty/live = 30,
+ /obj/effect/spawner/lootdrop/mine = 8
)
feature_spawn_list = list(
/obj/structure/geyser/random = 1,
- /obj/effect/mine/shrapnel/human_only = 1
+ /obj/effect/spawner/minefield = 1
)
mob_spawn_list = list(
//hivebots, not too difficult
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index ffee85cbf529..ab3a76d2ddff 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -203,7 +203,6 @@
name = "krav maga gloves"
desc = "These gloves can teach you to perform Krav Maga using nanochips."
icon_state = "fightgloves"
- item_state = "fightgloves"
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
@@ -214,7 +213,6 @@
name = "combat gloves plus"
desc = "These tactical gloves are fireproof and electrically insulated, and through the use of nanochip technology will teach you the martial art of krav maga."
icon_state = "black"
- item_state = "blackgloves"
siemens_coefficient = 0
permeability_coefficient = 0.05
strip_delay = 80
diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm
index 98db1541c953..ed8dd509ec3b 100644
--- a/code/datums/materials/basemats.dm
+++ b/code/datums/materials/basemats.dm
@@ -127,30 +127,6 @@ Unless you know what you're doing, only use the first three numbers. They're in
ore_type = /obj/item/stack/ore/bluespace_crystal
value_per_unit = 0.15
-///Honks and slips
-/datum/material/bananium
- name = "bananium"
- id = "bananium"
- desc = "Material with hilarious properties"
- color = "#ffff00" //obnoxiously bright yellow
- categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
- sheet_type = /obj/item/stack/sheet/mineral/bananium
- ore_type = /obj/item/stack/ore/bananium
- value_per_unit = 0.5
- beauty_modifier = 0.5
- armor_modifiers = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 0) //Clowns cant be blown away.
-
-/datum/material/bananium/on_applied(atom/source, amount, material_flags)
- . = ..()
- source.LoadComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50, falloff_exponent = 20)
- source.AddComponent(/datum/component/slippery, min(amount / 10, 80))
-
-
-/datum/material/bananium/on_removed(atom/source, amount, material_flags)
- . = ..()
- qdel(source.GetComponent(/datum/component/slippery))
- qdel(source.GetComponent(/datum/component/squeak))
-
///Mediocre force increase
/datum/material/titanium
@@ -166,18 +142,6 @@ Unless you know what you're doing, only use the first three numbers. They're in
beauty_modifier = 0.05
armor_modifiers = list("melee" = 1.35, "bullet" = 1.3, "laser" = 1.3, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1)
-/datum/material/runite
- name = "runite"
- id = "runite"
- desc = "Runite"
- color = "#3F9995"
- strength_modifier = 1.3
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
- sheet_type = /obj/item/stack/sheet/mineral/runite
- value_per_unit = 0.3
- beauty_modifier = 0.5
- armor_modifiers = list("melee" = 1.35, "bullet" = 2, "laser" = 0.5, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 1.4, "acid" = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle.
-
///Force decrease
/datum/material/plastic
name = "plastic"
@@ -224,42 +188,20 @@ Unless you know what you're doing, only use the first three numbers. They're in
var/obj/wooden = source
wooden.resistance_flags &= ~FLAMMABLE
-///Stronk force increase
-/datum/material/adamantine
- name = "adamantine"
- id = "adamantine"
- desc = "A powerful material made out of magic, I mean science!"
- color = "#6d7e8e"
+//Remember when the theme used to be "Eerie" before 1.3? Good times.
+/datum/material/hellstone
+ name = "hellstone"
+ id = "hellstone"
+ desc = "A colloquialism given to millenia-old slag, heat-treated through the eons in deep magma."
+ color = "#ffaf5e"
strength_modifier = 1.5
categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
- sheet_type = /obj/item/stack/sheet/mineral/adamantine
+ sheet_type = /obj/item/stack/sheet/mineral/hidden/hellstone
+ ore_type = /obj/item/stack/ore/hellstone
value_per_unit = 0.25
beauty_modifier = 0.4
armor_modifiers = list("melee" = 1.5, "bullet" = 1.5, "laser" = 1.3, "energy" = 1.3, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 2.5, "acid" = 1)
-///RPG Magic.
-/datum/material/mythril
- name = "mythril"
- id = "mythril"
- desc = "How this even exists is byond me"
- color = "#f2d5d7"
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
- sheet_type = /obj/item/stack/sheet/mineral/mythril
- value_per_unit = 0.75
- strength_modifier = 1.2
- armor_modifiers = list("melee" = 1.5, "bullet" = 1.5, "laser" = 1.5, "energy" = 1.5, "bomb" = 1.5, "bio" = 1.5, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5)
- beauty_modifier = 0.5
-
-/datum/material/mythril/on_applied_obj(atom/source, amount, material_flags)
- . = ..()
- if(istype(source, /obj/item))
- source.AddComponent(/datum/component/fantasy)
-
-/datum/material/mythril/on_removed_obj(atom/source, material_flags)
- . = ..()
- if(istype(source, /obj/item))
- qdel(source.GetComponent(/datum/component/fantasy))
-
//formed when freon react with o2, emits a lot of plasma when heated
/datum/material/hot_ice
name = "hot ice"
@@ -323,18 +265,6 @@ Unless you know what you're doing, only use the first three numbers. They're in
turf_sound_override = FOOTSTEP_SAND
texture_layer_icon_state = "sand"
-/datum/material/runedmetal
- name = "runed metal"
- id = "runed metal"
- desc = "Mir'ntrath barhah Nar'sie."
- color = "#3C3434"
- categories = list(MAT_CATEGORY_RIGID = TRUE)
- sheet_type = /obj/item/stack/sheet/runed_metal
- value_per_unit = 0.75
- armor_modifiers = list("melee" = 1.2, "bullet" = 1.2, "laser" = 1, "energy" = 1, "bomb" = 1.2, "bio" = 1.2, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5)
- beauty_modifier = -0.15
- texture_layer_icon_state = "runed"
-
/datum/material/bronze
name = "bronze"
id = "bronze"
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index fc91d2c71de1..96ca4b12d8b4 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -55,7 +55,6 @@
var/damnation_type = 0
var/datum/mind/soulOwner //who owns the soul. Under normal circumstances, this will point to src
var/hasSoul = TRUE // If false, renders the character unable to sell their soul.
- var/holy_role = NONE //is this person a chaplain or admin role allowed to use bibles, Any rank besides 'NONE' allows for this.
var/mob/living/enslaved_to //If this mind's master is another mob
var/datum/language_holder/language_holder
@@ -79,6 +78,9 @@
/// The index for our current scar slot, so we don't have to constantly check the savefile (unlike the slots themselves, this index is independent of selected char slot, and increments whenever a valid char is joined with)
var/current_scar_slot_index
+ /// Guestbook datum, in case we actually make use of the guestbook mechanics
+ var/datum/guestbook/guestbook
+
///Skill multiplier, adjusts how much xp you get/loose from adjust_xp. Dont override it directly, add your reason to experience_multiplier_reasons and use that as a key to put your value in there.
var/experience_multiplier = 1
///Skill multiplier list, just slap your multiplier change onto this with the type it is coming from as key.
@@ -95,6 +97,7 @@
key = _key
soulOwner = src
martial_art = default_martial_art
+ guestbook = new()
init_known_skills()
/datum/mind/Destroy()
@@ -102,6 +105,7 @@
if(islist(antag_datums))
QDEL_LIST(antag_datums)
QDEL_NULL(language_holder)
+ QDEL_NULL(guestbook)
set_current(null)
soulOwner = null
return ..()
diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm
index 6af401e8b009..028973c5c839 100644
--- a/code/datums/mood_events/drug_events.dm
+++ b/code/datums/mood_events/drug_events.dm
@@ -4,12 +4,12 @@
/datum/mood_event/smoked
description = "I have had a smoke recently.\n"
- mood_change = 2
+ mood_change = 1
timeout = 6 MINUTES
/datum/mood_event/wrong_brand
- description = "I hate that brand of cigarettes.\n"
- mood_change = -2
+ description = "That brand of cigarette just doesn't hit right.\n"
+ mood_change = -1
timeout = 6 MINUTES
/datum/mood_event/overdose
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index 84fca0443ca0..f5e51d1d59f4 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -292,3 +292,13 @@
description = "I was forced to eat cement...\n"
mood_change = -6
timeout = 4 MINUTES
+
+/datum/mood_event/joywire_emp
+ description = span_boldwarning("IT'S GONE!! IT'S GONE!!\n")
+ mood_change = -30
+ timeout = 5 MINUTES
+
+/datum/mood_event/mindscrew
+ description = span_boldwarning("It isn't ending... it isn't ending, come on...\n")
+ mood_change = -18
+ timeout = 3 MINUTES
diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm
index dbaac99c4296..f9e339c3c081 100644
--- a/code/datums/mood_events/generic_positive_events.dm
+++ b/code/datums/mood_events/generic_positive_events.dm
@@ -105,14 +105,6 @@
description = "My family heirloom is safe with me.\n"
mood_change = 1
-/datum/mood_event/fan_clown_pin
- description = "I love showing off my clown pin!\n"
- mood_change = 1
-
-/datum/mood_event/fan_mime_pin
- description = "I love showing off my mime pin!\n"
- mood_change = 1
-
/datum/mood_event/rilena_fan
description = "I love my RILENA merch!\n"
mood_change = 1
@@ -239,3 +231,13 @@
description = "Fishing is relaxing"
mood_change = 5
timeout = 3 MINUTES
+
+/datum/mood_event/joywire
+ description = span_boldnicegreen("I feel so joyous! Oh, so joyous!\n")
+ mood_change = 8
+ timeout = 10 SECONDS
+
+/datum/mood_event/root
+ description = span_nicegreen("I rooted recently, it feels good to charge naturally.\n")
+ mood_change = 5
+ timeout = 5 MINUTES
diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm
index f2ffe7c25fd2..53080247b827 100644
--- a/code/datums/mutations/actions.dm
+++ b/code/datums/mutations/actions.dm
@@ -88,67 +88,6 @@
if(direction_text)
to_chat(user,"You consider [tracking_target]'s scent. The trail leads [direction_text].")
-/datum/mutation/human/firebreath
- name = "Fire Breath"
- desc = "An ancient mutation that gives lizards breath of fire."
- quality = POSITIVE
- difficulty = 12
- locked = TRUE
- text_gain_indication = "Your throat is burning!"
- text_lose_indication = "Your throat is cooling down."
- power = /obj/effect/proc_holder/spell/aimed/firebreath
- instability = 30
- energy_coeff = 1
- power_coeff = 1
-
-/datum/mutation/human/firebreath/modify()
- if(power)
- var/obj/effect/proc_holder/spell/aimed/firebreath/S = power
- S.strength = GET_MUTATION_POWER(src)
-
-/obj/effect/proc_holder/spell/aimed/firebreath
- name = "Fire Breath"
- desc = "You can breathe fire at a target."
- school = "evocation"
- charge_max = 600
- clothes_req = FALSE
- range = 20
- projectile_type = /obj/projectile/magic/aoe/fireball/firebreath
- base_icon_state = "fireball"
- action_icon_state = "fireball0"
- sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises
- active_msg = "You built up heat in your mouth."
- deactive_msg = "You swallow the flame."
- var/strength = 1
-
-/obj/effect/proc_holder/spell/aimed/firebreath/before_cast(list/targets)
- . = ..()
- if(iscarbon(usr))
- var/mob/living/carbon/C = usr
- if(C.is_mouth_covered())
- C.adjust_fire_stacks(2)
- C.IgniteMob()
- to_chat(C,"Something in front of your mouth caught fire!")
- return FALSE
-
-/obj/effect/proc_holder/spell/aimed/firebreath/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration)
- if(!istype(P, /obj/projectile/magic/aoe/fireball))
- return
- var/obj/projectile/magic/aoe/fireball/F = P
- switch(strength)
- if(1 to 3)
- F.exp_light = strength-1
- if(4 to INFINITY)
- F.exp_heavy = strength-3
- F.exp_fire += strength
-
-/obj/projectile/magic/aoe/fireball/firebreath
- name = "fire breath"
- exp_heavy = 0
- exp_light = 0
- exp_flash = 0
- exp_fire= 4
-
/datum/mutation/human/void
name = "Void Magnet"
desc = "A rare genome that attracts odd forces not usually observed."
diff --git a/code/datums/numbered_display.dm b/code/datums/numbered_display.dm
index 9aa880aa75d9..b714be23fbbe 100644
--- a/code/datums/numbered_display.dm
+++ b/code/datums/numbered_display.dm
@@ -3,8 +3,8 @@
var/obj/item/sample_object
var/number
-/datum/numbered_display/New(obj/item/sample, _number = 1)
+/datum/numbered_display/New(obj/item/sample, _number = 1, datum/component/storage/parent)
if(!istype(sample))
qdel(src)
- sample_object = sample
+ sample_object = new /atom/movable/screen/storage/item_holder(null, parent, sample)
number = _number
diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm
index 964c269b5f43..34771af91ed2 100644
--- a/code/datums/outfit.dm
+++ b/code/datums/outfit.dm
@@ -104,6 +104,9 @@
/// Set to FALSE if your outfit requires runtime parameters
var/can_be_admin_equipped = TRUE
+ // Used to determine if it should be ignored in unit tests due to being to dynamic to always spawn backpack contents right
+ var/random = FALSE
+
/**
* extra types for chameleon outfit changes, mostly guns
*
diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm
index 5ffa3778edc6..7134d2e8ecef 100644
--- a/code/datums/progressbar.dm
+++ b/code/datums/progressbar.dm
@@ -32,12 +32,12 @@
return
goal = goal_number
bar_loc = target
- bar = image('icons/effects/progessbar.dmi', bar_loc, "prog_bar_0", HUD_LAYER)
+ bar = image('icons/effects/progressbar.dmi', bar_loc, "prog_bar_0", HUD_LAYER)
bar.plane = ABOVE_HUD_PLANE
bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
user = User
- LAZYADDASSOC(user.progressbars, bar_loc, src)
+ LAZYADDASSOCLIST(user.progressbars, bar_loc, src)
var/list/bars = user.progressbars[bar_loc]
listindex = bars.len
diff --git a/code/datums/ruins/beachplanet.dm b/code/datums/ruins/beachplanet.dm
index dae334aefae1..b258ef45f0e8 100644
--- a/code/datums/ruins/beachplanet.dm
+++ b/code/datums/ruins/beachplanet.dm
@@ -2,8 +2,6 @@
/datum/map_template/ruin/beachplanet
prefix = "_maps/RandomRuins/BeachRuins/"
- allow_duplicates = FALSE
- cost = 5
ruin_type = RUINTYPE_BEACH
/datum/map_template/ruin/beachplanet/fishinghut
@@ -18,12 +16,6 @@
description = "As you draw near the ancient wall, a sense of foreboding overcomes you. You aren't sure why, but you feel this dusty structure may contain great dangers."
suffix = "beach_ancient_ruin.dmm"
-/datum/map_template/ruin/beachplanet/colony
- name = "Abandoned Beachside Colony"
- id = "beach_colony"
- description = "A abandoned colony. It seems that this colony was abandoned, for a reason or another"
- suffix = "beach_colony.dmm"
-
/datum/map_template/ruin/beachplanet/town
name = "Beachside Town"
id = "beach_town"
@@ -36,18 +28,6 @@
description = "A small pirate outpost formed from the remains of a wrecked shuttle."
suffix = "beach_pirate_crash.dmm"
-/datum/map_template/ruin/beachplanet/fallenstar
- name = "Crashed Starwalker"
- id = "crashed_star"
- description = "A Crashed Starwalker Class Pirate Ship. It's Crew is Long-Dead."
- suffix = "beach_crashed_starwalker.dmm"
-
-/datum/map_template/ruin/beachplanet/knight
- name = "Knight's Rest"
- id = "knights_rest"
- description = "An small castle holding the grave of a renowned warrior"
- suffix = "beach_knights_rest.dmm"
-
/datum/map_template/ruin/beachplanet/treasurecove
name = "Treasure Cove"
id = "beach_treasure_cove"
diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm
index a447a5b6f465..60304e86f6f0 100644
--- a/code/datums/ruins/icemoon.dm
+++ b/code/datums/ruins/icemoon.dm
@@ -2,57 +2,20 @@
/datum/map_template/ruin/icemoon
prefix = "_maps/RandomRuins/IceRuins/"
- allow_duplicates = FALSE
- cost = 5
ruin_type = RUINTYPE_ICE
-// above ground only
-
-/datum/map_template/ruin/icemoon/engioutpost
- name = "Engineer Outpost"
- id = "engioutpost"
- description = "Blown up by an unfortunate accident."
- suffix = "icemoon_surface_engioutpost.dmm"
-
-
-/datum/map_template/ruin/icemoon/hydroponicslab //Shiptest edit
+/datum/map_template/ruin/icemoon/hydroponicslab
name = "Hydroponics Lab"
id = "hydroponicslab"
description = "An abandoned hydroponics research facility containing hostile plant fauna."
suffix = "icemoon_hydroponics_lab.dmm"
-// above and below ground together
-
-
-// below ground only
-
-/datum/map_template/ruin/icemoon
- name = "underground ruin"
-
/datum/map_template/ruin/icemoon/abandonedvillage
name = "Abandoned Village"
id = "abandonedvillage"
description = "Who knows what lies within?"
suffix = "icemoon_underground_abandoned_village.dmm"
-/datum/map_template/ruin/icemoon/corpreject
- name = "NT Security Solutions Site Gamma"
- id = "corpreject"
- description = "Nanotrasen Corporate Security Solutions vault site Gamma."
- suffix = "icemoon_surface_corporate_rejects.dmm"
-
-/datum/map_template/ruin/icemoon/syndicate_outpost
- name = "Abandoned Syndicate Outpost"
- id = "syndicate-outpost-icemoon"
- description = "A outpost that used to be a staging area for nuclear operatives. The Syndicate have moved to another location, but this still remains."
- suffix = "icemoon_underground_abandoned_newcops.dmm"
-
-/datum/map_template/ruin/icemoon/drakelair
- name = "Dragon's Lair"
- id = "drake-lair"
- description = "\"First the creature's Flame breathed from beneath the stone, Hot battle-fumes, and the earth rumbled.\""
- suffix = "icemoon_underground_drakelair.dmm"
-
/datum/map_template/ruin/icemoon/brazillian_lab
name = "Barricaded Compound"
id = "brazillian-lab"
diff --git a/code/datums/ruins/jungle.dm b/code/datums/ruins/jungle.dm
index 1f58dc96da67..f1e2e16bfec8 100644
--- a/code/datums/ruins/jungle.dm
+++ b/code/datums/ruins/jungle.dm
@@ -4,104 +4,12 @@
prefix = "_maps/RandomRuins/JungleRuins/"
ruin_type = RUINTYPE_JUNGLE
-/datum/map_template/ruin/jungle/jungle_botany_ruin
- id = "jungle_botany-ruin"
- suffix = "jungle_botany.dmm"
- name = "Ruined Botany Research Facility"
- description = "A research facility of great botany discoveries. Long since abandoned, willingly or not..."
-
-/datum/map_template/ruin/jungle/ai_ikea
- name = "Space Ikea AI Shipment"
- id = "ikea-ai"
- description = "A Space Ikea Brand AI Core and Necessities Crate, it seems to have missed its intended target."
- suffix = "jungle_surface_ikea_ai.dmm"
-
-/datum/map_template/ruin/jungle/coffinpirate
- name = "Coffin-Shaped Pirate Hut"
- id = "coffinpirate"
- description = "An odd coffin shaped pirate hut that the inhabitant of died in."
- suffix = "jungle_surface_coffinpirate.dmm"
-
-//far more tasteful than its predecessor...
-/datum/map_template/ruin/jungle/lessonintrickery
- name = "Bombmaker's Cabin"
- id = "bombmakers-cabin"
- description = "Playing with bombs again, are we?"
- suffix = "jungle_surface_bombmakers_cabin.dmm"
-
-/datum/map_template/ruin/jungle/weedshack
- name = "Stoner's Cabin"
- id = "weed-shack"
- description = "The Industrial Revolution and its consequences have been a disaster for the human race."
- suffix = "jungle_surface_weed_shack.dmm"
-
-//vae's jungle ruins from bungalowstation
-/datum/map_template/ruin/jungle/pizzawave
- name = "Jungle Pizzawave"
- id = "pizzawave"
- description = "Get some pizza my dude."
- suffix = "jungle_pizzawave.dmm"
-
-/datum/map_template/ruin/jungle/nest
- name = "Jungle Xenonest"
- id = "xenonestjungle"
- description = "A Xeno nest crammed into the Jungle."
- suffix = "jungle_nest.dmm"
-
-/datum/map_template/ruin/jungle/seedling
- name = "Seedling ruin"
- id = "seedling"
- description = "A rare seedling plant."
- suffix = "jungle_seedling.dmm"
-
-/datum/map_template/ruin/jungle/demon
- name = "Demonic Office"
- id = "demonjungle"
- description = "They handle the paperwork that comes with selling your soul."
- suffix = "jungle_demon.dmm"
-
-/datum/map_template/ruin/jungle/hangar
- name = "Abandoned Hangar"
- id = "hangar"
- description = "An abandoned hangar containing exosuits."
- suffix = "jungle_hangar.dmm"
-
-/datum/map_template/ruin/jungle/pirate
- name = "Jungle Pirates"
- id = "piratejungle"
- description = "A group of pirates on a small ship in the jungle."
- suffix = "jungle_pirate.dmm"
-
/datum/map_template/ruin/jungle/syndicate
name = "Jungle Syndicate Bunker"
id = "syndicatebunkerjungle"
description = "A small bunker owned by the Syndicate."
suffix = "jungle_syndicate.dmm"
-/datum/map_template/ruin/jungle/village
- name = "Monkey Village"
- id = "monkeyvillage"
- description = "A small village of monkeys."
- suffix = "jungle_village.dmm"
-
-/datum/map_template/ruin/jungle/witch
- name = "Jungle Witch"
- id = "witchjungle"
- description = "Some heretical sorcerer living in a dingy hut, with a cat."
- suffix = "jungle_witch.dmm"
-
-/datum/map_template/ruin/jungle/roommates
- name = "Roommates"
- id = "roommates"
- description = "A shack once inhabited by a clown and a mime... and they were roommates."
- suffix = "jungle_surface_roommates.dmm"
-
-/datum/map_template/ruin/jungle/ninjashrine
- name = "Ninja Shrine"
- id = "ninjashrine"
- description = "A ninja shrine."
- suffix = "jungle_surface_ninjashrine.dmm"
-
/datum/map_template/ruin/jungle/interceptor
name = "Old Crashed Interceptor"
id = "crashedcondor"
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index 05d1b6909bb9..816ffd685c14 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -4,75 +4,13 @@
prefix = "_maps/RandomRuins/LavaRuins/"
ruin_type = RUINTYPE_LAVA
-/datum/map_template/ruin/lavaland/biodome
- cost = 5
- allow_duplicates = FALSE
-
/datum/map_template/ruin/lavaland/biodome/winter
- name = "Biodome Winter"
+ name = "Solarian Winter Biodome"
id = "biodome-winter"
- description = "For those getaways where you want to get back to nature, but you don't want to leave the fortified military compound where you spend your days. \
- Includes a unique(*) laser pistol display case, and the recently introduced I.C.E(tm)."
+ description = "A Solarian frontier research facility created by the Pionierskompanien \
+ This one seems to simulate the wintery climate of the northern provinces, including a sauna!"
suffix = "lavaland_surface_biodome_winter.dmm"
-/datum/map_template/ruin/lavaland/sin
- cost = 10
- allow_duplicates = FALSE
-
-/datum/map_template/ruin/lavaland/sin/sloth
- name = "Ruin of Sloth"
- id = "sloth"
- description = "..."
- suffix = "lavaland_surface_sloth.dmm"
- // Generates nothing but atmos runtimes and salt
- cost = 0
-
-/datum/map_template/ruin/lavaland/hierophant
- name = "Hierophant's Arena"
- id = "hierophant"
- description = "A strange, square chunk of metal of massive size. Inside awaits only death and many, many squares."
- suffix = "lavaland_surface_hierophant.dmm"
- allow_duplicates = FALSE
-
-/datum/map_template/ruin/lavaland/xeno_nest
- name = "Xenomorph Nest"
- id = "xeno-nest"
- description = "These xenomorphs got bored of horrifically slaughtering people on space stations, and have settled down on a nice lava-filled hellscape to focus on what's really important in life. \
- Quality memes."
- suffix = "lavaland_surface_xeno_nest.dmm"
- cost = 20
-
-/datum/map_template/ruin/lavaland/survivalcapsule
- name = "Survival Capsule Ruins"
- id = "survivalcapsule"
- description = "What was once sanctuary to the common miner, is now their tomb."
- suffix = "lavaland_surface_survivalpod.dmm"
- cost = 5
-
-/datum/map_template/ruin/lavaland/pizza
- name = "Ruined Pizza Party"
- id = "pizza"
- description = "Little Timmy's birthday pizza bash took a turn for the worse when a bluespace anomaly passed by."
- suffix = "lavaland_surface_pizzaparty.dmm"
- allow_duplicates = FALSE
- cost = 5
-
-/datum/map_template/ruin/lavaland/cultaltar
- name = "Summoning Ritual"
- id = "cultaltar"
- description = "A place of vile worship, the scrawling of blood in the middle glowing eerily. A demonic laugh echoes throughout the caverns."
- suffix = "lavaland_surface_cultaltar.dmm"
- allow_duplicates = FALSE
- cost = 10
-
-/datum/map_template/ruin/lavaland/miningripley
- name = "Ripley"
- id = "ripley"
- description = "A heavily-damaged mining ripley, property of a very unfortunate miner. You might have to do a bit of work to fix this thing up."
- suffix = "lavaland_surface_random_ripley.dmm"
- allow_duplicates = FALSE
- cost = 5
-
/datum/map_template/ruin/lavaland/elephant_graveyard
name = "Elephant Graveyard"
id = "Graveyard"
@@ -81,53 +19,26 @@
allow_duplicates = FALSE
cost = 10
-/datum/map_template/ruin/lavaland/comm_outpost
- name = "Syndicate Comm Outpost"
- id = "commoutpost"
- description = "A forgotten outpost home to only a tragic tale."
- suffix = "lavaland_surface_comm_outpost.dmm"
- allow_duplicates = FALSE
- cost = 5
-
-/datum/map_template/ruin/lavaland/dwarffortress
- name = "Legion infested Dwarf Fortress"
- id = "dwarffortress"
- description = "A forgotten fortress home to only a tragic tale and infested corpses."
- suffix = "lavaland_surface_dwarffortress.dmm"
- allow_duplicates = FALSE
-
-/datum/map_template/ruin/lavaland/ashwalker_shrine
- name = "Ashwalker shrine"
- id = "ashwalker_shrine"
- description = "A destroyed ashwalker village. What even happened here?"
- suffix = "lavaland_surface_ashwalker_shrine.dmm"
-
-/datum/map_template/ruin/lavaland/fuckedupandevilclub
- name = "Evil Club"
- id = "evil_club"
- description = "A truly fucked up and evil club."
- suffix = "lavaland_surface_fuckedupandevilclub.dmm"
-
-/datum/map_template/ruin/lavaland/spookycrash
- name = "Spooky Crash"
- id = "spooky_crash"
- description = "A spooky looking crash."
- suffix = "lavaland_surface_SPOOKYCRASH.dmm"
-
-/datum/map_template/ruin/lavaland/crashedpinnance
- name = "Crashed Research Pinnance"
- id = "crashed_pinnance"
- description = "A crashed shuttlecraft, looks like the pilot didn't make it."
- suffix = "lavaland_surface_crashed_pinnance.dmm"
-
-/datum/map_template/ruin/lavaland/codelab
- name = "Nanotrasen Genetic Research Facility"
- id = "codelab"
- description = "A Nanotrasen genetic research facility, abandoned and ripe for looting. Whats that goo over there?"
- suffix = "lavaland_surface_codelab.dmm"
+/datum/map_template/ruin/lavaland/buried_shrine
+ name = "Buried Shrine"
+ id = "buried_shrine"
+ description = "An ancient temple belonging to some long-gone inhabitants, wrecked and buried by the volcanic activity of it's home planet."
+ suffix = "lavaland_surface_buried_shrine.dmm"
/datum/map_template/ruin/lavaland/lava_canyon
name = "Lava Canyon"
id = "lava_canyon"
description = "Tectonic activity has gouged a large fissure into the surface of the planet here. Tucked in the crevasse, the remains of an ashwalker village lay in ashes."
suffix = "lavaland_surface_lava_canyon.dmm"
+
+/datum/map_template/ruin/lavaland/wrecked_factory
+ name = "Wrecked Factory"
+ id = "wreck_factory"
+ description = "A Nanotrasen processing facility, assaulted by a pirate raid that has killed most of the staff. The offices however, remain unbreached for now."
+ suffix = "lavaland_surface_wrecked_factory.dmm"
+
+/datum/map_template/ruin/lavaland/fallenstar
+ name = "Crashed Starwalker"
+ id = "crashed_star"
+ description = "A crashed pirate ship. It would seem that it's crew died a while ago."
+ suffix = "lavaland_crashed_starwalker.dmm"
diff --git a/code/datums/ruins/rockplanet.dm b/code/datums/ruins/rockplanet.dm
index b3d9276b827e..f576f1a93464 100644
--- a/code/datums/ruins/rockplanet.dm
+++ b/code/datums/ruins/rockplanet.dm
@@ -2,79 +2,8 @@
/datum/map_template/ruin/rockplanet
prefix = "_maps/RandomRuins/RockRuins/"
- allow_duplicates = FALSE
- cost = 5
- ruin_type = RUINTYPE_ROCK
-
-/datum/map_template/ruin/rockplanet/heirophant
- name = "Ancient Heirophant"
- id = "rockheiro"
- description = "something dangerous"
- suffix = "rockplanet_heirophant.dmm"
-
-/datum/map_template/ruin/rockplanet/cult
- name = "Cult base"
- id = "rockcult"
- description = "Cultists seem to have gotten here too."
- suffix = "rockplanet_cult.dmm"
-
-/* TODO: GREEBLE
-/datum/map_template/ruin/rockplanet/dangerpod
- name = "Dangerous pod"
- id = "dangerpod"
- description = "A pod holding a dangerous threat."
- suffix = "wasteplanet_dangerpod.dmm"
-*/
-
-/* //TODO: MAKE THIS A MINOR RUIN
-/datum/map_template/ruin/rockplanet/pioneer
- name = "Krusty Krab Pizza"
- id = "pioneer"
- description = "The pioneers used to ride these babies for miles!"
- suffix = "rockplanet_pioneer.dmm"
-*/
-
-
-/* greeble
-/datum/map_template/ruin/rockplanet/wizard
- name = "rockplanet wizard den"
- id = "rockwizard"
- description = "Wizards have reached all the ways out here too."
- suffix = "rockplanet_wizard.dmm"
-*/
-
-/*greeble
-/datum/map_template/ruin/rockplanet/house
- name = "baracaded house"
- id = "house"
- description = "Some sort of house, baracaded in. It must be baracaded for a reason.."
- suffix = "rockplanet_house.dmm"
-*/
-/datum/map_template/ruin/rockplanet/mining_expedition
- name = "Mining Expedition"
- id = "expedition"
- description = "A mining operation gone wrong."
- suffix = "rockplanet_miningexpedition.dmm"
-
-
-/datum/map_template/ruin/rockplanet/boxsci
- name = "Abandoned science wing"
- id = "abandonedscience"
- description = "A chunk of a station that broke off.."
- suffix = "rockplanet_boxsci.dmm"
-
-/datum/map_template/ruin/rockplanet/crash_cult
- name = "Crashed Cult Ship"
- description = "A crashed part of some unlucky ship. Has been occupied by a cult."
- id = "crash_cult"
- suffix = "rockplanet_crash_cult.dmm"
-
-/datum/map_template/ruin/rockplanet/saloon
- name = "Abandoned saloon"
- description = "For whatever reason, someone decided to make a colony with a indie style."
- id = "rockplanet_saloon"
- suffix = "rockplanet_saloon.dmm"
+ ruin_type = RUINTYPE_ROCK
/datum/map_template/ruin/rockplanet/harmfactory
name = "Harm Factory"
@@ -88,8 +17,15 @@
id = "rockplanet_budgetcuts"
suffix = "rockplanet_budgetcuts.dmm"
+/datum/map_template/ruin/rockplanet/shippingdock
+ name = "Abandoned Shipping Dock"
+ description = "An abandoned shipping dock used by small cargo freighters and smugglers alike. Some malicious group seems to have trapped the place to eliminate scavengers."
+ id = "rockplanet_shippingdock"
+ suffix = "rockplanet_shippingdock.dmm"
+
/datum/map_template/ruin/rockplanet/nomadcrash
name = "Nomad Crash"
description = "A Crashed Arrow & Axe Interceptor. A long forgotten Crew. They tried their best to survive..."
id = "rockplanet_nomadcrash"
suffix = "rockplanet_nomadcrash.dmm"
+
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index b4c2af5a93e7..1aedb0b9be82 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -12,12 +12,6 @@
name = "Corporate Mining Module"
description = "An old and rusty mining facility, with big ore potential."
-/datum/map_template/ruin/space/excavator_DK
- id = "Excavator-DK"
- suffix = "excavator_DK.dmm"
- name = "Excavator DK Class"
- description = "A heavily damaged DK class excavator"
-
/datum/map_template/ruin/space/bigderelict1
id = "bigderelict1"
suffix = "bigderelict1.dmm"
@@ -31,71 +25,6 @@
name = "DK Excavator 453"
description = "Formerly a thriving planetary mining outpost, now a bit of an exploded mess. One has to wonder how it got here"
-/* shiptest: Replaced with dark_glade ruin
-/datum/map_template/ruin/space/way_home
- id = "way-home"
- suffix = "way_home.dmm"
- name = "Salvation"
- description = "In the darkest times, we will find our way home."
-*/
-
-/datum/map_template/ruin/space/djstation
- id = "djstation"
- suffix = "djstation.dmm"
- name = "DJ Station"
- description = "Until very recently this pirate radio station was used to harangue local space stations over a variety of perceived \"ethics violations\". \
- It seems like someone finally got sick of it, but the equipment still works."
-
-/datum/map_template/ruin/space/crashedship
- id = "crashedship"
- suffix = "crashedship.dmm"
- name = "Crashed Ship"
- description = "Among civilian vessels the most common cause of tragedy is lack of food. \
- This ship was outfitted with a multitude of food-generating features, then summarily ran into an asteroid shortly after takeoff."
-
-/datum/map_template/ruin/space/vaporwave
- id = "vaporwave"
- suffix = "vaporwave.dmm"
- name = "Aesthetic Outpost"
- description = "Pause and remember-- You are unique.You are special. Every mistake, trial, and hardship has helped to sculpt your real beauty. \
- Stop hating yourself and start appreciating and loving yourself!"
-
-/datum/map_template/ruin/space/clericden
- id = "clericden"
- suffix = "clericden.dmm"
- name = "Cleric's Den"
- description = "Once part of a larger monastery, this holy order of long dead clerics practiced far less non-violence than they preached. Appears to have been untouched by looters, however. Odd."
-
-/datum/map_template/ruin/space/hellfactory
- id = "hellfactory"
- suffix = "hellfactory.dmm"
- name = "Heck Brewery"
- description = "An abandoned warehouse and brewing facility, which has been recently rediscovered. Reports claim that the security system entered an ultra-hard lockdown, but these reports are inconclusive."
-
-/datum/map_template/ruin/space/cryocontainment
- id = "cryocontainment"
- suffix = "cryocontainment.dmm"
- name = "Cryogenic Containment Facility"
- description = "Some old facility where they stored something in a cryotube to experiement on, obviously it got out and now the only thing it contains is Space Carps."
-
-/datum/map_template/ruin/space/dangerous_research
- id = "dangerous_research"
- suffix = "dangerous_research.dmm"
- name = "Occult Research Station"
- description = "This station was deemed unsuitable for continued experiments, and quickly abandoned."
-
-/datum/map_template/ruin/space/macspace
- id = "fast_food"
- suffix = "Fast_Food.dmm"
- name = "Mac Space Restaurant"
- description = "A fast food reataurant in space."
-
-/datum/map_template/ruin/space/scav_mining
- id = "mining_asteroid"
- suffix = "scav_mining.dmm"
- name = "Mining asteroid"
- description = "An abandoned mining operation on an asteroid that now has new ocupants that is not happy to se you"
-
/datum/map_template/ruin/space/power_puzzle
id = "power_puzzle"
suffix = "power_puzzle.dmm"
@@ -103,42 +32,12 @@
description = "an abandoned secure storage location. there is no power left in the batteries and the former ocupants locked it pretty tight before leaving.\
You will have to power areas to raise the bolts on the doors. look out for secrets."
-/datum/map_template/ruin/space/transport18
- id = "transport18"
- suffix = "transport18.dmm"
- name = "Booze Cruise"
- description = "A freighter, damaged beyond repair and surrounded by a cloud of aluminium and... beer foam?"
-
-/datum/map_template/ruin/space/fueldepot
- id = "fueldepot"
- suffix = "fueldepot.dmm"
- name = "Fuel Depot"
- description = "An orbital refueling station with the remains of a ship lodged among the debris."
-
-/datum/map_template/ruin/space/ntfacility
- id = "ntfacility"
- suffix = "ntfacility.dmm"
- name = "Abandoned Facility"
- description = "A NT research station. Something has gone horribly wrong here."
-
/datum/map_template/ruin/space/astraeus
id = "astraeus"
suffix = "astraeus.dmm"
name = "Astraeus Ruin"
description = "This vessel served a lengthy period in the Nanotrasen fleet, before an accident in the munitions bay caused to to be destroyed while in active combat."
-/datum/map_template/ruin/space/glade
- id = "dark_glade"
- suffix = "dark_glade.dmm"
- name = "Dark Glade"
- description = "It's always dark in the ancient glade."
-
-/datum/map_template/ruin/space/syndicircle
- id = "provinggrounds"
- suffix = "provinggrounds.dmm"
- name = "Syndicate Battle Sphere"
- description = "The Syndicate Battle Sphere, complete with guns!"
-
/datum/map_template/ruin/space/singularitylab
id = "singularitylab"
suffix = "singularity_lab.dmm"
diff --git a/code/datums/ruins/wasteplanet.dm b/code/datums/ruins/wasteplanet.dm
index 80bf701526be..8083567a7c68 100644
--- a/code/datums/ruins/wasteplanet.dm
+++ b/code/datums/ruins/wasteplanet.dm
@@ -2,66 +2,26 @@
/datum/map_template/ruin/wasteplanet
prefix = "_maps/RandomRuins/WasteRuins/"
- allow_duplicates = FALSE
- cost = 5
ruin_type = RUINTYPE_WASTE
-/datum/map_template/ruin/wasteplanet/fortress
- name = "Fortress of Solitide"
- id = "solitude"
- description = "A fortress, although one you are probably more familiar with."
- suffix = "wasteplanet_fortress_of_solitide.dmm"
-
/datum/map_template/ruin/wasteplanet/weaponstest
name = "Weapons testing facility"
id = "guntested"
description = "A abandoned Nanotrasen weapons facility, presumably the place where the X-01 was manufactured."
suffix = "wasteplanet_lab.dmm"
-/datum/map_template/ruin/wasteplanet/oreprocess
- name = "Ore Processing Facility"
- id = "oreprocess"
- description = "A fortress, although one you are probably more familiar with.."
- suffix = "wasteplanet_ore_proccessing_facility.dmm"
-
/datum/map_template/ruin/wasteplanet/pandora
id = "pandora_arena"
suffix = "wasteplanet_pandora.dmm"
name = "Pandora Arena"
description = "Some... thing has settled here."
-/* Greeble
-/datum/map_template/ruin/wasteplanet/pod
- name = "Derelict pod"
- id = "oldpod"
- description = "A large, old pod."
- suffix = "wasteplanet_pod.dmm"
-*/
-
-/datum/map_template/ruin/wasteplanet/crash_kitchen
- name = "Crashed Kitchen"
- description = "A crashed part of some unlucky ship."
- id = "crash_kitchen"
- suffix = "wasteplanet_crash_kitchen.dmm"
-
/datum/map_template/ruin/wasteplanet/radiation
name = "Honorable deeds storage"
id = "wasteplanet_radiation"
description = "A dumping ground for nuclear waste."
suffix = "wasteplanet_unhonorable.dmm"
-/datum/map_template/ruin/wasteplanet/tradepost
- name = "Tradepost"
- id = "oldpod"
- description = "An abandoned tradepost."
- suffix = "wasteplanet_tradepost.dmm"
-
-/datum/map_template/ruin/wasteplanet/tarpit
- name = "Tar pit"
- id = "tarpit"
- description = "A facility once constructed over a asphalt deposit."
- suffix = "wasteplanet_tarpit.dmm"
-
/datum/map_template/ruin/wasteplanet/abandoned_mechbay
name = "Abandoned Mech Bay"
description = "A military base formerly used for staging 4 mechs and crew. God knows what's in it now."
diff --git a/code/datums/ruins/whitesands.dm b/code/datums/ruins/whitesands.dm
index 8e34f7cf379c..b3e0cb13adcc 100644
--- a/code/datums/ruins/whitesands.dm
+++ b/code/datums/ruins/whitesands.dm
@@ -4,43 +4,12 @@
prefix = "_maps/RandomRuins/SandRuins/"
ruin_type = RUINTYPE_SAND
-/datum/map_template/ruin/whitesands/starfury_crash
- name = "Starfury Crash"
- id = "starfurycrash"
- description = "The remains of an unidentified syndicate battleship has crashed here."
- suffix = "whitesands_surface_starfurycrash.dmm"
- allow_duplicates = FALSE
-
/datum/map_template/ruin/whitesands/medipen_plant
name = "Abandoned Medipen Factory"
id = "medipenplant"
description = "A once prosperous autoinjector manufacturing plant."
suffix = "whitesands_surface_medipen_plant.dmm"
-/datum/map_template/ruin/whitesands/assaultpodcrash
- name = "Crashed Syndicate Assault Drop Pod"
- id = "ws-assaultpodcrash"
- description = "The fauna of desert planets can be deadly even to equipped Syndicate Operatives."
- suffix = "whitesands_surface_assaultpodcrash.dmm"
-
-/datum/map_template/ruin/whitesands/conveniencestore
- name = "Conveniently Abandoned Convenience Store"
- id = "ws-conveniencestore"
- description = "Pretty convenient that they have a convenience store out here, huh?"
- suffix = "whitesands_surface_conveniencestore.dmm"
-
-/datum/map_template/ruin/whitesands/onlyaspoonful
- name = "Abandoned Spoon Factory"
- id = "ws-onlyaspoonful"
- description = "Literally a fucking spoon factory"
- suffix = "whitesands_surface_onlyaspoonful.dmm"
-
-/datum/map_template/ruin/whitesands/chokepoint
- name = "Chokepoint"
- id = "ws-chokepoint"
- description = "Some sort of survivors, brandishing old nanotrasen security gear."
- suffix = "whitesands_surface_chokepoint.dmm"
-
/datum/map_template/ruin/whitesands/pubbyslopcrash
name = "Pubby Slop Crash"
id = "ws-pubbyslopcrash"
@@ -48,19 +17,13 @@
suffix = "whitesands_surface_pubbyslopcrash.dmm"
//////////OUTSIDE SETTLEMENTS/RUINS//////////
-/datum/map_template/ruin/whitesands/survivors/drugstore
- name = "Abandoned Store"
- id = "ws-drugstore"
- description = "A store that once sold a variety of items and equipment."
- suffix = "whitesands_surface_camp_drugstore.dmm"
-
/datum/map_template/ruin/whitesands/survivors/saloon
name = "Hermit Saloon"
id = "ws-saloon"
description = "A western style saloon, most popular spot for the hermits to gather planetside"
suffix = "whitesands_surface_camp_saloon.dmm"
-/datum/map_template/ruin/whitesands/survivors/combination //combined extra large ruin of several other whitesands survivor ruins (excludes the drugstore)
+/datum/map_template/ruin/whitesands/survivors/combination //combined extra large ruin of several other whitesands survivor ruins
name = "Wasteland Survivor Village"
id = "ws-combination"
description = "A small encampment of nomadic survivors of the First Colony, and their descendants. By all accounts, feral and without allegance to anyone but themselves."
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index a66ed7d125ed..d7b60476d977 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -21,7 +21,8 @@
var/prefix = "ISV"
/// The full name of the ship's faction.
var/faction_name = "Independent"
- var/unique_ship_access = FALSE
+ /// Whether or not players from other ships can open airlocks.
+ var/unique_ship_access = TRUE
/// Set by config JSON. If true, the template's ships' "default" spawn location (when bought by a player or loaded at roundstart)
/// will be in the middle of space, instead of at an outpost.
var/space_spawn = FALSE
@@ -396,4 +397,12 @@
name = "Haste-class Ambulance"
prefix = "IRMV"
+/datum/map_template/shuttle/subshuttles/nail
+ file_name = "pgf_nail"
+ name = "Nail-class Boarding Vessel"
+ prefix = "PGF"
+/datum/map_template/shuttle/subshuttles/brawler
+ file_name = "frontiersmen_brawler"
+ name = "Brawler-class Dropship"
+ prefix = "SV"
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 52087f03174c..02b96c1b81de 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -334,7 +334,8 @@
/datum/status_effect/neck_slice/tick()
var/mob/living/carbon/human/H = owner
- if(H.stat == DEAD || H.bleed_rate <= 8)
+ var/obj/item/bodypart/throat_in_question = H.get_bodypart(BODY_ZONE_HEAD)
+ if(H.stat == DEAD || throat_in_question?.bleeding <= 8)
H.remove_status_effect(/datum/status_effect/neck_slice)
if(prob(10))
H.emote(pick("gasp", "gag", "choke"))
diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm
index 11037374b9b3..cc6a91b2f267 100644
--- a/code/datums/status_effects/gas.dm
+++ b/code/datums/status_effects/gas.dm
@@ -38,7 +38,7 @@
/datum/status_effect/freon/proc/do_resist()
to_chat(owner, "You start breaking out of the ice cube...")
- if(do_mob(owner, owner, 40))
+ if(do_after(owner, 40))
if(!QDELETED(src))
to_chat(owner, "You break out of the ice cube!")
owner.remove_status_effect(/datum/status_effect/freon)
diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm
index 76a33319631f..c7765ff772ac 100644
--- a/code/datums/status_effects/neutral.dm
+++ b/code/datums/status_effects/neutral.dm
@@ -275,3 +275,29 @@
/atom/movable/screen/alert/status_effect/surrender/Click(location, control, params)
. = ..()
owner.emote("surrender")
+
+/datum/status_effect/rooted
+ id = "rooted"
+ alert_type = /atom/movable/screen/alert/status_effect/rooted
+
+/datum/status_effect/rooted/on_apply()
+ . = ..()
+ ADD_TRAIT(owner,TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(id))
+ ADD_TRAIT(owner,TRAIT_PUSHIMMUNE, TRAIT_STATUS_EFFECT(id))
+ SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "root", /datum/mood_event/root)
+
+/datum/status_effect/rooted/on_remove()
+ . = ..()
+ REMOVE_TRAIT(owner,TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(id))
+ REMOVE_TRAIT(owner,TRAIT_PUSHIMMUNE, TRAIT_STATUS_EFFECT(id))
+
+/atom/movable/screen/alert/status_effect/rooted
+ name = "Rooted"
+ desc = "You're currently rooted into the ground and can't move. Click here to start digging yourself out."
+ icon_state = "dig_out"
+
+/atom/movable/screen/alert/status_effect/rooted/Click(location, control, params)
+ . = ..()
+ to_chat(owner, span_notice("You begin digging yourself free."))
+ SEND_SIGNAL(owner,COMSIG_DIGOUT)
+
diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm
index 52ee20e23c27..574c35f60beb 100644
--- a/code/datums/traits/good.dm
+++ b/code/datums/traits/good.dm
@@ -62,26 +62,6 @@
lose_text = "You feel isolated from others."
medical_record_text = "Patient is highly perceptive of and sensitive to social cues, or may possibly have ESP. Further testing needed."
-/datum/quirk/fan_clown
- name = "Clown Fan"
- desc = "You enjoy clown antics and get a mood boost from wearing your clown pin."
- value = 1
- mob_traits = list(TRAIT_FAN_CLOWN)
- gain_text = "You are a big fan of clowns."
- lose_text = "The clown doesn't seem so great."
- medical_record_text = "Patient reports being a big fan of clowns."
-
-/datum/quirk/fan_clown/on_spawn()
- var/mob/living/carbon/human/H = quirk_holder
- var/obj/item/clothing/accessory/fan_clown_pin/B = new(get_turf(H))
- var/list/slots = list (
- "backpack" = ITEM_SLOT_BACKPACK,
- "hands" = ITEM_SLOT_HANDS,
- )
- H.equip_in_one_of_slots(B, slots , qdel_on_fail = TRUE)
- var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN]
- fan.add_hud_to(H)
-
/datum/quirk/fan_rilena
name = "RILENA Super Fan"
desc = "You are a major fan of the popular webseries RILENA: LMR. You get a mood boost from plushies of your favorite characters, and wearing your Xader pin."
@@ -102,26 +82,6 @@
var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN]
fan.add_hud_to(H)
-/datum/quirk/fan_mime
- name = "Mime Fan"
- desc = "You enjoy mime antics and get a mood boost from wearing your mime pin."
- value = 1
- mob_traits = list(TRAIT_FAN_MIME)
- gain_text = "You are a big fan of the Mime."
- lose_text = "The mime doesn't seem so great."
- medical_record_text = "Patient reports being a big fan of mimes."
-
-/datum/quirk/fan_mime/on_spawn()
- var/mob/living/carbon/human/H = quirk_holder
- var/obj/item/clothing/accessory/fan_mime_pin/B = new(get_turf(H))
- var/list/slots = list (
- "backpack" = ITEM_SLOT_BACKPACK,
- "hands" = ITEM_SLOT_HANDS,
- )
- H.equip_in_one_of_slots(B, slots , qdel_on_fail = TRUE)
- var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN]
- fan.add_hud_to(H)
-
/datum/quirk/freerunning
name = "Freerunning"
desc = "You're great at quick moves! You can climb tables more quickly."
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index 4b0afce14b47..d1a8fd6acaa5 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -430,11 +430,6 @@
/datum/quirk/insanity/proc/madness()
quirk_holder.hallucination += rand(10, 25)
-/datum/quirk/insanity/post_add() //I don't /think/ we'll need this but for newbies who think "roleplay as insane" = "license to kill" it's probably a good thing to have
- if(!quirk_holder.mind || quirk_holder.mind.special_role)
- return
- to_chat(quirk_holder, "Please note that your dissociation syndrome does NOT give you the right to attack people or otherwise cause any interference to \
- the round. You are not an antagonist, and the rules will treat you the same as other crewmembers.")
/datum/quirk/social_anxiety
name = "Social Anxiety"
@@ -589,24 +584,57 @@
reagent_type = /datum/reagent/drug/nicotine
accessory_type = /obj/item/lighter/greyscale
+//I fucking hate prefscode
+
/datum/quirk/junkie/smoker/on_spawn()
- drug_container_type = pick(/obj/item/storage/fancy/cigarettes,
- /obj/item/storage/fancy/cigarettes/cigpack_midori,
- /obj/item/storage/fancy/cigarettes/cigpack_uplift,
- /obj/item/storage/fancy/cigarettes/cigpack_robust,
- /obj/item/storage/fancy/cigarettes/cigpack_robustgold,
- /obj/item/storage/fancy/cigarettes/cigpack_carp)
+ var/mob/living/carbon/human/H = quirk_holder
+ switch (H.client?.prefs.preferred_smoke_brand)
+ if (PREF_CIG_SPACE)
+ drug_container_type = /obj/item/storage/fancy/cigarettes
+ if (PREF_CIG_DROMEDARY)
+ drug_container_type = /obj/item/storage/fancy/cigarettes/dromedaryco
+ if (PREF_CIG_UPLIFT)
+ drug_container_type = /obj/item/storage/fancy/cigarettes/cigpack_uplift
+ if (PREF_CIG_ROBUST)
+ drug_container_type = /obj/item/storage/fancy/cigarettes/cigpack_robust
+ if (PREF_CIG_ROBUSTGOLD)
+ drug_container_type = /obj/item/storage/fancy/cigarettes/cigpack_robustgold
+ if (PREF_CIG_CARP)
+ drug_container_type= /obj/item/storage/fancy/cigarettes/cigpack_carp
+ if (PREF_CIG_MIDORI)
+ drug_container_type = /obj/item/storage/fancy/cigarettes/cigpack_midori
+ if (PREF_CIGAR)
+ drug_container_type = /obj/item/storage/fancy/cigarettes/cigars
+ accessory_type = /obj/item/storage/box/matches
+ if (PREF_CIGAR_SOLAR)
+ drug_container_type = /obj/item/storage/fancy/cigarettes/cigars/havana
+ accessory_type = /obj/item/storage/box/matches
+ if (PREF_CIGAR_COHIBA)
+ drug_container_type = /obj/item/storage/fancy/cigarettes/cigars/cohiba
+ accessory_type = /obj/item/storage/box/matches
+ if (PREF_VAPE)
+ drug_container_type = /obj/item/clothing/mask/vape
+ accessory_type = null
+ if (PREF_PIPE)
+ drug_container_type = /obj/item/clothing/mask/cigarette/pipe
+ accessory_type = /obj/item/storage/box/matches
+ else
+ CRASH("Someone had an improper cigarette pref on loading")
. = ..()
/datum/quirk/junkie/smoker/announce_drugs()
- to_chat(quirk_holder, "There is a [initial(drug_container_type.name)] [where_drug], and a lighter [where_accessory]. Make sure you get your favorite brand when you run out.")
-
+ if(accessory_type == null)
+ to_chat(quirk_holder, "There is a [initial(drug_container_type.name)] [where_drug], Make sure you get a refill soon.")
+ return
+ to_chat(quirk_holder, "There is a [initial(drug_container_type.name)] [where_drug], and a [initial(accessory_type.name)] [where_accessory]. Make sure you get your favorite brand when you run out.")
/datum/quirk/junkie/smoker/on_process()
. = ..()
var/mob/living/carbon/human/H = quirk_holder
var/obj/item/I = H.get_item_by_slot(ITEM_SLOT_MASK)
if (istype(I, /obj/item/clothing/mask/cigarette))
+ if(I == drug_container_type)
+ return
var/obj/item/storage/fancy/cigarettes/C = drug_container_type
if(istype(I, initial(C.spawn_type)))
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "wrong_cigs")
diff --git a/code/datums/wires/mines.dm b/code/datums/wires/mines.dm
new file mode 100644
index 000000000000..4c856cf99d3f
--- /dev/null
+++ b/code/datums/wires/mines.dm
@@ -0,0 +1,82 @@
+/datum/wires/mine
+ holder_type = /obj/item/mine/pressure
+ randomize = TRUE
+
+/datum/wires/mine/New(atom/holder)
+ wires = list(
+ WIRE_BOOM, WIRE_DELAYBOOM, WIRE_PIN, WIRE_RESET
+ )
+ ..()
+
+/datum/wires/mine/interactable(mob/user)
+ var/obj/item/mine/pressure/ourmine = holder
+ if(ourmine.open_panel)
+ return TRUE
+
+//are you feelin lucky, punk?
+/datum/wires/mine/on_pulse(wire)
+ var/obj/item/mine/pressure/ourmine = holder
+ switch(wire)
+ if(WIRE_BOOM)//oopsies
+ holder.visible_message(span_userdanger("[icon2html(ourmine, viewers(holder))] \The [ourmine] makes a shrill noise! It's go-"))
+ ourmine.trigger_mine()
+ if(WIRE_DELAYBOOM)//oopsies but you get to run
+ ourmine.blast_delay = clamp(ourmine.blast_delay * 5, 8, 50)
+ holder.visible_message(span_userdanger("[icon2html(ourmine, viewers(holder))] \The [ourmine] makes a shrill noise! It's go-"))
+ ourmine.trigger_mine()
+ //Resets the detonation pin, allowing someone to step off the mine. Minor success.
+ if(WIRE_PIN)
+ if(ourmine.clicked == TRUE)
+ holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] You hear something inside \the [ourmine] click softly."))
+ playsound(ourmine, 'sound/weapons/empty.ogg', 30, TRUE)
+ ourmine.clicked = FALSE
+ else
+ holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s detonation pad shifts slightly. Nothing happens."))
+ if(WIRE_RESET)//Disarms the mine, allowing it to be picked up. Major success.
+ if(ourmine.armed && ourmine.anchored)
+ holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s arming lights fade, and the securing bolts loosen. "))
+ playsound(ourmine, 'sound/machines/click.ogg', 100, TRUE)
+ ourmine.disarm()
+ else if(ourmine.anchored)
+ holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s yellow arming light flickers."))
+ else
+ holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s securing bolt shifts. Nothing happens."))
+
+/datum/wires/mine/on_cut(wire, mend)
+ var/obj/item/mine/pressure/ourmine = holder
+ switch(wire)
+ if(WIRE_BOOM)
+ if(!mend)
+ holder.visible_message(span_userdanger("[icon2html(ourmine, viewers(holder))] \The [ourmine] makes a shrill noise! It's go-"))
+ ourmine.trigger_mine()
+ if(WIRE_DELAYBOOM)
+ if(!mend)
+ ourmine.blast_delay = clamp(ourmine.blast_delay * 5, 8, 50)
+ holder.visible_message(span_userdanger("[icon2html(ourmine, viewers(holder))] \The [ourmine] makes a shrill noise! It's go-"))
+ ourmine.trigger_mine()
+ //Disables the detonation pin. Nothing will happen when the mine is triggered.
+ //Mine can still be exploded by cutting wires & damage.
+ if(WIRE_PIN)
+ if(!mend)
+ ourmine.dud = TRUE
+ if(ourmine.clicked == TRUE)
+ holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] You hear something inside \the [ourmine] shift out of place."))
+ playsound(ourmine, 'sound/weapons/empty.ogg', 30, TRUE)
+ ourmine.clicked = FALSE
+ else
+ holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s detonation pad goes loose."))
+ ourmine.foot_on_mine = null
+ else
+ ourmine.dud = FALSE
+ ourmine.clicked = FALSE
+ holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] You hear something inside \the [ourmine] shift back into place."))
+ if(WIRE_RESET)
+ if(!mend)
+ if(ourmine.armed && ourmine.anchored)
+ holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s arming lights fade, and the securing bolts loosen. Disarmed. "))
+ playsound(ourmine, 'sound/machines/click.ogg', 100, TRUE)
+ ourmine.disarm()
+ else if(ourmine.anchored)
+ holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s yellow arming light flickers."))
+ else
+ holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s securing bolt shifts. Nothing happens."))
diff --git a/code/game/MapData/shuttles/pgf_crying_sun.dm b/code/game/MapData/shuttles/pgf_crying_sun.dm
new file mode 100644
index 000000000000..6df40aa0efdd
--- /dev/null
+++ b/code/game/MapData/shuttles/pgf_crying_sun.dm
@@ -0,0 +1,43 @@
+/obj/item/book/manual/mount
+ name = "The UCWLWM"
+ desc = "It's looks old and worn out."
+ icon_state = "book3"
+ author = "Welds-the-Steel"
+ title = "The Universal Colossal Warship Linear Weapon Mount"
+ dat = {"
+
+
+
+
+
+
Copy No. 5441
+
+
+
Pan-Gezenan Federation
+
Universal Battleship Linear Weapon Mounts
+
Etherbor Lihmona Shipyards
+
+
+
The Universal Colossal Battleship Linear Weapon Mount or simply "Universal Linear Mount" (USM), is a linear rail system that can be commonly found in many ships created in the Etherbor Lihmona Shipyards. Attachment of a weapon to a Universal Linear Mount requires the use of a Linear Mount Tool Facility. An engineering marvel are the massive machines at these facilities that effortlessly handle these systems on a regular basis. Most shipyards dealing in Kalixcian Colossal Arms will also have such a facility to install the weapons.
+
+
The installation of weapons into a Universal Linear Mount is rather simplistic. A weapon must first be delivered to the Linear Mount Tool Facility, where it will be manually loaded onto the SMT's massive cargo lift. The SMT is then extended out around the weapon, and the weapon is then secured into the SMT with engaging locks. The next step is to bring the ship into the facility, placed just in line with the SMT. The weapon is then lined up with the Universal Linear Mount and slotted into place. The USM's hardware locks are then engaged, the weapon is welded to the USM, and electronic systems are hooked into the ship's computer systems. The weapons are then hooked into an independent power bank to prevent overdraw from main ship power banks, and prevent explosive backsurge.
+
+
Common Colossal Battleship Weapons compatible with the Universal Linear Mount include the following:
+
+
HORUS Colossal Energy Cannon
+
+ A massive laser cannon capable of variable strength, and sustained fire up to 10 seconds. One of the highest power draws of all colossal warship guns. Multiple independent power banks are required to fire this gun, with the lowest power setting drawing 4MW/s, and the highest drawing 16MW/s.
+
+
SUPERNOVA High-Performance Giant Rail Cannon
+
+ While not as powerful as the QUASAR SMITER Colossal Rail Cannon, this gun is one of the most commonly produced at the Lihmona Shipyards. Fires a 9/5ths meter "Huge Slug" ordinance, accelerated by 1MW draw pair of electromagnetic accelerators.
+
+
Massive Ordinance Missile Array (B.O.M.B)
+
+ A popular choice amongst bomber ships, the "Massive Ordinance Missile Array" or "M.O.M.A" for short, is a rapid fire missile array chain launcher. Capable of firing up to 4 missiles per second, these weapons often find their homes on ships with exceedingly large cargo bays built for holding large hoards of heavy ordinance.
+
+
QUASAR SMITER Colossal Rail Cannon
+
+ The largest gun ever produced by the Lihmona Shipyards, the QUASAR SMITER is a truly terrifying tool of destruction. A gun requiring 3 Universal Linear Mounts to hold, this gun finds its place only on the largest ships in the PGFN and PGFMC. This gun fires 18/5ths meter gigantic "DEMON SLUG"s at a rate of approximately 1 shot every 5 minutes. The power draw of such a massive weapon sings to the tun of 50MW of power per round.
+
+ "}
diff --git a/code/game/area/areas/ruins/beachplanet.dm b/code/game/area/areas/ruins/beachplanet.dm
index 919d2602a3d3..d33825e0087e 100644
--- a/code/game/area/areas/ruins/beachplanet.dm
+++ b/code/game/area/areas/ruins/beachplanet.dm
@@ -1,4 +1,3 @@
-
//tropical ruins here
//Beachside Town
@@ -24,12 +23,6 @@
/area/ruin/beach/oceantown/house
-//Knight's Rest
-
-/area/ruin/beachplanet/knight
- name = "Knight's Rest"
- icon_state = "dkyellow"
-
//Ancient Complex
/area/ruin/beach/complex //seems quite simple to me
@@ -58,12 +51,6 @@
/area/ruin/beach/piratecrash/storage
name = "Scrap Hut"
-//beach_crashed_starwalker
-
-/area/ruin/beach/starwalker
- name = "Crashed Pirate Ship"
- icon_state = "green"
-
//beach_treasure_cove, the beeginning
/area/ruin/beach/treasure_cove
diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm
index d2c8d1ca61f6..8e614c8a0e79 100644
--- a/code/game/area/areas/ruins/icemoon.dm
+++ b/code/game/area/areas/ruins/icemoon.dm
@@ -1,21 +1,5 @@
// Icemoon Ruins
-//Buried Library
-
-/area/ruin/unpowered/buried_library
- name = "Buried Library"
- icon_state = "dk_yellow"
-
-//Bathhouse
-
-/area/ruin/powered/bathhouse
- name = "Bath House"
- icon_state = "dk_yellow"
- mood_bonus = 10
- mood_message = "I wish I could stay here forever.\n"
-
-//corporate rejects
-
//Corporate Rejects
/area/ruin/unpowered/corprejectrooms
diff --git a/code/game/area/areas/ruins/jungle.dm b/code/game/area/areas/ruins/jungle.dm
index 09d0e95f2f36..2d2fc76f97b1 100644
--- a/code/game/area/areas/ruins/jungle.dm
+++ b/code/game/area/areas/ruins/jungle.dm
@@ -1,10 +1,3 @@
-//Thneed Factory
-
-/area/ruin/jungle/onceler/main
- requires_power = FALSE
- name = "Thneed Factory"
- icon_state = "engine"
-
//Interceptor Crash Site
/area/ruin/jungle/interceptor/crashsite
@@ -89,10 +82,6 @@
name = "cargo dump"
icon_state = "dk_yellow"
-/area/ruin/jungle/roommates/shack
- name = "clown and mime hideout"
- icon_state = "crew_quarters"
-
// Bombed Syndicate Starport
/area/ruin/jungle/starport
name = "Bombed Air Base"
diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm
index 444743c0403e..f7cbb414bc00 100644
--- a/code/game/area/areas/ruins/lavaland.dm
+++ b/code/game/area/areas/ruins/lavaland.dm
@@ -1,25 +1,25 @@
//Lavaland Ruins
-// Beach
+// Winter Biodome
-/area/ruin/powered/beach
- icon_state = "dk_yellow"
+/area/ruin/unpowered/winter_biodome
+ icon_state = "bluenew"
+ name = "Biodome Main Area"
-// Snow Biodome
+/area/ruin/unpowered/winter_biodome/entrance
+ name = "Biodome Entrance"
-/area/ruin/powered/snow_biodome
- icon_state = "dk_yellow"
+/area/ruin/unpowered/winter_biodome/living_quarters
+ name = "Biodome Living Quarters"
-//Gluttony
+/area/ruin/unpowered/winter_biodome/cabin
+ name = "Biodome Cabin"
-/area/ruin/powered/gluttony
- icon_state = "dk_yellow"
+/area/ruin/unpowered/winter_biodome/engineering
+ name = "Biodome Engineering"
-//Golem Ship
-
-/area/ruin/powered/golem_ship
- name = "Free Golem Ship"
- icon_state = "dk_yellow"
+/area/ruin/unpowered/winter_biodome/sauna
+ name = "Biodome Sauna"
//Hierophant Arena
@@ -38,67 +38,50 @@
name = "Elephant Graveyard"
icon_state = "green"
-//Syndicate Comms Outpost
-
-/area/ruin/unpowered/syndicate_outpost
- name = "Syndicate Comm Outpost"
- icon_state = "dk_yellow"
-
-
-//Cult Altar
-
-/area/ruin/unpowered/cultaltar
- name = "Cult Altar"
- ambientsounds = SPOOKY
+//Lava Canyon
-//Xeno Nest
-
-/area/ruin/unpowered/xenonest
- name = "The Hive"
- always_unpowered = TRUE
- power_environ = FALSE
- power_equip = FALSE
- power_light = FALSE
- poweralm = FALSE
-
-// Crashed Pinnance
+/area/ruin/unpowered/scorched_hut
+ name = "Scorched Hut"
+ icon_state = "red"
-/area/ruin/unpowered/crashsite
- name = "Crash Site"
- icon_state = "green"
+// Wrecked Factory
-/area/ruin/unpowered/crashsite/pinnance
- name = "Pinnace Wreckage"
- icon_state = "dk_yellow"
- always_unpowered = TRUE
+/area/ruin/lavaland/factory/warehouse
+ name = "Factory Warehouse"
+ icon_state = "cargo_warehouse"
+ requires_power = FALSE
-/area/ruin/unpowered/codelab
- name = "Nanotrasen Genetic Research Facility"
- icon_state = "bluenew"
+/area/ruin/lavaland/factory/foreman_office
+ name = "Foreman's Office"
+ icon_state = "purple"
+ requires_power = FALSE
-/area/ruin/unpowered/codelab/exterior
- name = "Nanotrasen Genetic Research Facility Exterior"
+/area/ruin/lavaland/factory/adminstrative
+ name = "Adminstrative Wing"
+ icon_state = "bridge_hallway"
+ requires_power = FALSE
-/area/ruin/unpowered/codelab/reception
- name = "Nanotrasen Genetic Research Reception"
- icon_state = "green"
+/area/ruin/lavaland/factory/manager_office
+ name ="Manager's Office"
+ icon_state = "bridge"
+ requires_power = FALSE
-/area/ruin/unpowered/codelab/subjectrooms
- name = "Nanotrasen Genetic Research Test Subject Storage"
- icon_state = "Sleep"
+/area/ruin/lavaland/factory/lobby
+ name ="Lobby"
+ icon_state = "hallC"
+ requires_power = FALSE
-/area/ruin/unpowered/codelab/storage
- name = "Nanotrasen Genetic Research Storage"
- icon_state = "cargo_bay"
+/area/ruin/lavaland/factory/dorms
+ name ="Dormitory"
+ icon_state = "crew_quarters"
+ requires_power = FALSE
+//Buried Shrine
-/area/ruin/unpowered/codelab/laboratory
- name = "Nanotrasen Genetic Research Laboratory"
- icon_state = "bridge"
+/area/ruin/unpowered/buried_shrine
+ name = "Buried Shrine"
+ icon_state = "red"
-/area/ruin/unpowered/codelab/maintenance
- name = "Nanotrasen Genetic Research Maintenance"
- icon_state = "dk_yellow"
+//Crashed Starwalker
-/area/ruin/unpowered/scorched_hut
- name = "Scorched Hut"
- icon_state = "red"
+/area/ruin/unpowered/crashed_starwalker
+ name = "Crashed Pirate Ship"
diff --git a/code/game/area/areas/ruins/rockplanet.dm b/code/game/area/areas/ruins/rockplanet.dm
index a89969566196..43516a72376a 100644
--- a/code/game/area/areas/ruins/rockplanet.dm
+++ b/code/game/area/areas/ruins/rockplanet.dm
@@ -1,15 +1,31 @@
/**********************Rock Planet Areas**************************/
-
-//syndicate
-/area/ruin/rockplanet/syndicate
- name = "Abandoned Syndicate Mining Facility"
- icon_state = "green"
+/area/ruin/rockplanet
+ icon_state = "red"
//budgetcuts
/area/ruin/rockplanet/nanotrasen
name = "Abandoned Research Facility"
always_unpowered = FALSE
- icon_state = "green"
+
+//shippingdock
+/area/ruin/rockplanet/shippingdockoffice
+ name = "Employee Office"
+ icon_state = "crew_quarters"
+
+/area/ruin/rockplanet/shippingdockcustoms
+ name = "Cargo Checkpoint"
+ icon_state = "security"
+
+/area/ruin/rockplanet/shippingdockwarehouse
+ name = "Warehouse"
+ icon_state = "storage"
+
+/area/ruin/rockplanet/shippingdocksecure
+ name = "Warehouse Secure Storage"
+ icon_state = "armory"
+
+/area/ruin/rockplanet/shippingdock
+ name = "Abandoned Shipping Dock"
//nomad
/area/ruin/rockplanet/nomad
diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm
index e6034e412198..45a9113d86ba 100644
--- a/code/game/area/areas/ruins/space.dm
+++ b/code/game/area/areas/ruins/space.dm
@@ -11,29 +11,12 @@
requires_power = FALSE
/////////////
-
-/area/ruin/space/way_home
- name = "\improper Salvation"
- icon_state = "away"
- always_unpowered = FALSE
-
// Onehalf Ruin
/area/ruin/space/has_grav/onehalf
name = "Station Fragment"
icon_state = "away"
-//Dinner For Two
-
-/area/ruin/space/has_grav/powered/dinner_for_two
- name = "Dinner for Two"
-
-//Aesthetic
-
-/area/ruin/space/has_grav/powered/aesthetic
- name = "Aesthetic"
- ambientsounds = list('sound/ambience/ambivapor1.ogg')
-
//Ruin of Derelict Oupost
/area/ruin/space/has_grav/derelictoutpost
@@ -56,222 +39,6 @@
name = "Derelict Outpost Docked Ship"
icon_state = "red"
-//Ruin of Deep Storage
-
-/area/ruin/space/has_grav/deepstorage
- name = "Deep Storage"
- icon_state = "storage"
-
-/area/ruin/space/has_grav/deepstorage/airlock
- name = "Deep Storage Airlock"
- icon_state = "quart"
-
-/area/ruin/space/has_grav/deepstorage/power
- name = "Deep Storage Power and Atmospherics Room"
- icon_state = "engi_storage"
-
-/area/ruin/space/has_grav/deepstorage/hydroponics
- name = "Deep Storage Hydroponics"
- icon_state = "garden"
-
-/area/ruin/space/has_grav/deepstorage/armory
- name = "Deep Storage Secure Storage"
- icon_state = "armory"
-
-/area/ruin/space/has_grav/deepstorage/storage
- name = "Deep Storage Storage"
- icon_state = "storage_wing"
-
-/area/ruin/space/has_grav/deepstorage/dorm
- name = "Deep Storage Dormitory"
- icon_state = "crew_quarters"
-
-/area/ruin/space/has_grav/deepstorage/kitchen
- name = "Deep Storage Kitchen"
- icon_state = "kitchen"
-
-/area/ruin/space/has_grav/deepstorage/crusher
- name = "Deep Storage Recycler"
- icon_state = "storage"
-
-//DERELICT
-
-/area/ruin/space/derelict
- name = "Derelict Station"
- icon_state = "storage"
-
-/area/ruin/space/derelict/hallway/primary
- name = "Derelict Primary Hallway"
- icon_state = "hallP"
-
-/area/ruin/space/derelict/hallway/secondary
- name = "Derelict Secondary Hallway"
- icon_state = "hallS"
-
-/area/ruin/space/derelict/hallway/primary/port
- name = "Derelict Port Hallway"
- icon_state = "hallFP"
-
-/area/ruin/space/derelict/arrival
- name = "Derelict Arrival Centre"
- icon_state = "yellow"
-
-/area/ruin/space/derelict/storage/equipment
- name = "Derelict Equipment Storage"
-
-/area/ruin/space/derelict/bridge
- name = "Derelict Control Room"
- icon_state = "bridge"
-
-/area/ruin/space/derelict/bridge/access
- name = "Derelict Control Room Access"
- icon_state = "auxstorage"
-
-/area/ruin/space/derelict/bridge/ai_upload
- name = "Derelict Computer Core"
- icon_state = "ai"
-
-/area/ruin/space/derelict/solar_control
- name = "Derelict Solar Control"
- icon_state = "engine"
-
-/area/ruin/space/derelict/se_solar
- name = "South East Solars"
- icon_state = "engine"
-
-/area/ruin/space/derelict/medical
- name = "Derelict Medbay"
- icon_state = "medbay"
-
-/area/ruin/space/derelict/medical/chapel
- name = "Derelict Chapel"
- icon_state = "chapel"
-
-/area/solar/derelict_starboard
- name = "Derelict Starboard Solar Array"
- icon_state = "panelsS"
-
-/area/solar/derelict_aft
- name = "Derelict Aft Solar Array"
- icon_state = "yellow"
-
-/area/ruin/space/derelict/singularity_engine
- name = "Derelict Singularity Engine"
- icon_state = "engine"
-
-/area/ruin/space/derelict/gravity_generator
- name = "Derelict Gravity Generator Room"
- icon_state = "red"
-
-/area/ruin/space/derelict/atmospherics
- name = "Derelict Atmospherics"
- icon_state = "red"
-
-//DJSTATION
-
-/area/ruin/space/djstation
- name = "Ruskie DJ Station"
- icon_state = "DJ"
- has_gravity = STANDARD_GRAVITY
-
-/area/ruin/space/djstation/solars
- name = "DJ Station Solars"
- icon_state = "DJ"
- has_gravity = STANDARD_GRAVITY
-
-//OLD AI SAT
-
-/area/tcommsat/oldaisat
- name = "Abandoned Satellite"
- icon_state = "tcomsatcham"
-
-//ABANDONED BOX WHITESHIP
-
-/area/ruin/space/has_grav/whiteship/box
-
- name = "Abandoned Ship"
- icon_state = "red"
-
-
-//SYNDICATE LISTENING POST STATION
-
-/area/ruin/space/has_grav/listeningstation
- name = "Listening Post"
- icon_state = "yellow"
-
-/area/ruin/space/has_grav/powered/ancient_shuttle
- name = "Ancient Shuttle"
- icon_state = "yellow"
-
-//HELL'S FACTORY OPERATING FACILITY
-
-/area/ruin/space/has_grav/hellfactory
- name = "Hell Factory"
- icon_state = "yellow"
-
-/area/ruin/space/has_grav/hellfactoryoffice
- name = "Hell Factory Office"
- icon_state = "red"
- area_flags = VALID_TERRITORY | BLOBS_ALLOWED | NOTELEPORT
-
-//Ruin of Transport 18
-
-/area/ruin/space/has_grav/transport18fore
- name = "Booze Cruise Fore"
- icon_state = "crew_quarters"
-
-/area/ruin/space/has_grav/transport18mid
- name = "Booze Cruise Hold"
- icon_state = "cargo_bay"
-
-/area/ruin/space/transport18aft
- name = "Booze Cruise Aft"
- icon_state = "engine"
-
-//Ruin of the rad ship. It's pretty rad.
-
-/area/ruin/space/has_grav/radship/Cargo1
- name = "Cargo Bay 1"
- icon_state = "cargo_bay"
-
-/area/ruin/space/has_grav/radship/Cargo2
- name = "Cargo Bay 2"
- icon_state = "cargo_bay"
-
-/area/ruin/space/has_grav/radship/Cargo3
- name = "Cargo Bay 3"
- icon_state = "cargo_bay"
-
-/area/ruin/space/has_grav/radship/Cargo4
- name = "Cargo Bay 4"
- icon_state = "cargo_bay"
-
-/area/ruin/space/has_grav/radship/EngineRoom
- name = "Engine Room"
- icon_state = "yellow"
-
-/area/ruin/space/has_grav/radship/Engineering
- name = "Engineering"
- icon_state = "engine"
-
-/area/ruin/space/has_grav/radship/MethLab
- name = "Storage"
- icon_state = "red"
-
-/area/ruin/space/has_grav/radship/CrewQuarters
- name = "Crew Quarters"
- icon_state = "green"
-
-/area/ruin/space/has_grav/radship/Hallway
- name = "Hallway"
- icon_state = "away"
-
-//MACSPACE
-
-/area/ruin/space/has_grav/powered/macspace
- name = "Mac Space Restaurant"
- icon_state = "yellow"
-
//POWER PUZZLE
/area/ruin/space/has_grav/powerpuzzle
@@ -286,20 +53,6 @@
name = "Engineering Wing"
icon_state = "yellow"
-//scav_mining
-
-/area/ruin/space/has_grav/scav_mining/entrance
- name = "Asteroid mine entrance"
- icon_state = "red"
-
-/area/ruin/space/has_grav/scav_mining/core
- name = "Asteroid mine core"
- icon_state = "yellow"
-
-/area/ruin/space/has_grav/scav_mining/dorm
- name = "Asteroid mine dorm"
- icon_state = "blue"
-
//astraeus
/area/ruin/space/has_grav/astraeus/hallway
@@ -326,44 +79,6 @@
name = "Custodial Closet"
icon_state = "green"
-/area/ruin/space/has_grav/glade
- name = "\improper Dark Glade"
- icon_state = "away"
- always_unpowered = FALSE
-
-//Syndie battle sphere
-
-/area/ruin/space/has_grav/syndicircle/halls
- name = "Syndicate Battle Sphere Primary Hallway"
- icon_state = "dk_yellow"
- color = "#a5131388"
-
-/area/ruin/space/has_grav/syndicircle/spacewalk
- name = "Syndicate Battle Sphere Shuttle Launch Site"
- icon_state = "dk_yellow"
- color = "#663cb488"
-
-/area/ruin/space/has_grav/syndicircle/research
- name = "Syndicate Battle Sphere Laboratory"
- icon_state = "dk_yellow"
- color = "#228a2b88"
-
-/area/ruin/space/has_grav/syndicircle/escape
- name = "Syndicate Battle Sphere Escape Shuttle"
- icon_state = "dk_yellow"
- color = "#92bb3388"
-
-/area/ruin/space/has_grav/syndicircle/winter
- name = "Syndicate Battle Sphere Snow Outpost"
- icon_state = "dk_yellow"
- color = "#4341c488"
-
-/area/ruin/space/has_grav/syndicircle/training
- name = "Syndicate Battle Sphere Training Grounds"
- icon_state = "dk_yellow"
- color = "#26773a88"
-
-
//Singularity Lab
/area/ruin/space/has_grav/singularitylab
diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm
index a9d7220bd3ca..6060367ca51b 100644
--- a/code/game/area/areas/shuttles.dm
+++ b/code/game/area/areas/shuttles.dm
@@ -189,27 +189,3 @@
/area/shuttle/syndicate_scout
name = "Syndicate Scout"
-
-/area/shuttle/caravan
- requires_power = TRUE
-
-/area/shuttle/caravan/syndicate1
- name = "Syndicate Fighter"
-
-/area/shuttle/caravan/syndicate2
- name = "Syndicate Fighter"
-
-/area/shuttle/caravan/syndicate3
- name = "Syndicate Drop Ship"
-
-/area/shuttle/caravan/pirate
- name = "Pirate Cutter"
-
-/area/shuttle/caravan/freighter1
- name = "Small Freighter"
-
-/area/shuttle/caravan/freighter2
- name = "Tiny Freighter"
-
-/area/shuttle/caravan/freighter3
- name = "Tiny Freighter"
diff --git a/code/game/area/ship_areas.dm b/code/game/area/ship_areas.dm
index be8e666b60a9..5f4e75b71d4d 100644
--- a/code/game/area/ship_areas.dm
+++ b/code/game/area/ship_areas.dm
@@ -68,7 +68,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/ship
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
- has_gravity = STANDARD_GRAVITY
always_unpowered = FALSE
area_flags = VALID_TERRITORY | BLOBS_ALLOWED // Loading the same shuttle map at a different time will produce distinct area instances.
icon_state = "shuttle"
@@ -282,6 +281,15 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
lighting_colour_bulb = "#ffbc6f"
sound_environment = SOUND_AREA_LARGE_ENCLOSED
+/area/ship/engineering/engines
+ name = "Engines"
+
+/area/ship/engineering/engines/port
+ name = "Port Engines"
+
+/area/ship/engineering/engines/starboard
+ name = "Starboard Engines"
+
/area/ship/engineering/atmospherics
name = "Atmospherics"
icon_state = "atmos"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 6c6849724bde..7ffa3255ada1 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -84,9 +84,6 @@
var/list/alternate_appearances
- ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy()
- var/list/targeted_by
-
/// Last appearance of the atom for demo saving purposes
var/image/demo_last_appearance
@@ -160,6 +157,7 @@
var/hitsound_type = PROJECTILE_HITSOUND_NON_LIVING
///volume wanted for being hit
var/hitsound_volume = 50
+
/**
* Called when an atom is created in byond (built in engine proc)
*
@@ -309,11 +307,6 @@
LAZYCLEARLIST(overlays)
LAZYCLEARLIST(managed_overlays)
- for(var/i in targeted_by)
- var/mob/M = i
- LAZYREMOVE(M.do_afters, src)
-
- targeted_by = null
QDEL_NULL(light)
if(smoothing_flags & SMOOTH_QUEUED)
@@ -975,15 +968,12 @@
var/list/things = src_object.contents()
var/datum/progressbar/progress = new(user, things.len, src)
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, TYPE_PROC_REF(/datum/component/storage, handle_mass_item_insertion), things, src_object, user, progress)))
+ while (do_after(user, 1 SECONDS, src, NONE, FALSE, CALLBACK(STR, TYPE_PROC_REF(/datum/component/storage, handle_mass_item_insertion), things, src_object, user, progress)))
stoplag(1)
progress.end_progress()
to_chat(user, "You dump as much of [src_object.parent]'s contents [STR.insert_preposition]to [src] as you can.")
- STR.orient2hud(user)
- src_object.orient2hud(user)
if(user.active_storage) //refresh the HUD to show the transfered contents
- user.active_storage.close(user)
- user.active_storage.show_to(user)
+ user.active_storage.ui_show(user)
return TRUE
///Get the best place to dump the items contained in the source storage item?
@@ -1555,6 +1545,7 @@
* * No gravity if this atom is in is a space turf
* * Gravity if the area it's in always has gravity
* * Gravity if there's a gravity generator on the z level
+ * * Gravity if there is a ship gravity generator in a ship
* * Gravity if the Z level has an SSMappingTrait for ZTRAIT_GRAVITY
* * otherwise no gravity
*/
@@ -1587,12 +1578,22 @@
else
// See if there's a gravity generator on our map zone
var/datum/map_zone/mapzone = T.get_map_zone()
+ var/max_grav = T.virtual_level_trait(ZTRAIT_GRAVITY)
if(mapzone?.gravity_generators.len)
- var/max_grav = 0
for(var/obj/machinery/gravity_generator/main/G as anything in mapzone.gravity_generators)
max_grav = max(G.setting,max_grav)
- return max_grav
- return T.virtual_level_trait(ZTRAIT_GRAVITY)
+ // Check for ship-based gravity
+ var/area/ship/ship = A
+ if(istype(ship))
+ var/obj/docking_port/mobile/shuttle = ship.mobile_port
+ if(shuttle)
+ for(var/datum/weakref/weakref as anything in shuttle.gravgen_list)
+ var/obj/machinery/power/ship_gravity/SG = weakref.resolve()
+ if(!SG)
+ shuttle.gravgen_list -= weakref
+ continue
+ max_grav = max(SG.active,max_grav)
+ return max_grav
/**
* Called when a mob examines (shift click or verb) this atom twice (or more) within EXAMINE_MORE_TIME (default 1.5 seconds)
@@ -1673,7 +1674,11 @@
active_hud.screentip_text.maptext = ""
else
//We inline a MAPTEXT() here, because there's no good way to statically add to a string like this
- active_hud.screentip_text.maptext = "[name]"
+ active_hud.screentip_text.maptext = "[get_screentip_name(client)]"
+
+/// Returns the atom name that should be used on screentip
+/atom/proc/get_screentip_name(client/hovering_client)
+ return name
///Called whenever a player is spawned on the same turf as this atom.
/atom/proc/join_player_here(mob/M)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 7dd3d612ae81..beb7cef2718f 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -560,7 +560,7 @@
if(!client)
return
if(new_virtual_z)
- LAZYADDASSOC(SSmobs.players_by_virtual_z, "[new_virtual_z]", src)
+ LAZYADDASSOCLIST(SSmobs.players_by_virtual_z, "[new_virtual_z]", src)
SSidlenpcpool.try_wakeup_virtual_z(new_virtual_z)
/mob/dead/on_virtual_z_change(new_virtual_z, previous_virtual_z)
@@ -570,7 +570,7 @@
if(!client)
return
if(new_virtual_z)
- LAZYADDASSOC(SSmobs.dead_players_by_virtual_z, "[new_virtual_z]", src)
+ LAZYADDASSOCLIST(SSmobs.dead_players_by_virtual_z, "[new_virtual_z]", src)
// Make sure you know what you're doing if you call this, this is intended to only be called by byond directly.
// You probably want CanPass()
@@ -624,7 +624,7 @@
SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A)
. = ..()
if(!QDELETED(throwing))
- throwing.hit_atom(A)
+ throwing.finalize(hit = TRUE, target = A)
. = TRUE
if(QDELETED(A))
return
@@ -821,7 +821,9 @@
var/impact_signal = SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum)
if(impact_signal & COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH)
hitpush = FALSE // hacky, tie this to something else or a proper workaround later
-
+ if(isturf(loc))
+ var/turf/T = loc
+ T.Entered(src)
if(impact_signal & ~COMPONENT_MOVABLE_IMPACT_NEVERMIND) // in case a signal interceptor broke or deleted the thing before we could process our hit
return hit_atom.hitby(src, throwingdatum=throwingdatum, hitpush=hitpush)
@@ -883,7 +885,7 @@
else
target_zone = thrower.zone_selected
- var/datum/thrownthing/TT = new(src, target, get_turf(target), get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, target_zone)
+ var/datum/thrownthing/TT = new(src, target, get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, target_zone)
var/dist_x = abs(target.x - src.x)
var/dist_y = abs(target.y - src.y)
diff --git a/code/game/communications.dm b/code/game/communications.dm
index 90d561e304c7..94afdbf364f5 100644
--- a/code/game/communications.dm
+++ b/code/game/communications.dm
@@ -99,6 +99,7 @@ GLOBAL_LIST_INIT(radiochannels, list(
RADIO_CHANNEL_SYNDICATE = FREQ_SYNDICATE,
RADIO_CHANNEL_NANOTRASEN = FREQ_NANOTRASEN,
RADIO_CHANNEL_MINUTEMEN = FREQ_MINUTEMEN,
+ RADIO_CHANNEL_PGF = FREQ_PGF,
RADIO_CHANNEL_INTEQ = FREQ_INTEQ,
RADIO_CHANNEL_PIRATE = FREQ_PIRATE,
RADIO_CHANNEL_AI_PRIVATE = FREQ_AI_PRIVATE,
@@ -115,6 +116,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list(
"[FREQ_SYNDICATE]" = RADIO_CHANNEL_SYNDICATE,
"[FREQ_NANOTRASEN]" = RADIO_CHANNEL_NANOTRASEN,
"[FREQ_MINUTEMEN]" = RADIO_CHANNEL_MINUTEMEN,
+ "[FREQ_PGF]" = RADIO_CHANNEL_PGF,
"[FREQ_INTEQ]" = RADIO_CHANNEL_INTEQ,
"[FREQ_PIRATE]" = RADIO_CHANNEL_PIRATE,
"[FREQ_AI_PRIVATE]" = RADIO_CHANNEL_AI_PRIVATE,
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 1dee49da7f54..4020895f29bd 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -216,24 +216,6 @@ Medical HUD! Basic mode needs suit sensors on.
holder.icon_state = "hudhealthy"
-/***********************************************
-FAN HUDs! For identifying other fans on-sight.
-************************************************/
-
-//HOOKS
-
-/mob/living/carbon/human/proc/fan_hud_set_fandom()
- var/image/holder = hud_list[FAN_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- holder.icon_state = "hudfan_no"
- var/obj/item/clothing/under/U = get_item_by_slot(ITEM_SLOT_ICLOTHING)
- if(U)
- if(istype(U.attached_accessory, /obj/item/clothing/accessory/fan_mime_pin))
- holder.icon_state = "fan_mime_pin"
- else if(istype(U.attached_accessory, /obj/item/clothing/accessory/fan_clown_pin))
- holder.icon_state = "fan_clown_pin"
-
/***********************************************
Security HUDs! Basic mode shows only the job.
************************************************/
diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm
index 9025f6ec2dcb..74e391ef5510 100644
--- a/code/game/gamemodes/clown_ops/clown_ops.dm
+++ b/code/game/gamemodes/clown_ops/clown_ops.dm
@@ -40,7 +40,6 @@
backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
/obj/item/kitchen/knife/combat/survival,
/obj/item/dnainjector/clumsymut, //in case you want to be clumsy for the memes
- /obj/item/storage/box/syndie_kit/clownpins, //for any guns that you get your grubby little clown op mitts on
/obj/item/reagent_containers/spray/waterflower/lube)
implants = list(/obj/item/implant/sad_trombone)
diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm
index fe95ea3c5988..3064a52a48ad 100644
--- a/code/game/gamemodes/clown_ops/clown_weapons.dm
+++ b/code/game/gamemodes/clown_ops/clown_weapons.dm
@@ -40,14 +40,14 @@
/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/Initialize()
. = ..()
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
- bananium.insert_amount_mat(max_recharge, /datum/material/bananium)
+ bananium.insert_amount_mat(max_recharge, /datum/material/hellstone)
START_PROCESSING(SSobj, src)
/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/process()
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
- var/bananium_amount = bananium.get_material_amount(/datum/material/bananium)
+ var/bananium_amount = bananium.get_material_amount(/datum/material/hellstone)
if(bananium_amount < max_recharge)
- bananium.insert_amount_mat(min(recharge_rate, max_recharge - bananium_amount), /datum/material/bananium)
+ bananium.insert_amount_mat(min(recharge_rate, max_recharge - bananium_amount), /datum/material/hellstone)
/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/attack_self(mob/user)
ui_action_click(user)
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index e6f4f882a401..f7ce7b036eb5 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -16,8 +16,6 @@
if(!istype(M))
return FALSE
if(M.mind)
- if(ishuman(M) && (M.mind.holy_role))
- return FALSE
if(specific_cult && specific_cult.is_sacrifice_target(M.mind))
return FALSE
if(M.mind.enslaved_to && !iscultist(M.mind.enslaved_to))
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 82735ff9d522..65e161f2176b 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -883,31 +883,6 @@ GLOBAL_LIST_EMPTY(possible_items_special)
explanation_text = "Steal at least five guns!"
wanted_items = list(/obj/item/gun)
-/datum/objective/steal_five_of_type/summon_magic
- name = "steal magic"
- explanation_text = "Steal at least five magical artefacts!"
- wanted_items = list()
-
-/datum/objective/steal_five_of_type/summon_magic/New()
- wanted_items = GLOB.summoned_magic_objectives
- ..()
-
-/datum/objective/steal_five_of_type/summon_magic/check_completion()
- var/list/datum/mind/owners = get_owners()
- var/stolen_count = 0
- for(var/datum/mind/M in owners)
- if(!isliving(M.current))
- continue
- var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc.
- for(var/obj/I in all_items) //Check for wanted items
- if(istype(I, /obj/item/book/granter/spell))
- var/obj/item/book/granter/spell/spellbook = I
- if(!spellbook.used || !spellbook.oneuse) //if the book still has powers...
- stolen_count++ //it counts. nice.
- else if(is_type_in_typecache(I, wanted_items))
- stolen_count++
- return stolen_count >= 5
-
//Created by admin tools
/datum/objective/custom
name = "custom"
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index e9906a6a0089..b423b28ce4d2 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -5,6 +5,8 @@
icon_state = "pdapainter"
base_icon_state = "pdapainter"
density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_MINIMAL
max_integrity = 200
var/obj/item/pda/storedpda = null
var/list/colorlist = list()
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index f0a1c403cfa4..3d4d05336c3c 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -11,6 +11,8 @@
icon_state = "sleeper"
base_icon_state = "sleeper"
density = FALSE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_LOW
state_open = TRUE
circuit = /obj/item/circuitboard/machine/sleeper
clicksound = 'sound/machines/pda_button1.ogg'
@@ -100,7 +102,7 @@
playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, frequency = rand(5120, 8800))
target.apply_status_effect(STATUS_EFFECT_STASIS, STASIS_MACHINE_EFFECT)
target.ExtinguishMob()
- use_power = ACTIVE_POWER_USE
+ set_active_power()
/obj/machinery/sleeper/proc/thaw_them(mob/living/target)
if(IS_IN_STASIS(target))
@@ -109,7 +111,8 @@
/obj/machinery/sleeper/process()
if(!occupant || !isliving(occupant))
- use_power = IDLE_POWER_USE
+ if(use_static_power != IDLE_POWER_USE)
+ set_idle_power()
return
var/mob/living/L_occupant = occupant
if(stasis_running())
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index a17b9c705dc1..4cddf93b2478 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -21,7 +21,7 @@ Class Variables:
power_channel (num)
What channel to draw from when drawing power for power mode
Possible Values:
- AREA_USAGE_EQUIP:0 -- Equipment Channel
+ AREA_USAGE_EQUIP:1 -- Equipment Channel
AREA_USAGE_LIGHT:2 -- Lighting Channel
AREA_USAGE_ENVIRON:3 -- Environment Channel
@@ -44,7 +44,7 @@ Class Procs:
auto_use_power() 'game/machinery/machine.dm'
This proc determines how power mode power is deducted by the machine.
'auto_use_power()' is called by the 'master_controller' game_controller every
- tick.
+ tick. (not anymore)
Return Value:
return:1 -- if object is powered
@@ -102,6 +102,7 @@ Class Procs:
//0 = dont run the auto
//1 = run auto, use idle
//2 = run auto, use active
+ var/use_static_power = NO_POWER_USE
var/idle_power_usage = 0
var/active_power_usage = 0
var/power_channel = AREA_USAGE_EQUIP
@@ -151,7 +152,11 @@ Class Procs:
if(occupant_typecache)
occupant_typecache = typecacheof(occupant_typecache)
-
+ switch(use_power)
+ if(IDLE_POWER_USE)
+ set_idle_power()
+ if(ACTIVE_POWER_USE)
+ set_active_power()
return INITIALIZE_HINT_LATELOAD
/// Helper proc for telling a machine to start processing with the subsystem type that is located in its `subsystem_type` var.
@@ -168,7 +173,16 @@ Class Procs:
. = ..()
power_change()
become_area_sensitive(ROUNDSTART_TRAIT)
- RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(power_change))
+ RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(enter_area))
+ RegisterSignal(src, COMSIG_EXIT_AREA, PROC_REF(exit_area))
+
+/obj/machinery/proc/enter_area(datum/source, area/A)
+ SIGNAL_HANDLER
+ power_change(A)
+
+/obj/machinery/proc/exit_area(datum/source, area/A)
+ SIGNAL_HANDLER
+ set_no_power(A)
/obj/machinery/Destroy()
GLOB.machines.Remove(src)
@@ -177,6 +191,7 @@ Class Procs:
lose_area_sensitivity(ROUNDSTART_TRAIT)
QDEL_NULL(circuit)
QDEL_LIST(component_parts)
+ set_no_power()
return ..()
/obj/machinery/proc/locate_machinery()
@@ -273,8 +288,8 @@ Class Procs:
target.forceMove(src)
updateUsrDialog()
update_appearance()
-
-/obj/machinery/proc/auto_use_power()
+/*
+/obj/machinery/proc/auto_use_power() //obsolete, tick controller doesn't call this anymore because machines use addStaticPower now.
if(!powered(power_channel))
return 0
if(use_power == 1)
@@ -282,7 +297,7 @@ Class Procs:
else if(use_power >= 2)
use_power(active_power_usage,power_channel)
return 1
-
+*/
///Called when we want to change the value of the `is_operational` variable. Boolean.
/obj/machinery/proc/set_is_operational(new_value)
@@ -618,6 +633,7 @@ Class Procs:
//called on deconstruction before the final deletion
/obj/machinery/proc/on_deconstruction()
+ set_no_power()
return
/obj/machinery/proc/can_be_overridden()
diff --git a/code/game/machinery/airlock_cycle_control.dm b/code/game/machinery/airlock_cycle_control.dm
index 76094e803cd3..7ba391fae782 100644
--- a/code/game/machinery/airlock_cycle_control.dm
+++ b/code/game/machinery/airlock_cycle_control.dm
@@ -67,8 +67,8 @@
icon = 'icons/obj/monitors.dmi'
icon_state = "aac"
use_power = IDLE_POWER_USE
- idle_power_usage = 4
- active_power_usage = 8
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
power_channel = AREA_USAGE_ENVIRON
req_access = list(ACCESS_ATMOSPHERICS)
max_integrity = 250
diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm
index f275d234fca7..d4057603957d 100644
--- a/code/game/machinery/announcement_system.dm
+++ b/code/game/machinery/announcement_system.dm
@@ -12,8 +12,8 @@ GLOBAL_LIST_EMPTY(announcement_systems)
verb_ask = "queries"
verb_exclaim = "alarms"
- idle_power_usage = 20
- active_power_usage = 50
+ idle_power_usage = IDLE_DRAW_LOW
+ active_power_usage = IDLE_DRAW_LOW
circuit = /obj/item/circuitboard/machine/announcement_system
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index d83831f2c634..e63b3f75fb2b 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -9,8 +9,9 @@
icon_state = "autolathe"
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 10
- active_power_usage = 100
+ idle_power_usage = IDLE_DRAW_LOW
+ active_power_usage = ACTIVE_DRAW_HIGH
+ power_channel = AREA_USAGE_EQUIP
circuit = /obj/item/circuitboard/machine/autolathe
layer = BELOW_OBJ_LAYER
@@ -50,7 +51,7 @@
)
/obj/machinery/autolathe/Initialize()
- AddComponent(/datum/component/material_container,list(/datum/material/iron, /datum/material/glass, /datum/material/plastic, /datum/material/silver, /datum/material/gold, /datum/material/plasma, /datum/material/uranium, /datum/material/titanium), 0, TRUE, null, null, CALLBACK(src, PROC_REF(AfterMaterialInsert)))
+ AddComponent(/datum/component/material_container,list(/datum/material/iron, /datum/material/glass, /datum/material/plastic, /datum/material/silver, /datum/material/gold, /datum/material/plasma, /datum/material/uranium, /datum/material/titanium, /datum/material/hellstone), 0, TRUE, null, null, CALLBACK(src, PROC_REF(AfterMaterialInsert)))
. = ..()
wires = new /datum/wires/autolathe(src)
@@ -223,7 +224,7 @@
for(var/MAT in being_built.materials)
total_amount += being_built.materials[MAT]
- var/power = max(active_power_usage, (total_amount)*multiplier/5) //Change this to use all materials
+ var/power = max(active_power_usage, total_amount) //Change this to use all materials
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
@@ -252,6 +253,7 @@
use_power(power)
icon_state = "autolathe_n"
var/time = is_stack ? 32 : (32 * coeff * multiplier) ** 0.8
+ set_active_power()
addtimer(CALLBACK(src, PROC_REF(make_item), power, materials_used, custom_materials, multiplier, coeff, is_stack, usr), time)
. = TRUE
else
@@ -326,12 +328,13 @@
else
flick("autolathe_o", src) //plays metal insertion animation
- use_power(min(1000, amount_inserted / 100))
+ use_power(min(active_power_usage, amount_inserted))
/obj/machinery/autolathe/proc/make_item(power, list/materials_used, list/picked_materials, multiplier, coeff, is_stack, mob/user)
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/atom/A = drop_location()
use_power(power)
+ set_idle_power()
materials.use_materials(materials_used)
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index 1f80c6a9c3ce..83f3e366e8a3 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -3,11 +3,12 @@
desc = "A machine used to deposit and withdraw funds."
icon_screen = "vault"
icon_keyboard = "security_key"
- idle_power_usage = 100
+ idle_power_usage = IDLE_DRAW_LOW
var/siphoning = FALSE
var/next_warning = 0
var/obj/item/radio/radio
+ var/datum/weakref/ship_account_ref
var/radio_channel = RADIO_CHANNEL_COMMON
var/minimum_time_between_warnings = 400
var/syphoning_credits = 0
@@ -19,23 +20,21 @@
radio.canhear_range = 0
radio.recalculateChannels()
+/obj/machinery/computer/bank_machine/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock)
+ . = ..()
+ ship_account_ref = WEAKREF(port.current_ship.ship_account)
+
/obj/machinery/computer/bank_machine/Destroy()
QDEL_NULL(radio)
. = ..()
/obj/machinery/computer/bank_machine/attackby(obj/item/I, mob/user)
- var/value = 0
- if(istype(I, /obj/item/spacecash/bundle))
- var/obj/item/spacecash/bundle/C = I
- value = C.value
- else if(istype(I, /obj/item/holochip))
- var/obj/item/holochip/H = I
- value = H.credits
+ var/value = I.get_item_credit_value()
if(value)
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- if(D)
- D.adjust_money(value)
- to_chat(user, "You deposit [I]. The Cargo Budget is now [D.account_balance] cr.")
+ var/datum/bank_account/ship_account = ship_account_ref.resolve()
+ if(ship_account)
+ ship_account.adjust_money(value, "deposit")
+ to_chat(user, "You deposit [I]. The [ship_account.account_holder] Budget is now [ship_account.account_balance] cr.")
qdel(I)
return
return ..()
@@ -46,15 +45,15 @@
if (machine_stat & (BROKEN|NOPOWER))
say("Insufficient power. Halting siphon.")
end_syphon()
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- if(!D.has_money(200))
- say("Cargo budget depleted. Halting siphon.")
+ var/datum/bank_account/ship_account = ship_account_ref.resolve()
+ if(!ship_account?.has_money(200))
+ say("Ship budget depleted. Halting siphon.")
end_syphon()
return
playsound(src, 'sound/items/poster_being_created.ogg', 100, TRUE)
syphoning_credits += 200
- D.adjust_money(-200)
+ ship_account.adjust_money(-200)
if(next_warning < world.time && prob(15))
var/area/A = get_area(loc)
var/message = "Unauthorized credit withdrawal underway in [initial(A.name)]!!"
@@ -69,14 +68,13 @@
/obj/machinery/computer/bank_machine/ui_data(mob/user)
var/list/data = list()
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
-
- if(D)
- data["current_balance"] = D.account_balance
+ var/datum/bank_account/ship_account = ship_account_ref.resolve()
+ if(ship_account)
+ data["current_balance"] = ship_account.account_balance
else
data["current_balance"] = 0
data["siphoning"] = siphoning
- data["station_name"] = station_name()
+ data["ship_name"] = ship_account.account_holder
return data
@@ -87,11 +85,11 @@
switch(action)
if("siphon")
- say("Siphon of company credits has begun!")
+ say("Siphon of ship credits has begun!")
siphoning = TRUE
. = TRUE
if("halt")
- say("Company credit withdrawal halted.")
+ say("Ship credit withdrawal halted.")
end_syphon()
. = TRUE
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index 1a89a2b011cc..f6c004ddca71 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -12,7 +12,7 @@
var/initialized_button = 0
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 70)
use_power = IDLE_POWER_USE
- idle_power_usage = 2
+ idle_power_usage = IDLE_DRAW_MINIMAL
resistance_flags = LAVA_PROOF | FIRE_PROOF
/obj/machinery/button/indestructible
@@ -68,34 +68,40 @@
default_deconstruction_screwdriver(user, "button-open", "[skin]",W)
update_appearance()
else
- to_chat(user, "Maintenance Access Denied.")
+ to_chat(user, span_alert("Maintenance Access Denied."))
flick("[skin]-denied", src)
return
if(panel_open)
if(!device && istype(W, /obj/item/assembly))
if(!user.transferItemToLoc(W, src))
- to_chat(user, "\The [W] is stuck to you!")
+ to_chat(user, span_warning("\The [W] is stuck to you!"))
return
device = W
- to_chat(user, "You add [W] to the button.")
+ to_chat(user, span_notice("You add [W] to the button."))
if(!board && istype(W, /obj/item/electronics/airlock))
if(!user.transferItemToLoc(W, src))
- to_chat(user, "\The [W] is stuck to you!")
+ to_chat(user, span_warning("\The [W] is stuck to you!"))
return
board = W
if(board.one_access)
req_one_access = board.accesses
else
req_access = board.accesses
- to_chat(user, "You add [W] to the button.")
+ to_chat(user, span_notice("You add [W] to the button."))
+
+ if(device && W.tool_behaviour == TOOL_MULTITOOL)
+ var/obj/item/multitool/multi = W
+ if(istype(device, /obj/item/assembly/control))
+ multi.buffer = device
+ to_chat(user, span_notice("You copy the [device] to your multitool's buffer."))
if(!device && !board && W.tool_behaviour == TOOL_WRENCH)
- to_chat(user, "You start unsecuring the button frame...")
+ to_chat(user, span_notice("You start unsecuring the button frame..."))
W.play_tool_sound(src)
if(W.use_tool(src, user, 40))
- to_chat(user, "You unsecure the button frame.")
+ to_chat(user, span_notice("You unsecure the button frame."))
transfer_fingerprints_to(new /obj/item/wallframe/button(get_turf(src)))
playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE)
qdel(src)
@@ -153,14 +159,14 @@
req_one_access = list()
board = null
update_appearance()
- to_chat(user, "You remove electronics from the button frame.")
+ to_chat(user, span_notice("You remove electronics from the button frame."))
else
if(skin == "doorctrl")
skin = "launcher"
else
skin = "doorctrl"
- to_chat(user, "You change the button frame's front panel.")
+ to_chat(user, span_notice("You change the button frame's front panel."))
return
if((machine_stat & (NOPOWER|BROKEN)))
@@ -170,7 +176,7 @@
return
if(!allowed(user))
- to_chat(user, "Access Denied.")
+ to_chat(user, span_alert("Access Denied."))
flick("[skin]-denied", src)
return
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index c1cca432efd4..fda41eab7789 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -9,8 +9,8 @@
icon_state = "camera" //mapping icon to represent upgrade states. if you want a different base icon, update default_camera_icon as well as this.
light_color = "#CDDDFF"
use_power = ACTIVE_POWER_USE
- idle_power_usage = 5
- active_power_usage = 10
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = IDLE_DRAW_MINIMAL*2
layer = WALL_OBJ_LAYER
resistance_flags = FIRE_PROOF
damage_deflection = 12
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index 8f57ad09203a..d5f7e618c637 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -56,18 +56,11 @@
/obj/machinery/camera/autoname/LateInitialize()
. = ..()
- number = 1
- var/area/A = get_area(src)
- if(A)
- for(var/obj/machinery/camera/autoname/C in GLOB.machines)
- if(C == src)
- continue
- var/area/CA = get_area(C)
- if(CA.type == A.type)
- if(C.number)
- number = max(number, C.number+1)
- c_tag = "[A.name] #[number]"
-
+ var/static/list/autonames_in_areas = list()
+ var/area/camera_area = get_area(src)
+ number = autonames_in_areas[camera_area] + 1
+ autonames_in_areas[camera_area] = number
+ c_tag = "[format_text(camera_area.name)] #[number]"
// UPGRADE PROCS
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index e1be8d8e4453..85d2d5651203 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -4,8 +4,8 @@
icon = 'icons/obj/power.dmi'
icon_state = "ccharger"
use_power = IDLE_POWER_USE
- idle_power_usage = 5
- active_power_usage = 60
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_LOW
power_channel = AREA_USAGE_EQUIP
circuit = /obj/item/circuitboard/machine/cell_charger
pass_flags = PASSTABLE
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index c71e94a0948a..ad4cd3834f06 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -16,6 +16,8 @@
density = TRUE
icon = 'icons/obj/machines/cloning.dmi'
icon_state = "pod_0"
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_LOW
req_access = list(ACCESS_CLONING) //FOR PREMATURE UNLOCKING.
verb_say = "states"
circuit = /obj/item/circuitboard/machine/clonepod
diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm
index bdbadf79a943..3a36603c5070 100644
--- a/code/game/machinery/computer/_computer.dm
+++ b/code/game/machinery/computer/_computer.dm
@@ -4,8 +4,8 @@
icon_state = "computer"
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 300
- active_power_usage = 300
+ idle_power_usage = IDLE_DRAW_LOW
+ active_power_usage = ACTIVE_DRAW_LOW
max_integrity = 200
integrity_failure = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 20)
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 571d5b090da9..d7f80fc45680 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -93,7 +93,6 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
visible_message("[src] dispenses.. woah, a gun! Way past cool.", "You hear a chime and a shot.")
user.client.give_award(/datum/award/achievement/misc/pulse, user)
return
-
var/prizeselect
if(prize_override)
prizeselect = pickweight(prize_override)
@@ -868,7 +867,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
say("WEEWOO! WEEWOO! Spaceport security en route!")
playsound(src, 'sound/items/weeoo1.ogg', 100, FALSE)
for(var/i, i<=3, i++)
- var/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion(get_turf(src))
+ var/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/orion/O = new/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/orion(get_turf(src))
O.target = usr
@@ -1243,7 +1242,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
newgame()
obj_flags |= EMAGGED
-/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/orion
name = "spaceport security"
desc = "Premier corporate security forces for all spaceports found along the Orion Trail."
faction = list("orion")
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 2f8e066a74ba..63f9284c28ae 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -419,8 +419,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
to_chat(usr, "No log exists for this job.")
updateUsrDialog()
return
- if(inserted_modify_id.registered_account)
- inserted_modify_id.registered_account.account_job = jobdatum // this is a terrible idea and people will grief but sure whatever
inserted_modify_id.access = (istype(src, /obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : jobdatum.get_access())
if (inserted_modify_id)
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index f875defd6044..c1a1171e57cc 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -6,8 +6,8 @@
icon_screen = "crew"
icon_keyboard = "med_key"
use_power = IDLE_POWER_USE
- idle_power_usage = 250
- active_power_usage = 500
+ idle_power_usage = IDLE_DRAW_LOW
+ active_power_usage = ACTIVE_DRAW_MEDIUM
circuit = /obj/item/circuitboard/computer/crew
light_color = LIGHT_COLOR_BLUE
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index ffeabbdc4e0a..815e2496d41b 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -43,8 +43,8 @@
circuit = /obj/item/circuitboard/computer/scan_consolenew
use_power = IDLE_POWER_USE
- idle_power_usage = 10
- active_power_usage = 400
+ idle_power_usage = IDLE_DRAW_LOW
+ active_power_usage = ACTIVE_DRAW_MEDIUM
light_color = LIGHT_COLOR_BLUE
/// Link to the techweb's stored research. Used to retrieve stored mutations
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 2dc9a2c98bed..37759d04b13e 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -190,35 +190,9 @@
if((istype(active2, /datum/data/record) && GLOB.data_core.security.Find(active2)))
dat += "Security Data"
dat += " Criminal Status: [active2.fields["criminal"]]"
- dat += "
@@ -108,24 +83,5 @@
authenticated = null
playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE)
- if("Pay")
- for(var/datum/data/crime/p in current.fields["citation"])
- if(p.dataId == text2num(href_list["cdataid"]))
- var/obj/item/holochip/C = M.is_holding_item_of_type(/obj/item/holochip)
- if(C && istype(C))
- var/pay = C.get_item_credit_value()
- if(!pay)
- to_chat(M, "[C] doesn't seem to be worth anything!")
- else
- var/diff = p.fine - p.paid
- GLOB.data_core.payCitation(current.fields["id"], text2num(href_list["cdataid"]), pay)
- to_chat(M, "You have paid [pay] credit\s towards your fine.")
- if (pay == diff || pay > diff || pay >= diff)
- investigate_log("Citation Paid off: [p.crimeName] Fine: [p.fine] | Paid off by [key_name(usr)]", INVESTIGATE_RECORDS)
- to_chat(M, "The fine has been paid in full.")
- qdel(C)
- playsound(src, "terminal_type", 25, FALSE)
- else
- to_chat(M, "Fines can only be paid with holochips!")
updateUsrDialog()
add_fingerprint(M)
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 20c3d66e8585..8419ee80ce1e 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -5,6 +5,8 @@
icon_state = "jukebox-"
verb_say = "states"
density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_MINIMAL
var/active = FALSE
var/list/rangers = list()
var/stop = 0
diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm
index f3fa616032d3..645e8eee762f 100644
--- a/code/game/machinery/defibrillator_mount.dm
+++ b/code/game/machinery/defibrillator_mount.dm
@@ -165,7 +165,7 @@
name = "PENLITE defibrillator mount"
desc = "Holds defibrillators. You can grab the paddles if one is mounted. This PENLITE variant also allows for slow, passive recharging of the defibrillator."
icon_state = "penlite_mount"
- idle_power_usage = 1
+ idle_power_usage = 0
wallframe_type = /obj/item/wallframe/defib_mount/charging
diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm
index baf3d6ae2cc1..740ea5c935fa 100644
--- a/code/game/machinery/dish_drive.dm
+++ b/code/game/machinery/dish_drive.dm
@@ -5,8 +5,8 @@
Or you can just drop your plates on the floor, like civilized folk."
icon = 'icons/obj/kitchen.dmi'
icon_state = "synthesizer"
- idle_power_usage = 8 //5 with default parts
- active_power_usage = 13 //10 with default parts
+ idle_power_usage = IDLE_DRAW_MINIMAL //lower
+ active_power_usage = ACTIVE_DRAW_MINIMAL //lower ingame because stockparts
density = FALSE
circuit = /obj/item/circuitboard/machine/dish_drive
pass_flags = PASSTABLE
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index 7f61dde6ef79..a45aaa474438 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -6,8 +6,8 @@
base_icon_state = "scanner"
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 50
- active_power_usage = 300
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MEDIUM
occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/brain)
circuit = /obj/item/circuitboard/machine/dnascanner
var/locked = FALSE
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 6bb5a4bab561..121c93a07353 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -958,7 +958,7 @@
to_chat(user, "You need at least 2 metal sheets to reinforce [src].")
return
to_chat(user, "You start reinforcing [src].")
- if(do_after(user, 20, TRUE, src))
+ if(do_after(user, 20, src))
if(!panel_open || !S.use(2))
return
user.visible_message("[user] reinforces \the [src] with metal.",
@@ -972,7 +972,7 @@
to_chat(user, "You need at least 2 plasteel sheets to reinforce [src].")
return
to_chat(user, "You start reinforcing [src].")
- if(do_after(user, 20, TRUE, src))
+ if(do_after(user, 20, src))
if(!panel_open || !S.use(2))
return
user.visible_message("[user] reinforces \the [src] with plasteel.",
@@ -1226,7 +1226,7 @@
var/time_to_open = 50
playsound(src, pry_sound, 100, TRUE, mono_adj = TRUE) //is it aliens or just the CE being a dick?
prying_so_hard = TRUE
- if(do_after(user, time_to_open, TRUE, src))
+ if(do_after(user, time_to_open, src))
open(2)
if(density && !open(2))
to_chat(user, "Despite your attempts, [src] refuses to open.")
@@ -1414,7 +1414,7 @@
playsound(src, 'sound/machines/creaking.ogg', 100, TRUE, mono_adj = TRUE)
- if(do_after(user, time_to_open, TRUE, src))
+ if(do_after(user, time_to_open, src))
if(density && !open(2)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!)
to_chat(user, "Despite your efforts, [src] managed to resist your attempts to open it!")
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 8e0ed982b501..492ce30f6ac4 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -264,17 +264,7 @@
opacity = FALSE
glass = TRUE
-/obj/machinery/door/airlock/bananium
- name = "bananium airlock"
- desc = "Honkhonkhonk"
- icon = 'icons/obj/doors/airlocks/station/bananium.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_bananium
- doorOpen = 'sound/items/bikehorn.ogg'
- has_hatch = FALSE
-/obj/machinery/door/airlock/bananium/glass
- opacity = FALSE
- glass = TRUE
/obj/machinery/door/airlock/sandstone
name = "sandstone airlock"
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 8dbc880f740a..eb23f1060be3 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -1,7 +1,7 @@
/obj/machinery/door
name = "door"
desc = "It opens and closes."
- icon = 'icons/obj/doors/Doorint.dmi'
+ icon = 'icons/obj/doors/doorf.dmi'
icon_state = "door1"
base_icon_state = "door"
opacity = TRUE
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index 4e846c26f14a..7e3febcc482c 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -23,26 +23,32 @@
/obj/machinery/door/poddoor/attackby(obj/item/W, mob/user, params)
. = ..()
if((resistance_flags & INDESTRUCTIBLE) && W.tool_behaviour == TOOL_SCREWDRIVER) // This makes it so ERT members cannot cheese by opening their blast doors.
- to_chat(user, "You can't find the panel!")
+ to_chat(user, span_warning("You can't find the panel!"))
return
if(W.tool_behaviour == TOOL_SCREWDRIVER)
if(density)
- to_chat(user, "You need to open [src] to access the maintenance panel!")
+ to_chat(user, span_warning("You need to open [src] to access the maintenance panel"))
return
else if(default_deconstruction_screwdriver(user, icon_state, icon_state, W))
- to_chat(user, "You [panel_open ? "open" : "close"] the maintenance hatch of [src].")
+ to_chat(user, span_notice("You [panel_open ? "open" : "close"] the maintenance hatch of [src]."))
return TRUE
if(panel_open && !density)
if(W.tool_behaviour == TOOL_MULTITOOL)
- var/change_id = input("Set [src]'s ID. It must be a number between 1 and 100.", "ID", id) as num|null
- if(change_id)
- id = clamp(round(change_id, 1), 1, 100)
- to_chat(user, "You change the ID to [id].")
+ var/obj/item/multitool/multi = W
+ if (istype(multi.buffer,/obj/item/assembly/control))
+ var/obj/item/assembly/control/controller = multi.buffer
+ id = controller.id
+ to_chat(user, span_notice("You copy the ID in your multitool's buffer into the [src]."))
+ else
+ var/change_id = input("Set [src]'s ID. It must be a number between 1 and 100.", "ID", id) as num|null
+ if(change_id)
+ id = clamp(round(change_id, 1), 1, 100)
+ to_chat(user, span_notice("You change the ID to [id]."))
if(W.tool_behaviour == TOOL_CROWBAR)
- to_chat(user, "You start to remove the airlock electronics.")
+ to_chat(user, span_notice("You start to remove the airlock electronics."))
if(!(machine_stat & NOPOWER))
do_sparks(5, TRUE, src)
electrocute_mob(user, get_area(src), src, 1, TRUE) //fuck this fella
@@ -52,9 +58,9 @@
/obj/machinery/door/poddoor/examine(mob/user)
. = ..()
- . += "The maintenance panel is [panel_open ? "opened" : "closed"]."
+ . += span_notice("The maintenance panel is [panel_open ? "opened" : "closed"].")
if(panel_open)
- . += "The airlock electronics are exposed and could be pried out."
+ . += span_notice("The airlock electronics are exposed and could be pried out.")
/obj/machinery/door/poddoor/deconstruct(disassembled = TRUE, mob/user)
if(!(flags_1 & NODECONSTRUCT_1))
@@ -142,18 +148,18 @@
/obj/machinery/door/poddoor/attack_alien(mob/living/carbon/alien/humanoid/user)
if(density & !(resistance_flags & INDESTRUCTIBLE))
add_fingerprint(user)
- user.visible_message("[user] begins prying open [src].",\
- "You begin digging your claws into [src] with all your might!",\
- "You hear groaning metal...")
+ user.visible_message(span_warning("[user] begins prying open [src]."),\
+ span_noticealien("You begin digging your claws into [src] with all your might"),\
+ span_warning("You hear groaning metal..."))
playsound(src, 'sound/machines/creaking.ogg', 100, TRUE)
var/time_to_open = 5 SECONDS
if(hasPower())
time_to_open = 15 SECONDS
- if(do_after(user, time_to_open, TRUE, src))
+ if(do_after(user, time_to_open, src))
if(density && !open(TRUE)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!)
- to_chat(user, "Despite your efforts, [src] managed to resist your attempts to open it!")
+ to_chat(user, span_warning("Despite your efforts, [src] managed to resist your attempts to open it!"))
else
return ..()
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 0b538d1ce109..25da902ea3f5 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -6,6 +6,8 @@
icon = 'icons/obj/machines/research.dmi'
base_icon_state = "tdoppler"
density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_LOW
verb_say = "states coldly"
var/cooldown = 10
var/next_announce = 0
@@ -233,11 +235,9 @@
var/old_tech_largest_bomb_value = linked_techweb.largest_bomb_value //held so we can pull old before we do math
linked_techweb.largest_bomb_value = point_gain
point_gain -= old_tech_largest_bomb_value
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_SCI)
- if(D)
- D.adjust_money(point_gain)
- linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, point_gain)
- say("Explosion details and mixture analyzed and sold to the highest bidder for [point_gain] cr, with a reward of [point_gain] points.")
+ new /obj/item/spacecash(get_dumping_location(), point_gain)
+ linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, point_gain)
+ say("Explosion details and mixture analyzed and sold to the highest bidder for [point_gain] cr, with a reward of [point_gain] points.")
else //you've made smaller bombs
say("Data already captured. Aborting.")
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
index d54bc3c476af..4603044ab285 100644
--- a/code/game/machinery/droneDispenser.dm
+++ b/code/game/machinery/droneDispenser.dm
@@ -9,6 +9,8 @@
icon = 'icons/obj/machines/droneDispenser.dmi'
icon_state = "on"
density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_LOW
max_integrity = 250
integrity_failure = 0.33
@@ -109,12 +111,12 @@
/obj/machinery/droneDispenser/swarmer
name = "swarmer fabricator"
desc = "An alien machine of unknown origin. It whirs and hums with green-blue light, the air above it shimmering."
- icon = 'icons/obj/machines/gateway.dmi'
- icon_state = "toffcenter"
- icon_off = "toffcenter"
- icon_on = "toffcenter"
- icon_recharging = "toffcenter"
- icon_creating = "offcenter"
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "hivebot_fab"
+ icon_off = "hivebot_fab"
+ icon_on = "hivebot_fab"
+ icon_recharging = "hivebot_fab"
+ icon_creating = "hivebot_fab_on"
metal_cost = 0
glass_cost = 0
cooldownTime = 300 //30 seconds
diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm
index 9d190b2e1369..34d4bb320c46 100644
--- a/code/game/machinery/embedded_controller/access_controller.dm
+++ b/code/game/machinery/embedded_controller/access_controller.dm
@@ -7,8 +7,8 @@
/obj/machinery/doorButtons
power_channel = AREA_USAGE_ENVIRON
use_power = IDLE_POWER_USE
- idle_power_usage = 2
- active_power_usage = 4
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/idSelf
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index faceb46419d5..6cbd6eaed278 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -23,8 +23,8 @@
integrity_failure = 0.4
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30)
use_power = IDLE_POWER_USE
- idle_power_usage = 2
- active_power_usage = 6
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
power_channel = AREA_USAGE_ENVIRON
resistance_flags = FIRE_PROOF
diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm
index 8833a20d90c4..81c422ea31fa 100644
--- a/code/game/machinery/gulag_item_reclaimer.dm
+++ b/code/game/machinery/gulag_item_reclaimer.dm
@@ -6,8 +6,8 @@
req_access = list(ACCESS_SECURITY) //REQACCESS TO ACCESS ALL STORED ITEMS
density = FALSE
use_power = IDLE_POWER_USE
- idle_power_usage = 100
- active_power_usage = 2500
+ idle_power_usage = IDLE_DRAW_LOW
+ active_power_usage = IDLE_DRAW_MEDIUM
var/list/stored_items = list()
var/obj/machinery/gulag_teleporter/linked_teleporter = null
diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm
index e147e24717ca..3632c204f36b 100644
--- a/code/game/machinery/gulag_teleporter.dm
+++ b/code/game/machinery/gulag_teleporter.dm
@@ -15,8 +15,8 @@ The console is located at computer/gulag_teleporter.dm
state_open = FALSE
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 200
- active_power_usage = 5000
+ idle_power_usage = IDLE_DRAW_LOW
+ active_power_usage = ACTIVE_DRAW_EXTREME
circuit = /obj/item/circuitboard/machine/gulag_teleporter
var/locked = FALSE
var/message_cooldown
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index 9cf4470cab5c..1b0093458e49 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -2,12 +2,14 @@
name = "organ harvester"
desc = "An advanced machine used for harvesting organs and limbs from the deceased."
density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_LOW
icon = 'icons/obj/machines/harvester.dmi'
icon_state = "harvester"
base_icon_state = "harvester"
verb_say = "states"
state_open = FALSE
- idle_power_usage = 50
+ idle_power_usage = IDLE_DRAW_MINIMAL
circuit = /obj/item/circuitboard/machine/harvester
light_color = LIGHT_COLOR_BLUE
var/interval = 20
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 4a31d650f9a1..60ded054842a 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -36,8 +36,8 @@ Possible to do for anyone motivated enough:
plane = FLOOR_PLANE
req_access = list(ACCESS_KEYCARD_AUTH) //Used to allow for forced connecting to other (not secure) holopads. Anyone can make a call, though.
use_power = IDLE_POWER_USE
- idle_power_usage = 5
- active_power_usage = 100
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MEDIUM
max_integrity = 300
armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
circuit = /obj/item/circuitboard/machine/holopad
@@ -78,6 +78,8 @@ Possible to do for anyone motivated enough:
var/secure = FALSE
/// If we are currently calling another holopad
var/calling = FALSE
+ /// The last holopad that called this one.
+ var/caller_history
/obj/machinery/holopad/Initialize()
. = ..()
@@ -178,7 +180,9 @@ 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."
+ . += span_notice("The status display reads: Current projection range: [holo_range] units.")
+ if(caller_history)
+ . += span_notice("The caller history displays the last recieved call to be from: [caller_history].")
/obj/machinery/holopad/attackby(obj/item/P, mob/user, params)
if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P))
@@ -195,11 +199,11 @@ Possible to do for anyone motivated enough:
if(istype(P,/obj/item/disk/holodisk))
if(disk)
- to_chat(user,"There's already a disk inside [src]!")
+ to_chat(user,span_warning("There's already a disk inside [src]!"))
return
if (!user.transferItemToLoc(P,src))
return
- to_chat(user,"You insert [P] into [src].")
+ to_chat(user,span_notice("You insert [P] into [src]."))
disk = P
return
@@ -249,15 +253,15 @@ Possible to do for anyone motivated enough:
if("AIrequest")
if(last_request + 200 < world.time)
last_request = world.time
- to_chat(usr, "You requested an AI's presence.")
+ to_chat(usr, span_info("You requested an AI's presence."))
var/area/area = get_area(src)
for(var/mob/living/silicon/ai/AI in GLOB.silicon_mobs)
if(!AI.client)
continue
- to_chat(AI, "Your presence is requested at \the [area].")
+ to_chat(AI, span_info("Your presence is requested at \the [area]."))
return TRUE
else
- to_chat(usr, "A request for AI presence was already sent recently.")
+ to_chat(usr, span_info("A request for AI presence was already sent recently."))
return
if("holocall")
if(outgoing_call)
@@ -280,7 +284,7 @@ Possible to do for anyone motivated enough:
calling = TRUE
return TRUE
else
- to_chat(usr, "You must stand on the holopad to make a call!")
+ to_chat(usr, span_warning("You must stand on the holopad to make a call!"))
if("connectcall")
var/datum/holocall/call_to_connect = locate(params["holopad"]) in holo_calls
if(!QDELETED(call_to_connect))
@@ -374,6 +378,7 @@ Possible to do for anyone motivated enough:
for(var/I in holo_calls)
var/datum/holocall/HC = I
if(HC.connected_holopad != src)
+ caller_history = get_area_name(HC.calling_holopad)
if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2)))
HC.Answer(src)
break
@@ -392,7 +397,7 @@ Possible to do for anyone motivated enough:
if(is_operational && (!AI || AI.eyeobj.loc == loc))//If the projector has power and client eye is on it
if (AI && istype(AI.current, /obj/machinery/holopad))
- to_chat(user, "ERROR: \black Image feed in progress.")
+ to_chat(user, span_danger("ERROR: \black Image feed in progress."))
return
var/obj/effect/overlay/holo_pad_hologram/Hologram = new(loc)//Spawn a blank effect at the location.
@@ -415,11 +420,11 @@ Possible to do for anyone motivated enough:
move_hologram(user, loc)
set_holo(user, Hologram)
- visible_message("A holographic image of [user] flickers to life before your eyes!")
+ visible_message(span_notice("A holographic image of [user] flickers to life before your eyes!"))
return Hologram
else
- to_chat(user, "ERROR: Unable to project hologram.")
+ to_chat(user, span_danger("ERROR:Unable to project hologram."))
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
@@ -446,8 +451,11 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/holopad/proc/SetLightsAndPower()
var/total_users = LAZYLEN(masters) + LAZYLEN(holo_calls)
- use_power = total_users > 0 ? ACTIVE_POWER_USE : IDLE_POWER_USE
- active_power_usage = HOLOPAD_PASSIVE_POWER_USAGE + (HOLOGRAM_POWER_USAGE * total_users)
+ if(total_users > 0)
+ set_active_power()
+ else
+ set_idle_power()
+ active_power_usage = initial(active_power_usage) * total_users
if(total_users || replay_mode)
set_light(2)
else
@@ -580,7 +588,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
Hologram.set_anchored(TRUE)//So space wind cannot drag it.
Hologram.name = "[record.caller_name] (Hologram)"//If someone decides to right click.
Hologram.set_light(2) //hologram lighting
- visible_message("A holographic image of [record.caller_name] flickers to life before your eyes!")
+ visible_message(span_notice("A holographic image of [record.caller_name] flickers to life before your eyes!"))
return Hologram
/obj/machinery/holopad/proc/replay_start()
diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm
index b31dd9925375..e14756815bb2 100644
--- a/code/game/machinery/hypnochair.dm
+++ b/code/game/machinery/hypnochair.dm
@@ -6,6 +6,8 @@
base_icon_state = "hypnochair"
circuit = /obj/item/circuitboard/machine/hypnochair
density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_LOW
opacity = FALSE
var/mob/living/carbon/victim = null ///Keeps track of the victim to apply effects if it teleports away
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 8117ad2c251a..c82d67a9df62 100644
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -6,8 +6,8 @@
base_icon_state = "igniter"
plane = FLOOR_PLANE
use_power = IDLE_POWER_USE
- idle_power_usage = 2
- active_power_usage = 4
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_LOW
max_integrity = 300
armor = list("melee" = 50, "bullet" = 30, "laser" = 70, "energy" = 50, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
resistance_flags = FIRE_PROOF
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index c7752a8cbfaa..c3e6bead671a 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -3,9 +3,9 @@
desc = "A bluespace pad able to thrust matter through bluespace, teleporting it to or from nearby locations."
icon = 'icons/obj/telescience.dmi'
icon_state = "lpad-idle"
- use_power = TRUE
- idle_power_usage = 200
- active_power_usage = 2500
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_LOW
+ active_power_usage = ACTIVE_DRAW_EXTREME
hud_possible = list(DIAG_LAUNCHPAD_HUD)
circuit = /obj/item/circuitboard/machine/launchpad
var/icon_teleport = "lpad-beam"
@@ -149,7 +149,7 @@
teleporting = FALSE
// use a lot of power
- use_power(1000)
+ use_power(active_power_usage)
var/turf/source = target
var/list/log_msg = list()
diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm
index dc5b41ee3821..c0f296c1ffcf 100644
--- a/code/game/machinery/limbgrower.dm
+++ b/code/game/machinery/limbgrower.dm
@@ -7,8 +7,8 @@
icon_state = "limbgrower_idleoff"
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 10
- active_power_usage = 100
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_LOW
circuit = /obj/item/circuitboard/machine/limbgrower
/// The category of limbs we're browing in our UI.
@@ -24,7 +24,7 @@
/// Our internal techweb for limbgrower designs.
var/datum/techweb/stored_research
/// All the categories of organs we can print.
- var/list/categories = list(SPECIES_HUMAN,SPECIES_LIZARD,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ETHEREAL,SPECIES_RACHNID,SPECIES_KEPORI,SPECIES_VOX,"other")
+ var/list/categories = list(SPECIES_HUMAN,SPECIES_SARATHI,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ELZUOSE,SPECIES_RACHNID,SPECIES_KEPORI,SPECIES_VOX,"other")
//yogs grower a little different because we're going to allow meats to be converted to synthflesh because hugbox
var/list/accepted_biomass = list(
/obj/item/reagent_containers/food/snacks/meat/slab/monkey = 25,
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index 4f91bea3ab7a..7316e5b42422 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -4,8 +4,8 @@
icon = 'icons/obj/stationobjs.dmi'
icon_state = "mass_driver"
use_power = IDLE_POWER_USE
- idle_power_usage = 2
- active_power_usage = 50
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MEDIUM
var/power = 1
var/code = 1
var/id = 1
diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm
index 79fb5e83bdf1..2f60c799ae23 100644
--- a/code/game/machinery/medical_kiosk.dm
+++ b/code/game/machinery/medical_kiosk.dm
@@ -18,53 +18,23 @@
base_icon_state = "kiosk"
layer = ABOVE_MOB_LAYER
density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_LOW
circuit = /obj/item/circuitboard/machine/medical_kiosk
var/obj/item/scanner_wand
- var/default_price = 15 //I'm defaulting to a low price on this, but in the future I wouldn't have an issue making it more or less expensive.
- var/active_price = 15 //Change by using a multitool on the board.
- var/pandemonium = FALSE //AKA: Emag mode.
+ /// Emag mode
+ var/pandemonium = FALSE
/// Shows whether the kiosk is being used to scan someone and what it's being used for.
var/scan_active = NONE
- /// Do we have someone paying to use this?
- var/paying_customer = FALSE //Ticked yes if passing inuse()
-
- var/datum/bank_account/account //payer's account.
- var/mob/living/carbon/human/H //The person using the console in each instance. Used for paying for the kiosk.
- var/mob/living/carbon/human/altPatient //If scanning someone else, this will be the target.
- var/obj/item/card/id/C //the account of the person using the console.
+ /// The patient that the kiosk is currently scanning.
+ var/mob/living/carbon/human/altPatient
/obj/machinery/medical_kiosk/Initialize() //loaded subtype for mapping use
. = ..()
scanner_wand = new/obj/item/scanner_wand(src)
-/obj/machinery/medical_kiosk/proc/inuse() //Verifies that the user can use the interface, followed by showing medical information.
- if (pandemonium == TRUE)
- active_price += (rand(10,30)) //The wheel of capitalism says health care ain't cheap.
- if(!istype(C))
- say("No ID card detected.") // No unidentified crew.
- return
- if(C.registered_account)
- account = C.registered_account
- else
- say("No account detected.") //No homeless crew.
- return
- if(!account.has_money(active_price))
- say("You do not possess the funds to purchase this.") //No jobless crew, either.
- return
- else
- account.adjust_money(-active_price)
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_MED)
- if(D)
- D.adjust_money(active_price)
- use_power(20)
- paying_customer = TRUE
- icon_state = "[base_icon_state]_active"
- say("Thank you for your patronage!")
- RefreshParts()
- return
-
/obj/machinery/medical_kiosk/proc/clearScans() //Called it enough times to be it's own proc
scan_active = NONE
update_appearance()
@@ -85,12 +55,6 @@
default_unfasten_wrench(user, I, time = 10)
return TRUE
-/obj/machinery/medical_kiosk/RefreshParts()
- var/obj/item/circuitboard/machine/medical_kiosk/board = circuit
- if(board)
- active_price = board.custom_cost
- return
-
/obj/machinery/medical_kiosk/attackby(obj/item/O, mob/user, params)
if(default_deconstruction_screwdriver(user, "[base_icon_state]_open", "[base_icon_state]_off", O))
return
@@ -135,7 +99,7 @@
scanner_wand = null
/obj/machinery/medical_kiosk/Destroy()
- qdel(scanner_wand)
+ QDEL_NULL(scanner_wand)
return ..()
/obj/machinery/medical_kiosk/emag_act(mob/user)
@@ -179,8 +143,6 @@
ui.open()
icon_state = "[base_icon_state]_active"
RefreshParts()
- H = user
- C = H.get_idcard(TRUE)
/obj/machinery/medical_kiosk/ui_data(mob/living/carbon/human/user)
var/list/data = list()
@@ -210,7 +172,7 @@
sickness_data = "\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]"
if(altPatient.has_dna()) //Blood levels Information
- if(altPatient.bleed_rate)
+ if(LAZYLEN(altPatient.get_bleeding_parts()))
bleed_status = "Patient is currently bleeding!"
if(blood_percent <= 80)
blood_warning = " Patient has low blood levels. Seek a large meal, or iron supplements."
@@ -299,7 +261,6 @@
else if (user.hallucinating())
chaos_modifier = 0.3
- data["kiosk_cost"] = active_price + (chaos_modifier * (rand(1,25)))
data["patient_name"] = patient_name
data["patient_health"] = round(((total_health - (chaos_modifier * (rand(1,50)))) / max_health) * 100, 0.001)
data["brute_health"] = round(brute_loss+(chaos_modifier * (rand(1,30))),0.001) //To break this down for easy reading, all health values are rounded to the .001 place
@@ -338,29 +299,13 @@
switch(action)
if("beginScan_1")
- if(!(scan_active & KIOSK_SCANNING_GENERAL))
- inuse()
- if(paying_customer == TRUE)
- scan_active |= KIOSK_SCANNING_GENERAL
- paying_customer = FALSE
+ scan_active |= KIOSK_SCANNING_GENERAL
if("beginScan_2")
- if(!(scan_active & KIOSK_SCANNING_SYMPTOMS))
- inuse()
- if(paying_customer == TRUE)
- scan_active |= KIOSK_SCANNING_SYMPTOMS
- paying_customer = FALSE
+ scan_active |= KIOSK_SCANNING_SYMPTOMS
if("beginScan_3")
- if(!(scan_active & KIOSK_SCANNING_NEURORAD))
- inuse()
- if(paying_customer == TRUE)
- scan_active |= KIOSK_SCANNING_NEURORAD
- paying_customer = FALSE
+ scan_active |= KIOSK_SCANNING_NEURORAD
if("beginScan_4")
- if(!(scan_active & KIOSK_SCANNING_REAGENTS))
- inuse()
- if(paying_customer == TRUE)
- scan_active |= KIOSK_SCANNING_REAGENTS
- paying_customer = FALSE
+ scan_active |= KIOSK_SCANNING_REAGENTS
if("clearTarget")
altPatient = null
clearScans()
diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm
index 4dac48d6cfd4..ceb0ed389c17 100644
--- a/code/game/machinery/medipen_refiller.dm
+++ b/code/game/machinery/medipen_refiller.dm
@@ -5,7 +5,7 @@
icon_state = "medipen_refiller"
density = TRUE
circuit = /obj/item/circuitboard/machine/medipen_refiller
- idle_power_usage = 100
+ idle_power_usage = IDLE_DRAW_LOW
/// list of medipen subtypes it can refill
var/list/allowed = list(
/obj/item/reagent_containers/hypospray/medipen = /datum/reagent/medicine/epinephrine,
@@ -67,7 +67,7 @@
return
..()
-/obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
+/obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/P, mob/living/user)
to_chat(user, "You start furiously plunging [name].")
if(do_after(user, 30, target = src))
to_chat(user, "You finish plunging the [name].")
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index a847b44d39a1..b54c192f4407 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -49,7 +49,7 @@
if(previous_virtual_z)
LAZYREMOVEASSOC(GLOB.navbeacons, "[previous_virtual_z]", src)
if(new_virtual_z)
- LAZYADDASSOC(GLOB.navbeacons, "[new_virtual_z]", src)
+ LAZYADDASSOCLIST(GLOB.navbeacons, "[new_virtual_z]", src)
..()
// set the transponder codes assoc list from codes_txt
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 75498600b007..5891898ef6dc 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -33,8 +33,8 @@ DEFINE_BITFIELD(turret_flags, list(
density = TRUE
desc = "A covered turret that shoots at its enemies."
use_power = IDLE_POWER_USE //this turret uses and requires power
- idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power
- active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power
+ idle_power_usage = IDLE_DRAW_MINIMAL //when inactive, this turret takes up constant 50 Equipment power
+ active_power_usage = ACTIVE_DRAW_LOW //when active, this turret takes up constant 300 Equipment power
req_access = list(ACCESS_SECURITY) /// Only people with Security access
power_channel = AREA_USAGE_EQUIP //drains power from the EQUIPMENT channel
max_integrity = 160 //the turret's health
@@ -795,7 +795,7 @@ DEFINE_BITFIELD(turret_flags, list(
max_integrity = 300
always_up = 1
use_power = ACTIVE_POWER_USE
- active_power_usage = 300
+ active_power_usage = ACTIVE_DRAW_MINIMAL
has_cover = 0
scan_range = 9
stun_projectile = /obj/projectile/beam/disabler
diff --git a/code/game/machinery/prisonlabor.dm b/code/game/machinery/prisonlabor.dm
index 6fe329ed4a71..76612018d87a 100644
--- a/code/game/machinery/prisonlabor.dm
+++ b/code/game/machinery/prisonlabor.dm
@@ -4,8 +4,8 @@
icon = 'icons/obj/machines/prison.dmi'
icon_state = "offline"
use_power = IDLE_POWER_USE
- idle_power_usage = 2
- active_power_usage = 50
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_LOW
var/obj/item/stack/license_plates/empty/current_plate
var/pressing = FALSE
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index cc9f8f6d3d59..7d0455ab82f0 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -4,8 +4,8 @@
icon = 'icons/obj/telescience.dmi'
icon_state = "qpad-idle"
use_power = IDLE_POWER_USE
- idle_power_usage = 200
- active_power_usage = 5000
+ idle_power_usage = IDLE_DRAW_LOW
+ active_power_usage = ACTIVE_DRAW_EXTREME
obj_flags = CAN_BE_HIT | UNIQUE_RENAME
circuit = /obj/item/circuitboard/machine/quantumpad
var/teleport_cooldown = 400 //30 seconds base due to base parts
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index c604b3eeccf6..b0e030206a0f 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -5,8 +5,8 @@
base_icon_state = "recharger"
desc = "A charging dock for energy based weaponry."
use_power = IDLE_POWER_USE
- idle_power_usage = 4
- active_power_usage = 250
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_LOW
circuit = /obj/item/circuitboard/machine/recharger
pass_flags = PASSTABLE
var/obj/item/charging = null
@@ -21,6 +21,7 @@
/obj/item/ammo_box/magazine/recharge,
/obj/item/modular_computer,
/obj/item/gun/ballistic/automatic/powered,
+ /obj/item/gun/ballistic/automatic/assault/e40,
))
/obj/machinery/recharger/RefreshParts()
@@ -50,11 +51,11 @@
if (new_charging)
START_PROCESSING(SSmachines, src)
finished_recharging = FALSE
- use_power = ACTIVE_POWER_USE
+ set_active_power()
using_power = TRUE
update_appearance()
else
- use_power = IDLE_POWER_USE
+ set_idle_power()
using_power = FALSE
update_appearance()
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 7039b015e673..cedf6c0a56ff 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -1,12 +1,12 @@
/obj/machinery/recharge_station
name = "cyborg recharging station"
desc = "This device recharges cyborgs and resupplies them with materials."
- icon = 'icons/obj/objects.dmi'
+ icon = 'icons/obj/machines/borgcharger.dmi'
icon_state = "borgcharger0"
density = FALSE
use_power = IDLE_POWER_USE
- idle_power_usage = 5
- active_power_usage = 1000
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MEDIUM
req_access = list(ACCESS_ROBOTICS)
state_open = TRUE
circuit = /obj/item/circuitboard/machine/cyborgrecharger
@@ -90,12 +90,12 @@
/obj/machinery/recharge_station/open_machine()
. = ..()
- use_power = IDLE_POWER_USE
+ set_idle_power()
/obj/machinery/recharge_station/close_machine()
. = ..()
if(occupant)
- use_power = ACTIVE_POWER_USE //It always tries to charge, even if it can't.
+ set_active_power() //It always tries to charge, even if it can't.
add_fingerprint(occupant)
/obj/machinery/recharge_station/update_icon_state()
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index b548ecf73125..82265e244448 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -7,6 +7,8 @@
icon_state = "grinder-o0"
layer = ABOVE_ALL_MOB_LAYER // Overhead
density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_LOW
circuit = /obj/item/circuitboard/machine/recycler
var/safety_mode = FALSE // Temporarily stops machine if it detects a mob
var/icon_name = "grinder-o"
@@ -19,7 +21,7 @@
/obj/machinery/recycler/Initialize()
AddComponent(/datum/component/butchering/recycler, 1, amount_produced,amount_produced/5)
- AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/plasma, /datum/material/gold, /datum/material/diamond, /datum/material/plastic, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace), INFINITY, FALSE, null, null, null, TRUE)
+ AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/plasma, /datum/material/gold, /datum/material/diamond, /datum/material/plastic, /datum/material/uranium, /datum/material/hellstone, /datum/material/titanium, /datum/material/bluespace), INFINITY, FALSE, null, null, null, TRUE)
. = ..()
update_appearance()
req_one_access = get_all_accesses() + get_all_centcom_access()
diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm
index c9e1d108c1e5..351f1c42ae5e 100644
--- a/code/game/machinery/roulette_machine.dm
+++ b/code/game/machinery/roulette_machine.dm
@@ -26,8 +26,8 @@
density = TRUE
use_power = IDLE_POWER_USE
anchored = FALSE
- idle_power_usage = 10
- active_power_usage = 100
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
max_integrity = 500
armor = list("melee" = 45, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 10, "bio" = 30, "rad" = 30, "fire" = 30, "acid" = 30)
var/static/list/numbers = list("0" = "green", "1" = "red", "3" = "red", "5" = "red", "7" = "red", "9" = "red", "12" = "red", "14" = "red", "16" = "red",\
diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scan_gate.dm
index afc154a0c95a..cf83233598aa 100644
--- a/code/game/machinery/scan_gate.dm
+++ b/code/game/machinery/scan_gate.dm
@@ -6,6 +6,7 @@
#define SCANGATE_WANTED "Wanted"
#define SCANGATE_SPECIES "Species"
+//god why cant this use the normal species defines
#define SCANGATE_HUMAN "human"
#define SCANGATE_LIZARD "lizard"
#define SCANGATE_FLY "fly"
@@ -17,7 +18,7 @@
#define SCANGATE_SPIDER "rachnid"
#define SCANGATE_IPC "ipc"
#define SCANGATE_SQUID "squid"
-#define SCANGATE_ETHEREAL "ethereal"
+#define SCANGATE_ELZUOSE "elzuose"
#define SCANGATE_KEPORI "kepori"
/obj/machinery/scanner_gate
@@ -26,7 +27,7 @@
icon = 'icons/obj/machines/scangate.dmi'
icon_state = "scangate"
use_power = IDLE_POWER_USE
- idle_power_usage = 50
+ idle_power_usage = IDLE_DRAW_LOW
circuit = /obj/item/circuitboard/machine/scanner_gate
var/scanline_timer
@@ -146,8 +147,8 @@
scan_species = /datum/species/spider
if(SCANGATE_IPC)
scan_species = /datum/species/ipc
- if(SCANGATE_ETHEREAL)
- scan_species = /datum/species/ethereal
+ if(SCANGATE_ELZUOSE)
+ scan_species = /datum/species/elzuose
if(SCANGATE_KEPORI)
scan_species = /datum/species/kepori
if(is_species(H, scan_species))
@@ -247,5 +248,5 @@
#undef SCANGATE_SPIDER
#undef SCANGATE_IPC
#undef SCANGATE_SQUID
-#undef SCANGATE_ETHEREAL
+#undef SCANGATE_ELZUOSE
#undef SCANGATE_KEPORI
diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm
index 569bfa4b6f9e..ec9f0f5ff5a3 100644
--- a/code/game/machinery/sheetifier.dm
+++ b/code/game/machinery/sheetifier.dm
@@ -5,8 +5,8 @@
icon_state = "base_machine"
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 10
- active_power_usage = 100
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_LOW
circuit = /obj/item/circuitboard/machine/sheetifier
layer = BELOW_OBJ_LAYER
var/busy_processing = FALSE
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index bc578a856300..df865aee82e5 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -122,25 +122,23 @@
if(.)
return
if(locked && !issilicon(user))
- to_chat(user, "The machine is locked, you are unable to use it!")
+ to_chat(user, span_notice("The machine is locked, you are unable to use it!"))
return
if(panel_open)
- to_chat(user, "The panel must be closed before operating this machine!")
+ to_chat(user, span_warning("The panel must be closed before operating this machine!"))
return
if (active)
- user.visible_message("[user] deactivated \the [src].", \
- "You deactivate \the [src].", \
- "You hear heavy droning fade out.")
+ user.visible_message(span_notice("[user] deactivated \the [src]."), span_notice("You deactivate \the [src]."), span_hear("You hear heavy droning fade out"))
shields_down()
else
if(anchored)
- user.visible_message("[user] activated \the [src].", \
- "You activate \the [src].", \
- "You hear heavy droning.")
+ user.visible_message(span_notice("[user] activated \the [src]."), \
+ span_notice("You activate \the [src]."), \
+ span_hear("You hear heavy droning."))
shields_up()
else
- to_chat(user, "The device must first be secured to the floor!")
+ to_chat(user, span_warning("The device must first be secured to the floor!"))
return
/obj/machinery/shieldgen/attackby(obj/item/W, mob/user, params)
@@ -148,60 +146,60 @@
W.play_tool_sound(src, 100)
panel_open = !panel_open
if(panel_open)
- to_chat(user, "You open the panel and expose the wiring.")
+ to_chat(user, span_notice("You open the panel and expose the wiring."))
else
- to_chat(user, "You close the panel.")
+ to_chat(user, span_notice("You close the panel."))
else if(istype(W, /obj/item/stack/cable_coil) && (machine_stat & BROKEN) && panel_open)
var/obj/item/stack/cable_coil/coil = W
if (coil.get_amount() < 1)
- to_chat(user, "You need one length of cable to repair [src]!")
+ to_chat(user, span_warning("You need one length of cable to repair [src]!"))
return
- to_chat(user, "You begin to replace the wires...")
+ to_chat(user, span_notice("You begin to replace the wires..."))
if(do_after(user, 30, target = src))
if(coil.get_amount() < 1)
return
coil.use(1)
obj_integrity = max_integrity
set_machine_stat(machine_stat & ~BROKEN)
- to_chat(user, "You repair \the [src].")
+ to_chat(user, span_notice("You repair \the [src]."))
update_appearance()
else if(W.tool_behaviour == TOOL_WRENCH)
if(locked)
- to_chat(user, "The bolts are covered! Unlocking this would retract the covers.")
+ to_chat(user, span_warning("The bolts are covered! Unlocking this would retract the covers."))
return
if(!anchored && !isinspace())
W.play_tool_sound(src, 100)
- to_chat(user, "You secure \the [src] to the floor!")
+ to_chat(user, span_notice("You secure \the [src] to the floor!"))
set_anchored(TRUE)
else if(anchored)
W.play_tool_sound(src, 100)
- to_chat(user, "You unsecure \the [src] from the floor!")
+ to_chat(user, span_notice("You unsecure \the [src] from the floor!"))
if(active)
- to_chat(user, "\The [src] shuts off!")
+ to_chat(user, span_notice("\The [src] shuts off!"))
shields_down()
set_anchored(FALSE)
else if(W.GetID())
if(allowed(user) && !(obj_flags & EMAGGED))
locked = !locked
- to_chat(user, "You [locked ? "lock" : "unlock"] the controls.")
+ to_chat(user, span_notice("You [locked ? "lock" : "unlock"] the controls."))
else if(obj_flags & EMAGGED)
- to_chat(user, "Error, access controller damaged!")
+ to_chat(user, span_danger("Error, access controller damaged!"))
else
- to_chat(user, "Access denied.")
+ to_chat(user, span_danger("Access denied."))
else
return ..()
/obj/machinery/shieldgen/emag_act(mob/user)
if(obj_flags & EMAGGED)
- to_chat(user, "The access controller is damaged!")
+ to_chat(user, span_warning("The access controller is damaged!"))
return
obj_flags |= EMAGGED
locked = FALSE
playsound(src, "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- to_chat(user, "You short out the access controller.")
+ to_chat(user, span_warning("You short out the access controller."))
/obj/machinery/shieldgen/update_icon_state()
icon_state = "shield[active ? "on" : "off"][(machine_stat & BROKEN) ? "br" : null]"
@@ -219,8 +217,8 @@
req_access = list(ACCESS_TELEPORTER)
flags_1 = CONDUCT_1
use_power = NO_POWER_USE
- idle_power_usage = 10
- active_power_usage = 50
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_HIGH
circuit = /obj/item/circuitboard/machine/shieldwallgen
max_integrity = 300
var/active = FALSE
@@ -275,9 +273,7 @@
if(!active_power_usage || surplus() >= active_power_usage)
add_load(active_power_usage)
else
- visible_message("The [src.name] shuts down due to lack of power!", \
- "If this message is ever seen, something is wrong.",
- "You hear heavy droning fade out.")
+ visible_message(span_danger("The [src.name] shuts down due to lack of power!"), "If this message is ever seen, something is wrong.",span_hear("You hear heavy droning fade out."))
active = FALSE
log_game("[src] deactivated due to lack of power at [AREACOORD(src)]")
for(var/direction in GLOB.cardinals)
@@ -348,7 +344,7 @@
/obj/machinery/power/shieldwallgen/can_be_unfasten_wrench(mob/user, silent)
if(active)
if(!silent)
- to_chat(user, "Turn off the shield generator first!")
+ to_chat(user, span_warning("Turn off the shield generator first!"))
return FAILED_UNFASTEN
return ..()
@@ -388,11 +384,11 @@
if(item.GetID())
if(allowed(user) && !(obj_flags & EMAGGED))
locked = !locked
- to_chat(user, "You [src.locked ? "lock" : "unlock"] the controls.")
+ to_chat(user, span_notice("You [src.locked ? "lock" : "unlock"] the controls."))
else if(obj_flags & EMAGGED)
- to_chat(user, "Error, access controller damaged!")
+ to_chat(user, span_danger("Error, access controller damaged!"))
else
- to_chat(user, "Access denied.")
+ to_chat(user, span_danger("Access denied."))
else
add_fingerprint(user)
@@ -406,25 +402,23 @@
shock(user,50)
return
if(!anchored)
- to_chat(user, "\The [src] needs to be firmly secured to the floor first!")
+ to_chat(user, span_warning("\The [src] needs to be firmly secured to the floor first!"))
return
if(locked && !issilicon(user))
- to_chat(user, "The controls are locked!")
+ to_chat(user, span_warning("The controls are locked!"))
return
if(!powernet)
- to_chat(user, "\The [src] needs to be powered by a wire!")
+ to_chat(user, span_warning("\The [src] needs to be powered by a wire!"))
return
if(active)
- user.visible_message("[user] turned \the [src] off.", \
- "You turn off \the [src].", \
- "You hear heavy droning fade out.")
+ user.visible_message(span_notice("[user] turned \the [src] off."), \
+ span_notice("You turn off \the [src]."), \
+ span_hear("You hear heavy droning fade out."))
active = FALSE
log_game("[src] was deactivated by [key_name(user)] at [AREACOORD(src)]")
else
- user.visible_message("[user] turned \the [src] on.", \
- "You turn on \the [src].", \
- "You hear heavy droning.")
+ user.visible_message(span_notice("[user] turned \the [src] on."), span_notice("ou turn on \the [src]."), span_hear("ou hear heavy droning."))
active = ACTIVE_SETUPFIELDS
log_game("[src] was activated by [key_name(user)] at [AREACOORD(src)]")
add_fingerprint(user)
@@ -435,28 +429,28 @@
if(!powernet)
return
if(active)
- visible_message("The [src.name] hums as it powers down.", \
+ visible_message(span_notice("The [src.name] hums as it powers down."), \
"If this message is ever seen, something is wrong.", \
- "You hear heavy droning fade out.")
+ span_notice("You hear heavy droning fade out."))
playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, frequency = 6120)
active = FALSE
log_game("[src] was deactivated by wire pulse at [AREACOORD(src)]")
else
- visible_message("The [src.name] beeps as it powers up.", \
+ visible_message(span_notice("The [src.name] beeps as it powers up."), \
"If this message is ever seen, something is wrong.", \
- "You hear heavy droning.")
+ span_notice("You hear heavy droning."))
playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, frequency = 6120)
active = ACTIVE_SETUPFIELDS
log_game("[src] was activated by wire pulse at [AREACOORD(src)]")
/obj/machinery/power/shieldwallgen/emag_act(mob/user)
if(obj_flags & EMAGGED)
- to_chat(user, "The access controller is damaged!")
+ to_chat(user, span_warning("The access controller is damaged!"))
return
obj_flags |= EMAGGED
locked = FALSE
playsound(src, "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- to_chat(user, "You short out the access controller.")
+ to_chat(user, span_warning("You short out the access controller."))
/obj/machinery/power/shieldwallgen/proc/shock(mob/user, prb)
if(machine_stat & (BROKEN|NOPOWER)) // unpowered, no shock
@@ -511,10 +505,31 @@
/obj/machinery/power/shieldwallgen/atmos/proc/can_be_rotated(mob/user, rotation_type)
if (anchored)
- to_chat(user, "It is fastened to the floor!")
+ to_chat(user, span_warning("It is fastened to the floor!"))
return FALSE
return TRUE
+/obj/machinery/power/shieldwallgen/atmos/attacked_by(obj/item/I, mob/living/user)
+ if(I.tool_behaviour == TOOL_MULTITOOL)
+ var/obj/item/multitool/multi = I
+ if(!panel_open && !locked)
+ if(istype(multi.buffer,/obj/item/assembly/control/shieldwallgen))
+ var/obj/item/assembly/control/shieldwallgen/controller = multi.buffer
+ to_chat(user, span_notice("You copy the ID in your multitool's buffer to the [src]."))
+ id = controller.id
+ return TRUE
+
+ else
+ to_chat(user, span_warning("The controls are locked!"))
+ return
+
+ return ..()
+
+/obj/machinery/power/shieldwallgen/atmos/multitool_act(mob/living/user, obj/item/I)
+ . = ..()
+
+
+
/// Same as in the normal shieldwallgen, but with the shieldwalls replaced with atmos shieldwalls
/obj/machinery/power/shieldwallgen/atmos/setup_field(direction)
if(!direction)
@@ -586,7 +601,7 @@
setDir(get_dir(gen_primary, gen_secondary))
if(hardshield == TRUE)
for(var/mob/living/victim in get_turf(src))
- visible_message("\The [src] is suddenly occupying the same space as \the [victim]!")
+ visible_message(span_danger("\The [src] is suddenly occupying the same space as \the [victim]!"))
victim.gib()
/obj/machinery/shieldwall/Destroy()
diff --git a/code/game/machinery/shuttle/ship_gravity.dm b/code/game/machinery/shuttle/ship_gravity.dm
new file mode 100644
index 000000000000..4f63c60d7824
--- /dev/null
+++ b/code/game/machinery/shuttle/ship_gravity.dm
@@ -0,0 +1,124 @@
+//
+// Ship Gravity Generator
+//
+
+/obj/machinery/power/ship_gravity
+ name = "gravitational generator"
+ desc = "A ship-portable gravity generator, capable of providing gravity throughout the vessel it is installed on."
+ icon = 'icons/obj/machines/ship_gravity.dmi'
+ icon_state = "shipgrav"
+ base_icon_state = "shipgrav"
+ density = TRUE
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_EXTREME
+ circuit = /obj/item/circuitboard/machine/ship_gravity
+ var/charging = FALSE
+ var/active = FALSE
+ var/charge = 0
+
+/obj/machinery/power/ship_gravity/unanchored
+ anchored = FALSE
+
+/obj/machinery/power/ship_gravity/admin
+ idle_power_usage = 0
+ active_power_usage = 0
+ active = TRUE
+
+/obj/machinery/power/ship_gravity/Initialize()
+ . = ..()
+ if(anchored)
+ connect_to_network()
+
+/obj/machinery/power/ship_gravity/process()
+ if(charging && (!active_power_usage || surplus() >= active_power_usage))
+ add_load(active_power_usage)
+ charge = min(charge+1, 5)
+ if(charge >= 5)
+ set_state(TRUE)
+ else
+ charge = max(charge-1, 0)
+ if(!charge)
+ set_state(FALSE)
+ update_appearance()
+
+/obj/machinery/power/ship_gravity/proc/set_state(toggle)
+ if(toggle == active)
+ return
+ if(toggle)
+ active = TRUE
+ playsound(src.loc, 'sound/effects/empulse.ogg', 100, TRUE)
+ visible_message(span_warning("The [src.name] finishes charging!"), blind_message = span_hear("You hear a low hum fade in."))
+ else
+ visible_message(span_danger("The [src.name] shuts down due to lack of power!"), blind_message = span_hear("You hear a low hum fade out."))
+ active = FALSE
+ log_game("[src] deactivated due to lack of power at [AREACOORD(src)]", INVESTIGATE_GRAVITY)
+ update_appearance()
+
+/obj/machinery/power/ship_gravity/update_overlays()
+ . = ..()
+ var/mutable_appearance/charge_state
+ if(active)
+ charge_state = mutable_appearance(icon, "charge_active")
+ if(charge < 5)
+ charge_state = mutable_appearance(icon, "charge_[charge]")
+ . += charge_state
+
+/obj/machinery/power/ship_gravity/examine(mob/user)
+ . = ..()
+ if(anchored)
+ . += span_info("It's secured to the floor, you can unsecure it with a wrench.")
+ else
+ . += span_info("It's currently unsecured, you can secure it with a wrench.")
+ if(in_range(user, src) || isobserver(user))
+ if(!charging && !charge)
+ . += span_info("Its status display is currently turned off.")
+ else
+ . += span_info("Its status display reads: Current charge at [charge*20]%.")
+
+/obj/machinery/power/ship_gravity/screwdriver_act(mob/living/user, obj/item/I)
+ ..()
+ if(charging || charge)
+ to_chat(user, span_notice("You cannot open the maintenance panel on [src] while it is active!"))
+ return TRUE
+ default_deconstruction_screwdriver(user, "shipgrav_o", "shipgrav", I)
+ return TRUE
+
+/obj/machinery/power/ship_gravity/wrench_act(mob/living/user, obj/item/I)
+ . =..()
+ if(active)
+ to_chat(user, span_notice("You cannot unsecure [src] while it is active!"))
+ return TRUE
+ default_unfasten_wrench(user, I)
+ return TRUE
+
+/obj/machinery/power/ship_gravity/crowbar_act(mob/living/user, obj/item/I)
+ . = ..()
+ default_deconstruction_crowbar(I)
+ return TRUE
+
+/obj/machinery/power/ship_gravity/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
+ . = ..()
+ if(. == SUCCESSFUL_UNFASTEN)
+ if(anchored)
+ connect_to_network()
+ else
+ disconnect_from_network()
+ charging = FALSE
+ set_state(FALSE)
+
+/obj/machinery/power/ship_gravity/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock)
+ . = ..()
+ port.gravgen_list |= WEAKREF(src)
+
+/obj/machinery/power/ship_gravity/interact(mob/user)
+ if(!powernet && active_power_usage)
+ to_chat(user, span_notice("[src] isn't connected to a wire!"))
+ return
+ if(panel_open)
+ return
+ charging = !charging
+ play_click_sound("switch")
+ user.visible_message(span_warning("[user] flips [src]'s power [charging ? "on" : "off"]!"), \
+ span_info("You flip [src]'s power lever, turning it [charging ? "on" : "off"]"), \
+ span_hear("You hear a heavy lever being pulled."))
+ update_appearance()
diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm
index 267c8d102918..c4fd424d4076 100644
--- a/code/game/machinery/shuttle/shuttle_engine.dm
+++ b/code/game/machinery/shuttle/shuttle_engine.dm
@@ -12,7 +12,7 @@
var/enabled = TRUE
///How much thrust this engine generates when burned fully.
var/thrust = 0
- ///I don't really know what this is but it's used a lot
+ ///Whether this engine is actively providing thrust to the ship
var/thruster_active = FALSE
/**
diff --git a/code/game/machinery/shuttle/shuttle_engine_types.dm b/code/game/machinery/shuttle/shuttle_engine_types.dm
index e5e3d812c098..de9992e106d1 100644
--- a/code/game/machinery/shuttle/shuttle_engine_types.dm
+++ b/code/game/machinery/shuttle/shuttle_engine_types.dm
@@ -29,7 +29,7 @@
if(heat_creation)
heat_engine()
var/to_use = fuel_use * (percentage / 100) * deltatime
- return resolved_heater.consume_fuel(to_use, fuel_type) / to_use * thrust //This proc returns how much was actually burned, so let's use that and multiply it by the thrust to get all the thrust we CAN give.
+ return resolved_heater.consume_fuel(to_use, fuel_type) / to_use * percentage / 100 * thrust //This proc returns how much was actually burned, so let's use that and multiply it by the thrust to get all the thrust we CAN give.
/obj/machinery/power/shuttle/engine/fueled/return_fuel()
. = ..()
diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm
index 94735ba4ab25..8578e3fb5a23 100644
--- a/code/game/machinery/shuttle/shuttle_heater.dm
+++ b/code/game/machinery/shuttle/shuttle_heater.dm
@@ -16,7 +16,7 @@
icon_state = "heater_pipe"
var/icon_state_closed = "heater_pipe"
var/icon_state_open = "heater_pipe_open"
- idle_power_usage = 50
+ idle_power_usage = IDLE_DRAW_MINIMAL
circuit = /obj/item/circuitboard/machine/shuttle/heater
density = TRUE
@@ -25,7 +25,7 @@
layer = OBJ_LAYER
showpipe = TRUE
- pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY
+ pipe_flags = PIPING_ONE_PER_TURF
var/efficiency_multiplier = 1
var/gas_capacity = 0
@@ -34,6 +34,13 @@
///The internals tank to draw from
var/obj/item/tank/fuel_tank
+/obj/machinery/atmospherics/components/unary/shuttle/heater/on_construction(obj_color, set_layer)
+ var/obj/item/circuitboard/machine/shuttle/heater/board = circuit
+ if(board)
+ piping_layer = board.pipe_layer
+ set_layer = piping_layer
+ ..()
+
/obj/machinery/atmospherics/components/unary/shuttle/heater/New()
. = ..()
SetInitDirections()
diff --git a/code/modules/power/turbine.dm b/code/game/machinery/shuttle/turbine.dm
similarity index 54%
rename from code/modules/power/turbine.dm
rename to code/game/machinery/shuttle/turbine.dm
index ba390b1cf873..7d310d37cd30 100644
--- a/code/modules/power/turbine.dm
+++ b/code/game/machinery/shuttle/turbine.dm
@@ -25,48 +25,60 @@
/obj/machinery/power/compressor
name = "compressor"
desc = "The compressor stage of a gas turbine generator."
- icon = 'icons/obj/atmospherics/pipes/simple.dmi'
+ icon = 'icons/obj/atmospherics/components/turbine.dmi'
icon_state = "compressor"
density = TRUE
resistance_flags = FIRE_PROOF
CanAtmosPass = ATMOS_PASS_DENSITY
+ use_power = NO_POWER_USE // powered by gas flow
+ interacts_with_air = TRUE
circuit = /obj/item/circuitboard/machine/power_compressor
- var/obj/machinery/power/turbine/turbine
+ var/obj/machinery/power/shuttle/engine/turbine/turbine
var/datum/gas_mixture/gas_contained
- var/turf/inturf
var/starter = 0
var/rpm = 0
var/rpmtarget = 0
var/capacity = 1e6
var/comp_id = 0
- var/efficiency
+ var/efficiency = 1
+ var/intake_ratio = 0.1 // might add a way to adjust this in-game later
-/obj/machinery/power/turbine/lavaland
+/obj/machinery/power/shuttle/engine/turbine/lavaland
destroy_output = TRUE
/obj/machinery/power/compressor/Destroy()
+ SSair.stop_processing_machine(src)
if (turbine && turbine.compressor == src)
turbine.compressor = null
+ if(isopenturf(loc))
+ loc.assume_air(gas_contained)
+ loc.air_update_turf()
turbine = null
return ..()
-/obj/machinery/power/turbine
+/obj/machinery/power/shuttle/engine/turbine
name = "gas turbine generator"
desc = "A gas turbine used for backup power generation."
- icon = 'icons/obj/atmospherics/pipes/simple.dmi'
+ icon = 'icons/obj/atmospherics/components/turbine.dmi'
icon_state = "turbine"
density = TRUE
resistance_flags = FIRE_PROOF
CanAtmosPass = ATMOS_PASS_DENSITY
+ use_power = NO_POWER_USE // powered by gas flow
+ interacts_with_air = TRUE
circuit = /obj/item/circuitboard/machine/power_turbine
+ thrust = 0 // no thrust by default
+ icon_state_closed = "turbine"
+ icon_state_open = "turbine"
+ icon_state_off = "turbine"
var/opened = 0
var/obj/machinery/power/compressor/compressor
- var/turf/outturf
- var/lastgen
+ var/lastgen = 0
var/productivity = 1
var/destroy_output = FALSE //Destroy the output gas instead of actually outputting it. Used on lavaland to prevent cooking the zlevel
-/obj/machinery/power/turbine/Destroy()
+/obj/machinery/power/shuttle/engine/turbine/Destroy()
+ SSair.stop_processing_machine(src)
if (compressor && compressor.turbine == src)
compressor.turbine = null
compressor = null
@@ -74,29 +86,39 @@
// the inlet stage of the gas turbine electricity generator
-/obj/machinery/power/compressor/Initialize()
+/obj/machinery/power/compressor/Initialize(mapload)
. = ..()
// The inlet of the compressor is the direction it faces
gas_contained = new
- inturf = get_step(src, dir)
+ SSair.start_processing_machine(src, mapload)
locate_machinery()
if(!turbine)
obj_break()
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/machinery/power/compressor/LateInitialize()
+ . = ..()
+ var/turf/comp_turf = get_turf(src)
+ comp_turf.ImmediateCalculateAdjacentTurfs() // turbine blocks atmos so update the turf it's on or stuff breaks
#define COMPFRICTION 5e5
/obj/machinery/power/compressor/locate_machinery()
if(turbine)
return
- turbine = locate() in get_step(src, get_dir(inturf, src))
+ turbine = locate() in get_step(src, turn(dir, 180))
if(turbine)
+ set_machine_stat(machine_stat & ~BROKEN)
turbine.locate_machinery()
+ else
+ turbine = null
+ obj_break()
/obj/machinery/power/compressor/RefreshParts()
var/E = 0
for(var/obj/item/stock_parts/manipulator/M in component_parts)
E += M.rating
- efficiency = E / 6
+ efficiency = max(E / 6, 1)
/obj/machinery/power/compressor/examine(mob/user)
. = ..()
@@ -108,49 +130,63 @@
return
if(default_change_direction_wrench(user, I))
- turbine = null
- inturf = get_step(src, dir)
- locate_machinery()
if(turbine)
to_chat(user, "Turbine connected.")
set_machine_stat(machine_stat & ~BROKEN)
else
to_chat(user, "Turbine not connected.")
- obj_break()
return
default_deconstruction_crowbar(I)
-/obj/machinery/power/compressor/process()
- if(!starter)
- return
- if(!turbine || (turbine.machine_stat & BROKEN))
- starter = FALSE
- if(machine_stat & BROKEN || panel_open)
- starter = FALSE
- return
- cut_overlays()
-
- rpm = 0.9* rpm + 0.1 * rpmtarget
+/obj/machinery/power/compressor/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I)
+ . = ..()
+ if(panel_open)
+ set_machine_stat(machine_stat | MAINT)
+ else
+ set_machine_stat(machine_stat & ~MAINT)
- // It's a simplified version taking only 1/10 of the moles from the turf nearby. It should be later changed into a better version
- // above todo 7 years and counting
+//update when moved or changing direction
+/obj/machinery/power/compressor/setDir(newdir)
+ . = ..()
+ locate_machinery()
- inturf.transfer_air_ratio(gas_contained, 0.1)
+/obj/machinery/power/compressor/Move(atom/newloc, direct, glide_size_override)
+ . = ..()
+ locate_machinery()
-// RPM function to include compression friction - be advised that too low/high of a compfriction value can make things screwy
+/obj/machinery/power/compressor/process(delta_time)
+ return
+/obj/machinery/power/compressor/process_atmos(delta_time)
+ // RPM function to include compression friction - be advised that too low/high of a compfriction value can make things screwy
+ rpm -= 1
+ rpm = (0.9 * rpm) + (0.1 * rpmtarget)
rpm = min(rpm, (COMPFRICTION*efficiency)/2)
- rpm = max(0, rpm - (rpm*rpm)/(COMPFRICTION*efficiency))
+ rpm = max(0, rpm - (rpm**2)/(COMPFRICTION*efficiency))
- if(starter && !(machine_stat & NOPOWER))
- use_power(2800)
- if(rpm<1000)
- rpmtarget = 1000
- else
- if(rpm<1000)
- rpmtarget = 0
+ update_overlays()
+
+ if(!turbine || (turbine.machine_stat & BROKEN))
+ locate_machinery() // try to find the other part if we somehow got disconnected
+
+ if((machine_stat & (BROKEN|MAINT)) || !starter) // if we didn't find it...
+ rpmtarget = 0
+ return
+
+ var/turf/inturf = get_step(src, dir)
+ var/datum/gas_mixture/environment = inturf.return_air()
+ var/external_pressure = environment.return_pressure()
+ var/pressure_delta = external_pressure - gas_contained.return_pressure()
+
+ // Equalize the gas between the environment and the internal gas mix
+ if(pressure_delta > 0)
+ var/datum/gas_mixture/removed = environment.remove_ratio((1 - ((1 - intake_ratio)**delta_time)) * pressure_delta / (external_pressure * 2)) // silly math to keep it consistent with delta_time
+ gas_contained.merge(removed)
+ inturf.air_update_turf()
+/obj/machinery/power/compressor/update_overlays()
+ . = ..()
if(rpm>50000)
add_overlay(mutable_appearance(icon, "comp-o4", FLY_LAYER))
else if(rpm>10000)
@@ -159,91 +195,122 @@
add_overlay(mutable_appearance(icon, "comp-o2", FLY_LAYER))
else if(rpm>500)
add_overlay(mutable_appearance(icon, "comp-o1", FLY_LAYER))
- //TODO: DEFERRED
// These are crucial to working of a turbine - the stats modify the power output. TurbGenQ modifies how much raw energy can you get from
// rpms, TurbGenG modifies the shape of the curve - the lower the value the less straight the curve is.
#define TURBGENQ 100000
#define TURBGENG 0.5
+#define POWER_TO_THRUST 0.001 // power production to thrust ratio
-/obj/machinery/power/turbine/Initialize()
+/obj/machinery/power/shuttle/engine/turbine/Initialize(mapload)
. = ..()
-// The outlet is pointed at the direction of the turbine component
- outturf = get_step(src, dir)
+ SSair.start_processing_machine(src, mapload)
locate_machinery()
if(!compressor)
obj_break()
connect_to_network()
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/machinery/power/shuttle/engine/turbine/LateInitialize()
+ . = ..()
+ var/turf/comp_turf = get_turf(src)
+ comp_turf.ImmediateCalculateAdjacentTurfs() // turbine blocks atmos so update the turf it's on or stuff breaks
-/obj/machinery/power/turbine/RefreshParts()
+/obj/machinery/power/shuttle/engine/turbine/RefreshParts()
var/P = 0
for(var/obj/item/stock_parts/capacitor/C in component_parts)
P += C.rating
productivity = P / 6
-/obj/machinery/power/turbine/examine(mob/user)
+/obj/machinery/power/shuttle/engine/turbine/examine(mob/user)
. = ..()
if(in_range(user, src) || isobserver(user))
. += "The status display reads: Productivity at [productivity*100]%."
-/obj/machinery/power/turbine/locate_machinery()
+/obj/machinery/power/shuttle/engine/turbine/locate_machinery()
if(compressor)
return
- compressor = locate() in get_step(src, get_dir(outturf, src))
+ compressor = locate() in get_step(src, turn(dir, 180))
if(compressor)
+ set_machine_stat(machine_stat & ~BROKEN)
compressor.locate_machinery()
+ else
+ compressor = null
+ obj_break()
-/obj/machinery/power/turbine/process()
+/obj/machinery/power/shuttle/engine/turbine/process(delta_time)
+ add_avail(lastgen) // add power in process() so it doesn't update power output separately from the rest of the powernet (bad)
+ update_overlays()
+/obj/machinery/power/shuttle/engine/turbine/process_atmos(delta_time)
if(!compressor)
set_machine_stat(BROKEN)
+ locate_machinery() // try to find the missing piece
- if((machine_stat & BROKEN) || panel_open)
+ if(machine_stat & (BROKEN|MAINT)) // we're only running half a turbine, don't continue
return
- if(!compressor.starter)
- return
- cut_overlays()
// This is the power generation function. If anything is needed it's good to plot it in EXCEL before modifying
// the TURBGENQ and TURBGENG values
lastgen = ((compressor.rpm / TURBGENQ)**TURBGENG) * TURBGENQ * productivity
+ thrust = lastgen * POWER_TO_THRUST // second law
- add_avail(lastgen)
-
- // Weird function but it works. Should be something else...
-
- var/newrpm = ((compressor.gas_contained.return_temperature()) * compressor.gas_contained.total_moles())/4
+ var/turf/outturf = get_step(src, dir)
+ if(!LAZYLEN(outturf.atmos_adjacent_turfs))
+ compressor.rpmtarget = 0
+ return
- newrpm = max(0, newrpm)
+ // Move gas from the compressor to the outlet
+ var/datum/gas_mixture/environment = outturf.return_air()
+ var/internal_pressure = compressor.gas_contained.return_pressure()
+ var/pressure_delta = internal_pressure - environment.return_pressure()
- if(!compressor.starter || newrpm > 1000)
- compressor.rpmtarget = newrpm
+ // Now set the compressor's RPM target based on how much gas is flowing through
+ compressor.rpmtarget = max(0, pressure_delta * compressor.gas_contained.return_volume() / (R_IDEAL_GAS_EQUATION * 4))
- if(compressor.gas_contained.total_moles()>0)
- var/oamount = min(compressor.gas_contained.total_moles(), (compressor.rpm+100)/35000*compressor.capacity)
+ // Equalize the gas between the internal gas mix and the environment
+ if(pressure_delta > 0)
+ var/datum/gas_mixture/removed = compressor.gas_contained.remove_ratio(pressure_delta / (internal_pressure * 2))
if(destroy_output)
- compressor.gas_contained.set_moles(compressor.gas_contained.get_moles() - oamount)
- else
- outturf.assume_air_moles(compressor.gas_contained, oamount)
+ qdel(removed)
+ return
+ outturf.assume_air(removed)
+ outturf.air_update_turf()
+
+// Return the current thrust amount
+/obj/machinery/power/shuttle/engine/turbine/burn_engine(percentage, deltatime)
+ return thrust * deltatime * (percentage / 100)
+
+// Return the current power output
+/obj/machinery/power/shuttle/engine/turbine/return_fuel()
+ return lastgen
+
+// Return the maximum power output
+/obj/machinery/power/shuttle/engine/turbine/return_fuel_cap()
+ return ((COMPFRICTION*(compressor ? compressor.efficiency : 1) / (TURBGENQ*4))**TURBGENG) * TURBGENQ * productivity
+
+// Return the maximum power output
+/obj/machinery/power/shuttle/engine/turbine/update_engine()
+ if(!(flags_1 & INITIALIZED_1))
+ return FALSE
+ thruster_active = !panel_open && compressor
+ return thruster_active
// If it works, put an overlay that it works!
-
+/obj/machinery/power/shuttle/engine/turbine/update_overlays()
+ . = ..()
if(lastgen > 100)
add_overlay(mutable_appearance(icon, "turb-o", FLY_LAYER))
-/obj/machinery/power/turbine/attackby(obj/item/I, mob/user, params)
+/obj/machinery/power/shuttle/engine/turbine/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), I))
return
if(default_change_direction_wrench(user, I))
- compressor = null
- outturf = get_step(src, dir)
- locate_machinery()
if(compressor)
to_chat(user, "Compressor connected.")
- set_machine_stat(machine_stat & ~BROKEN)
else
to_chat(user, "Compressor not connected.")
obj_break()
@@ -251,25 +318,42 @@
default_deconstruction_crowbar(I)
-/obj/machinery/power/turbine/ui_interact(mob/user, datum/tgui/ui)
+/obj/machinery/power/shuttle/engine/turbine/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I)
+ . = ..()
+ if(panel_open)
+ set_machine_stat(machine_stat | MAINT)
+ else
+ set_machine_stat(machine_stat & ~MAINT)
+
+// update if it moves or changes direction
+/obj/machinery/power/shuttle/engine/turbine/setDir(newdir)
+ . = ..()
+ locate_machinery()
+
+/obj/machinery/power/shuttle/engine/turbine/Move(atom/newloc, direct, glide_size_override)
+ . = ..()
+ locate_machinery()
+
+/obj/machinery/power/shuttle/engine/turbine/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "TurbineComputer", name)
ui.open()
-/obj/machinery/power/turbine/ui_data(mob/user)
+/obj/machinery/power/shuttle/engine/turbine/ui_data(mob/user)
var/list/data = list()
data["compressor"] = compressor ? TRUE : FALSE
- data["compressor_broke"] = (!compressor || (compressor.machine_stat & BROKEN)) ? TRUE : FALSE
+ data["compressor_broke"] = (!compressor || (compressor.machine_stat & (BROKEN|MAINT))) ? TRUE : FALSE
data["turbine"] = compressor?.turbine ? TRUE : FALSE
- data["turbine_broke"] = (!compressor || !compressor.turbine || (compressor.turbine.machine_stat & BROKEN)) ? TRUE : FALSE
+ data["turbine_broke"] = (!compressor || !compressor.turbine || (compressor.turbine.machine_stat & (BROKEN|MAINT))) ? TRUE : FALSE
data["online"] = compressor?.starter
data["power"] = DisplayPower(compressor?.turbine?.lastgen)
data["rpm"] = compressor?.rpm
data["temp"] = compressor?.gas_contained.return_temperature()
+ data["pressure"] = compressor?.gas_contained.return_pressure()
return data
-/obj/machinery/power/turbine/ui_act(action, params)
+/obj/machinery/power/shuttle/engine/turbine/ui_act(action, params)
. = ..()
if(.)
return
@@ -306,7 +390,7 @@
/obj/machinery/computer/turbine_computer/locate_machinery()
if(id)
- for(var/obj/machinery/power/compressor/C in GLOB.machines)
+ for(var/obj/machinery/power/compressor/C in SSair.atmos_air_machinery)
if(C.comp_id == id)
compressor = C
return
@@ -322,13 +406,14 @@
/obj/machinery/computer/turbine_computer/ui_data(mob/user)
var/list/data = list()
data["compressor"] = compressor ? TRUE : FALSE
- data["compressor_broke"] = (!compressor || (compressor.machine_stat & BROKEN)) ? TRUE : FALSE
+ data["compressor_broke"] = (!compressor || (compressor.machine_stat & (BROKEN|MAINT))) ? TRUE : FALSE
data["turbine"] = compressor?.turbine ? TRUE : FALSE
- data["turbine_broke"] = (!compressor || !compressor.turbine || (compressor.turbine.machine_stat & BROKEN)) ? TRUE : FALSE
+ data["turbine_broke"] = (!compressor || !compressor.turbine || (compressor.turbine.machine_stat & (BROKEN|MAINT))) ? TRUE : FALSE
data["online"] = compressor?.starter
data["power"] = DisplayPower(compressor?.turbine?.lastgen)
data["rpm"] = compressor?.rpm
data["temp"] = compressor?.gas_contained.return_temperature()
+ data["pressure"] = compressor?.gas_contained.return_pressure()
return data
/obj/machinery/computer/turbine_computer/ui_act(action, params)
@@ -345,6 +430,7 @@
locate_machinery()
. = TRUE
+#undef POWER_TO_THRUST
#undef COMPFRICTION
#undef TURBGENQ
#undef TURBGENG
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 0ae88638d5b3..2038612c2791 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -22,7 +22,7 @@
base_icon_state = "slots"
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 50
+ idle_power_usage = IDLE_DRAW_MINIMAL
circuit = /obj/item/circuitboard/computer/slot_machine
light_color = LIGHT_COLOR_BROWN
unique_icon = TRUE
diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm
index 37e079715dcd..2582c57da903 100644
--- a/code/game/machinery/stasis.dm
+++ b/code/game/machinery/stasis.dm
@@ -9,8 +9,8 @@
can_buckle = TRUE
buckle_lying = 90
circuit = /obj/item/circuitboard/machine/stasis
- idle_power_usage = 40
- active_power_usage = 340
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_HIGH
var/stasis_enabled = TRUE
var/last_stasis_sound = FALSE
var/stasis_can_toggle = 0
@@ -112,12 +112,12 @@
playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 2, frequency = freq)
target.apply_status_effect(STATUS_EFFECT_STASIS, STASIS_MACHINE_EFFECT)
target.ExtinguishMob()
- use_power = ACTIVE_POWER_USE
+ set_active_power()
/obj/machinery/stasis/proc/thaw_them(mob/living/target)
target.remove_status_effect(STATUS_EFFECT_STASIS, STASIS_MACHINE_EFFECT)
if(target == occupant)
- use_power = IDLE_POWER_USE
+ set_idle_power()
/obj/machinery/stasis/post_buckle_mob(mob/living/L)
if(!can_be_occupant(L))
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index 1e402ee02e5a..9e1b5b28690b 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -22,7 +22,7 @@
icon_state = "frame"
density = FALSE
use_power = IDLE_POWER_USE
- idle_power_usage = 10
+ idle_power_usage = IDLE_DRAW_MINIMAL
maptext_height = 26
maptext_width = 32
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index e86d4ae9f0f9..107c5656c034 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -1,3 +1,5 @@
+#define BASE_UV_CYCLES 7
+
// SUIT STORAGE UNIT /////////////////
/obj/machinery/suit_storage_unit
name = "suit storage unit"
@@ -6,7 +8,10 @@
icon_state = "ssu_classic"
base_icon_state = "ssu_classic"
density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_MINIMAL
max_integrity = 250
+ circuit = /obj/item/circuitboard/machine/suit_storage_unit
var/obj/item/clothing/suit/space/suit = null
var/obj/item/clothing/head/helmet/space/helmet = null
@@ -40,7 +45,9 @@
*/
var/uv_super = FALSE
/// How many cycles remain for the decontamination sequence.
- var/uv_cycles = 6
+ var/uv_cycles = 7
+ /// Time reduction from stock parts
+ var/lasers_bonus = 0
/// Cooldown for occupant breakout messages via relaymove()
var/message_cooldown
/// How long it takes to break out of the SSU.
@@ -191,6 +198,19 @@
storage = new storage_type(src)
update_appearance()
+/obj/machinery/suit_storage_unit/examine(mob/user)
+ . = ..()
+ . += span_notice("Number of UV cycles reduced by [lasers_bonus].")
+ if(locked)
+ . += span_notice("The locking bolts on \the [src] are engaged, preventing it from being pried open.")
+
+/obj/machinery/suit_storage_unit/RefreshParts()
+ lasers_bonus = 0
+ for(var/obj/item/stock_parts/micro_laser/lasers in component_parts)
+ lasers_bonus += ((lasers.rating) * 0.25)
+
+ uv_cycles = BASE_UV_CYCLES - lasers_bonus
+
/obj/machinery/suit_storage_unit/Destroy()
QDEL_NULL(suit)
QDEL_NULL(helmet)
@@ -250,7 +270,15 @@
if(!(flags_1 & NODECONSTRUCT_1))
open_machine()
dump_contents()
- new /obj/item/stack/sheet/metal (loc, 2)
+ on_deconstruction()
+ if(circuit)
+ circuit.forceMove(loc)
+ circuit = null
+ if(length(component_parts))
+ spawn_frame(disassembled)
+ for(var/obj/item/I in component_parts)
+ I.forceMove(loc)
+ component_parts.Cut()
qdel(src)
/obj/machinery/suit_storage_unit/interact(mob/living/user)
@@ -318,7 +346,7 @@
else
if (occupant)
var/mob/living/mob_occupant = occupant
- to_chat(mob_occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!")
+ to_chat(mob_occupant, span_userdanger("[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!"))
cook()
if ("lock", "unlock")
if (!state_open)
@@ -364,27 +392,27 @@
return
var/mob/living/target = A
if(!state_open)
- to_chat(user, "The unit's doors are shut!")
+ to_chat(user, span_warning("The unit's doors are shut!"))
return
if(!is_operational)
- to_chat(user, "The unit is not operational!")
+ to_chat(user, span_warning("The unit is not operational!"))
return
if(occupant || helmet || suit || storage)
- to_chat(user, "It's too cluttered inside to fit in!")
+ to_chat(user, span_warning("It's too cluttered inside to fit in!"))
return
if(target == user)
- user.visible_message("[user] starts squeezing into [src]!", "You start working your way into [src]...")
+ user.visible_message(span_warning("[user] starts squeezing into [src]!"), span_notice("You start working your way into [src]..."))
else
- target.visible_message("[user] starts shoving [target] into [src]!", "[user] starts shoving you into [src]!")
+ target.visible_message(span_warning("[user] starts shoving [target] into [src]!"), span_userdanger("[user] starts shoving you into [src]!"))
- if(do_mob(user, target, 30))
+ if(do_after(user, 30, target))
if(occupant || helmet || suit || storage)
return
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.")
+ user.visible_message(span_warning("[user] slips into [src] and closes the door behind [user.p_them()]!"), span_notice("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(span_warning("[user] pushes [target] into [src] and shuts its door!"), span_userdanger("[user] shoves you into [src] and shuts the door!"))
close_machine(target)
add_fingerprint(user)
@@ -398,11 +426,12 @@
*/
/obj/machinery/suit_storage_unit/proc/cook()
var/mob/living/mob_occupant = occupant
- if(uv_cycles)
+ if(uv_cycles > 0)
uv_cycles--
uv = TRUE
locked = TRUE
update_appearance()
+ use_power(ACTIVE_DRAW_HIGH)
if(occupant)
if(uv_super)
mob_occupant.adjustFireLoss(rand(20, 36))
@@ -411,11 +440,11 @@
mob_occupant.emote("scream")
addtimer(CALLBACK(src, PROC_REF(cook)), 50)
else
- uv_cycles = initial(uv_cycles)
+ uv_cycles = (BASE_UV_CYCLES - lasers_bonus)
uv = FALSE
locked = FALSE
if(uv_super)
- visible_message("[src]'s door creaks open with a loud whining noise. A cloud of foul black smoke escapes from its chamber.")
+ visible_message(span_warning("[src]'s door creaks open with a loud whining noise. A cloud of foul black smoke escapes from its chamber."))
playsound(src, 'sound/machines/creaking.ogg', 50, TRUE)
helmet = null
qdel(helmet)
@@ -429,10 +458,16 @@
wires.cut_all()
else
if(!occupant)
- visible_message("[src]'s door slides open. The glowing yellow lights dim to a gentle green.")
+ visible_message(span_notice("[src]'s door slides open. The glowing yellow lights dim to a gentle green."))
else
- visible_message("[src]'s door slides open, barraging you with the nauseating smell of charred flesh.")
+ visible_message(span_warning("[src]'s door slides open, barraging you with the nauseating smell of charred flesh."))
mob_occupant.radiation = 0
+ if(iscarbon(mob_occupant))
+ var/mob/living/carbon/bacon = mob_occupant
+ for(var/obj/item/bodypart/grilling as anything in bacon.get_bleeding_parts(TRUE))
+ if(!grilling.can_bandage())
+ continue
+ grilling.apply_bandage(0.005, 600, "cauterization")
playsound(src, 'sound/machines/airlocks/standard/close.ogg', 25, TRUE)
var/list/things_to_clear = list() //Done this way since using GetAllContents on the SSU itself would include circuitry and such.
if(suit)
@@ -469,7 +504,7 @@
if(locked)
if(message_cooldown <= world.time)
message_cooldown = world.time + 50
- to_chat(user, "[src]'s door won't budge!")
+ to_chat(user, span_warning("[src]'s door won't budge!"))
return
open_machine()
dump_contents()
@@ -481,21 +516,21 @@
return
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
- user.visible_message("You see [user] kicking against the doors of [src]!", \
- "You start kicking against the doors... (this will take about [DisplayTimeText(breakout_time)].)", \
- "You hear a thump from [src].")
+ user.visible_message(span_notice("You see [user] kicking against the doors of [src]!"), \
+ span_notice("You start kicking against the doors... (this will take about [DisplayTimeText(breakout_time)].)"), \
+ span_hear("You hear a thump from [src]."))
if(do_after(user,(breakout_time), target = src))
if(!user || user.stat != CONSCIOUS || user.loc != src)
return
- user.visible_message("[user] successfully broke out of [src]!", \
- "You successfully break out of [src]!")
+ user.visible_message(span_warning("[user] successfully broke out of [src]!"), \
+ span_notice("You successfully break out of [src]!"))
open_machine()
dump_contents()
add_fingerprint(user)
if(locked)
- visible_message("You see [user] kicking against the doors of [src]!", \
- "You start kicking against the doors...")
+ visible_message(span_notice("You see [user] kicking against the doors of [src]!"), \
+ span_notice("You start kicking against the doors..."))
addtimer(CALLBACK(src, PROC_REF(resist_open), user), 300)
else
open_machine()
@@ -503,42 +538,42 @@
/obj/machinery/suit_storage_unit/proc/resist_open(mob/user)
if(!state_open && occupant && (user in src) && user.stat == 0) // Check they're still here.
- visible_message("You see [user] burst out of [src]!", \
- "You escape the cramped confines of [src]!")
+ visible_message(span_notice("You see [user] burst out of [src]!"), \
+ span_notice("You escape the cramped confines of [src]!"))
open_machine()
/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params)
if(state_open && is_operational)
if(istype(I, /obj/item/clothing/suit))
if(suit)
- to_chat(user, "The unit already contains a suit!.")
+ to_chat(user, span_warning("The unit already contains a suit!."))
return
if(!user.transferItemToLoc(I, src))
return
suit = I
else if(istype(I, /obj/item/clothing/head))
if(helmet)
- to_chat(user, "The unit already contains a helmet!")
+ to_chat(user, span_warning("The unit already contains a helmet!"))
return
if(!user.transferItemToLoc(I, src))
return
helmet = I
else if(istype(I, /obj/item/clothing/mask))
if(mask)
- to_chat(user, "The unit already contains a mask!")
+ to_chat(user, span_warning("The unit already contains a mask!"))
return
if(!user.transferItemToLoc(I, src))
return
mask = I
else
if(storage)
- to_chat(user, "The auxiliary storage compartment is full!")
+ to_chat(user, span_warning("The auxiliary storage compartment is full!"))
return
if(!user.transferItemToLoc(I, src))
return
storage = I
- visible_message("[user] inserts [I] into [src]", "You load [I] into [src].")
+ visible_message(span_notice("[user] inserts [I] into [src]"), span_notice("You load [I] into [src]."))
update_appearance()
return
@@ -561,7 +596,7 @@
*/
/obj/machinery/suit_storage_unit/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I)
if(!(flags_1 & NODECONSTRUCT_1) && I.tool_behaviour == TOOL_SCREWDRIVER && uv)
- to_chat(user, "It might not be wise to fiddle with [src] while it's running...")
+ to_chat(user, span_warning("It might not be wise to fiddle with [src] while it's running..."))
return TRUE
return ..()
@@ -570,8 +605,12 @@
. = !(state_open || panel_open || is_operational || locked || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR
if(.)
I.play_tool_sound(src, 50)
- visible_message("[usr] pries open \the [src].", "You pry open \the [src].")
+ visible_message(span_notice("[usr] pries open \the [src]."), span_notice("You pry open \the [src]."))
open_machine()
+ // todo, make it not deconstruct while locked
+ if(!locked)
+ if(default_deconstruction_crowbar(I))
+ return TRUE
// Mapping helper unit takes whatever lies on top of it
/obj/machinery/suit_storage_unit/inherit/Initialize(mapload)
@@ -596,3 +635,6 @@
AM.forceMove(src)
storage = AM
update_appearance()
+
+
+#undef BASE_UV_CYCLES
diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm
index f9cbc692e050..2a12e6bcf937 100644
--- a/code/game/machinery/telecomms/machines/broadcaster.dm
+++ b/code/game/machinery/telecomms/machines/broadcaster.dm
@@ -14,7 +14,7 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages
desc = "A dish-shaped machine used to broadcast processed subspace signals."
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 25
+ idle_power_usage = IDLE_DRAW_MINIMAL
circuit = /obj/item/circuitboard/machine/telecomms/broadcaster
/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/subspace/signal, obj/machinery/telecomms/machine_from)
diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm
index 2496ee41c874..6428456d1614 100644
--- a/code/game/machinery/telecomms/machines/bus.dm
+++ b/code/game/machinery/telecomms/machines/bus.dm
@@ -14,7 +14,7 @@
desc = "A mighty piece of hardware used to send massive amounts of data quickly."
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 50
+ idle_power_usage = IDLE_DRAW_MINIMAL
netspeed = 40
circuit = /obj/item/circuitboard/machine/telecomms/bus
var/change_frequency = 0
diff --git a/code/game/machinery/telecomms/machines/hub.dm b/code/game/machinery/telecomms/machines/hub.dm
index dedf7c7f3a77..a01225b4f4fd 100644
--- a/code/game/machinery/telecomms/machines/hub.dm
+++ b/code/game/machinery/telecomms/machines/hub.dm
@@ -14,7 +14,7 @@
desc = "A mighty piece of hardware used to send/receive massive amounts of data."
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 80
+ idle_power_usage = IDLE_DRAW_MINIMAL
long_range_link = TRUE
netspeed = 40
circuit = /obj/item/circuitboard/machine/telecomms/hub
diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm
index d11067c290fd..d9f927a7c355 100644
--- a/code/game/machinery/telecomms/machines/message_server.dm
+++ b/code/game/machinery/telecomms/machines/message_server.dm
@@ -12,8 +12,8 @@
name = "Blackbox Recorder"
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 10
- active_power_usage = 100
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70)
var/obj/item/stored
@@ -80,8 +80,8 @@
desc = "A machine that processes and routes PDA and request console messages."
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 10
- active_power_usage = 100
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
circuit = /obj/item/circuitboard/machine/telecomms/message_server
var/list/datum/data_pda_msg/pda_msgs = list()
diff --git a/code/game/machinery/telecomms/machines/processor.dm b/code/game/machinery/telecomms/machines/processor.dm
index 86bc02438d95..6c13ee65d510 100644
--- a/code/game/machinery/telecomms/machines/processor.dm
+++ b/code/game/machinery/telecomms/machines/processor.dm
@@ -12,7 +12,7 @@
desc = "This machine is used to process large quantities of information."
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 30
+ idle_power_usage = IDLE_DRAW_MINIMAL
circuit = /obj/item/circuitboard/machine/telecomms/processor
var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals
diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm
index 79b989648d55..33b0bc7028ec 100644
--- a/code/game/machinery/telecomms/machines/receiver.dm
+++ b/code/game/machinery/telecomms/machines/receiver.dm
@@ -12,7 +12,7 @@
desc = "This machine has a dish-like shape and green lights. It is designed to detect and process subspace radio activity."
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 30
+ idle_power_usage = IDLE_DRAW_MINIMAL
circuit = /obj/item/circuitboard/machine/telecomms/receiver
/obj/machinery/telecomms/receiver/receive_signal(datum/signal/subspace/signal)
diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm
index 60797eaee992..763c42dbbf9c 100644
--- a/code/game/machinery/telecomms/machines/relay.dm
+++ b/code/game/machinery/telecomms/machines/relay.dm
@@ -12,7 +12,7 @@
desc = "A mighty piece of hardware used to send massive amounts of data far away."
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 30
+ idle_power_usage = IDLE_DRAW_MINIMAL
netspeed = 5
long_range_link = 1
circuit = /obj/item/circuitboard/machine/telecomms/relay
@@ -74,35 +74,40 @@
autolinkers = list("r_relay")
/obj/machinery/telecomms/relay/preset/nanotrasen
- freq_listening = list(FREQ_COMMAND, FREQ_NANOTRASEN, FREQ_COMMON)
+ freq_listening = list(FREQ_COMMAND, FREQ_NANOTRASEN)
id = "Nanotrasen Relay"
network = "nt_commnet"
/obj/machinery/telecomms/relay/preset/inteq
- freq_listening = list(FREQ_COMMAND, FREQ_INTEQ, FREQ_COMMON)
+ freq_listening = list(FREQ_COMMAND, FREQ_INTEQ)
id = "IRMG Relay"
network = "irmg_commnet"
/obj/machinery/telecomms/relay/preset/minutemen
- freq_listening = list(FREQ_COMMAND, FREQ_MINUTEMEN, FREQ_COMMON)
+ freq_listening = list(FREQ_COMMAND, FREQ_MINUTEMEN)
id = "CLIP Relay"
network = "clip_commnet"
/obj/machinery/telecomms/relay/preset/solgov
- freq_listening = list(FREQ_COMMAND, FREQ_SOLGOV, FREQ_COMMON)
+ freq_listening = list(FREQ_COMMAND, FREQ_SOLGOV)
id = "SolGov Relay"
network = "solgov_commnet"
/obj/machinery/telecomms/relay/preset/syndicate
- freq_listening = list(FREQ_COMMAND, FREQ_SYNDICATE, FREQ_COMMON)
+ freq_listening = list(FREQ_COMMAND, FREQ_SYNDICATE)
id = "Syndicate Relay"
network = "synd_commnet"
/obj/machinery/telecomms/relay/preset/frontiersmen
- freq_listening = list(FREQ_COMMAND, FREQ_PIRATE, FREQ_COMMON)
+ freq_listening = list(FREQ_COMMAND, FREQ_PIRATE)
id = "Frontiersmen Relay"
network = "frontier_commnet"
+/obj/machinery/telecomms/relay/preset/pgf
+ freq_listening = list(FREQ_COMMAND, FREQ_PGF)
+ id = "PGF Relay"
+ network = "pgf_commnet"
+
//Generic preset relay
/obj/machinery/telecomms/relay/preset/auto
hide = TRUE
diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm
index 664d45b5b1c1..5607b6bbec8c 100644
--- a/code/game/machinery/telecomms/machines/server.dm
+++ b/code/game/machinery/telecomms/machines/server.dm
@@ -11,7 +11,7 @@
desc = "A machine used to store data and network statistics."
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 15
+ idle_power_usage = IDLE_DRAW_MINIMAL
circuit = /obj/item/circuitboard/machine/telecomms/server
var/list/log_entries = list()
var/totaltraffic = 0 // gigabytes (if > 1024, divide by 1024 -> terrabytes)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 6e0551b25d41..1a342f0554cd 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -9,8 +9,8 @@
icon_state = "tele0"
base_icon_state = "tele"
use_power = IDLE_POWER_USE
- idle_power_usage = 10
- active_power_usage = 2000
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_HIGH
circuit = /obj/item/circuitboard/machine/teleporter_hub
var/accuracy = 0
var/obj/machinery/teleport/station/power_station
@@ -106,8 +106,8 @@
icon_state = "controller"
base_icon_state = "controller"
use_power = IDLE_POWER_USE
- idle_power_usage = 10
- active_power_usage = 2000
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_HIGH
circuit = /obj/item/circuitboard/machine/teleporter_station
var/engaged = FALSE
var/obj/machinery/computer/teleporter/teleporter_console
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 63d308f69558..3882fe8d5a6f 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -101,13 +101,13 @@
chassis.use_power(energy_drain)
addtimer(CALLBACK(src, PROC_REF(set_ready_state), 1), equip_cooldown)
-/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target)
+/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target, mob/user, interaction_key)
if(!chassis)
return
var/C = chassis.loc
set_ready_state(0)
chassis.use_power(energy_drain)
- . = do_after(chassis.occupant, equip_cooldown, target=target)
+ . = do_after(user, equip_cooldown, target=target, interaction_key = interaction_key)
set_ready_state(1)
if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir))
return 0
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index 6a36a0ee01d6..17e3fc0116b8 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -306,8 +306,8 @@
mechsyringe.forceMove(get_turf(chassis))
reagents.trans_to(mechsyringe, min(mechsyringe.volume, reagents.total_volume), transfered_by = chassis.occupant)
syringes -= mechsyringe
- mechsyringe.icon = 'icons/obj/chemical.dmi'
- mechsyringe.icon_state = "syringeproj"
+ mechsyringe.icon = 'icons/obj/chemical/misc.dmi'
+ mechsyringe.icon_state = "potgreen"
playsound(chassis, 'sound/items/syringeproj.ogg', 50, TRUE)
log_message("Launched [mechsyringe] from [src], targeting [target].", LOG_MECHA)
var/mob/originaloccupant = chassis.occupant
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 6814f0cc2e7f..83a2c4861c90 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -5,8 +5,8 @@
desc = "Nothing is being built."
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 20
- active_power_usage = 5000
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_HIGH
req_access = list(ACCESS_ROBOTICS)
circuit = /obj/item/circuitboard/machine/mechfab
var/time_coeff = 1
@@ -196,10 +196,10 @@
rmat.silo_log(src, "built", -1, "[D.name]", res_coef)
add_overlay("fab-active")
- use_power = ACTIVE_POWER_USE
+ set_active_power()
updateUsrDialog()
sleep(get_construction_time_w_coeff(D))
- use_power = IDLE_POWER_USE
+ set_idle_power()
cut_overlay("fab-active")
desc = initial(desc)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index d2c712d32ea8..48cc0388b508 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -158,7 +158,7 @@
return cell
/obj/mecha/Destroy()
- if(occupant)
+ if(occupant && iscarbon(occupant))
occupant.SetSleeping(destruction_sleep_duration)
go_out()
var/mob/living/silicon/ai/AI
@@ -831,7 +831,7 @@
//An actual AI (simple_animal mecha pilot) entering the mech
-/obj/mecha/proc/aimob_enter_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob)
+/obj/mecha/proc/aimob_enter_mech(mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/pilot_mob)
if(pilot_mob && pilot_mob.Adjacent(src))
if(occupant)
return
@@ -841,7 +841,7 @@
pilot_mob.forceMove(src)
GrantActions(pilot_mob)//needed for checks, and incase a badmin puts somebody in the mob
-/obj/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob)
+/obj/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/pilot_mob)
if(occupant == pilot_mob)
occupant = null
if(pilot_mob.mecha == src)
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 42c32e04fa98..fbe90058fc3e 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -210,7 +210,7 @@
M.visible_message("[user] starts buckling [M] to [src]!",\
"[user] starts buckling you to [src]!",\
"You hear metal clanking.")
- if(!do_after(user, 2 SECONDS, TRUE, M))
+ if(!do_after(user, 2 SECONDS, M))
return FALSE
// Sanity check before we attempt to buckle. Is everything still in a kosher state for buckling after the 3 seconds have elapsed?
diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm
index fc7e4e3c9859..ab859a3b3215 100644
--- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm
+++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm
@@ -28,7 +28,7 @@
/obj/effect/anomaly/hallucination/proc/hallucination_pulse(turf/open/location, effectrange)
for(var/mob/living/carbon/human/user in view(location, effectrange))
// If they are immune to the anomaly
- if (iscarbon(user) && !user.research_scanner)
+ if (user.research_scanner)
continue
// Blind people don't get hallucinations.
diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm
index 205a8778d394..ab574ee475dd 100644
--- a/code/game/objects/effects/anomalies/anomalies_static.dm
+++ b/code/game/objects/effects/anomalies/anomalies_static.dm
@@ -39,19 +39,19 @@
playsound(src, 'sound/effects/walkietalkie.ogg', 75)
if(stored_mob && looking.stat != DEAD && prob(25))
say_fucky_things()
- if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD) && looking.stat != DEAD || !looking.research_scanner && looking.stat != DEAD || !HAS_TRAIT(looking, TRAIT_DEAF))
- looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 200)
- playsound(src, 'sound/effects/stall.ogg', 50)
- if(looking.getOrganLoss(ORGAN_SLOT_BRAIN) >= 150 && looking.stat != DEAD)
- if(prob(20))
- var/mob/living/carbon/victim = looking
- var/obj/effect/anomaly/tvstatic/planetary/expansion
- expansion = new(get_turf(victim))
- visible_message(" The static overtakes [victim], [expansion] taking their place!")
- victim.death()
- expansion.stored_mob = victim
- victim.forceMove(expansion)
- return
+ if(HAS_TRAIT(looking, TRAIT_MINDSHIELD) || looking.stat == DEAD || looking.research_scanner || HAS_TRAIT(looking, TRAIT_DEAF))
+ continue
+ looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 200)
+ playsound(src, 'sound/effects/stall.ogg', 50)
+ if(looking.getOrganLoss(ORGAN_SLOT_BRAIN) >= 150 && looking.stat != DEAD)
+ if(prob(20))
+ var/mob/living/carbon/victim = looking
+ var/obj/effect/anomaly/tvstatic/planetary/expansion
+ expansion = new(get_turf(victim))
+ visible_message(span_warning("The static overtakes [victim], [expansion] taking their place!"))
+ victim.death()
+ expansion.stored_mob = victim
+ victim.forceMove(expansion)
/obj/effect/anomaly/tvstatic/Bumped(atom/movable/AM)
@@ -89,13 +89,13 @@
/obj/effect/anomaly/tvstatic/detonate()
for(var/mob/living/carbon/human/looking in range(effectrange, src))
- visible_message(" The static lashes out, agony filling your mind as its tendrils scrape your thoughts!")
+ visible_message(span_boldwarning(" The static lashes out, agony filling your mind as its tendrils scrape your thoughts!"))
if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD) && looking.stat != DEAD)
looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100, 200)
playsound(src, 'sound/effects/stall.ogg', 100)
if(stored_mob)
mangle_corpse()
- visible_message("The static sputters out [stored_mob], their body coming out in a burst of blood and gore!")
+ visible_message(span_warning("The static sputters out [stored_mob], their body coming out in a burst of blood and gore!"))
new /obj/effect/gibspawner/human(loc)
stored_mob.forceMove(get_turf(src))
stored_mob = null
@@ -111,7 +111,7 @@
var/turf/T = get_turf(src)
if(T)
if(stored_mob)
- visible_message("The static spits out [stored_mob], their body coming out in a burst!")
+ visible_message(span_warning("The static spits out [stored_mob], their body coming out in a burst!"))
stored_mob.forceMove(get_turf(src))
stored_mob = null
. = ..()
@@ -122,8 +122,11 @@
immobile = TRUE
/obj/effect/anomaly/tvstatic/planetary/Initialize(mapload)
- if(prob(25))
- stored_mob = /obj/effect/mob_spawn/human/corpse/damaged
+ if(prob(25) & !stored_mob)
+ var/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/vicspawner = new (src)
+ var/mob/living/carbon/victim = (vicspawner.spawned_mob_ref)?.resolve()
+ src.stored_mob = victim
+ victim.forceMove(src)
. = ..()
/obj/effect/particle_effect/staticball
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index a50e72d9fcb7..ccfd89363482 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -72,6 +72,7 @@
var/original_name
desc = "A large piece of space-resistant printed paper."
icon = 'icons/obj/contraband.dmi'
+ icon_state = "poster_ripped"
anchored = TRUE
var/ruined = FALSE
/// how do we want to handle the random poster pool? POSTER_SUBTYPES chooses randomly from subtypes, AKA how it was handled before
@@ -1058,6 +1059,83 @@
desc = "A RILENA: LMR poster split in two to represent the series' disregard for conventional timeline aspects."
icon_state = "poster-rilena_timeline"
+//PGF Mission Accomplished
+/obj/structure/sign/poster/pgf/mission_accomplished_1
+ name = "MISSION ACCOMPLISHED! 1"
+ desc = "MISSION ACCOMPLISHED SOLDIER!"
+ icon_state = "poster-mission_accomplished-1"
+ never_random = TRUE
+
+/obj/item/poster/mission_accomplished_1
+ name = "Mission Accomplished Poster 1"
+ poster_type = /obj/structure/sign/poster/pgf/mission_accomplished_1
+ icon_state = "rolled_poster"
+
+/obj/structure/sign/poster/pgf/mission_accomplished_2
+ name = "MISSION ACCOMPLISHED! 2"
+ desc = "MISSION ACCOMPLISHED SOLDIER!"
+ icon_state = "poster-mission_accomplished-2"
+ never_random = TRUE
+
+/obj/item/poster/mission_accomplished_2
+ name = "Mission Accomplished Poster 2"
+ poster_type = /obj/structure/sign/poster/pgf/mission_accomplished_2
+ icon_state = "rolled_poster"
+
+/obj/structure/sign/poster/pgf/mission_accomplished_3
+ name = "MISSION ACCOMPLISHED! 3"
+ desc = "MISSION ACCOMPLISHED SOLDIER!"
+ icon_state = "poster-mission_accomplished-3"
+ never_random = TRUE
+
+/obj/item/poster/mission_accomplished_3
+ name = "Mission Accomplished Poster 3"
+ poster_type = /obj/structure/sign/poster/pgf/mission_accomplished_3
+ icon_state = "rolled_poster"
+
+/obj/structure/sign/poster/pgf/mission_accomplished_4
+ name = "MISSION ACCOMPLISHED! 4"
+ desc = "MISSION ACCOMPLISHED SOLDIER!"
+ icon_state = "poster-mission_accomplished-4"
+ never_random = TRUE
+
+/obj/item/poster/mission_accomplished_4
+ name = "Mission Accomplished Poster 4"
+ poster_type = /obj/structure/sign/poster/pgf/mission_accomplished_4
+ icon_state = "rolled_poster"
+
+/obj/structure/sign/poster/pgf/mission_accomplished_5
+ name = "MISSION ACCOMPLISHED! 5"
+ desc = "MISSION ACCOMPLISHED SOLDIER!"
+ icon_state = "poster-mission_accomplished-5"
+ never_random = TRUE
+
+/obj/item/poster/mission_accomplished_5
+ name = "Mission Accomplished Poster 5"
+ poster_type = /obj/structure/sign/poster/pgf/mission_accomplished_5
+ icon_state = "rolled_poster"
+
+/obj/structure/sign/poster/pgf/mission_accomplished_6
+ name = "MISSION ACCOMPLISHED! 6"
+ desc = "MISSION ACCOMPLISHED SOLDIER!"
+ icon_state = "poster-mission_accomplished-6"
+ never_random = TRUE
+
+/obj/item/poster/mission_accomplished_6
+ name = "Mission Accomplished Poster 6"
+ poster_type = /obj/structure/sign/poster/pgf/mission_accomplished_6
+ icon_state = "rolled_poster"
+
+/obj/structure/sign/poster/pgf/mission_accomplished_7
+ name = "MISSION ACCOMPLISHED! 7"
+ desc = "MISSION ACCOMPLISHED SOLDIER!"
+ icon_state = "poster-mission_accomplished-7"
+ never_random = TRUE
+
+/obj/item/poster/mission_accomplished_7
+ name = "Mission Accomplished Poster 7"
+ poster_type = /obj/structure/sign/poster/pgf/mission_accomplished_7
+ icon_state = "rolled_poster"
#undef PLACE_SPEED
diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm
index f283de309cc8..798eeeb9b166 100644
--- a/code/game/objects/effects/decals/cleanable/robots.dm
+++ b/code/game/objects/effects/decals/cleanable/robots.dm
@@ -35,12 +35,12 @@
random_icon_states = list("gibarm", "gibleg")
/obj/effect/decal/cleanable/robot_debris/up
- icon_state = "gibup1"
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibup1","gibup1")
+ icon_state = "gibup"
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibup","gibup")
/obj/effect/decal/cleanable/robot_debris/down
- icon_state = "gibdown1"
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibdown1","gibdown1")
+ icon_state = "gibdown"
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibdown","gibdown")
/obj/effect/decal/cleanable/oil
name = "motor oil"
diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm
index 173764fdf198..7ff53391f6e0 100644
--- a/code/game/objects/effects/decals/crayon.dm
+++ b/code/game/objects/effects/decals/crayon.dm
@@ -4,7 +4,7 @@ GLOBAL_LIST(gang_tags)
name = "rune"
desc = "Graffiti. Damn kids."
icon = 'icons/effects/crayondecal.dmi'
- icon_state = "rune1"
+ icon_state = "firedanger"
gender = NEUTER
plane = GAME_PLANE //makes the graffiti visible over a wall.
mergeable_decal = FALSE
@@ -37,6 +37,7 @@ GLOBAL_LIST(gang_tags)
name = "Leet Like Jeff K gang tag"
desc = "Looks like someone's claimed this area for Leet Like Jeff K."
icon = 'icons/obj/gang/tags.dmi'
+ icon_state = "B_tag"
layer = BELOW_MOB_LAYER
var/datum/team/gang/my_gang
diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm
index a3ad1f1af13d..2dfea3173feb 100644
--- a/code/game/objects/effects/decals/decal.dm
+++ b/code/game/objects/effects/decals/decal.dm
@@ -39,8 +39,8 @@
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/obj/effect/turf_decal
- icon = 'icons/turf/decals.dmi'
- icon_state = "warningline"
+ icon = 'icons/turf/decals/decals.dmi'
+ icon_state = "warningfulltile"
plane = FLOOR_PLANE
layer = TURF_DECAL_LAYER
var/detail_overlay
diff --git a/code/game/objects/effects/decals/turfdecal/flooring_decals.dm b/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
index b5c6f9fe0eec..fc23ed89c278 100644
--- a/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
+++ b/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
@@ -138,6 +138,8 @@ TURF_DECAL_COLOR_HELPER(opaque/grey, COLOR_FLOORTILE_GRAY, 255)
TURF_DECAL_COLOR_HELPER(opaque/lightgrey, "#a8b2b6", 255)
TURF_DECAL_COLOR_HELPER(opaque/bottlegreen, "#57967f", 255)
TURF_DECAL_COLOR_HELPER(opaque/ntblue, "#283674", 255)
+TURF_DECAL_COLOR_HELPER(opaque/nsorange, "#FF6600", 255)
+TURF_DECAL_COLOR_HELPER(opaque/vired, "#d40000", 255)
TURF_DECAL_COLOR_HELPER(opaque/solgovblue, "#2d2a4e", 255)
TURF_DECAL_COLOR_HELPER(opaque/solgovgold, "#eeac2e", 255)
TURF_DECAL_COLOR_HELPER(opaque/syndiered, "#730622", 255)
@@ -163,6 +165,8 @@ TURF_DECAL_COLOR_HELPER(transparent/grey, COLOR_FLOORTILE_GRAY, 140)
TURF_DECAL_COLOR_HELPER(transparent/lightgrey, "#a8b2b6", 140)
TURF_DECAL_COLOR_HELPER(transparent/bottlegreen, "#57967f", 140)
TURF_DECAL_COLOR_HELPER(transparent/ntblue, "#283674", 140)
+TURF_DECAL_COLOR_HELPER(transparent/nsorange, "#FF6600", 140)
+TURF_DECAL_COLOR_HELPER(opaque/vired, "#d40000", 140)
TURF_DECAL_COLOR_HELPER(transparent/solgovblue, "#2d2a4e", 140)
TURF_DECAL_COLOR_HELPER(transparent/solgovgold, "#eeac2e", 140)
TURF_DECAL_COLOR_HELPER(transparent/syndiered, "#730622", 140)
@@ -414,15 +418,6 @@ TURF_DECAL_COLOR_HELPER(transparent/inteqbrown, "#4b2a18", 140)
/obj/effect/turf_decal/plaque
name = "plaque"
icon_state = "plaque"
- icon = 'icons/turf/decals.dmi'
-
-/obj/effect/turf_decal/asteroid
- name = "random asteroid rubble"
- icon_state = "asteroid0"
-
-/obj/effect/turf_decal/asteroid/New()
- icon_state = "asteroid[rand(0,9)]"
- ..()
/obj/effect/turf_decal/chapel
name = "chapel"
@@ -805,6 +800,438 @@ TURF_DECAL_COLOR_HELPER(transparent/inteqbrown, "#4b2a18", 140)
/obj/effect/turf_decal/solgov/all/bottom_right
icon_state = "bottom-right-all"
+// suns
+
+/obj/effect/turf_decal/suns
+ icon = 'icons/turf/decals/suns_floor.dmi'
+ icon_state = "suns-columm1-bottom"
+
+/obj/effect/turf_decal/suns/capital_s
+ icon_state = "capital-s"
+
+/obj/effect/turf_decal/suns/capital_u
+ icon_state = "capital-u"
+
+/obj/effect/turf_decal/suns/capital_n
+ icon_state = "capital-n"
+
+/obj/effect/turf_decal/suns/capital_s/fancy
+ icon_state = "capitalfancy-s"
+
+/obj/effect/turf_decal/suns/capital_u/fancy
+ icon_state = "capitalfancy-u"
+
+/obj/effect/turf_decal/suns/capital_n/fancy
+ icon_state = "capitalfancy-n"
+
+/obj/effect/turf_decal/suns/capital_s/marble
+ icon_state = "capitalmarble-s"
+
+/obj/effect/turf_decal/suns/capital_u/marble
+ icon_state = "capitalmarble-u"
+
+/obj/effect/turf_decal/suns/capital_n/marble
+ icon_state = "capitalmarble-n"
+
+// borders
+
+/obj/effect/turf_decal/suns/line
+ icon_state = "suns-border"
+
+/obj/effect/turf_decal/suns/line/corner
+ icon_state = "suns-bordercorner"
+
+/obj/effect/turf_decal/suns/line/end
+ icon_state = "suns-borderend"
+
+/obj/effect/turf_decal/suns/line/fill
+ icon_state = "suns-fill"
+
+/obj/effect/turf_decal/suns/line/fill/corner
+ icon_state = "suns-fillcorner"
+
+/obj/effect/turf_decal/suns/line/fill/end
+ icon_state = "suns-fillend"
+
+/obj/effect/turf_decal/suns/line/fancy
+ icon_state = "sunsfancy-border"
+
+/obj/effect/turf_decal/suns/line/fancy/corner
+ icon_state = "sunsfancy-bordercorner"
+
+/obj/effect/turf_decal/suns/line/fancy/end
+ icon_state = "sunsfancy-borderend"
+
+/obj/effect/turf_decal/suns/line/fancy/fill
+ icon_state = "sunsfancy-fill"
+
+/obj/effect/turf_decal/suns/line/fancy/fill/corner
+ icon_state = "sunsfancy-fillcorner"
+
+/obj/effect/turf_decal/suns/line/fancy/fill/end
+ icon_state = "sunsfancy-fillend"
+
+/obj/effect/turf_decal/suns/line/marble
+ icon_state = "sunsmarble-border"
+
+/obj/effect/turf_decal/suns/line/marble/corner
+ icon_state = "sunsmarble-bordercorner"
+
+/obj/effect/turf_decal/suns/line/marble/end
+ icon_state = "sunsmarble-borderend"
+
+/obj/effect/turf_decal/suns/line/marble/fill
+ icon_state = "sunsmarble-fill"
+
+/obj/effect/turf_decal/suns/line/marble/fill/corner
+ icon_state = "sunsmarble-fillcorner"
+
+/obj/effect/turf_decal/suns/line/marble/fill/end
+ icon_state = "sunsmarble-fillend"
+
+// suns 3x6 decal
+
+/obj/effect/turf_decal/suns/columm1
+ icon_state = "suns-columm1-bottom"
+
+/obj/effect/turf_decal/suns/columm1/middle
+ icon_state = "suns-columm1-middle"
+
+/obj/effect/turf_decal/suns/columm1/top
+ icon_state = "suns-columm1-top"
+
+/obj/effect/turf_decal/suns/columm2
+ icon_state = "suns-columm2-bottom"
+
+/obj/effect/turf_decal/suns/columm2/middle
+ icon_state = "suns-columm2-middle"
+
+/obj/effect/turf_decal/suns/columm2/top
+ icon_state = "suns-columm2-top"
+
+/obj/effect/turf_decal/suns/columm3
+ icon_state = "suns-columm3-bottom"
+
+/obj/effect/turf_decal/suns/columm3/middle
+ icon_state = "suns-columm3-middle"
+
+/obj/effect/turf_decal/suns/columm3/top
+ icon_state = "suns-columm3-top"
+
+/obj/effect/turf_decal/suns/columm4
+ icon_state = "suns-columm4-middle"
+
+/obj/effect/turf_decal/suns/columm4/top
+ icon_state = "suns-columm4-top"
+
+/obj/effect/turf_decal/suns/columm5
+ icon_state = "suns-columm5-middle"
+
+/obj/effect/turf_decal/suns/columm5/top
+ icon_state = "suns-columm5-top"
+
+/obj/effect/turf_decal/suns/columm6
+ icon_state = "suns-columm6-middle"
+
+/obj/effect/turf_decal/suns/columm6/top
+ icon_state = "suns-columm6-top"
+
+/obj/effect/turf_decal/suns/marble/columm1
+ icon_state = "sunsmarble-columm1-bottom"
+
+/obj/effect/turf_decal/suns/marble/columm1/middle
+ icon_state = "sunsmarble-columm1-middle"
+
+/obj/effect/turf_decal/suns/marble/columm1/top
+ icon_state = "sunsmarble-columm1-top"
+
+/obj/effect/turf_decal/suns/marble/columm2
+ icon_state = "sunsmarble-columm2-bottom"
+
+/obj/effect/turf_decal/suns/marble/columm2/middle
+ icon_state = "sunsmarble-columm2-middle"
+
+/obj/effect/turf_decal/suns/marble/columm2/top
+ icon_state = "sunsmarble-columm2-top"
+
+/obj/effect/turf_decal/suns/marble/columm3
+ icon_state = "sunsmarble-columm3-bottom"
+
+/obj/effect/turf_decal/suns/marble/columm3/middle
+ icon_state = "sunsmarble-columm3-middle"
+
+/obj/effect/turf_decal/suns/marble/columm3/top
+ icon_state = "sunsmarble-columm3-top"
+
+/obj/effect/turf_decal/suns/marble/columm4
+ icon_state = "sunsmarble-columm4-middle"
+
+/obj/effect/turf_decal/suns/marble/columm4/top
+ icon_state = "sunsmarble-columm4-top"
+
+/obj/effect/turf_decal/suns/marble/columm5
+ icon_state = "sunsmarble-columm5-middle"
+
+/obj/effect/turf_decal/suns/marble/columm5/top
+ icon_state = "sunsmarble-columm5-top"
+
+/obj/effect/turf_decal/suns/marble/columm6
+ icon_state = "sunsmarble-columm6-middle"
+
+/obj/effect/turf_decal/suns/marble/columm6/top
+ icon_state = "sunsmarble-columm6-top"
+
+/obj/effect/turf_decal/suns/fancy/columm1
+ icon_state = "sunsfancy-columm1-bottom"
+
+/obj/effect/turf_decal/suns/fancy/columm1/middle
+ icon_state = "sunsfancy-columm1-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm1/top
+ icon_state = "sunsfancy-columm1-top"
+
+/obj/effect/turf_decal/suns/fancy/columm2
+ icon_state = "sunsfancy-columm2-bottom"
+
+/obj/effect/turf_decal/suns/fancy/columm2/middle
+ icon_state = "sunsfancy-columm2-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm2/top
+ icon_state = "sunsfancy-columm2-top"
+
+/obj/effect/turf_decal/suns/fancy/columm3
+ icon_state = "sunsfancy-columm3-bottom"
+
+/obj/effect/turf_decal/suns/fancy/columm3/middle
+ icon_state = "sunsfancy-columm3-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm3/top
+ icon_state = "sunsfancy-columm3-top"
+
+/obj/effect/turf_decal/suns/fancy/columm4
+ icon_state = "sunsfancy-columm4-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm4/top
+ icon_state = "sunsfancy-columm4-top"
+
+/obj/effect/turf_decal/suns/fancy/columm5
+ icon_state = "sunsfancy-columm5-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm5/top
+ icon_state = "sunsfancy-columm5-top"
+
+/obj/effect/turf_decal/suns/fancy/columm6
+ icon_state = "sunsfancy-columm6-middle"
+
+/obj/effect/turf_decal/suns/fancy/columm6/top
+ icon_state = "sunsfancy-columm6-top"
+
+
+// suns alt decal
+
+/obj/effect/turf_decal/suns/alt
+ icon_state = "sunsalt-top-left"
+
+/obj/effect/turf_decal/suns/alt/top_left
+ icon_state = "sunsalt-top-left"
+
+/obj/effect/turf_decal/suns/alt/top_center
+ icon_state = "sunsalt-top-center"
+
+/obj/effect/turf_decal/suns/alt/top_right
+ icon_state = "sunsalt-top-right"
+
+/obj/effect/turf_decal/suns/alt/middle_left
+ icon_state = "sunsalt-middle-left"
+
+/obj/effect/turf_decal/suns/alt/middle_center
+ icon_state = "sunsalt-middle-center"
+
+/obj/effect/turf_decal/suns/alt/middle_right
+ icon_state = "sunsalt-middle-right"
+
+/obj/effect/turf_decal/suns/alt/bottom_left
+ icon_state = "sunsalt-bottom-left"
+
+/obj/effect/turf_decal/suns/alt/bottom_center
+ icon_state = "sunsalt-bottom-center"
+
+/obj/effect/turf_decal/suns/alt/bottom_right
+ icon_state = "sunsalt-bottom-right"
+
+/obj/effect/turf_decal/suns/alt/fancy
+ icon_state = "sunsaltfancy-top-left"
+
+/obj/effect/turf_decal/suns/alt/fancy/top_left
+ icon_state = "sunsaltfancy-top-left"
+
+/obj/effect/turf_decal/suns/alt/fancy/top_center
+ icon_state = "sunsaltfancy-top-center"
+
+/obj/effect/turf_decal/suns/alt/fancy/top_right
+ icon_state = "sunsaltfancy-top-right"
+
+/obj/effect/turf_decal/suns/alt/fancy/middle_left
+ icon_state = "sunsaltfancy-middle-left"
+
+/obj/effect/turf_decal/suns/alt/fancy/middle_center
+ icon_state = "sunsaltfancy-middle-center"
+
+/obj/effect/turf_decal/suns/alt/fancy/middle_right
+ icon_state = "sunsaltfancy-middle-right"
+
+/obj/effect/turf_decal/suns/alt/fancy/bottom_left
+ icon_state = "sunsaltfancy-bottom-left"
+
+/obj/effect/turf_decal/suns/alt/fancy/bottom_center
+ icon_state = "sunsaltfancy-bottom-center"
+
+/obj/effect/turf_decal/suns/alt/fancy/bottom_right
+ icon_state = "sunsaltfancy-bottom-right"
+
+/obj/effect/turf_decal/suns/alt/marble
+ icon_state = "sunsaltmarble-top-left"
+
+/obj/effect/turf_decal/suns/alt/marble/top_left
+ icon_state = "sunsaltmarble-top-left"
+
+/obj/effect/turf_decal/suns/alt/marble/top_center
+ icon_state = "sunsaltmarble-top-center"
+
+/obj/effect/turf_decal/suns/alt/marble/top_right
+ icon_state = "sunsaltmarble-top-right"
+
+/obj/effect/turf_decal/suns/alt/marble/middle_left
+ icon_state = "sunsaltmarble-middle-left"
+
+/obj/effect/turf_decal/suns/alt/marble/middle_center
+ icon_state = "sunsaltmarble-middle-center"
+
+/obj/effect/turf_decal/suns/alt/marble/middle_right
+ icon_state = "sunsaltmarble-middle-right"
+
+/obj/effect/turf_decal/suns/alt/marble/bottom_left
+ icon_state = "sunsaltmarble-bottom-left"
+
+/obj/effect/turf_decal/suns/alt/marble/bottom_center
+ icon_state = "sunsaltmarble-bottom-center"
+
+/obj/effect/turf_decal/suns/alt/marble/bottom_right
+ icon_state = "sunsaltmarble-bottom-right"
+
+/obj/effect/turf_decal/suns/alt/transparent
+ icon_state = "sunsalttrans-top-left"
+
+/obj/effect/turf_decal/suns/alt/transparent/top_left
+ icon_state = "sunsalttrans-top-left"
+
+/obj/effect/turf_decal/suns/alt/transparent/top_center
+ icon_state = "sunsalttrans-top-center"
+
+/obj/effect/turf_decal/suns/alt/transparent/top_right
+ icon_state = "sunsalttrans-top-right"
+
+/obj/effect/turf_decal/suns/alt/transparent/middle_left
+ icon_state = "sunsalttrans-middle-left"
+
+/obj/effect/turf_decal/suns/alt/transparent/middle_center
+ icon_state = "sunsalttrans-middle-center"
+
+/obj/effect/turf_decal/suns/alt/transparent/middle_right
+ icon_state = "sunsalttrans-middle-right"
+
+/obj/effect/turf_decal/suns/alt/transparent/bottom_left
+ icon_state = "sunsalttrans-bottom-left"
+
+/obj/effect/turf_decal/suns/alt/transparent/bottom_center
+ icon_state = "sunsalttrans-bottom-center"
+
+/obj/effect/turf_decal/suns/alt/transparent/bottom_right
+ icon_state = "sunsalttrans-bottom-right"
+
+// suns 3x6 decal transparent
+
+/obj/effect/turf_decal/suns/transparent/columm1
+ icon_state = "sunstrans-columm1-bottom"
+
+/obj/effect/turf_decal/suns/transparent/columm1/middle
+ icon_state = "sunstrans-columm1-middle"
+
+/obj/effect/turf_decal/suns/transparent/columm1/top
+ icon_state = "sunstrans-columm1-top"
+
+/obj/effect/turf_decal/suns/transparent/columm2
+ icon_state = "sunstrans-columm2-bottom"
+
+/obj/effect/turf_decal/suns/transparent/columm2/middle
+ icon_state = "sunstrans-columm2-middle"
+
+/obj/effect/turf_decal/suns/transparent/columm2/top
+ icon_state = "sunstrans-columm2-top"
+
+/obj/effect/turf_decal/suns/transparent/columm3
+ icon_state = "sunstrans-columm3-bottom"
+
+/obj/effect/turf_decal/suns/transparent/columm3/middle
+ icon_state = "sunstrans-columm3-middle"
+
+/obj/effect/turf_decal/suns/transparent/columm3/top
+ icon_state = "sunstrans-columm3-top"
+
+/obj/effect/turf_decal/suns/transparent/columm4
+ icon_state = "sunstrans-columm4-middle"
+
+/obj/effect/turf_decal/suns/transparent/columm4/top
+ icon_state = "sunstrans-columm4-top"
+
+/obj/effect/turf_decal/suns/transparent/columm5
+ icon_state = "sunstrans-columm5-middle"
+
+/obj/effect/turf_decal/suns/transparent/columm5/top
+ icon_state = "sunstrans-columm5-top"
+
+/obj/effect/turf_decal/suns/transparent/columm6
+ icon_state = "sunstrans-columm6-middle"
+
+/obj/effect/turf_decal/suns/transparent/columm6/top
+ icon_state = "sunstrans-columm6-top"
+
+// nanotrasen
+
+/obj/effect/turf_decal/nanotrasen //placeholder for sorting these together, add 3x3 NT and Vigilitas logos later
+ icon = 'icons/obj/nanotrasen_floor.dmi'
+ icon_state = "NS-2x2" //also placeholder
+
+/obj/effect/turf_decal/nanotrasen/ns
+ icon_state = "NS-2x2"
+
+/obj/effect/turf_decal/nanotrasen/ns/top_left
+ icon_state = "NS-top-left"
+
+/obj/effect/turf_decal/nanotrasen/ns/top
+ icon_state = "NS-top-center"
+
+/obj/effect/turf_decal/nanotrasen/ns/top_right
+ icon_state = "NS-top-right"
+
+/obj/effect/turf_decal/nanotrasen/ns/center_left
+ icon_state = "NS-center-left"
+
+/obj/effect/turf_decal/nanotrasen/ns/center
+ icon_state = "NS-center"
+
+/obj/effect/turf_decal/nanotrasen/ns/center_right
+ icon_state = "NS-center-right"
+
+/obj/effect/turf_decal/nanotrasen/ns/bottom_left
+ icon_state = "NS-bottom-left"
+
+/obj/effect/turf_decal/nanotrasen/ns/bottom
+ icon_state = "NS-bottom-center"
+
+/obj/effect/turf_decal/nanotrasen/ns/bottom_right
+ icon_state = "NS-bottom-right"
+
/obj/effect/turf_decal/road
name = "road decal"
icon_state = "road"
@@ -1053,6 +1480,17 @@ TURF_DECAL_COLOR_HELPER(transparent/inteqbrown, "#4b2a18", 140)
/obj/effect/turf_decal/ntspaceworks_big/eight
icon_state = "ntspaceworks_big-8"
+//Etherbor Lihmona Shipyards
+
+/obj/effect/turf_decal/etherbor/left
+ icon_state = "etherbor_left"
+
+/obj/effect/turf_decal/etherbor/center
+ icon_state = "etherbor_center"
+
+/obj/effect/turf_decal/etherbor/right
+ icon_state = "etherbor_right"
+
//Hardline Salvage and Mining
/obj/effect/turf_decal/hardline_small
diff --git a/code/game/objects/effects/decals/turfdecal/markings.dm b/code/game/objects/effects/decals/turfdecal/markings.dm
index e0a0746f5a2d..860f8f0bd2b2 100644
--- a/code/game/objects/effects/decals/turfdecal/markings.dm
+++ b/code/game/objects/effects/decals/turfdecal/markings.dm
@@ -229,32 +229,28 @@
/obj/effect/turf_decal/syndicateemblem/top/right
icon_state = "s3,3"
+/obj/effect/turf_decal/atmos
+ icon = 'icons/turf/decals/decals.dmi'
+
/obj/effect/turf_decal/atmos/oxygen
- icon = 'icons/turf/decals.dmi'
icon_state = "oxygen"
/obj/effect/turf_decal/atmos/carbon_dioxide
- icon = 'icons/turf/decals.dmi'
icon_state = "carbon_dioxide"
/obj/effect/turf_decal/atmos/nitrogen
- icon = 'icons/turf/decals.dmi'
icon_state = "nitrogen"
/obj/effect/turf_decal/atmos/air
- icon = 'icons/turf/decals.dmi'
icon_state = "air"
/obj/effect/turf_decal/atmos/nitrous_oxide
- icon = 'icons/turf/decals.dmi'
icon_state = "nitrous_oxide"
/obj/effect/turf_decal/atmos/plasma
- icon = 'icons/turf/decals.dmi'
icon_state = "plasma"
/obj/effect/turf_decal/atmos/mix
- icon = 'icons/turf/decals.dmi'
icon_state = "mix"
/**
@@ -339,169 +335,129 @@
// centered number decals
+
/obj/effect/turf_decal/number/one
- icon = 'icons/turf/decals.dmi'
icon_state = "1"
/obj/effect/turf_decal/number/two
- icon = 'icons/turf/decals.dmi'
icon_state = "2"
/obj/effect/turf_decal/number/three
- icon = 'icons/turf/decals.dmi'
icon_state = "3"
/obj/effect/turf_decal/number/four
- icon = 'icons/turf/decals.dmi'
icon_state = "4"
/obj/effect/turf_decal/number/five
- icon = 'icons/turf/decals.dmi'
icon_state = "5"
/obj/effect/turf_decal/number/six
- icon = 'icons/turf/decals.dmi'
icon_state = "6"
/obj/effect/turf_decal/number/seven
- icon = 'icons/turf/decals.dmi'
icon_state = "7"
/obj/effect/turf_decal/number/eight
- icon = 'icons/turf/decals.dmi'
icon_state = "8"
/obj/effect/turf_decal/number/nine
- icon = 'icons/turf/decals.dmi'
icon_state = "9"
/obj/effect/turf_decal/number/zero
- icon = 'icons/turf/decals.dmi'
icon_state = "0"
// right-shifted number decals (1s digit)
/obj/effect/turf_decal/number/right_one
- icon = 'icons/turf/decals.dmi'
icon_state = "-1"
/obj/effect/turf_decal/number/right_two
- icon = 'icons/turf/decals.dmi'
icon_state = "-2"
/obj/effect/turf_decal/number/right_three
- icon = 'icons/turf/decals.dmi'
icon_state = "-3"
/obj/effect/turf_decal/number/right_four
- icon = 'icons/turf/decals.dmi'
icon_state = "-4"
/obj/effect/turf_decal/number/right_five
- icon = 'icons/turf/decals.dmi'
icon_state = "-5"
/obj/effect/turf_decal/number/right_six
- icon = 'icons/turf/decals.dmi'
icon_state = "-6"
/obj/effect/turf_decal/number/right_seven
- icon = 'icons/turf/decals.dmi'
icon_state = "-7"
/obj/effect/turf_decal/number/right_eight
- icon = 'icons/turf/decals.dmi'
icon_state = "-8"
/obj/effect/turf_decal/number/right_nine
- icon = 'icons/turf/decals.dmi'
icon_state = "-9"
/obj/effect/turf_decal/number/right_zero
- icon = 'icons/turf/decals.dmi'
icon_state = "-0"
// left-shifted number decals (10s digit)
/obj/effect/turf_decal/number/left_one
- icon = 'icons/turf/decals.dmi'
icon_state = "1-"
/obj/effect/turf_decal/number/left_two
- icon = 'icons/turf/decals.dmi'
icon_state = "2-"
/obj/effect/turf_decal/number/left_three
- icon = 'icons/turf/decals.dmi'
icon_state = "3-"
/obj/effect/turf_decal/number/left_four
- icon = 'icons/turf/decals.dmi'
icon_state = "4-"
/obj/effect/turf_decal/number/left_five
- icon = 'icons/turf/decals.dmi'
icon_state = "5-"
/obj/effect/turf_decal/number/left_six
- icon = 'icons/turf/decals.dmi'
icon_state = "6-"
/obj/effect/turf_decal/number/left_seven
- icon = 'icons/turf/decals.dmi'
icon_state = "7-"
/obj/effect/turf_decal/number/left_eight
- icon = 'icons/turf/decals.dmi'
icon_state = "8-"
/obj/effect/turf_decal/number/left_nine
- icon = 'icons/turf/decals.dmi'
icon_state = "9-"
/obj/effect/turf_decal/number/left_zero
- icon = 'icons/turf/decals.dmi'
icon_state = "0-"
/obj/effect/turf_decal/dept/hop
- icon = 'icons/turf/decals.dmi'
icon_state = "hop"
/obj/effect/turf_decal/dept/bar
- icon = 'icons/turf/decals.dmi'
icon_state = "bar"
/obj/effect/turf_decal/dept/cargo
- icon = 'icons/turf/decals.dmi'
icon_state = "cargo"
/obj/effect/turf_decal/dept/medical
- icon = 'icons/turf/decals.dmi'
icon_state = "med"
/obj/effect/turf_decal/dept/science
- icon = 'icons/turf/decals.dmi'
icon_state = "sci"
/obj/effect/turf_decal/dept/security
- icon = 'icons/turf/decals.dmi'
icon_state = "sec"
/obj/effect/turf_decal/dept/mining
- icon = 'icons/turf/decals.dmi'
icon_state = "mine"
/obj/effect/turf_decal/zoo
- icon = 'icons/turf/decals.dmi'
icon_state = "zoo"
/obj/effect/turf_decal/no
- icon = 'icons/turf/decals.dmi'
icon_state = "no"
/obj/effect/turf_decal/radiation
- icon = 'icons/turf/decals.dmi'
icon_state = "radiation"
/obj/effect/turf_decal/radiation/white
- icon = 'icons/turf/decals.dmi'
icon_state = "radiation-w"
diff --git a/code/game/objects/effects/decals/turfdecal/weather.dm b/code/game/objects/effects/decals/turfdecal/weather.dm
index 04dcf807314a..0c8284b53f8c 100644
--- a/code/game/objects/effects/decals/turfdecal/weather.dm
+++ b/code/game/objects/effects/decals/turfdecal/weather.dm
@@ -13,12 +13,10 @@
/obj/effect/turf_decal/weather/dirt
name = "dirt siding"
- icon = 'icons/turf/decals.dmi'
icon_state = "dirt_side"
/obj/effect/turf_decal/weather/dirt/corner
name = "corner"
- icon = 'icons/turf/decals.dmi'
icon_state = "dirt_side_corner"
/obj/effect/turf_decal/weather/sand
@@ -36,30 +34,24 @@
/obj/effect/turf_decal/weather/asteroid
name = "asteroid siding"
- icon = 'icons/turf/decals.dmi'
icon_state = "asteroid_side"
/obj/effect/turf_decal/weather/asteroid/corner
name = "corner"
- icon = 'icons/turf/decals.dmi'
icon_state = "asteroid_side_corner"
/obj/effect/turf_decal/weather/whitesands
name = "salted sand siding"
- icon = 'icons/turf/decals.dmi'
icon_state = "ws_side"
/obj/effect/turf_decal/weather/whitesands/corner
name = "corner"
- icon = 'icons/turf/decals.dmi'
icon_state = "ws_side_corner"
/obj/effect/turf_decal/weather/rock
name = "rock siding"
- icon = 'icons/turf/decals.dmi'
icon_state = "rock_side"
/obj/effect/turf_decal/weather/rock/corner
name = "corner"
- icon = 'icons/turf/decals.dmi'
icon_state = "rock_side_corner"
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index c8332e1dd0cd..078c435bd213 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -45,7 +45,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
. = ..()
GLOB.start_landmarks_list += src
if(jobspawn_override)
- LAZYADDASSOC(GLOB.jobspawn_overrides, name, src)
+ LAZYADDASSOCLIST(GLOB.jobspawn_overrides, name, src)
if(name != "start")
tag = "start*[name]"
@@ -187,7 +187,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
/obj/effect/landmark/start/psychologist
name = "Psychologist"
- icon_state = "Psychologist"
+ icon_state = "Curator"
/obj/effect/landmark/start/chaplain
name = "Chaplain"
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
deleted file mode 100644
index 0ca73652857c..000000000000
--- a/code/game/objects/effects/mines.dm
+++ /dev/null
@@ -1,217 +0,0 @@
-
-/obj/effect/mine
- name = "dummy mine"
- desc = "Better stay away from that thing."
- density = FALSE
- anchored = TRUE
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "uglymine"
- var/triggered = 0
-
-/obj/effect/mine/Initialize()
- . = ..()
- var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
- )
- AddElement(/datum/element/connect_loc, loc_connections)
-
-/obj/effect/mine/proc/mineEffect(mob/victim)
- to_chat(victim, "*click*")
-
-/obj/effect/mine/proc/on_entered(datum/source, atom/movable/AM)
- SIGNAL_HANDLER
- if(isturf(loc))
- if(ismob(AM))
- var/mob/MM = AM
- if(!(MM.movement_type & FLYING))
- INVOKE_ASYNC(src, PROC_REF(triggermine), AM)
- else
- INVOKE_ASYNC(src, PROC_REF(triggermine), AM)
-
-/obj/effect/mine/proc/triggermine(mob/victim)
- if(triggered)
- return
- visible_message("[victim] sets off [icon2html(src, viewers(src))] [src]!")
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- mineEffect(victim)
- SEND_SIGNAL(src, COMSIG_MINE_TRIGGERED)
- triggered = 1
- qdel(src)
-
-
-/obj/effect/mine/explosive
- name = "explosive mine"
- var/range_devastation = 0
- var/range_heavy = 1
- var/range_light = 2
- var/range_flash = 3
-
-/obj/effect/mine/explosive/mineEffect(mob/victim)
- explosion(loc, range_devastation, range_heavy, range_light, range_flash)
-
-/obj/effect/mine/stun
- name = "stun mine"
- var/stun_time = 80
-
-/obj/effect/mine/shrapnel
- name = "shrapnel mine"
- var/shrapnel_type = /obj/projectile/bullet/shrapnel
- var/shrapnel_magnitude = 3
-
-/obj/effect/mine/shrapnel/mineEffect(mob/victim)
- AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_magnitude)
-
-/obj/effect/mine/shrapnel/human_only
- name = "sophisticated shrapnel mine"
- desc = "A deadly mine, this one seems to be modified to trigger for humans only?"
-
-/obj/effect/mine/shrapnel/human_only/on_entered(datum/source, atom/movable/AM)
- if(!ishuman(AM))
- return
- . = ..()
-
-/obj/effect/mine/shrapnel/sting
- name = "stinger mine"
- shrapnel_type = /obj/projectile/bullet/pellet/stingball
-
-/obj/effect/mine/stun/mineEffect(mob/living/victim)
- if(isliving(victim))
- victim.Paralyze(stun_time)
-
-/obj/effect/mine/kickmine
- name = "kick mine"
-
-/obj/effect/mine/kickmine/mineEffect(mob/victim)
- if(isliving(victim) && victim.client)
- to_chat(victim, "You have been kicked FOR NO REISIN!")
- qdel(victim.client)
-
-
-/obj/effect/mine/gas
- name = "oxygen mine"
- var/gas_amount = 360
- var/gas_type = "o2"
-
-/obj/effect/mine/gas/mineEffect(mob/victim)
- atmos_spawn_air("[gas_type]=[gas_amount]")
-
-
-/obj/effect/mine/gas/plasma
- name = "plasma mine"
- gas_type = "plasma"
-
-
-/obj/effect/mine/gas/n2o
- name = "\improper N2O mine"
- gas_type = "n2o"
-
-
-/obj/effect/mine/gas/water_vapor
- name = "chilled vapor mine"
- gas_amount = 500
- gas_type = "water_vapor"
-
-/obj/effect/mine/sound
- name = "honkblaster 1000"
- var/sound = 'sound/items/bikehorn.ogg'
-
-/obj/effect/mine/sound/mineEffect(mob/victim)
- playsound(loc, sound, 100, TRUE)
-
-
-/obj/effect/mine/sound/bwoink
- name = "bwoink mine"
- sound = 'sound/effects/adminhelp.ogg'
-
-/obj/effect/mine/pickup
- name = "He"
- desc = "He."
- icon = 'icons/obj/marg.dmi'
- icon_state = "marg"
- density = FALSE
- var/duration = 0
- pixel_x = -8
- pixel_y = 1
-
-/obj/effect/mine/pickup/Initialize()
- . = ..()
- animate(src, time = 20, loop = -1)
-
-/obj/effect/mine/pickup/triggermine(mob/victim)
- if(triggered)
- return
- triggered = 1
- invisibility = INVISIBILITY_ABSTRACT
- mineEffect(victim)
- qdel(src)
-
-
-/obj/effect/mine/pickup/bloodbath
- name = "His Odium"
- desc = "Embrace my righteous fury."
- duration = 1200 //2min
- color = "#FF0000"
- var/mob/living/doomslayer
- var/obj/item/chainsaw/doomslayer/chainsaw
-
-/obj/effect/mine/pickup/bloodbath/mineEffect(mob/living/carbon/victim)
- if(!victim.client || !istype(victim))
- return
- to_chat(victim, "RIP AND TEAR")
-
- INVOKE_ASYNC(src, PROC_REF(blood_delusion), victim)
-
- chainsaw = new(victim.loc)
- victim.log_message("entered a marg frenzy", LOG_ATTACK)
-
- ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT)
- victim.drop_all_held_items()
- victim.put_in_hands(chainsaw, forced = TRUE)
- chainsaw.attack_self(victim)
- victim.reagents.add_reagent(/datum/reagent/medicine/adminordrazine,25)
- to_chat(victim, "KILL, KILL, KILL! YOU HAVE NO ALLIES ANYMORE, KILL THEM ALL!")
-
- var/datum/client_colour/colour = victim.add_client_colour(/datum/client_colour/bloodlust)
- QDEL_IN(colour, 11)
- doomslayer = victim
- RegisterSignal(src, COMSIG_PARENT_QDELETING, PROC_REF(end_blood_frenzy))
- QDEL_IN(WEAKREF(src), duration)
-
-/obj/effect/mine/pickup/bloodbath/proc/end_blood_frenzy()
- if(doomslayer)
- to_chat(doomslayer, "Your bloodlust seeps back into the bog of your subconscious and you regain self control.")
- doomslayer.log_message("exited a blood frenzy", LOG_ATTACK)
- if(chainsaw)
- qdel(chainsaw)
-
-/obj/effect/mine/pickup/bloodbath/proc/blood_delusion(mob/living/carbon/victim)
- new /datum/hallucination/delusion(victim, TRUE, "demon", duration, 0)
-
-/obj/effect/mine/pickup/healing
- name = "His Benevolence"
- desc = "Come, come. Your wounds shall be undone by my mercy."
-
-
-/obj/effect/mine/pickup/healing/mineEffect(mob/living/carbon/victim)
- if(!victim.client || !istype(victim))
- return
- to_chat(victim, "You feel great!")
- victim.revive(full_heal = TRUE, admin_revive = TRUE)
-
-/obj/effect/mine/pickup/speed
- name = "His Purpose"
- desc = "Come, let me quicken you to brilliance."
- duration = 300
-
-/obj/effect/mine/pickup/speed/mineEffect(mob/living/carbon/victim)
- if(!victim.client || !istype(victim))
- return
- to_chat(victim, "You feel fast!")
- victim.add_movespeed_modifier(/datum/movespeed_modifier/yellow_orb)
- addtimer(CALLBACK(src, PROC_REF(finish_effect), victim), duration)
-
-/obj/effect/mine/pickup/speed/proc/finish_effect(mob/living/carbon/victim)
- victim.remove_movespeed_modifier(/datum/movespeed_modifier/yellow_orb)
- to_chat(victim, "You slow down.")
diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm
index b21c0b7073d5..73b96c29768c 100644
--- a/code/game/objects/effects/misc.dm
+++ b/code/game/objects/effects/misc.dm
@@ -1,12 +1,3 @@
-//The effect when you wrap a dead body in gift wrap
-/obj/effect/spresent
- name = "strange present"
- desc = "It's a ... present?"
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "strangepresent"
- density = TRUE
- anchored = FALSE
-
/obj/effect/beam
name = "beam"
var/def_zone
@@ -83,7 +74,6 @@
/obj/effect/abstract/marker/at
name = "active turf marker"
-
/obj/effect/dummy/lighting_obj
name = "lighting fx obj"
desc = "Tell a coder if you're seeing this."
diff --git a/code/game/objects/effects/radiation.dm b/code/game/objects/effects/radiation.dm
index 6a0d53907ced..d9984e601810 100644
--- a/code/game/objects/effects/radiation.dm
+++ b/code/game/objects/effects/radiation.dm
@@ -6,29 +6,39 @@
var/rad_power = 33
var/rad_range = 1 // !Range mod = rad dropoff speed
var/rad_spread = 6 // Range of nearby atoms to radiate
- var/rad_delay = 20
var/rad_prob = 10
- var/_pulse = 0 // Holds the world.time interval in process
+ COOLDOWN_DECLARE(pulse_cooldown)
+ var/rad_delay = 2 SECONDS
/obj/effect/radiation/Initialize()
START_PROCESSING(SSobj, src)
. = ..()
/obj/effect/radiation/process()
- if(world.time > _pulse)
- for(var/obj/O in range(rad_spread, src))
- if(prob(rad_prob))
- radiation_pulse(O, rad_power, rad_range)
- _pulse = world.time + rad_delay
+ if(!COOLDOWN_FINISHED(src, pulse_cooldown))
+ return ..()
+
+ var/player_in_range = FALSE
+ for(var/mob/living/L in range(rad_spread))
+ if(L.client)
+ player_in_range = TRUE
+ break
+ if(!player_in_range)
+ return ..()
+ COOLDOWN_START(src, pulse_cooldown, rad_delay)
+ for(var/obj/O in range(rad_spread, src))
+ if(prob(rad_prob))
+ radiation_pulse(O, rad_power, rad_range)
+
..()
/obj/effect/radiation/waste
rad_power = 33
- rad_delay = 40
+ rad_delay = 4 SECONDS
rad_prob = 20
rad_spread = 3
/obj/effect/radiation/waste/intense //3.6 roetgen. Not bad. Not good.
rad_power = 120
- rad_delay = 80
+ rad_delay = 8 SECONDS
rad_prob = 10
diff --git a/code/game/objects/effects/spawners/bundle.dm b/code/game/objects/effects/spawners/bundle.dm
index 19e7b1c957fa..edab392613f3 100644
--- a/code/game/objects/effects/spawners/bundle.dm
+++ b/code/game/objects/effects/spawners/bundle.dm
@@ -141,18 +141,6 @@
/obj/item/clothing/head/wizard/fake,
/obj/item/staff)
-/obj/effect/spawner/bundle/costume/sexyclown
- name = "sexy clown costume spawner"
- items = list(
- /obj/item/clothing/mask/gas/sexyclown,
- /obj/item/clothing/under/rank/civilian/clown/sexy)
-
-/obj/effect/spawner/bundle/costume/sexymime
- name = "sexy mime costume spawner"
- items = list(
- /obj/item/clothing/mask/gas/sexymime,
- /obj/item/clothing/under/rank/civilian/mime/sexy)
-
/obj/effect/spawner/bundle/costume/mafia
name = "black mafia outfit spawner"
items = list(
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 3370c8b4543d..d763c46e84e9 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -87,7 +87,7 @@
/obj/item/assembly/flash/handheld = 1,
/obj/item/restraints/handcuffs/cable/zipties = 1,
/obj/item/restraints/handcuffs = 1,
- /obj/item/radio/off = 1,
+ /obj/item/radio = 1,
/obj/item/lighter = 3,
/obj/item/storage/box/matches = 3,
/obj/item/reagent_containers/syringe/contraband/space_drugs = 1,
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 8c8c8f900aab..4913f9b835ce 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -115,17 +115,14 @@
/obj/effect/temp_visual/dir_setting/wraith
name = "shadow"
icon = 'icons/mob/mob.dmi'
- icon_state = "phase_shift2"
+ icon_state = "revenant_idle"
duration = 6
/obj/effect/temp_visual/dir_setting/wraith/angelic
- icon_state = "phase_shift2_angelic"
/obj/effect/temp_visual/dir_setting/wraith/out
- icon_state = "phase_shift"
/obj/effect/temp_visual/dir_setting/wraith/out/angelic
- icon_state = "phase_shift_angelic"
/obj/effect/temp_visual/dir_setting/tailsweep
icon_state = "tailsweep"
@@ -157,7 +154,7 @@
fades = TRUE
/obj/effect/temp_visual/dir_setting/curse/hand
- icon_state = "cursehand"
+ icon_state = "cursehand0"
/obj/effect/temp_visual/dir_setting/space_wind
icon = 'icons/effects/atmospherics.dmi'
@@ -174,7 +171,7 @@
name = "\improper Bluespace energy wave"
desc = "A massive, rippling wave of bluepace energy, all rapidly exhausting itself the moment it leaves the concentrated beam of light."
icon = 'icons/effects/beam_splash.dmi'
- icon_state = "beam_splash_l"
+ icon_state = "beam_splash_e"
layer = ABOVE_ALL_MOB_LAYER
pixel_y = -16
duration = 50
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
index 8fe5e7cf5340..b850681c713f 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
@@ -6,7 +6,7 @@
icon_state = "muzzle_laser"
/obj/effect/projectile/muzzle/laser/blue
- icon_state = "muzzle_laser_blue"
+ icon_state = "muzzle_blue"
/obj/effect/projectile/muzzle/laser/emitter
name = "emitter flash"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index df7c5ae431c5..033307e5472f 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -22,7 +22,14 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
///Icon file for right inhand overlays
var/righthand_file = 'icons/mob/inhands/items_righthand.dmi'
- var/supports_variations = null //This is a bitfield that defines what variations exist for bodyparts like Digi legs.
+ ///This is a bitfield that defines what variations exist for bodyparts like Digi legs.
+ var/supports_variations = null
+
+ ///If set, kepori wearing this use this instead of their clothing file
+ var/kepoi_override_icon
+
+ ///If set, vox wearing this use this instead of their clothing file
+ var/vox_override_icon
/// Needs to follow this syntax: either a list() with the x and y coordinates of the pixel you want to get the colour from, or a hexcolour. Colour one replaces red, two replaces blue, and three replaces green in the icon state.
var/list/greyscale_colors[3]
@@ -69,8 +76,11 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
///Whether or not we use stealthy audio levels for this item's attack sounds
var/stealthy_audio = FALSE
- ///How large is the object, used for stuff like whether it can fit in backpacks or not
+ /// Weight class for how much storage capacity it uses and how big it physically is meaning storages can't hold it if their maximum weight class isn't as high as it.
var/w_class = WEIGHT_CLASS_NORMAL
+ /// Volume override for the item, otherwise automatically calculated from w_class.
+ var/w_volume
+
///This is used to determine on which slots an item can fit.
var/slot_flags = 0
pass_flags = PASSTABLE
@@ -192,6 +202,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
var/canMouseDown = FALSE
+ //for setting world icons on the go
+ var/inventory_state
+ var/world_state
+
/obj/item/Initialize()
if(attack_verb)
@@ -381,7 +395,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(grav > STANDARD_GRAVITY)
var/grav_power = min(3,grav - STANDARD_GRAVITY)
to_chat(user,"You start picking up [src]...")
- if(!do_mob(user,src,30*grav_power))
+ if(!do_after(user, 30*grav_power, src))
return
@@ -508,12 +522,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/proc/equipped(mob/user, slot, initial = FALSE)
SHOULD_CALL_PARENT(1)
visual_equipped(user, slot, initial)
- SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot)
for(var/X in actions)
var/datum/action/A = X
if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot.
A.Grant(user)
item_flags |= IN_INVENTORY
+ SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot)
if(!initial)
if(equip_sound && (slot_flags & slot))
playsound(src, equip_sound, EQUIP_SOUND_VOLUME, TRUE, ignore_walls = FALSE)
@@ -684,7 +698,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if (callback) //call the original callback
. = callback.Invoke()
item_flags &= ~IN_INVENTORY
- if(!pixel_y && !pixel_x)
+ if(!pixel_y && !pixel_x && !(item_flags & NO_PIXEL_RANDOM_DROP))
pixel_x = rand(-8,8)
pixel_y = rand(-8,8)
@@ -699,6 +713,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/proc/get_belt_overlay() //Returns the icon used for overlaying the object on a belt
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state)
+/obj/item/proc/get_helmet_overlay() // returns the icon for overlaying on a helmet
+ return mutable_appearance('icons/mob/clothing/helmet_overlays.dmi', icon_state)
+
/obj/item/proc/update_slot_icon()
if(!ismob(loc))
return
@@ -842,6 +859,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/MouseEntered(location, control, params)
. = ..()
+ SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_ENTER, location, control, params)
if((item_flags & IN_INVENTORY || item_flags & IN_STORAGE) && usr.client.prefs.enable_tips && !QDELETED(src))
var/timedelay = usr.client.prefs.tip_delay/100
var/user = usr
@@ -856,7 +874,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
. = ..()
remove_outline()
-/obj/item/MouseExited()
+/obj/item/MouseExited(location,control,params)
+ SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_EXIT, location, control, params)
deltimer(tip_timer)//delete any in-progress timer if the mouse is moved off the item before it finishes
closeToolTip(usr)
remove_outline()
@@ -907,7 +926,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
var/datum/callback/tool_check = CALLBACK(src, PROC_REF(tool_check_callback), user, amount, extra_checks)
if(ismob(target))
- if(!do_mob(user, target, delay, extra_checks=tool_check))
+ if(!do_after(user, delay, target, extra_checks=tool_check))
return
else
@@ -979,6 +998,11 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
dropped(M, FALSE)
return ..()
+/// Get an item's volume that it uses when being stored.
+/obj/item/proc/get_w_volume()
+ // if w_volume is 0 you fucked up.
+ return w_volume || AUTO_SCALE_VOLUME(w_class)
+
/obj/item/proc/embedded(mob/living/carbon/human/embedded_mob)
return
@@ -1025,7 +1049,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
* * forced- Do we want this to go through 100%?
*/
/obj/item/proc/tryEmbed(atom/target, forced=FALSE, silent=FALSE)
- if(!isbodypart(target) && !iscarbon(target) && !isclosedturf(target))
+ if(!isbodypart(target) && !iscarbon(target))
return
if(!forced && !LAZYLEN(embedding))
return
diff --git a/code/game/objects/items/binoculars.dm b/code/game/objects/items/binoculars.dm
index 6d04e2e505ff..d7fca8e0048c 100644
--- a/code/game/objects/items/binoculars.dm
+++ b/code/game/objects/items/binoculars.dm
@@ -3,8 +3,6 @@
desc = "Used for long-distance surveillance."
item_state = "binoculars"
icon_state = "binoculars"
- lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/items_righthand.dmi'
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
var/mob/listeningTo
diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm
index f44359ca656c..31af53aa3fc7 100644
--- a/code/game/objects/items/cardboard_cutouts.dm
+++ b/code/game/objects/items/cardboard_cutouts.dm
@@ -104,7 +104,7 @@
var/new_appearance = show_radial_menu(user, src, possible_appearances, custom_check = CALLBACK(src, PROC_REF(check_menu), user, crayon), radius = 36, require_near = TRUE)
if(!new_appearance)
return FALSE
- if(!do_after(user, 10, FALSE, src, TRUE))
+ if(!do_after(user, 10, src, progress = TRUE))
return FALSE
if(!check_menu(user, crayon))
return FALSE
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index ce5afeba737a..110121dc08e2 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -140,8 +140,8 @@
playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE)
/obj/item/card/id
- name = "identification card"
- desc = "A card used to provide ID and determine access across the station."
+ name = "access card"
+ desc = "These cards provide access to different sections of a ship."
icon_state = "id"
item_state = "card-id"
lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
@@ -159,7 +159,7 @@
var/obj/machinery/paystand/my_store
var/uses_overlays = TRUE
var/icon/cached_flat_icon
- var/registered_age = 13 // default age for ss13 players
+ var/registered_age = 18 // default age for ss13 players
var/job_icon
var/faction_icon
@@ -180,10 +180,18 @@
/obj/item/card/id/attack_self(mob/user)
if(Adjacent(user))
- var/minor
- if(registered_name && registered_age && registered_age < AGE_MINOR)
- minor = " (MINOR)"
- user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name][minor].", "You show \the [src.name][minor].")
+ var/id_message = "\the [initial(name)] "
+ var/list/id_info = list()
+ if(assignment)
+ id_info += "JOB: [assignment]"
+ if(registered_name)
+ id_info += "NAME: [registered_name]"
+ if(id_info)
+ id_message += id_info.Join(", ")
+ var/self_message = span_notice("You show [id_message]")
+ var/other_message = span_notice("[user] shows you: [icon2html(src, viewers(user))] [id_message]")
+
+ user.visible_message(other_message, self_message)
add_fingerprint(user)
/obj/item/card/id/vv_edit_var(var_name, var_value)
@@ -304,10 +312,6 @@
set_new_account(user)
return
- if (world.time < registered_account.withdrawDelay)
- registered_account.bank_card_talk("ERROR: UNABLE TO LOGIN DUE TO SCHEDULED MAINTENANCE. MAINTENANCE IS SCHEDULED TO COMPLETE IN [(registered_account.withdrawDelay - world.time)/10] SECONDS.", TRUE)
- return
-
var/amount_to_remove = FLOOR(input(user, "How much do you want to withdraw? Current Balance: [registered_account.account_balance]", "Withdraw Funds", 5) as num|null, 1)
if(!amount_to_remove || amount_to_remove < 0)
@@ -322,41 +326,47 @@
log_econ("[amount_to_remove] credits were removed from [src] owned by [src.registered_name]")
return
else
- if (registered_account.frozen)
- registered_account.bank_card_talk("ERROR: The linked account is frozen! Contact your department head.", TRUE)
- else
- var/difference = amount_to_remove - registered_account.account_balance
- registered_account.bank_card_talk("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal.", TRUE)
+ var/difference = amount_to_remove - registered_account.account_balance
+ registered_account.bank_card_talk("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal.", TRUE)
/obj/item/card/id/examine(mob/user)
. = ..()
- if(registered_account)
- . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr."
- if(registered_account.frozen)
- . += "The linked account is frozen, and cannot be withdrawn from or deposited into!"
. += "There's more information below, you can look again to take a closer look..."
/obj/item/card/id/examine_more(mob/user)
var/list/msg = list("You examine [src] closer, and note the following...")
+ if(registered_name)
+ msg += "NAME:"
+ msg += "[registered_name]"
if(registered_age)
- msg += "The card indicates that the holder is [registered_age] years old. [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads 'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO' along the bottom of the card." : ""]"
- if(mining_points)
- msg += "There's [mining_points] mining equipment redemption point\s loaded onto this card."
+ msg += "AGE:"
+ msg += "[registered_age] years old [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads 'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO' along the bottom of the card." : ""]"
if(length(ship_access))
+ msg += "SHIP ACCESS:"
+
+ var/list/ship_factions = list()
+ for(var/datum/overmap/ship/controlled/ship in ship_access)
+ var/faction = ship.get_faction()
+ if(!(faction in ship_factions))
+ ship_factions += faction
+ msg += "[ship_factions.Join(", ")]"
+
var/list/ship_names = list()
for(var/datum/overmap/ship/controlled/ship in ship_access)
ship_names += ship.name
- msg += "The card has access to the following ships: [ship_names.Join(", ")]"
+ msg += "[ship_names.Join(", ")]"
+
if(registered_account)
- msg += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr."
- msg += "Alt-Click the ID to pull money from the linked account in the form of holochips."
- msg += "You can insert credits into the linked account by pressing holochips, cash, or coins against the ID."
+ msg += "ACCOUNT:"
+ msg += "LINKED ACCOUNT HOLDER: '[registered_account.account_holder]'"
+ msg += "BALANCE: [registered_account.account_balance] cr."
+ msg += "Alt-click the ID to pull money from the account in the form of holochips."
+ msg += "You can insert credits into the account by pressing holochips, cash, or coins against the ID."
if(registered_account.account_holder == user.real_name)
- msg += "If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number."
+ msg += "If you lose this ID card, you can reclaim your account by Alt-click a blank ID card and entering your account ID number."
else
- msg += "There is no registered account linked to this card. Alt-Click to add one."
-
+ msg += "There is no registered account. Alt-click to add one."
return msg
/obj/item/card/id/GetAccess()
@@ -416,16 +426,14 @@
/*
Usage:
update_label()
- Sets the id name to whatever registered_name and assignment is
+ Sets the id name to whatever the assignment is
*/
/obj/item/card/id/proc/update_label()
- var/blank = !registered_name
- name = "[blank ? initial(name) : "[registered_name]'s ID Card"][(!assignment) ? "" : " ([assignment])"]"
+ name = "[(istype(src, /obj/item/card/id/syndicate)) ? "[initial(name)]" : "access card"][(!assignment) ? "" : " ([assignment])"]"
/obj/item/card/id/silver
- name = "silver identification card"
- desc = "A silver card which shows honour and dedication."
+ desc = "A silver-colored card, usually given to higher-ranking officials in ships and stations."
icon_state = "silver"
item_state = "silver_id"
lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
@@ -437,8 +445,7 @@ update_label()
access = list(ACCESS_CHANGE_IDS)
/obj/item/card/id/gold
- name = "gold identification card"
- desc = "A golden card which shows power and might."
+ desc = "A golden-colored card, usually given to those at the top of the hierarchy in a ship."
icon_state = "gold"
item_state = "gold_id"
lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
@@ -541,10 +548,7 @@ update_label()
access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER)
/obj/item/card/id/syndicate_command
- name = "syndicate ID card"
- desc = "An ID straight from the Syndicate."
- registered_name = "Syndicate"
- assignment = "Syndicate Overlord"
+ desc = "An access card widely utilized by Coalition splinters in the frontier."
icon_state = "syndie"
access = list(ACCESS_SYNDICATE)
uses_overlays = FALSE
@@ -578,15 +582,12 @@ update_label()
/obj/item/card/id/patient //Aegis ID
assignment = "Long Term Patient"
uses_overlays = FALSE
- access = list(ACCESS_SYNDICATE)
/obj/item/card/id/captains_spare
- desc = "The spare ID of the High Lord himself."
icon_state = "gold"
item_state = "gold_id"
lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
- registered_name = "Captain"
assignment = "Captain"
registered_age = null
@@ -605,11 +606,9 @@ update_label()
..()
/obj/item/card/id/centcom
- name = "\improper CentCom ID"
- desc = "An ID straight from Central Command."
+ name = "\improper Nanotrasen Central Command access card"
+ desc = "An access card sourced from Nanotrasen's Central Command."
icon_state = "centcom"
- registered_name = "Central Command"
- assignment = "Central Command"
uses_overlays = FALSE
registered_age = null
@@ -624,8 +623,6 @@ update_label()
name = "\improper CentCom ID"
desc = "An ERT ID card."
icon_state = "ert_commander"
- registered_name = "Emergency Response Team Commander"
- assignment = "Emergency Response Team Commander"
uses_overlays = FALSE
registered_age = null
@@ -634,8 +631,6 @@ update_label()
. = ..()
/obj/item/card/id/ert/security
- registered_name = "Security Response Officer"
- assignment = "Security Response Officer"
icon_state = "ert_security"
/obj/item/card/id/ert/security/Initialize()
@@ -643,8 +638,6 @@ update_label()
. = ..()
/obj/item/card/id/ert/engineer
- registered_name = "Engineering Response Officer"
- assignment = "Engineering Response Officer"
icon_state = "ert_engineer"
/obj/item/card/id/ert/engineer/Initialize()
@@ -652,8 +645,6 @@ update_label()
. = ..()
/obj/item/card/id/ert/medical
- registered_name = "Medical Response Officer"
- assignment = "Medical Response Officer"
icon_state = "ert_medic"
/obj/item/card/id/ert/medical/Initialize()
@@ -661,8 +652,6 @@ update_label()
. = ..()
/obj/item/card/id/ert/chaplain
- registered_name = "Religious Response Officer"
- assignment = "Religious Response Officer"
icon_state = "ert_chaplain"
/obj/item/card/id/ert/chaplain/Initialize()
@@ -670,8 +659,6 @@ update_label()
. = ..()
/obj/item/card/id/ert/janitor
- registered_name = "Janitorial Response Officer"
- assignment = "Janitorial Response Officer"
icon_state = "ert_janitor"
/obj/item/card/id/ert/janitor/Initialize()
@@ -679,8 +666,6 @@ update_label()
. = ..()
/obj/item/card/id/ert/clown
- registered_name = "Entertainment Response Officer"
- assignment = "Entertainment Response Officer"
icon_state = "ert_clown"
/obj/item/card/id/ert/clown/Initialize()
@@ -688,12 +673,10 @@ update_label()
. = ..()
/obj/item/card/id/ert/deathsquad
- name = "\improper Death Squad ID"
- desc = "A Death Squad ID card."
+ desc = "An access card colored in black and red."
icon_state = "deathsquad" //NO NO SIR DEATH SQUADS ARENT A PART OF NANOTRASEN AT ALL
- registered_name = "Death Commando"
- assignment = "Death Commando"
uses_overlays = FALSE
+ job_icon = "deathsquad"
/obj/item/card/id/debug
name = "\improper Debug ID"
@@ -704,7 +687,6 @@ update_label()
/obj/item/card/id/debug/Initialize()
access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access()
- registered_account = SSeconomy.get_dep_account(ACCOUNT_CAR)
. = ..()
/obj/item/card/id/prisoner
@@ -784,75 +766,26 @@ update_label()
name = "bunker access ID"
/obj/item/card/id/solgov
- name = "\improper SolGov ID"
- desc = "A SolGov ID with no proper access to speak of."
+ name = "\improper SolGov keycard"
+ desc = "A SolGov keycard with no proper access to speak of."
assignment = "Officer"
icon_state = "solgov"
uses_overlays = FALSE
/obj/item/card/id/solgov/commander
- name = "\improper SolGov ID"
- desc = "A SolGov ID with no proper access to speak of. This one indicates a Commander."
+ name = "\improper SolGov commander keycard"
+ desc = "A SolGov keycard with no proper access to speak of. This one indicates a Commander."
assignment = "Commander"
-/obj/item/card/id/departmental_budget
- name = "departmental card (FUCK)"
- desc = "Provides access to the departmental budget."
- icon_state = "budgetcard"
+/obj/item/card/id/suns
+ name = "\improper SUNS keycard"
+ desc = "A keycard belonging to the Student-Union Association of Naturalistic Sciences."
+ assignment = "Student"
+ icon_state = "suns"
uses_overlays = FALSE
- var/department_ID = ACCOUNT_CIV
- var/department_name = ACCOUNT_CIV_NAME
- registered_age = null
-
-/obj/item/card/id/departmental_budget/Initialize()
- . = ..()
- var/datum/bank_account/B = SSeconomy.get_dep_account(department_ID)
- if(B)
- registered_account = B
- if(!B.bank_cards.Find(src))
- B.bank_cards += src
- name = "departmental card ([department_name])"
- desc = "Provides access to the [department_name]."
- SSeconomy.dep_cards += src
-
-/obj/item/card/id/departmental_budget/Destroy()
- SSeconomy.dep_cards -= src
- return ..()
-
-/obj/item/card/id/departmental_budget/update_label()
- return
-/obj/item/card/id/departmental_budget/civ
- department_ID = ACCOUNT_CIV
- department_name = ACCOUNT_CIV_NAME
- icon_state = "civ_budget"
-
-/obj/item/card/id/departmental_budget/eng
- department_ID = ACCOUNT_ENG
- department_name = ACCOUNT_ENG_NAME
- icon_state = "eng_budget"
-
-/obj/item/card/id/departmental_budget/sci
- department_ID = ACCOUNT_SCI
- department_name = ACCOUNT_SCI_NAME
- icon_state = "sci_budget"
-
-/obj/item/card/id/departmental_budget/med
- department_ID = ACCOUNT_MED
- department_name = ACCOUNT_MED_NAME
- icon_state = "med_budget"
-
-/obj/item/card/id/departmental_budget/srv
- department_ID = ACCOUNT_SRV
- department_name = ACCOUNT_SRV_NAME
- icon_state = "srv_budget"
-
-/obj/item/card/id/departmental_budget/car
- department_ID = ACCOUNT_CAR
- department_name = ACCOUNT_CAR_NAME
- icon_state = "car_budget" //saving up for a new tesla
-
-/obj/item/card/id/departmental_budget/sec
- department_ID = ACCOUNT_SEC
- department_name = ACCOUNT_SEC_NAME
- icon_state = "sec_budget"
+/obj/item/card/id/suns/command
+ name = "\improper SUNS command keycard"
+ desc = "A keycard belonging to the Student-Union Association of Naturalistic Sciences. This one has a gold stripe, indicating a command member."
+ assignment = "Academic Staff"
+ icon_state = "sunscommand"
diff --git a/code/game/objects/items/cash.dm b/code/game/objects/items/cash.dm
index c906da16b606..12c9a0b99f0c 100644
--- a/code/game/objects/items/cash.dm
+++ b/code/game/objects/items/cash.dm
@@ -21,6 +21,24 @@
if(amount)
value = amount
update_appearance()
+ SSeconomy.physical_money += value
+
+/obj/item/spacecash/proc/adjust_value(amount)
+ value += amount
+ SSeconomy.physical_money += amount
+ update_appearance()
+
+/obj/item/spacecash/proc/transfer_value(amount, obj/item/spacecash/target)
+ amount = clamp(amount, 0, value)
+ value -= amount
+ target.value += amount
+ target.update_appearance()
+
+ if(value == 0)
+ qdel(src)
+ return
+
+ update_appearance()
/obj/item/spacecash/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/spacecash))
@@ -31,30 +49,26 @@
var/obj/item/spacecash/cash = W
bundle = new (loc)
bundle.value = cash.value
+ cash.value = 0
user.dropItemToGround(cash)
qdel(cash)
- bundle.value += value
- bundle.update_appearance()
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.dropItemToGround(src)
H.dropItemToGround(bundle)
H.put_in_hands(bundle)
to_chat(user, "You add [value] credits worth of money to the bundle. It now holds [bundle.value] credits.")
- qdel(src)
+ bundle.transfer_value(bundle.value, src)
/obj/item/spacecash/Destroy()
- . = ..()
+ SSeconomy.physical_money -= value
value = 0 // Prevents money from be duplicated anytime.//I'll trust eris on this one
+ return ..()
/obj/item/spacecash/bundle
icon_state = "credit20"
-/obj/item/spacecash/bundle/Initialize()
- . = ..()
- update_appearance()
-
/obj/item/spacecash/bundle/update_appearance()
icon_state = "nothing"
cut_overlays()
@@ -122,45 +136,35 @@
to_chat(usr, "You need to be in arm's reach for that!")
return
- value -= cashamount
- if(!value)
- usr.dropItemToGround(src)
- qdel(src)
-
- var/obj/item/spacecash/bundle/bundle = new (usr.loc)
- bundle.value = cashamount
- bundle.update_appearance()
+ var/obj/item/spacecash/bundle/bundle = new(usr.loc)
+ transfer_value(cashamount, bundle)
usr.put_in_hands(bundle)
update_appearance()
/obj/item/spacecash/bundle/AltClick(mob/living/user)
- var/cashamount = input(usr, "How many credits do you want to take? (0 to [value])", "Take Money", 20) as num
+ var/cashamount = input(user, "How many credits do you want to take? (0 to [value])", "Take Money", 20) as num
cashamount = round(clamp(cashamount, 0, value))
if(!cashamount)
return
- else if(!Adjacent(usr))
- to_chat(usr, "You need to be in arm's reach for that!")
+ else if(!Adjacent(user))
+ to_chat(user, "You need to be in arm's reach for that!")
return
- value -= cashamount
+ adjust_value(-cashamount)
if(!value)
- usr.dropItemToGround(src)
+ user.dropItemToGround(src)
qdel(src)
- var/obj/item/spacecash/bundle/bundle = new (usr.loc)
- bundle.value = cashamount
- bundle.update_appearance()
- usr.put_in_hands(bundle)
- update_appearance()
+ var/obj/item/spacecash/bundle/bundle = new(user.loc, cashamount)
+ user.put_in_hands(bundle)
/obj/item/spacecash/bundle/attack_hand(mob/user)
if(user.get_inactive_held_item() == src)
if(value == 0)//may prevent any edge case duping
qdel(src)
return
- var/nuvalue = value - 1
- value = nuvalue
+ adjust_value(-1)
user.put_in_hands(new /obj/item/spacecash/bundle(loc, 1))
update_appearance()
else
diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm
index 888bebac8095..baa541662e20 100644
--- a/code/game/objects/items/chrono_eraser.dm
+++ b/code/game/objects/items/chrono_eraser.dm
@@ -51,7 +51,7 @@
item_flags = DROPDEL
ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam)
can_charge = FALSE
- fire_delay = 50
+ fire_delay = 5 SECONDS
var/obj/item/chrono_eraser/TED = null
var/obj/structure/chrono_field/field = null
var/turf/startpos = null
@@ -147,7 +147,7 @@
/obj/item/ammo_casing/energy/chrono_beam
name = "eradication beam"
projectile_type = /obj/projectile/energy/chrono_beam
- icon_state = "chronobolt"
+ icon_state = "caseless"
e_cost = 0
var/obj/item/gun/energy/chrono_gun/gun
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index a60600b3661f..6b7b364118d4 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -45,7 +45,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
damtype = "fire"
force = 3
hitsound = 'sound/items/welder.ogg'
- item_state = "cigon"
name = "lit [initial(name)]"
desc = "A [initial(name)]. This one is lit."
attack_verb = list("burnt","singed")
@@ -59,7 +58,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
damtype = "brute"
force = initial(force)
icon_state = "match_burnt"
- item_state = "cigoff"
name = "burnt [initial(name)]"
desc = "A [initial(name)]. This one has seen better days."
attack_verb = list("flicked")
@@ -116,7 +114,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
desc = "A roll of tobacco and nicotine."
icon_state = "cigoff"
throw_speed = 0.5
- item_state = "cigoff"
w_class = WEIGHT_CLASS_TINY
body_parts_covered = null
grind_results = list()
@@ -418,7 +415,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_off = "cigaroff" //make sure to add positional sprites in icons/obj/cigarettes.dmi if you add more.
type_butt = /obj/item/cigbutt/cigarbutt
throw_speed = 0.5
- item_state = "cigaroff"
smoketime = 300 // 11 minutes
chem_volume = 40
list_reagents = list(/datum/reagent/drug/nicotine = 25)
@@ -787,7 +783,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/lighter/liz/ignition_effect(atom/A, mob/user)
if(get_temperature())
. = "[user] spits fire at [A], igniting it."
- playsound(src, 'sound/magic/fireball.ogg', 10, TRUE)
+ playsound(src, 'sound/voice/lizard/firespit.ogg', 20, TRUE)
/obj/item/lighter/enigma
name = "\improper Enigma Shipworks Lighter"
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 306634a639fc..4fbe06343ae5 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -201,8 +201,19 @@
name = "Circulator/Heat Exchanger (Machine Board)"
icon_state = "engineering"
build_path = /obj/machinery/atmospherics/components/binary/circulator
+ var/pipe_layer = PIPING_LAYER_DEFAULT
req_components = list()
+/obj/item/circuitboard/machine/circulator/attackby(obj/item/I, mob/user, params)
+ if(I.tool_behaviour == TOOL_MULTITOOL)
+ pipe_layer = (pipe_layer >= PIPING_LAYER_MAX) ? PIPING_LAYER_MIN : (pipe_layer + 1)
+ to_chat(user, "You change the circuitboard to layer [pipe_layer].")
+ return
+
+/obj/item/circuitboard/machine/circulator/examine()
+ . = ..()
+ . += "It is set to layer [pipe_layer]."
+
/obj/item/circuitboard/machine/emitter
name = "Emitter (Machine Board)"
icon_state = "engineering"
@@ -257,7 +268,7 @@
/obj/item/circuitboard/machine/power_turbine
name = "Power Turbine (Machine Board)"
icon_state = "engineering"
- build_path = /obj/machinery/power/turbine
+ build_path = /obj/machinery/power/shuttle/engine/turbine
req_components = list(
/obj/item/stack/cable_coil = 5,
/obj/item/stock_parts/capacitor = 6)
@@ -389,6 +400,17 @@
name = "Freezer (Machine Board)"
build_path = PATH_FREEZER
+/obj/item/circuitboard/machine/ship_gravity
+ name = "Gravity Generator (Machine Board)"
+ icon_state = "engineering"
+ build_path = /obj/machinery/power/ship_gravity
+ req_components = list(
+ /obj/item/stock_parts/capacitor = 5,
+ /obj/item/stack/sheet/bluespace_crystal = 1,
+ /obj/item/stock_parts/micro_laser = 4
+ )
+ needs_anchored = FALSE
+
#undef PATH_FREEZER
#undef PATH_HEATER
@@ -811,24 +833,10 @@
name = "Medical Kiosk (Machine Board)"
icon_state = "medical"
build_path = /obj/machinery/medical_kiosk
- var/custom_cost = 10
req_components = list(
/obj/item/healthanalyzer = 1,
/obj/item/stock_parts/scanning_module = 1)
-/obj/item/circuitboard/machine/medical_kiosk/multitool_act(mob/living/user)
- . = ..()
- var/new_cost = input("Set a new cost for using this medical kiosk.","New cost", custom_cost) as num|null
- if(!new_cost || (loc != user))
- to_chat(user, "You must hold the circuitboard to change its cost!")
- return
- custom_cost = clamp(round(new_cost, 1), 10, 1000)
- to_chat(user, "The cost is now set to [custom_cost].")
-
-/obj/item/circuitboard/machine/medical_kiosk/examine(mob/user)
- . = ..()
- . += "The cost to use this kiosk is set to [custom_cost]."
-
/obj/item/circuitboard/machine/limbgrower
name = "Limb Grower (Machine Board)"
icon_state = "medical"
@@ -1473,10 +1481,22 @@
/obj/item/circuitboard/machine/shuttle/heater
name = "Fueled Engine Heater (Machine Board)"
+ desc = "You can use mulitool to switch pipe layers"
build_path = /obj/machinery/atmospherics/components/unary/shuttle/heater
+ var/pipe_layer = PIPING_LAYER_DEFAULT
req_components = list(/obj/item/stock_parts/micro_laser = 2,
/obj/item/stock_parts/matter_bin = 1)
+/obj/item/circuitboard/machine/shuttle/heater/attackby(obj/item/I, mob/user, params)
+ if(I.tool_behaviour == TOOL_MULTITOOL)
+ pipe_layer = (pipe_layer >= PIPING_LAYER_MAX) ? PIPING_LAYER_MIN : (pipe_layer + 1)
+ to_chat(user, "You change the circuitboard to layer [pipe_layer].")
+ return
+
+/obj/item/circuitboard/machine/shuttle/heater/examine()
+ . = ..()
+ . += "It is set to layer [pipe_layer]."
+
/obj/item/circuitboard/machine/shuttle/smes
name = "Electric Engine Precharger (Machine Board)"
build_path = /obj/machinery/power/smes/shuttle
@@ -1504,22 +1524,8 @@
/obj/item/stock_parts/manipulator = 2,
)
-/obj/item/circuitboard/machine/coffeemaker
- name = "Modello 3 Coffeemaker"
- build_path = /obj/machinery/coffeemaker
- req_components = list(
- /obj/item/stack/sheet/glass = 1,
- /obj/item/reagent_containers/glass/beaker = 2,
- /obj/item/stock_parts/capacitor = 1,
- /obj/item/stock_parts/micro_laser = 2,
- )
-
-/obj/item/circuitboard/machine/coffeemaker/impressa
- name = "Impressa Coffeemaker"
- build_path = /obj/machinery/coffeemaker/impressa
- req_components = list(
- /obj/item/stack/sheet/glass = 1,
- /obj/item/reagent_containers/glass/beaker = 2,
- /obj/item/stock_parts/capacitor = 1,
- /obj/item/stock_parts/micro_laser = 2,
- )
+/obj/item/circuitboard/machine/suit_storage_unit
+ name = "Suit Storage Unit"
+ icon_state = "engineering"
+ build_path = /obj/machinery/suit_storage_unit
+ req_components = list(/obj/item/stock_parts/micro_laser = 4)
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 5ca8fa313c60..d703ae86ca7d 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -43,16 +43,15 @@
var/drawtype
var/text_buffer = ""
- var/static/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","star","poseur tag","prolizard","antilizard")
+ var/static/list/graffiti = list("face","guy","end","body")
+ var/static/list/code = list("getout","empty","unsafe","camp","safepath","jackpot","dismantle")
var/static/list/symbols = list("danger","firedanger","electricdanger","biohazard","radiation","safe","evac","space","med","trade","shop","food","peace","like","skull","nay","heart","credit")
- var/static/list/drawings = list("smallbrush","brush","largebrush","splatter","snake","stickman","carp","ghost","clown","taser","disk","fireaxe","toolbox","corgi","cat","toilet","blueprint","beepsky","scroll","bottle","shotgun")
- var/static/list/oriented = list("arrow","line","thinline","shortline","body","chevron","footprint","clawprint","pawprint") // These turn to face the same way as the drawer
- var/static/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6")
+ var/static/list/drawings = list("smallbrush","brush","splatter","snake","carp","ghost","taser","disk","fireaxe","toolbox","corgi","cat","toilet","blueprint","beepsky","scroll","bottle","shotgun")
+ var/static/list/oriented = list("arrow","line","thinline","shortline","body","chevron","footprint","clawprint","pawprint","dogo","nogo") // These turn to face the same way as the drawer
var/static/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED,
RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER, RANDOM_SYMBOL, RANDOM_PUNCTUATION, RANDOM_DRAWING)
- var/static/list/graffiti_large_h = list("yiffhell", "secborg", "paint")
- var/static/list/all_drawables = graffiti + symbols + drawings + oriented + runes + graffiti_large_h
+ var/static/list/all_drawables = graffiti + code + symbols + drawings + oriented
var/paint_mode = PAINT_NORMAL
@@ -176,15 +175,15 @@
. = list()
- var/list/g_items = list()
+ var/list/g_items = list() //i hate tgcode
. += list(list("name" = "Graffiti", "items" = g_items))
for(var/g in graffiti)
g_items += list(list("item" = g))
- var/list/glh_items = list()
- . += list(list("name" = "Graffiti Large Horizontal", "items" = glh_items))
- for(var/glh in graffiti_large_h)
- glh_items += list(list("item" = glh))
+ var/list/c_items = list()
+ . += list(list("name" = "Code", "items" = c_items))
+ for(var/c in code)
+ c_items += list(list("item" = c))
var/list/S_items = list()
. += list(list("name" = "Symbols", "items" = S_items))
@@ -201,11 +200,6 @@
for(var/O in oriented)
O_items += list(list("item" = O))
- var/list/R_items = list()
- . += list(list(name = "Runes", "items" = R_items))
- for(var/R in runes)
- R_items += list(list("item" = R))
-
var/list/rand_items = list()
. += list(list(name = "Random", "items" = rand_items))
for(var/i in randoms)
@@ -245,9 +239,6 @@
drawtype = stencil
. = TRUE
text_buffer = ""
- if(stencil in graffiti_large_h)
- paint_mode = PAINT_LARGE_HORIZONTAL
- text_buffer = ""
else
paint_mode = PAINT_NORMAL
if("select_colour")
@@ -281,8 +272,6 @@
var/istagger = HAS_TRAIT(user, TRAIT_TAGGER)
var/cost = 1
- if(paint_mode == PAINT_LARGE_HORIZONTAL)
- cost = 5
if(istype(target, /obj/item/canvas))
cost = 0
if(ishuman(user))
@@ -311,8 +300,6 @@
drawing = pick(drawings)
if(RANDOM_GRAFFITI)
drawing = pick(graffiti)
- if(RANDOM_RUNE)
- drawing = pick(runes)
if(RANDOM_ORIENTED)
drawing = pick(oriented)
if(RANDOM_NUMBER)
diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm
index 9a6663cf2046..fdc17fa8d97f 100644
--- a/code/game/objects/items/credit_holochip.dm
+++ b/code/game/objects/items/credit_holochip.dm
@@ -13,6 +13,11 @@
. = ..()
credits = amount
update_appearance()
+ SSeconomy.physical_money += amount
+
+/obj/item/holochip/Destroy()
+ SSeconomy.physical_money -= credits
+ return ..()
/obj/item/holochip/examine(mob/user)
. = ..()
@@ -77,6 +82,7 @@
/obj/item/holochip/proc/spend(amount, pay_anyway = FALSE)
if(credits >= amount)
credits -= amount
+ SSeconomy.physical_money -= amount
if(credits == 0)
qdel(src)
update_appearance()
@@ -92,6 +98,7 @@
if(istype(I, /obj/item/holochip))
var/obj/item/holochip/H = I
credits += H.credits
+ SSeconomy.physical_money += H.credits
to_chat(user, "You insert the credits into [src].")
update_appearance()
qdel(H)
diff --git a/code/game/objects/items/decal_painter.dm b/code/game/objects/items/decal_painter.dm
index e6043d584a84..7b12190ba581 100644
--- a/code/game/objects/items/decal_painter.dm
+++ b/code/game/objects/items/decal_painter.dm
@@ -201,9 +201,9 @@
to_chat(user, "\The [src] can only be used on flooring.")
return
if(color_disallowed.Find(decal_state))
- F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', decal_state, decal_dir, FALSE, color, null, null, alpha)
+ F.AddElement(/datum/element/decal, 'icons/turf/decals/decals.dmi', decal_state, decal_dir, FALSE, color, null, null, alpha)
else
- F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', decal_state, decal_dir, FALSE, decal_color, null, null, alpha)
+ F.AddElement(/datum/element/decal, 'icons/turf/decals/decals.dmi', decal_state, decal_dir, FALSE, decal_color, null, null, alpha)
playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE)
/obj/item/decal_painter/attack_self(mob/user)
@@ -215,7 +215,7 @@
/obj/item/decal_painter/interact(mob/user as mob) //TODO: Make TGUI for this because ouch
if(!decal_icon)
- decal_icon = icon('icons/turf/decals.dmi', decal_state, decal_dir)
+ decal_icon = icon('icons/turf/decals/decals.dmi', decal_state, decal_dir)
user << browse_rsc(decal_icon, "floor.png")
var/dat = {"
@@ -288,7 +288,7 @@
decal_color = chosen_colour
- decal_icon = icon('icons/turf/decals.dmi', decal_state, decal_dir)
+ decal_icon = icon('icons/turf/decals/decals.dmi', decal_state, decal_dir)
if(usr)
attack_self(usr)
diff --git a/code/game/objects/items/desk_flags.dm b/code/game/objects/items/desk_flags.dm
index 3e7c299fc3bd..c1af9cfe6c3f 100644
--- a/code/game/objects/items/desk_flags.dm
+++ b/code/game/objects/items/desk_flags.dm
@@ -1,6 +1,6 @@
/obj/item/desk_flag
name = "blank desk flag"
- desc = "Show your patriotism with WaffleCo. brand desk flags!"
+ desc = "Show your patriotism with desk flags!"
icon = 'icons/obj/deskflags.dmi'
icon_state = "flag"
force = 3
@@ -30,3 +30,8 @@
name = "gezenan desk flag"
desc = "A small banner on a pole depicting the sigil of the Pan-Gezenan Federation."
icon_state = "gezena"
+
+/obj/item/desk_flag/suns
+ name = "SUNS desk flag"
+ desc = "A little desk decoration in the gold and purple color palette of SUNS."
+ icon_state = "suns"
diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm
index 37613679e628..c8a918732a9d 100644
--- a/code/game/objects/items/devices/PDA/PDA_types.dm
+++ b/code/game/objects/items/devices/PDA/PDA_types.dm
@@ -239,3 +239,8 @@
name = "brig physician PDA"
default_cartridge = /obj/item/cartridge/medical
icon_state = "pda-brig_phys"
+
+/obj/item/pda/suns
+ name = "SUNS PDA"
+ default_cartridge = /obj/item/cartridge/medical
+ icon_state = "pda-suns"
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 584bbcc1227f..6528ef4851c7 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -253,7 +253,7 @@
name = "banana lamp"
desc = "Only a clown would think to make a ghetto banana-shaped lamp. Even has a goofy pullstring."
icon_state = "bananalamp"
- item_state = "bananalamp"
+ item_state = "lampgreen"
// FLARES
diff --git a/code/game/objects/items/devices/mines.dm b/code/game/objects/items/devices/mines.dm
new file mode 100644
index 000000000000..1772cbf497c3
--- /dev/null
+++ b/code/game/objects/items/devices/mines.dm
@@ -0,0 +1,709 @@
+
+/obj/item/mine
+ name = "mine"
+ desc = "An anti-personnel mine. This one explodes into nothing and does nothing. Why can you see this? You should't be able to see this. Stop looking at this."
+ icon = 'icons/obj/landmine.dmi'
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 5
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ icon_state = "mine"
+ item_state = "assembly"//when we get custom sprites replace this. please
+ base_icon_state = "mine"
+
+ /// Is our mine live?
+ var/armed = FALSE
+ /// Is our mine currently exploding?
+ var/triggered = FALSE
+
+ /// Sets a delay for mines going live after being planted
+ var/arm_delay = 5 SECONDS
+ /// Use to set a delay after activation to trigger the explosion.
+ var/blast_delay = 1 DECISECONDS
+
+ var/manufacturer = MANUFACTURER_NONE
+
+
+/obj/item/mine/Initialize(mapload)
+ . = ..()
+ if(armed)
+ now_armed()
+
+
+/obj/item/mine/examine(mob/user)
+ . = ..()
+ if(!armed)
+ . += span_info("It appears to be inactive...")
+ else
+ . += span_info("It looks ready to explode.")
+
+ if(manufacturer)
+ . += span_notice("It has [manufacturer] engraved on it.")
+
+/obj/item/mine/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state][triggered ? "_exploding" : null][!armed && anchored ? "_arming" : null][armed && anchored && !triggered ? "_armed" : null]"
+
+//mines have a small chance to be triggered by damage, but they take longer to explode
+/obj/item/mine/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir)
+ . = ..()
+ if(prob(35) & obj_integrity > 0)
+ blast_delay = blast_delay * 2
+ trigger_mine()
+
+//insert your horrible fate here
+/obj/item/mine/proc/mine_effect(mob/victim)
+ return
+
+//handles controlled deactivation
+/obj/item/mine/proc/disarm()
+ if(triggered) //no turning back now
+ return
+ anchored = FALSE
+ armed = FALSE
+ update_appearance(UPDATE_ICON_STATE)
+ return
+
+//using an unarmed mine inhand deploys it.
+/obj/item/mine/attack_self(mob/user)
+ if(!armed)
+ user.visible_message(span_danger("[user] deploys the [src]."), span_notice("You deploy the [src]."))
+
+ user.dropItemToGround(src)
+ anchored = TRUE
+ playsound(src, 'sound/machines/click.ogg', 60, TRUE)
+
+ if(arm_delay)
+ armed = FALSE
+ update_appearance(UPDATE_ICON_STATE)
+ addtimer(CALLBACK(src, PROC_REF(now_armed)), arm_delay)
+ else
+ armed = TRUE
+ message_admins("[key_name(user)] has placed \a [src] at ([x],[y],[z]).")
+
+//let them know the mine's done cooking
+/obj/item/mine/proc/now_armed()
+ armed = TRUE
+ update_appearance(UPDATE_ICON_STATE)
+ playsound(src, 'sound/machines/nuke/angry_beep.ogg', 55, FALSE, 1)
+ visible_message("\The [src] beeps softly, indicating it is now active.", vision_distance = COMBAT_MESSAGE_RANGE)
+
+/// Can this mine trigger on the passed movable?
+/obj/item/mine/proc/can_trigger(atom/movable/on_who)
+ //var/badtype = typecacheof(list(/obj/effect, /obj/item/mine))
+ if(triggered || !isturf(loc) || !armed || iseffect(on_who) || istype(on_who, /obj/item/mine))
+ return FALSE
+ //if(on_who == badtype)//no recursive self triggering. Bad landmine
+ // return FALSE
+ return TRUE
+
+/// When something sets off a mine
+/obj/item/mine/proc/trigger_mine(atom/movable/triggerer)
+ if(obj_integrity <= 0)
+ return
+ if(triggered) //too busy detonating to detonate again
+ return
+ if(triggerer)
+ triggerer.visible_message(span_danger("[icon2html(src, viewers(src))] [triggerer] sets off \the [src]. It's gonna blow!"), span_danger("[icon2html(src, viewers(src))] \The [src] activates."))
+ else
+ visible_message(span_danger("[icon2html(src, viewers(src))] \the [src] begins to flash bright red!"))
+ triggered = TRUE
+ update_appearance(UPDATE_ICON_STATE)
+ if(blast_delay >= 5 DECISECONDS)
+ playsound(src, 'sound/items/mine_activate.ogg', 70, FALSE)
+ else
+ playsound(src, 'sound/items/mine_activate_short.ogg', 80, FALSE)
+ light_color = "#FF0000"
+ light_power = 5
+ light_range = 3
+ if(!blast_delay)//addtimer gets mad if the delay is 0
+ blast_now(triggerer)
+ else
+ addtimer(CALLBACK(src, PROC_REF(blast_now), triggerer), blast_delay)
+
+//NOW we actually blow up
+/obj/item/mine/proc/blast_now(atom/movable/triggerer)
+ var/datum/effect_system/spark_spread/sporks = new /datum/effect_system/spark_spread
+ sporks.set_up(3, 1, src)
+ sporks.start()
+ if(ismob(triggerer))
+ mine_effect(triggerer)
+ else
+ mine_effect()
+ visible_message(span_danger("[icon2html(src, viewers(src))] \the [src] detonates!"))
+ SEND_SIGNAL(src, COMSIG_MINE_TRIGGERED, triggerer)
+ if(triggered)//setting triggered to false in mine_effect() creates a reusable mine
+ qdel(src)
+
+//trying to pick up a live mine is probably up there when it comes to terrible ideas
+/obj/item/mine/attack_hand(mob/user)
+ if(armed)
+ user.visible_message(span_warning("[user] extends their hand towards \the [src]!"), span_userdanger("You extend your arms to pick up \the [src], knowing that it will likely blow up when you touch it!"))
+ if(do_after(user, 5 SECONDS, target = src))//SO SO generous. You can still step back from the edge.
+ if(prob(10))
+ user.visible_message(span_notice("[user] picks up \the [src], which miraculously doesn't explode!"), span_notice("You pick up \the [src], which miraculously doesn't explode!"))
+ disarm()
+ else
+ user.visible_message(span_danger("[user] attempts to pick up \the [src] only to hear a beep as it activates in their hand!"), span_danger("You attempt to pick up \the [src] only to hear a beep as it activates in your hands!"))
+ anchored = FALSE
+ trigger_mine(user)
+ return . =..()
+ else
+ user.visible_message(span_notice("[user] withdraws their hand from \the [src]."), span_notice("You decide against picking up \the [src]."))
+ . =..()
+
+//just don't.
+/obj/item/mine/attackby(obj/item/I, mob/user)
+ if(!armed)
+ to_chat(user, span_notice("You smack \the [src] with [I]. Thankfully, nothing happens."))
+ return
+ else//please stop hitting the live mine with a rock
+ if(user.a_intent != INTENT_HARM)//are you SURE you want to hit the live mine with a rock
+ user.visible_message(user, span_notice("[user] gently pokes \the [src] with [I]. Nothing seems to happen."), span_notice("You gently prod \the [src] with [I]. Thankfully, nothing happens."))
+ else//at this point it's just natural selection
+ user.visible_message(span_danger("[user] hits \the [src] with [I], activating it!"), span_userdanger("[icon2html(src, viewers(src))]You hit \the [src] with [I]. The light goes red."))
+ trigger_mine(user)
+
+//
+//PRESSURE BASED MINE:
+//Mine that explodes when stepped on.
+/obj/item/mine/pressure
+ name = "dummy landmine"
+ /// When true, mines trigger instantly on being stepped upon
+ var/hair_trigger = FALSE
+ /// Has the mine loc been entered?
+ var/clicked = FALSE
+ /// Prevents a mine from being screwdrivable (e.g. cannot be disarmed)
+ var/sealed = FALSE
+ /// Disables the mine without disarming it. perfect for practical jokes
+ var/dud = FALSE
+
+ /// Are the wires exposed?
+ var/open_panel = FALSE
+
+ /// Who's got their foot on the mine's pressure plate
+ /// Stepping on the mine will set this to the first mob who stepped over it
+ /// The mine will not detonate via movement unless the first mob steps off of it
+ var/datum/weakref/foot_on_mine
+
+/obj/item/mine/pressure/Initialize()
+ . = ..()
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
+ COMSIG_ATOM_EXITED = PROC_REF(on_exited),
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
+ wires = new /datum/wires/mine(src)
+
+/obj/item/mine/pressure/examine(mob/user)
+ . = ..()
+ if(hair_trigger)
+ . += span_danger("It's been rigged to detonate as soon as someone steps on it.")
+ else
+ var/atom/movable/unlucky_sod = foot_on_mine?.resolve()
+ if(user == unlucky_sod)
+ . += span_bolddanger("The pressure plate is depressed. Any movement you make will set it off now.")
+ else if(!isnull(unlucky_sod))
+ . += span_danger("The pressure plate is depressed by [unlucky_sod]. Any move they make'll set it off now.")
+
+//step 1: the mistake
+/obj/item/mine/pressure/proc/on_entered(datum/source, atom/movable/arrived)
+ SIGNAL_HANDLER
+ if(!can_trigger(arrived))
+ return
+ // All other movment types rn can easily avoid it
+ if(!(arrived.movement_type == GROUND))
+ return
+ // Someone already on it
+ if(foot_on_mine?.resolve())
+ return
+
+ if(dud == FALSE)//we don't actually need this if the mine's been disabled
+ foot_on_mine = WEAKREF(arrived)
+
+ if(ismob(arrived))
+ var/mob/living/fool = arrived
+ fool.do_alert_animation(fool)
+ if(!hair_trigger)
+ fool.Immobilize(25 DECISECONDS, TRUE)
+ to_chat(fool, span_userdanger("You step on \the [src] and freeze."))
+ visible_message(span_danger("[icon2html(src, viewers(src))] *click*"))
+ if(dud == FALSE)//see wirecutting
+ clicked = TRUE
+ if(hair_trigger)
+ trigger_mine(arrived)
+ playsound(src, 'sound/machines/click.ogg', 100, TRUE)
+
+//step 2: the consequences
+/obj/item/mine/pressure/proc/on_exited(datum/source, atom/movable/gone)
+ SIGNAL_HANDLER
+ if(hair_trigger)
+ return
+ if(!clicked)
+ return
+ if(!can_trigger(gone))
+ return
+ // Check that the guy who's on it is stepping off
+ if(foot_on_mine && !IS_WEAKREF_OF(gone, foot_on_mine))
+ return
+ INVOKE_ASYNC(src, PROC_REF(trigger_mine), gone)
+ foot_on_mine = null
+
+/obj/item/mine/pressure/disarm()
+ clicked = FALSE
+ . = ..()
+
+/obj/item/mine/pressure/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
+ trigger_mine(AM)
+ ..()
+
+//handles disarming(and failing to disarm)
+/obj/item/mine/pressure/attackby(obj/item/I, mob/user)
+ if(I.tool_behaviour == TOOL_SCREWDRIVER)
+ if(sealed)
+ to_chat(user, "You can't see any way to access \the [src]'s wiring.")
+ return
+ open_panel = !open_panel
+ update_appearance(UPDATE_ICON_STATE)
+ to_chat(user, "You [open_panel ? "reveal" : "hide"] \the [src]'s wiring.")
+ I.play_tool_sound(src, 50)
+ return
+ else if(is_wire_tool(I) && open_panel)
+ wires.interact(user)
+ return
+ else
+ . = ..()
+
+//
+//PROXIMITY MINES
+//Mines that explode when someone moves nearby. Simpler, because I don't have to worry about saving step info or disarming logic
+//
+
+/obj/item/mine/proximity
+ name = "dummy proximity mine"
+ blast_delay = 15 DECISECONDS
+ arm_delay = 10 SECONDS//clear the area
+ ///needed for the proximity checks.
+ var/datum/proximity_monitor/proximity_monitor
+ var/proximity_range = 2
+
+/obj/item/mine/proximity/Initialize(mapload)
+ . = ..()
+ START_PROCESSING(SSfastprocess, src)
+
+/obj/item/mine/proximity/examine(mob/user)
+ . = ..()
+ if(armed)
+ . += span_danger("It's been rigged to detonate as soon as someone moves nearby...")
+ else
+ . += span_notice("When armed, it activates based on the proximity of living targets.")
+
+/obj/item/mine/proximity/now_armed()
+ . = ..()
+ proximity_monitor = new(src, proximity_range)
+ light_color = "#FF0000"
+ light_power = 1
+ light_range = 1
+
+/obj/item/mine/proximity/disarm()
+ . = ..()
+ QDEL_NULL(proximity_monitor)
+
+/obj/item/mine/proximity/Destroy()
+ STOP_PROCESSING(SSfastprocess, src)
+ QDEL_NULL(proximity_monitor)
+ . = ..()
+
+/obj/item/mine/proximity/HasProximity(atom/movable/triggerer)
+ if(!iscarbon(triggerer))//let's keep these on player movements for now.
+ return
+ if(!can_trigger(triggerer))
+ return
+ var/mob/living/clueless = triggerer
+ clueless.do_alert_animation(clueless)
+ trigger_mine(triggerer)
+ QDEL_NULL(proximity_monitor)
+ return
+
+//
+//LANDMINE TYPES
+//Rylie please help me make these more immersive
+//
+
+/obj/item/mine/pressure/explosive
+ name = "\improper G-80 Landmine"
+ desc = "An anti-infantry explosive produced during the corporate wars. Watch your step."
+
+ //customize explosive power
+ var/range_devastation = 0
+ var/range_heavy = 1
+ var/range_light = 5
+ var/range_flame = 1
+
+ //using this to indicate pb
+ var/range_flash = 1
+
+ //customize shrapnel. Magnitude zero prevents them from spawning
+ var/shrapnel_type = /obj/projectile/bullet/shrapnel
+ var/shrapnel_magnitude = 3
+
+ /// If TRUE, we spawn extra pellets to eviscerate a person still sitting on it, otherwise it just spawns a ring of pellets around the tile we're on (making setting it off an offensive move)
+ var/shred_triggerer = TRUE
+
+ manufacturer = MANUFACTURER_SCARBOROUGH
+
+/obj/item/mine/pressure/explosive/mine_effect(mob/victim)
+ explosion(loc, range_devastation, range_heavy, range_light, range_flash, 1, 0, range_flame, 0, 1)
+ if(shrapnel_magnitude > 0)
+ AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_magnitude)
+
+
+/obj/item/mine/pressure/explosive/rusty
+ name = "\improper Rusted Landmine"
+ desc = "An anti-infantry explosive, designed to go off underfoot. This one has seen better days."
+ manufacturer = MANUFACTURER_NONE
+ range_heavy = 0
+ range_light = 3
+ shrapnel_type = /obj/projectile/bullet/shrapnel/rusty
+
+
+/obj/item/mine/pressure/explosive/fire
+ name = "\improper G-82 Incindeary"
+ desc = "An anti-infantry explosive produced during the corporate wars. Transforms into superheated slag and a ball of fire on detonation. "
+
+ range_flame = 6
+ range_light = 3
+ range_flash = 3
+
+ shrapnel_type = /obj/projectile/bullet/shrapnel/hot
+ shrapnel_magnitude = 4
+
+/obj/item/mine/pressure/explosive/fire/mine_effect(mob/victim)
+ if(victim.is_holding(src))//in case it's been picked up
+ for(var/turf/T in view(4,victim))
+ T.IgniteTurf(15)
+ new /obj/effect/hotspot(T)
+ else
+ for(var/turf/T in view(4,src))
+ T.IgniteTurf(15)
+ new /obj/effect/hotspot(T)
+ . = ..()
+
+
+/obj/item/mine/pressure/explosive/heavy
+ name = "\improper G-81 Anti-Tank Mine"
+ desc = "An immense anti-vehicle explosive built during the corporate wars. Someone has recklessly switched out the detonator for one that activates for lighter targets."
+ w_class = WEIGHT_CLASS_BULKY
+ range_heavy = 6
+ range_light = 9
+ shrapnel_magnitude = 7
+ shrapnel_type = /obj/projectile/bullet/shrapnel/mega
+ blast_delay = 50//run.
+ sealed = TRUE//unless we specifically give it to people disarmed, we probably don't want them stealing this
+
+
+/obj/item/mine/pressure/explosive/shrapnel
+ name = "\improper G-84 Fragmentation"
+ desc = "An anti-infantry explosive built during the corporate wars. Metal banding inside creates additional deadly shrapnel on detonation. "
+
+ range_heavy = 1
+ range_light = 4
+
+ shrapnel_magnitude = 6
+ shred_triggerer = TRUE
+
+/obj/item/mine/pressure/explosive/rad
+ name = "\improper G-85 Fission"
+ desc = "An anti-infantry explosive produced during the corporate wars. This one detonates a small microfission core, creating a bloom of deadly radiation. "
+ range_light = 4
+ range_flame = 2
+ shrapnel_magnitude = 7
+ shrapnel_type = /obj/projectile/bullet/shrapnel/spicy
+ var/radpower = 750
+
+/obj/item/mine/pressure/explosive/rad/mine_effect(mob/victim)
+ radiation_pulse(src, radpower, 1)
+ . = ..()
+
+//put this on military ships for disarming practice
+/obj/item/mine/pressure/training
+ name = "\improper G-MTH Defusal Trainer"
+ desc = "A mothballed anti-personnel explosive, equipped with VISCERAL DEFUSAL ACTION for training purposes. Though Scarborough was forced to decomission their stockpiles of mines as part of the ceasefire, the deployed minefields remain."
+ arm_delay = 2 SECONDS
+ manufacturer = MANUFACTURER_SCARBOROUGH
+
+/obj/item/mine/pressure/training/mine_effect(mob/living/victim)
+ src.say("BOOM! Better luck next time!")
+ src.visible_message(span_notice("The mine resets itself for another disarming attempt."))
+ triggered = FALSE
+ disarm()
+ . = ..()
+
+/obj/item/mine/pressure/gas
+ name = "chilled vapor mine"
+ desc = "A non-lethal security deterrent."
+ var/gas_amount = 500
+ var/gas_type = "water_vapor"
+ hair_trigger = TRUE
+
+/obj/item/mine/pressure/gas/mine_effect(mob/victim)
+ atmos_spawn_air("[gas_type]=[gas_amount]")
+
+
+/obj/item/mine/proximity/explosive
+ name = "\improper G-80P Bouncer"
+ desc = "An anti-infantry explosive produced during the corporate wars. This one has been rearmed with a proximity movement detector."
+
+ var/range_devastation = 0
+ var/range_heavy = 2
+ var/range_light = 4
+ var/range_flame = 1
+
+ var/range_flash = 1
+
+ var/shrapnel_type = /obj/projectile/bullet/shrapnel
+ var/shrapnel_magnitude = 5
+
+ manufacturer = MANUFACTURER_SCARBOROUGH
+
+/obj/item/mine/proximity/explosive/mine_effect(mob/victim)
+ explosion(loc, range_devastation, range_heavy, range_light, range_flash, 1, 0, range_flame, 0, 1)
+ if(shrapnel_magnitude > 0)
+ AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_magnitude)
+
+
+//like all real 'less' than lethal crowd control options this is, in fact, not very good at being nonlethal
+/obj/item/mine/proximity/explosive/sting
+ name = "\improper'Stinger' Crowd Management Device"
+ desc = "A \"less\" than lethal crowd control weapon, designed to demoralise and scatter anti-NT protestors. The bands of ballistic gel inside strike targets and incapacitate without causing serious maiming. In Theory."
+
+ range_heavy = 0
+ range_light = 1
+ range_flash = 3
+ range_flame = 0
+
+ shrapnel_magnitude = 8
+ shrapnel_type = /obj/projectile/bullet/pellet/stingball
+ manufacturer = MANUFACTURER_NANOTRASEN_OLD
+
+
+/obj/item/mine/proximity/explosive/plasma
+ name = "\improper Etherbor EP-3"
+ desc = "An anti-infantry explosive designed by the PGF for denial of territory to enemy forces. Radiates high energy plasma to eradicate nearby targets."
+ range_light = 2
+ range_flame = 3
+ range_heavy = 0
+ shrapnel_magnitude = 8
+ shrapnel_type = /obj/projectile/energy/plasmabolt
+ manufacturer = MANUFACTURER_PGF
+
+/obj/item/mine/proximity/explosive/plasma/mine_effect(mob/victim)
+ if(victim.is_holding(src))//in case it's been picked up
+ for(var/turf/T in view(3,victim))
+ T.IgniteTurf(25, "green")
+ else
+ for(var/turf/T in view(3,src))
+ T.IgniteTurf(25, "green")
+ . = ..()
+
+//Manhacks... so pretty...
+/obj/item/mine/proximity/spawner
+ name = "debug spawner mine"
+ desc = "Real no Virus. 100% free. Coders hate him!"
+ var/spawn_type = null //manhacks go here :)
+ var/spawn_number = 5
+
+/obj/item/mine/proximity/spawner/mine_effect(mob/victim)
+ if(isturf(loc))
+ var/turf/T = get_turf(src)
+ playsound(T, 'sound/effects/phasein.ogg', 100, TRUE)
+ spawn_and_random_walk(spawn_type, T, spawn_number, walk_chance=50, admin_spawn=((flags_1 & ADMIN_SPAWNED_1) ? TRUE : FALSE))
+ . = ..()
+
+/obj/item/mine/proximity/spawner/manhack
+ name = "\improper P-83 Lacerator"
+ desc = "An anti-infantry device produced during the corporate wars. The explosive payload has been swapped out for 'viscerator'-type antipersonnel drones."
+ spawn_type = /mob/living/simple_animal/hostile/viscerator
+
+//
+//GIMMICK MINES//
+//pretty much exclusively for adminbus & code dependencies
+//
+
+/obj/item/mine/pressure/kickmine
+ name = "\improper A-00 'Adminbus'"
+ desc = "An Anti-Griefer proximity expulsive. Delivers Justice."
+ blast_delay = null//funnier this way
+ hair_trigger = TRUE
+
+/obj/item/mine/pressure/kickmine/mine_effect(mob/victim)
+ if(isliving(victim) && victim.client && Adjacent(victim))
+ to_chat(victim, span_userdanger("You have been kicked from the game. Take this time to think about what you've done."))
+ qdel(victim.client)
+
+/obj/item/mine/pressure/sound
+ name = "sonic mine"
+ desc = "A potent tool of psychological warfare."
+ var/sound = 'sound/effects/adminhelp.ogg'
+ blast_delay = null
+ hair_trigger = TRUE
+
+/obj/item/mine/pressure/sound/mine_effect(mob/victim)
+ playsound(loc, sound, 100, TRUE)
+
+/obj/item/mine/pressure/pickup
+ name = "pickup mine"
+ desc = "does nothing"
+ icon = 'icons/obj/marg.dmi'
+ icon_state = "marg"
+ density = FALSE
+ var/duration = 0
+ pixel_x = -8
+ pixel_y = 1
+ anchored = TRUE
+ armed = TRUE
+ blast_delay = null
+ hair_trigger = TRUE
+
+/obj/item/mine/pressure/pickup/Initialize()
+ . = ..()
+ animate(src, time = 20, loop = -1)
+
+/obj/item/mine/pressure/pickup/trigger_mine(mob/victim)
+ if(triggered)
+ return
+ triggered = TRUE
+ invisibility = INVISIBILITY_ABSTRACT
+ mine_effect(victim)
+ qdel(src)
+
+
+/obj/item/mine/pressure/pickup/bloodbath
+ name = "bloody orb"
+ desc = "Embrace righteous fury."
+ duration = 1200 //2min
+ color = "#FF0000"
+ var/mob/living/doomslayer
+ var/obj/item/chainsaw/doomslayer/chainsaw
+
+/obj/item/mine/pressure/pickup/bloodbath/mine_effect(mob/living/carbon/victim)
+ if(!victim.client || !istype(victim))
+ return
+ to_chat(victim, "RIP AND TEAR")
+
+ INVOKE_ASYNC(src, PROC_REF(blood_delusion), victim)
+
+ chainsaw = new(victim.loc)
+ victim.log_message("entered a marg frenzy", LOG_ATTACK)
+
+ ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT)
+ victim.drop_all_held_items()
+ victim.put_in_hands(chainsaw, forced = TRUE)
+ chainsaw.attack_self(victim)
+ victim.reagents.add_reagent(/datum/reagent/medicine/adminordrazine,25)
+ to_chat(victim, "KILL, KILL, KILL! YOU HAVE NO ALLIES ANYMORE, KILL THEM ALL!")
+
+ var/datum/client_colour/colour = victim.add_client_colour(/datum/client_colour/bloodlust)
+ QDEL_IN(colour, 11)
+ doomslayer = victim
+ RegisterSignal(src, COMSIG_PARENT_QDELETING, PROC_REF(end_blood_frenzy))
+ QDEL_IN(WEAKREF(src), duration)
+
+/obj/item/mine/pressure/pickup/bloodbath/proc/end_blood_frenzy()
+ if(doomslayer)
+ to_chat(doomslayer, "Your bloodlust seeps back into the bog of your subconscious and you regain self control.")
+ doomslayer.log_message("exited a blood frenzy", LOG_ATTACK)
+ if(chainsaw)
+ qdel(chainsaw)
+
+/obj/item/mine/pressure/pickup/bloodbath/proc/blood_delusion(mob/living/carbon/victim)
+ new /datum/hallucination/delusion(victim, TRUE, "demon", duration, 0)
+
+/obj/item/mine/pressure/pickup/healing
+ name = "healing orb"
+ desc = "Your wounds shall be undone."
+
+/obj/item/mine/pressure/pickup/healing/mine_effect(mob/living/carbon/victim)
+ if(!victim.client || !istype(victim))
+ return
+ to_chat(victim, "You feel great!")
+ victim.revive(full_heal = TRUE, admin_revive = TRUE)
+
+/obj/item/mine/pressure/pickup/speed
+ name = "quick orb"
+ desc = "Quickens you."
+ duration = 300
+
+/obj/item/mine/pressure/pickup/speed/mine_effect(mob/living/carbon/victim)
+ if(!victim.client || !istype(victim))
+ return
+ to_chat(victim, "You feel fast!")
+ victim.add_movespeed_modifier(/datum/movespeed_modifier/yellow_orb)
+ addtimer(CALLBACK(src, PROC_REF(finish_effect), victim), duration)
+
+/obj/item/mine/pressure/pickup/speed/proc/finish_effect(mob/living/carbon/victim)
+ victim.remove_movespeed_modifier(/datum/movespeed_modifier/yellow_orb)
+ to_chat(victim, "You slow down.")
+
+
+
+//
+//mapping tool that generates "live" variants of all mine subtypes, which are anchored and ready to blow.
+//Add new mine variants you make below as a LIVE_MINE_HELPER define containing their subtyping.
+//
+
+#define LIVE_MINE_HELPER(mine_type) \
+ /obj/item/mine/##mine_type/live { \
+ anchored = TRUE; \
+ armed = TRUE; \
+ }
+
+LIVE_MINE_HELPER(pressure/explosive)
+LIVE_MINE_HELPER(pressure/explosive/fire)
+LIVE_MINE_HELPER(pressure/explosive/rusty)
+LIVE_MINE_HELPER(pressure/explosive/rad)
+LIVE_MINE_HELPER(pressure/explosive/heavy)
+LIVE_MINE_HELPER(pressure/explosive/shrapnel)
+
+LIVE_MINE_HELPER(proximity/explosive)
+LIVE_MINE_HELPER(proximity/explosive/sting)
+LIVE_MINE_HELPER(proximity/spawner/manhack)
+LIVE_MINE_HELPER(proximity/explosive/plasma)
+
+LIVE_MINE_HELPER(pressure/gas)
+LIVE_MINE_HELPER(pressure/kickmine)
+LIVE_MINE_HELPER(pressure/sound)
+
+//
+// spawners (random mines, minefields, non-guaranteed mine)
+//
+
+/obj/effect/spawner/lootdrop/mine
+ name = "live mine spawner (random)"
+ lootcount = 1
+ fan_out_items = TRUE
+ loot = list(
+ /obj/item/mine/pressure/explosive/live = 10,
+ /obj/item/mine/pressure/explosive/shrapnel/live = 3,
+ /obj/item/mine/pressure/explosive/rad/live = 3,
+ /obj/item/mine/pressure/explosive/fire/live = 3)
+
+/obj/effect/spawner/minefield
+ name = "minefield spawner"
+ var/minerange = 9
+ var/minetype = /obj/item/mine/pressure/explosive/rusty/live
+
+/obj/effect/spawner/minefield/Initialize(mapload)
+ . = ..()
+ for(var/turf/open/T in view(minerange,loc))
+ if(prob(5))
+ new minetype(T)
+
+/obj/effect/spawner/minefield/random
+ name = "random minefield spawner"
+ minetype = /obj/effect/spawner/lootdrop/mine
+
+/obj/effect/spawner/minefield/manhack
+ name = "manhack field spawner"
+ minetype = /obj/item/mine/proximity/spawner/manhack/live
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index bf08b704beb0..61486cf07bf2 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -85,7 +85,7 @@
pai.master_dna = M.dna.unique_enzymes
to_chat(pai, "You have been bound to a new master.")
pai.laws.set_zeroth_law("Serve your master.")
- pai.emittersemicd = FALSE
+ pai.emittercurrent_cooldown = FALSE
if(href_list["wipe"])
var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No")
if(confirm == "Yes")
diff --git a/code/game/objects/items/devices/portable_chem_mixer.dm b/code/game/objects/items/devices/portable_chem_mixer.dm
index fa777fec1124..1964e2dbd04a 100644
--- a/code/game/objects/items/devices/portable_chem_mixer.dm
+++ b/code/game/objects/items/devices/portable_chem_mixer.dm
@@ -1,7 +1,7 @@
/obj/item/storage/portable_chem_mixer
name = "Portable Chemical Mixer"
desc = "A portable device that dispenses and mixes chemicals. Can be upgraded to hold more beakers by inserting a vortex anomaly core. All necessary reagents need to be supplied with beakers. A label indicates that a screwdriver is required to open it for refills. This device can be worn on a belt. The letters 'S&T' are imprinted on the side."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "portablechemicalmixer_open"
w_class = WEIGHT_CLASS_HUGE
slot_flags = ITEM_SLOT_BELT
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 3a6ba2f73950..5b69cab9cc7b 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -10,6 +10,7 @@
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
flags_1 = CONDUCT_1
+ item_flags = NO_PIXEL_RANDOM_DROP
throwforce = 5
throw_speed = 1
throw_range = 2
diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm
index 60cfe4eb89b3..6fa07cf3f8ce 100644
--- a/code/game/objects/items/devices/pressureplates.dm
+++ b/code/game/objects/items/devices/pressureplates.dm
@@ -2,7 +2,6 @@
name = "pressure plate"
desc = "An electronic device that triggers when stepped on. Ctrl-Click to toggle the pressure plate off and on."
icon = 'icons/obj/puzzle_small.dmi'
- item_state = "flash"
icon_state = "pressureplate"
layer = LOW_OBJ_LAYER
var/trigger_mob = TRUE
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 0904cdef3676..f8ced22c54be 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -42,9 +42,14 @@
/obj/item/encryptionkey/minutemen
name = "minutemen encryption key"
- icon_state = "clip_cypherkey"
+ icon_state = "cmm_cypherkey"
channels = list(RADIO_CHANNEL_MINUTEMEN = 1)
+/obj/item/encryptionkey/pgf
+ name = "pgf encryption key"
+ icon_state = "bin_cypherkey"
+ channels = list(RADIO_CHANNEL_PGF = 1)
+
/obj/item/encryptionkey/inteq
name = "inteq encryption key"
icon_state = "irmg_cypherkey"
@@ -57,7 +62,7 @@
/obj/item/encryptionkey/headset_com
name = "command radio encryption key"
- icon_state = "comm_cypherkey"
+ icon_state = "com_cypherkey"
channels = list(RADIO_CHANNEL_COMMAND = 1)
/obj/item/encryptionkey/heads/captain
@@ -83,6 +88,11 @@
icon_state = "solgov_cypherkey"
channels = list(RADIO_CHANNEL_SOLGOV = 1)
+// /obj/item/encryptionkey/suns
+// name = "\improper SUNS encryption key"
+// icon_state = "suns_cypherkey"
+// channels = list(RADIO_CHANNEL_SUNS = 1)
+
/obj/item/encryptionkey/wideband
name = "wideband encryption key"
icon = 'icons/obj/radio.dmi'
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 574dd88e5cc4..0f0081c90454 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -7,6 +7,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
RADIO_CHANNEL_SYNDICATE = RADIO_TOKEN_SYNDICATE,
RADIO_CHANNEL_NANOTRASEN = RADIO_TOKEN_NANOTRASEN, //Shiptest edits - faction channels, removed department channels
RADIO_CHANNEL_MINUTEMEN = RADIO_TOKEN_MINUTEMEN,
+ RADIO_CHANNEL_PGF = RADIO_TOKEN_PGF,
RADIO_CHANNEL_INTEQ = RADIO_TOKEN_INTEQ,
RADIO_CHANNEL_PIRATE = RADIO_TOKEN_PIRATE,
MODE_BINARY = MODE_TOKEN_BINARY,
@@ -21,6 +22,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
custom_materials = list(/datum/material/iron=75)
subspace_transmission = TRUE
headset = TRUE
+ listening = TRUE
canhear_range = 0 // can't hear headsets from very far away
slot_flags = ITEM_SLOT_EARS
@@ -79,7 +81,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "bowman headset"
desc = "An updated, modular intercom that fits over the head. Protects ears from flashbangs."
icon_state = "headset_alt"
- item_state = "headset_alt"
/obj/item/radio/headset/alt/ComponentInitialize()
. = ..()
@@ -90,7 +91,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "syndicate headset"
desc = "A headset worn by members of the various Syndicate splinters on the frontier."
icon_state = "syndie_headset"
- item_state = "syndie_headset"
keyslot = new /obj/item/encryptionkey/syndicate
/obj/item/radio/headset/syndicate/captain
@@ -103,7 +103,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "syndicate bowman headset"
desc = "A headset worn by members of the various Syndicate splinters on the frontier. Protects ears from flashbangs."
icon_state = "syndie_headset_alt"
- item_state = "syndie_headset_alt"
/obj/item/radio/headset/syndicate/alt/captain
name = "syndicate leader bowman headset"
@@ -119,6 +118,26 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "team leader headset"
command = TRUE
+/obj/item/radio/headset/syndicate/suns
+ name = "SUNS headset"
+ icon_state = "suns_headset"
+ desc = "A headset worn by staff and students of SUNS, both in the frontier and elsewhere."
+
+/obj/item/radio/headset/syndicate/suns/command
+ name = "SUNS command headset"
+ desc = "A headset worn by staff and students of SUNS, both in the frontier and elsewhere. This one is worn by command staff."
+ command = TRUE
+
+/obj/item/radio/headset/syndicate/alt/suns
+ name = "SUNS bowman headset"
+ icon_state = "suns_headset_alt"
+ desc = "A headset worn by staff and students of SUNS, both in the frontier and elsewhere. Protects ears from distractions during exams."
+
+/obj/item/radio/headset/syndicate/alt/suns/command
+ name = "SUNS bowman command headset"
+ desc = "A headset worn by staff and students of SUNS, both in the frontier and elsewhere. This one is worn by command staff. Protects ears from distractions during exams."
+ command = TRUE
+
//nanotrasen
/obj/item/radio/headset/nanotrasen
name = "nanotrasen radio headset"
@@ -136,7 +155,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "nanotrasen bowman headset"
desc = "Worn proudly by the battered remnants of Nanotrasen's frontier holdings. Protects ears from flashbangs."
icon_state = "nanotrasen_headset_alt"
- item_state = "nanotrasen_headset_alt"
/obj/item/radio/headset/nanotrasen/alt/captain
name = "nanotrasen captain's bowman headset"
@@ -163,9 +181,8 @@ GLOBAL_LIST_INIT(channel_tokens, list(
/obj/item/radio/headset/clip/alt
name = "minutemen bowman headset"
- desc = "Used by militias flying the five stars of the CLIP Minutemen. Protects ears from flashbangs."
- icon_state = "clip_headset_alt"
- item_state = "clip_headset_alt"
+ desc = "Used by militias flying the five stars of the Colonial Minutemen. Protects ears from flashbangs."
+ mob_overlay_state = "cmm_headset_alt"
/obj/item/radio/headset/clip/alt/captain
name = "minuteman officer bowman headset"
@@ -194,7 +211,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "inteq bowman headset"
desc = "This is used by Inteq Risk Management Group's mercenaries. Protects ears from flashbangs."
icon_state = "inteq_headset_alt"
- item_state = "inteq_headset_alt"
/obj/item/radio/headset/inteq/alt/captain
name = "vanguard bowman headset"
@@ -223,7 +239,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "pirate bowman headset"
desc = "Used to sing shanties across the vast emptiness of space, and complain about Minuteman patrols. Protects ears from flashbangs."
icon_state = "pirate_headset_alt"
- item_state = "pirate_headset_alt"
/obj/item/radio/headset/pirate/alt/captain
name = "pirate captain bowman headset"
@@ -235,6 +250,29 @@ GLOBAL_LIST_INIT(channel_tokens, list(
. = ..()
AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS))
+//PGF
+/obj/item/radio/headset/pgf
+ name = "\improper PGF headset"
+ desc = "A headset often worn by members of the PGFN and PGFMC."
+ keyslot = new /obj/item/encryptionkey/pgf
+
+/obj/item/radio/headset/pgf/captain
+ name = "\improper PGF official radio headset"
+ desc = "Worn by various officials and leaders serving the PGFN or PGFMC."
+ keyslot2 = new /obj/item/encryptionkey/heads/captain
+ command = TRUE
+
+/obj/item/radio/headset/pgf/alt
+ name = "\improper PGF bowman headset"
+ desc = "A headset often worn by members of the PGFN and PGFMC. Protects ears from flashbangs."
+ icon_state = "solgov_headset_alt"
+
+/obj/item/radio/headset/pgf/alt/captain
+ name = "\improper PGF official bowman headset"
+ desc = "Worn by various officials and leaders serving the PGFN or PGFMC. Protects ears from flashbangs."
+ keyslot2 = new /obj/item/encryptionkey/heads/captain
+ command = TRUE
+
//solgov
/obj/item/radio/headset/solgov
name = "\improper SolGov headset"
@@ -274,7 +312,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "command bowman headset"
desc = "An officer's headset. Protects ears from flashbangs."
icon_state = "com_headset_alt"
- item_state = "com_headset_alt"
/obj/item/radio/headset/headset_com/alt/ComponentInitialize()
. = ..()
@@ -294,7 +331,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "captain's bowman headset"
desc = "Dresses the ears of independent ship captains across the frontier. Protects ears from flashbangs."
icon_state = "com_headset_alt"
- item_state = "com_headset_alt"
/obj/item/radio/headset/heads/captain/alt/ComponentInitialize()
. = ..()
@@ -326,7 +362,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "\improper CentCom bowman headset"
desc = "A headset especially for emergency response personnel. Protects ears from flashbangs."
icon_state = "cent_headset_alt"
- item_state = "cent_headset_alt"
keyslot = null
/obj/item/radio/headset/headset_cent/alt/ComponentInitialize()
@@ -354,7 +389,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "security bowman headset"
desc = "This is used by your elite security force. Protects ears from flashbangs."
icon_state = "sec_headset_alt"
- item_state = "sec_headset_alt"
/obj/item/radio/headset/headset_sec/alt/ComponentInitialize()
. = ..()
@@ -423,7 +457,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "\proper the head of security's bowman headset"
desc = "The headset of the man in charge of keeping order and protecting the innocent. Protects ears from flashbangs."
icon_state = "com_headset_alt"
- item_state = "com_headset_alt"
/obj/item/radio/headset/heads/hos/ComponentInitialize()
. = ..()
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index a91789c542cd..944fe7462583 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/radio.dmi'
icon_state = "intercom"
anchored = TRUE
+ listening = TRUE
w_class = WEIGHT_CLASS_BULKY
canhear_range = 2
dog_fashion = null
@@ -152,6 +153,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom, 31)
/obj/item/wallframe/intercom/table
icon_state = "intercom-table"
+ icon = 'icons/obj/radio.dmi'
result_path = /obj/item/radio/intercom/table
pixel_shift = 0
@@ -197,5 +199,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/wideband, 26)
/obj/item/wallframe/intercom/wideband/table
icon_state = "intercom-wideband-table"
+ icon = 'icons/obj/radio.dmi'
result_path = /obj/item/radio/intercom/wideband/table
pixel_shift = 0
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index e95ab85cda9d..cc528f103fe2 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -2,7 +2,9 @@
icon = 'icons/obj/radio.dmi'
name = "shortwave radio"
icon_state = "walkietalkie"
- item_state = "walkietalkie"
+ item_state = "radio"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
desc = "A basic handheld radio that communicates with local telecommunication networks."
pickup_sound = 'sound/items/handling/device_pickup.ogg'
drop_sound = 'sound/items/handling/device_drop.ogg'
@@ -25,7 +27,7 @@
var/last_chatter_time // The time since we last played a radio chatter sound. (WS edit - Radio Chatter #434)
var/broadcasting = FALSE // Whether the radio will transmit dialogue it hears nearby.
- var/listening = TRUE // Whether the radio is currently receiving.
+ var/listening = FALSE // Whether the radio is currently receiving.
var/prison_radio = FALSE // If true, the transmit wire starts cut.
var/unscrewed = FALSE // Whether wires are accessible. Toggleable by screwdrivering.
var/freerange = FALSE // If true, the radio has access to the full spectrum.
@@ -434,12 +436,6 @@
recalculateChannels()
-
-/obj/item/radio/off // Station bounced radios, their only difference is spawning with the speakers off, this was made to help the lag.
- listening = 0 // And it's nice to have a subtype too for future features.
- dog_fashion = /datum/dog_fashion/back
-
-
/obj/item/radio/old
name = "old radio"
icon_state = "radio"
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 3f40f82fe0ae..cdded7e418ef 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -357,7 +357,7 @@ GENE SCANNER
if(blood_id)
if(ishuman(C))
var/mob/living/carbon/human/H = C
- if(H.bleed_rate)
+ if(LAZYLEN(H.get_bleeding_parts()))
render_list += "Subject is bleeding!\n"
var/blood_percent = round((C.blood_volume / BLOOD_VOLUME_NORMAL)*100)
var/blood_type = C.dna.blood_type.name
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index 4f034824e2f4..b25cc10636e2 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -185,7 +185,7 @@ effective or pretty fucking useless.
name = "cloaker belt"
desc = "Makes you invisible for short periods of time. Recharges in darkness."
icon = 'icons/obj/clothing/belts.dmi'
- icon_state = "utilitybelt"
+ icon_state = "utility"
item_state = "utility"
slot_flags = ITEM_SLOT_BELT
attack_verb = list("whipped", "lashed", "disciplined")
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index 34563d5e649c..a11539595805 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -62,7 +62,7 @@
if(target != user)
target.visible_message("[user] is trying to inject [target] with [src]!", \
"[user] is trying to inject you with [src]!")
- if(!do_mob(user, target) || used)
+ if(!do_after(user, target = target) || used)
return
target.visible_message("[user] injects [target] with the syringe with [src]!", \
"[user] injects you with the syringe with [src]!")
@@ -90,11 +90,6 @@
desc = "This will make you big and strong, but give you a bad skin condition."
add_mutations = list(HULK)
-/obj/item/dnainjector/firebreath
- name = "\improper DNA injector (Fire Breath)"
- desc = "Restores the dragon ancestry."
- add_mutations = list(FIREBREATH)
-
/obj/item/dnainjector/xraymut
name = "\improper DNA injector (X-ray)"
desc = "Finally you can see what the Captain does."
diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm
index dc49ee2dc6ae..7ddb02035927 100644
--- a/code/game/objects/items/dualsaber.dm
+++ b/code/game/objects/items/dualsaber.dm
@@ -65,7 +65,7 @@
/obj/item/dualsaber/update_icon_state()
- icon_state = wielded ? "dualsaber[saber_color][wielded]" : "dualsaber0"
+ icon_state = wielded ? "dualsaber[saber_color]" : "dualsaber"
return ..()
/obj/item/dualsaber/Initialize()
diff --git a/code/game/objects/items/dyekit.dm b/code/game/objects/items/dyekit.dm
index 2cbfbca6332b..86c6e90a3290 100644
--- a/code/game/objects/items/dyekit.dm
+++ b/code/game/objects/items/dyekit.dm
@@ -38,3 +38,30 @@
return
playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5)
human_target.update_hair()
+
+/obj/item/colorsalve
+ name = "Elzuose color salve"
+ desc = "A Kalixcian beauty product for Elzuose that comes in the form of a salve packaged with various color additives. Used to temporarily change the pigment color of light emitting cells in the skin, requiring an extensive amount of time to prepare and apply. Wears off after a few hours."
+ icon = 'icons/obj/dyespray.dmi'
+ icon_state = "colorsalve"
+
+/obj/item/colorsalve/attack_self(mob/living/user)
+ if(!iselzuose(user))
+ return
+
+ var/mob/living/carbon/human/H = user
+ var/datum/species/elzuose/species_datum = H.dna.species
+ // select new color
+ var/new_etherealcolor = input(user, "Choose your Elzuose color:", "Character Preference", species_datum.default_color) as color|null
+ if(new_etherealcolor)
+ var/temp_hsv = RGBtoHSV(new_etherealcolor)
+ if(ReadHSV(temp_hsv)[3] >= ReadHSV("#505050")[3]) // elzu colors should be bright ok??
+ if(!do_after(usr, 30 SECONDS, user))
+ return
+ playsound(src, 'sound/effects/ointment.ogg', 5, TRUE, 5)
+ species_datum.default_color = sanitize_hexcolor(new_etherealcolor, 6, TRUE)
+ species_datum.current_color = species_datum.health_adjusted_color(user, species_datum.default_color)
+ species_datum.spec_updatehealth(user)
+ user.visible_message(span_notice("[user] applies the salve, changing [user.p_their()] color to [new_etherealcolor]"))
+ else
+ to_chat(user, span_danger("Invalid color. Your color is not bright enough."))
diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm
index 111dd3aa96bc..1396521aaf9a 100644
--- a/code/game/objects/items/eightball.dm
+++ b/code/game/objects/items/eightball.dm
@@ -59,7 +59,7 @@
shaking = TRUE
start_shaking(user)
- if(do_after(user, shake_time, needhand=TRUE, target=user, progress=TRUE))
+ if(do_after(user, shake_time, target=user))
var/answer = get_answer()
say(answer)
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index 6a1e439422a4..813e53111f61 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -183,9 +183,9 @@
update_appearance()
#define REQUIRED_POWER_TO_FIRE_FLAMETHROWER 10
-#define FLAMETHROWER_POWER_MULTIPLIER 0.5
-#define FLAMETHROWER_RANGE 4
-#define FLAMETHROWER_RELEASE_AMOUNT 8
+#define FLAMETHROWER_POWER_MULTIPLIER 0.8
+#define FLAMETHROWER_RANGE 5
+#define FLAMETHROWER_RELEASE_AMOUNT 5
/obj/item/flamethrower/proc/flame_turf(target)
if(!beaker)
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 0681892fd47e..f3cdfb068944 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -247,19 +247,6 @@
user.Stun(40, ignore_canstun = TRUE)
user.petrify(30)
-/obj/item/book/granter/spell/cards
- spell = /obj/effect/proc_holder/spell/aimed/spell_cards
- spellname = "spellcards"
- icon_state ="bookspellcards"
- desc = "The ultimate card trick, for users ten and up."
- remarks = list("It's all about the razzmataz.", "...I don't think I'll actually be sawing anyone in half", "These are pretty flimsy, most armor would defeat them.", "They do burn damage? Weird.", "Why the dumb stance? It's just a flick of the hand...", "Are these cards? They feel stiffer then pages.", "Best performed using a top hat...")
-
-/obj/item/book/granter/spell/cards/recoil(mob/living/user)
- ..()
- to_chat(user,"The cards are against you!")
- user.Stun(40, ignore_canstun = TRUE)
- user.petrify(30)
-
/obj/item/book/granter/spell/shapechange
spell = /obj/effect/proc_holder/spell/targeted/shapeshift
spellname = "shapechange"
diff --git a/code/game/objects/items/grenades/discogrenade.dm b/code/game/objects/items/grenades/discogrenade.dm
index be2ec68f0cb1..84ce765d59d3 100644
--- a/code/game/objects/items/grenades/discogrenade.dm
+++ b/code/game/objects/items/grenades/discogrenade.dm
@@ -91,7 +91,7 @@
return
if(target.stat != CONSCIOUS) //Only conscious people can dance
return
- if(!target || isethereal(target)) //Non humans and non etherals can't dance
+ if(!target || iselzuose(target)) //Non humans and non etherals can't dance
return
var/distance = max(0,get_dist(get_turf(src), target_turf))
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 01f147a1b1d0..9fece4feedd4 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -57,7 +57,8 @@
"[user] is trying to put [src.name] on you!")
playsound(loc, cuffsound, 30, TRUE, -2)
- if(do_mob(user, C, 30) && C.canBeHandcuffed())
+ log_combat(user, C, "attempted to handcuff")
+ if(do_after(user, 3 SECONDS, C) && C.canBeHandcuffed())
if(iscyborg(user))
apply_cuffs(C, user, TRUE)
else
@@ -217,7 +218,7 @@
desc = "Use this to keep prisoners in line."
gender = PLURAL
icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "legcuff"
+ icon_state = "handcuff"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
flags_1 = CONDUCT_1
@@ -272,6 +273,11 @@
update_appearance()
playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
+/obj/item/restraints/legcuffs/beartrap/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
+ if(armed)
+ close_trap()
+ ..()
+
/obj/item/restraints/legcuffs/beartrap/proc/on_entered(datum/source, AM as mob|obj)
SIGNAL_HANDLER
if(armed && isturf(loc))
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index cd01cef70503..0affcd107af0 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -1,150 +1,12 @@
// CHAPLAIN CUSTOM ARMORS //
-/obj/item/clothing/head/helmet/chaplain
- name = "crusader helmet"
- desc = "Deus Vult."
- icon_state = "knight_templar"
- item_state = "knight_templar"
- armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
- flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
- strip_delay = 80
- dog_fashion = null
-
-/obj/item/clothing/suit/armor/riot/chaplain
- name = "crusader armour"
- desc = "God wills it!"
- icon_state = "chaplain_templar"
- item_state = "knight_templar"
- allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
- slowdown = 0
- clothing_flags = NONE
-
-/obj/item/choice_beacon/holy
- name = "armaments beacon"
- desc = "Contains a set of armaments for the chaplain."
-
-/obj/item/choice_beacon/holy/canUseBeacon(mob/living/user)
- if(user.mind && user.mind.holy_role)
- return ..()
- else
- playsound(src, 'sound/machines/buzz-sigh.ogg', 40, TRUE)
- return FALSE
-
-/obj/item/choice_beacon/holy/generate_display_names()
- var/static/list/holy_item_list
- if(!holy_item_list)
- holy_item_list = list()
- var/list/templist = typesof(/obj/item/storage/box/holy)
- for(var/V in templist)
- var/atom/A = V
- holy_item_list[initial(A.name)] = A
- return holy_item_list
-
-/obj/item/choice_beacon/holy/spawn_option(obj/choice,mob/living/M)
- if(!GLOB.holy_armor_type)
- ..()
- playsound(src, 'sound/effects/pray_chaplain.ogg', 40, TRUE)
- SSblackbox.record_feedback("tally", "chaplain_armor", 1, "[choice]")
- GLOB.holy_armor_type = choice
- else
- to_chat(M, "A selection has already been made. Self-Destructing...")
- return
-
-
/obj/item/storage/box/holy
- name = "Templar Kit"
-
-/obj/item/storage/box/holy/PopulateContents()
- new /obj/item/clothing/head/helmet/chaplain(src)
- new /obj/item/clothing/suit/armor/riot/chaplain(src)
-
-/obj/item/storage/box/holy/student
- name = "Profane Scholar Kit"
-
-/obj/item/storage/box/holy/student/PopulateContents()
- new /obj/item/clothing/suit/armor/riot/chaplain/studentuni(src)
- new /obj/item/clothing/head/helmet/chaplain/cage(src)
-
-/obj/item/clothing/suit/armor/riot/chaplain/studentuni
- name = "student robe"
- desc = "The uniform of a bygone institute of learning."
- icon_state = "chaplain_studentuni"
- item_state = "studentuni"
- body_parts_covered = ARMS|CHEST
- allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
-
-/obj/item/clothing/head/helmet/chaplain/cage
- name = "cage"
- desc = "A cage that restrains the will of the self, allowing one to see the profane world for what it is."
- flags_inv = HIDEHAIR //bald
- mob_overlay_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
- icon_state = "cage"
- item_state = "cage"
- worn_x_dimension = 64
- worn_y_dimension = 64
-
-/obj/item/storage/box/holy/sentinel
- name = "Stone Sentinel Kit"
-
-/obj/item/storage/box/holy/sentinel/PopulateContents()
- new /obj/item/clothing/suit/armor/riot/chaplain/ancient(src)
- new /obj/item/clothing/head/helmet/chaplain/ancient(src)
-
-/obj/item/clothing/head/helmet/chaplain/ancient
- name = "ancient helmet"
- desc = "None may pass!"
- icon_state = "knight_ancient"
- item_state = "knight_ancient"
-
-/obj/item/clothing/suit/armor/riot/chaplain/ancient
- name = "ancient armour"
- desc = "Defend the treasure..."
- icon_state = "chaplain_ancient"
- item_state = "knight_ancient"
-
-/obj/item/storage/box/holy/witchhunter
name = "Witchhunter Kit"
-/obj/item/storage/box/holy/witchhunter/PopulateContents()
- new /obj/item/clothing/suit/armor/riot/chaplain/witchhunter(src)
- new /obj/item/clothing/head/helmet/chaplain/witchunter_hat(src)
-
-/obj/item/clothing/suit/armor/riot/chaplain/witchhunter
- name = "witchunter garb"
- desc = "This worn outfit saw much use back in the day."
- icon_state = "chaplain_witchhunter"
- item_state = "witchhunter"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
-
-/obj/item/clothing/head/helmet/chaplain/witchunter_hat
- name = "witchunter hat"
- desc = "This hat saw much use back in the day."
- icon_state = "witchhunterhat"
- item_state = "witchhunterhat"
- flags_cover = HEADCOVERSEYES
- flags_inv = HIDEEYES|HIDEHAIR
-
-/obj/item/storage/box/holy/adept
- name = "Divine Adept Kit"
-
-/obj/item/storage/box/holy/adept/PopulateContents()
- new /obj/item/clothing/suit/armor/riot/chaplain/adept(src)
- new /obj/item/clothing/head/helmet/chaplain/adept(src)
-
-/obj/item/clothing/head/helmet/chaplain/adept
- name = "adept hood"
- desc = "Its only heretical when others do it."
- icon_state = "crusader"
- item_state = "crusader"
- flags_cover = HEADCOVERSEYES
- flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
+/obj/item/storage/box/holy/PopulateContents()
+ new /obj/item/clothing/head/witchunter(src)
+ new /obj/item/clothing/suit/armor/witchhunter(src)
-/obj/item/clothing/suit/armor/riot/chaplain/adept
- name = "adept robes"
- desc = "The ideal outfit for burning the unfaithful."
- icon_state = "chaplain_crusader"
- item_state = "crusader"
/obj/item/storage/box/holy/follower
name = "Followers of the Chaplain Kit"
@@ -203,62 +65,6 @@
var/reskinned = FALSE
var/chaplain_spawnable = TRUE
-/obj/item/nullrod/Initialize()
- . = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
-
-/obj/item/nullrod/attack_self(mob/user)
- if(user.mind && (user.mind.holy_role) && !reskinned)
- reskin_holy_weapon(user)
-
-/**
- * reskin_holy_weapon: Shows a user a list of all available nullrod reskins and based on his choice replaces the nullrod with the reskinned version
- *
- * Arguments:
- * * M The mob choosing a nullrod reskin
- */
-/obj/item/nullrod/proc/reskin_holy_weapon(mob/M)
- if(GLOB.holy_weapon_type)
- return
- var/list/display_names = list()
- var/list/nullrod_icons = list()
- for(var/V in typesof(/obj/item/nullrod))
- var/obj/item/nullrod/rodtype = V
- if(initial(rodtype.chaplain_spawnable))
- display_names[initial(rodtype.name)] = rodtype
- nullrod_icons += list(initial(rodtype.name) = image(icon = initial(rodtype.icon), icon_state = initial(rodtype.icon_state)))
-
- nullrod_icons = sortList(nullrod_icons)
- var/choice = show_radial_menu(M, src , nullrod_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), M), radius = 42, require_near = TRUE)
- if(!choice || !check_menu(M))
- return
-
- var/A = display_names[choice] // This needs to be on a separate var as list member access is not allowed for new
- var/obj/item/nullrod/holy_weapon = new A
- GLOB.holy_weapon_type = holy_weapon.type
-
- SSblackbox.record_feedback("tally", "chaplain_weapon", 1, "[choice]")
-
- if(holy_weapon)
- holy_weapon.reskinned = TRUE
- qdel(src)
- M.put_in_active_hand(holy_weapon)
-
-/**
- * check_menu: Checks if we are allowed to interact with a radial menu
- *
- * Arguments:
- * * user The mob interacting with a menu
- */
-/obj/item/nullrod/proc/check_menu(mob/user)
- if(!istype(user))
- return FALSE
- if(QDELETED(src) || reskinned)
- return FALSE
- if(user.incapacitated() || !user.is_holding(src))
- return FALSE
- return TRUE
-
/obj/item/nullrod/godhand
icon_state = "disintegrate"
item_state = "disintegrate"
@@ -648,13 +454,6 @@
hitsound = 'sound/weapons/bite.ogg'
var/used_blessing = FALSE
-/obj/item/nullrod/carp/attack_self(mob/living/user)
- if(used_blessing)
- else if(user.mind && (user.mind.holy_role))
- to_chat(user, "You are blessed by Carp-Sie. Wild space carp will no longer attack you.")
- user.faction |= "carp"
- used_blessing = TRUE
-
/obj/item/nullrod/claymore/bostaff //May as well make it a "claymore" and inherit the blocking
name = "monk's staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts, it is now used to harass the clown."
@@ -671,33 +470,6 @@
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
-/obj/item/nullrod/tribal_knife
- icon_state = "crysknife"
- item_state = "crysknife"
- lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- name = "arrhythmic knife"
- w_class = WEIGHT_CLASS_HUGE
- desc = "They say fear is the true mind killer, but stabbing them in the head works too. Honour compels you to not sheathe it once drawn."
- sharpness = IS_SHARP
- slot_flags = null
- hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- item_flags = SLOWS_WHILE_IN_HAND
-
-/obj/item/nullrod/tribal_knife/Initialize(mapload)
- . = ..()
- START_PROCESSING(SSobj, src)
- AddComponent(/datum/component/butchering, 50, 100)
-
-/obj/item/nullrod/tribal_knife/Destroy()
- STOP_PROCESSING(SSobj, src)
- . = ..()
-
-/obj/item/nullrod/tribal_knife/process()
- slowdown = rand(-2, 2)
-
-
/obj/item/nullrod/pitchfork
icon_state = "pitchfork0"
lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm
index fd79c112c9b1..871f8f8a133d 100644
--- a/code/game/objects/items/implants/implant.dm
+++ b/code/game/objects/items/implants/implant.dm
@@ -1,7 +1,7 @@
/obj/item/implant
name = "implant"
icon = 'icons/obj/implants.dmi'
- icon_state = "generic" //Shows up as the action button icon
+ icon_state = "lighting_bolt" //Idk seemes liek the best option, Needs a generic icon but this works
actions_types = list(/datum/action/item_action/hands_free/activate)
var/activated = TRUE //1 for implant types that can be activated, 0 for ones that are "always on" like mindshield implants
var/mob/living/imp_in = null
diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm
index cd22652120d7..c4c832209bac 100644
--- a/code/game/objects/items/implants/implant_misc.dm
+++ b/code/game/objects/items/implants/implant_misc.dm
@@ -1,7 +1,6 @@
/obj/item/implant/weapons_auth
name = "firearms authentication implant"
desc = "Lets you shoot your guns."
- icon_state = "auth"
activated = 0
/obj/item/implant/weapons_auth/get_data()
diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm
index 5b8db550a87d..6de461954cb2 100644
--- a/code/game/objects/items/implants/implanter.dm
+++ b/code/game/objects/items/implants/implanter.dm
@@ -27,7 +27,7 @@
M.visible_message("[user] is attempting to implant [M].")
var/turf/T = get_turf(M)
- if(T && (M == user || do_mob(user, M, 50)))
+ if(T && (M == user || do_after(user, 5 SECONDS, M)))
if(src && imp)
if(imp.implant(M, user))
if (M == user)
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 2732e0d37719..9e90329404f0 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -66,10 +66,13 @@
/obj/item/kitchen/knife
name = "kitchen knife"
- icon_state = "knife"
- item_state = "knife"
+ icon = 'icons/obj/item/knife.dmi'
+ lefthand_file = 'icons/mob/inhands/weapons/knifes_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/knifes_righthand.dmi'
+ icon_state = "kitchenknife"
+ item_state = "kitchenknife"
desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
- pickup_sound = 'sound/items/handling/knife1_pickup.ogg'
+ pickup_sound = 'sound/items/handling/knife1_pickup.ogg'
drop_sound = 'sound/items/handling/knife3_drop.ogg'
flags_1 = CONDUCT_1
force = 10
@@ -97,7 +100,6 @@
/obj/item/kitchen/knife/plastic
name = "plastic knife"
icon_state = "plastic_knife"
- item_state = "knife"
desc = "A very safe, barely sharp knife made of plastic. Good for cutting food and not much else."
force = 0
w_class = WEIGHT_CLASS_TINY
@@ -155,8 +157,8 @@
/obj/item/kitchen/knife/butcher
name = "butcher's cleaver"
- icon_state = "butch"
- item_state = "butch"
+ icon_state = "cleaver"
+ item_state = "cleaver"
desc = "A huge thing used for chopping and chopping up meat."
flags_1 = CONDUCT_1
force = 15
@@ -175,9 +177,47 @@
/obj/item/kitchen/knife/hunting/set_butchering()
AddComponent(/datum/component/butchering, 80 - force, 100, force + 10)
+/obj/item/kitchen/knife/switchblade
+ name = "switchblade"
+ icon_state = "switchblade"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ desc = "A sharp, concealable, spring-loaded knife."
+ flags_1 = CONDUCT_1
+ force = 3
+ w_class = WEIGHT_CLASS_SMALL
+ throwforce = 5
+ custom_materials = list(/datum/material/iron=12000)
+ hitsound = 'sound/weapons/genhit.ogg'
+ attack_verb = list("stubbed", "poked")
+ resistance_flags = FIRE_PROOF
+ var/extended = 0
+
+/obj/item/kitchen/knife/switchblade/attack_self(mob/user)
+ extended = !extended
+ playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, TRUE)
+ if(extended)
+ force = 20
+ w_class = WEIGHT_CLASS_NORMAL
+ throwforce = 23
+ icon_state = "switchblade_ext"
+ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ sharpness = IS_SHARP
+ else
+ force = 3
+ w_class = WEIGHT_CLASS_SMALL
+ throwforce = 5
+ icon_state = "switchblade"
+ attack_verb = list("stubbed", "poked")
+ hitsound = 'sound/weapons/genhit.ogg'
+ sharpness = IS_BLUNT
+
/obj/item/kitchen/knife/combat
name = "combat knife"
- icon_state = "buckknife"
+ icon = 'icons/obj/world/melee.dmi'
+ icon_state = "combatknife"
+ item_state = "combatknife"
desc = "A military combat utility survival knife."
embedding = list("pain_mult" = 4, "embed_chance" = 65, "fall_chance" = 10, "ignore_throwspeed_threshold" = TRUE)
force = 20
@@ -185,9 +225,14 @@
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
bayonet = TRUE
+/obj/item/kitchen/knife/combat/Initialize()
+ . = ..()
+ AddElement(/datum/element/world_icon, null, icon, 'icons/obj/item/knife.dmi')
+
/obj/item/kitchen/knife/combat/survival
name = "survival knife"
icon_state = "survivalknife"
+ item_state = "survivalknife"
embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10)
desc = "A hunting grade survival knife."
force = 15
diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm
index 693858bf1b2e..05af8fcadbad 100644
--- a/code/game/objects/items/manuals.dm
+++ b/code/game/objects/items/manuals.dm
@@ -256,8 +256,8 @@
-
Trickwines for idiots
- Okay, so you just joined the SRM and you want to make some brews! I'm tired of explaining all of this so I'm jotting it all down for you clowns.
+
Trickwines for brewers
+ Okay, so you just joined the SRM and you want to make some brews! I'm tired of explaining all of this so I'm jotting it all down for the new hires.
Trickwines almost all share the same effect. When you drink them, they provide a beneficial effect and when you toss them at someone it provides some sort of bad effect.
Breakaway flasks
Honestly, I love these things. I'm not a scientist so I cant exactly explain how it works but somehow when you fuse plasma into glass it makes it ultra sharp and makes it really good for cracking over fauna heads.
@@ -273,22 +273,27 @@
Soon it will drops some apples and you can grind them for the bacteria.
Once you have enough you can fabricate it the same way you would a normal barrel.
+
Ratios
+ A common trend among Trickwines is the ratio of 3:1:1.
+ 3 parts being an ethonal, the other 2 parts are often made from flora or fauna.
+
Ashwine
- It's kind of our trademark, and it's one of the simplest trickwines to make. The Montagnes love using this stuff in ceremonies as well so it should get you some good boy points.
+ It's kind of our trademark, and it's one of the simplest trickwines to make.
+ These are the most common wines used in ceremonies so we often stock ships with the moonflowers needed to make them.
It's made with a ratio of 3:1:1 absinthe, mushroom hallucinogen, and ash respectively.
Mushroom hallucinogens come from mushroom caps and you can ferment absinthe from moonflowers.
Its a mild hallucinogenic but seems to have powerful cleansing effects on the devoted SRM.
It can also really fuck someone up, causing their vision to go shaky and blurry which makes it difficult for them to fight.
Icewine
- This one helps stopping foes in their tracks. It's also got a nice taste.
+ This one helps stopping foes in their tracks. One of my favorite flavor wise.
Its made with 3:1:1 saké, polar bear fur, frost oil(grind chilled peppers).
You can get polar bear fur and frost oil from grinding up polar bear hides and chilled peppers.
It's pretty good at sealing burns and lowering your temperature quickly.
However, it completely encases foes in ice and drops their temperature substantially.
Shockwine
- Easily my favorite, this thing is great at scorching most fauna.
+ Easily my favorite for its splashed effect, this thing is great at scorching most fauna.
Its made with vodka, calcium, and lemon juice.
If you did not know, vodka requires enzymes instead of the normal fermenting process.
It's a nice upper. Great if you're trying to run away.
@@ -301,15 +306,18 @@
Its made out of ground up fireblossems with some nice hard cider and a bit of welding fuel with of course a ratio of 3:1:1.
Forcewine
- I once had a duel with a wizard and and I was able to completly ignore a few of his spells! Its like they just fizzled out when they hit me.
- Would recomend for any esoteric senarios even though I have only been in a few of those.
- You can also use it to entrap Fauna inside of a forcefield like bubble, Gives you time to breath and laugh at them.
- 3:1:1 Tequila, Space Montain Wind, and I know its strange but hollow water, Its that stuff you can extract from geysers
+ Two intresting effects from the consumption of Forcewine.
+ First it seems to give you an "anti magic" effect, I have read about of tales of how it fizzled out some sort of great curse that we could best trace back to a ancient cult.
+ Second is it protects the mind from cohersion and mind control.
+ From my research this seems to act like nanotrasen mindshield implants.
+ Would recomend for any esoteric senarios. We wont see these alot but its always smart to prepare for the worst.
+ You can also use it to entrap Fauna inside of a forcefield like bubble, Gives you time to breath and prepare an attack.
+ 3:1:1. Tequila, Space Montain Wind, and I know its one of the most difficult things to come by but hollow water, Its that stuff you can extract from geysers
Prismwine
Gives you a nice shiny layer of armour, fire seems to have alot harder time sticking to me when i tested it.
Throwing it seeems to do the reverse acting like a magnifying glass to burns and lasers
- Made 3:1:1 with good ol Gin, then add plasma and tinea luxor which is found from mushroom stems
+ 3:1:1. Good ol Gin, then add plasma and tinea luxor which is found from mushroom stems
Some of these can be a bit situatinal but its always nice to have a few in your bag for emergecys.
As a bonus, most of the other factions have no clue how to make these so you can sell them for a fair chunk of cash.
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index f4fbd42be38b..9d90a1a43373 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -646,31 +646,6 @@
held_sausage.desc = "[held_sausage.desc] It has been cooked to perfection on \a [target]."
update_appearance()
-/obj/item/melee/cleric_mace
- name = "cleric mace"
- desc = "The grandson of the club, yet the grandfather of the baseball bat. Most notably used by holy orders in days past."
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "mace_greyscale"
- item_state = "mace_greyscale"
- lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color.
- custom_materials = list(/datum/material/iron = 12000) //Defaults to an Iron Mace.
- slot_flags = ITEM_SLOT_BELT
- force = 14
- w_class = WEIGHT_CLASS_BULKY
- throwforce = 8
- armour_penetration = 50
- attack_verb = list("smacked", "struck", "cracked", "beaten")
- var/overlay_state = "mace_handle"
- var/mutable_appearance/overlay
-
-/obj/item/melee/cleric_mace/Initialize()
- . = ..()
- overlay = mutable_appearance(icon, overlay_state)
- overlay.appearance_flags = RESET_COLOR
- add_overlay(overlay)
-
/obj/item/melee/greykingsword
name = "blade of the grey-king"
desc = "A legendary sword made with 3 replica katanas nailed together and dipped in heavy narcotics."
diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm
index 487d5d2c96ca..0f5d79f13b37 100644
--- a/code/game/objects/items/miscellaneous.dm
+++ b/code/game/objects/items/miscellaneous.dm
@@ -1,8 +1,8 @@
/obj/item/caution
- desc = "Caution! Wet Floor!"
name = "wet floor sign"
- icon = 'icons/obj/janitor.dmi'
+ desc = "No running."
icon_state = "caution"
+ icon = 'icons/obj/janitor.dmi'
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
force = 1
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index d9311f5e2b43..a08b1398aad8 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -165,7 +165,7 @@
user.visible_message("[user] starts loading [target] into [src].", \
"You start loading [target] into [src]...", null, null, target)
to_chat(target, "[user] starts loading you into [user.p_their()] [name]!")
- if(!do_mob(user, target, 30))
+ if(!do_after(user, 3 SECONDS, target))
return
if(target in occupants)
return
diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm
index 5d6b409e8d32..9f937312b561 100644
--- a/code/game/objects/items/puzzle_pieces.dm
+++ b/code/game/objects/items/puzzle_pieces.dm
@@ -1,6 +1,6 @@
//**************
-//*****Keys*******************
-//************** ** **
+//*****Keys*****
+//**************
/obj/item/keycard
name = "security keycard"
desc = "This feels like it belongs to a door."
@@ -21,50 +21,35 @@
color = "#f0da12"
puzzle_id = "cheese"
-/obj/item/keycard/swordfish
- name = "titanic keycard"
- desc = "Smells like it was at the bottom of a harbor."
- color = "#3bbbdb"
- puzzle_id = "swordfish"
+/obj/item/keycard/harmfactory
+ name = "factory keycard"
+ desc = "A keycard opening a door within the world's worst factory"
+ color = "#727a7c"
+ puzzle_id = "factory"
+
+/obj/item/keycard/harmfactory/stockroom
+ name = "stockroom keycard"
+ desc = "A keycard opening a door within the world's worst factory"
+ color = "#cf2323"
+ puzzle_id = "stockroom"
+
+/obj/item/keycard/harmfactory/office
+ name = "office keycard"
+ desc = "A keycard opening a door within the world's worst factory"
+ color = "#1dac22"
+ puzzle_id = "office"
+
+/obj/item/keycard/harmfactory/entry
+ name = "entry keycard"
+ desc = "A keycard opening a door within the world's worst factory"
+ color = "#1a27e7"
+ puzzle_id = "entry"
+
+
/obj/item/keycard/gatedrop
icon_state = "golden_key"
-/obj/item/keycard/gatedrop/drakelair
- name = "Drake's Key"
- desc = "A dull, golden key originally kept by a menacing ash drake."
- puzzle_id = "drakelairkey"
-
-/obj/item/keycard/gatedrop/disciple
- name = "Altar Key"
- desc = "A key held dear by the late Disciple of The Priest. Only by shutting themselves in with their stone idol were they able to spare those they love most from their madness and obsession."
- puzzle_id = "disciplekey"
-
-/obj/item/keycard/gatedrop/guard
- name = "Armory Key"
- desc = "A golden key entrusted to the Captain of the Holy Guard of The Priest. Entrusted by His Holiness to guard the greatest weapon in His arsenal"
- puzzle_id = "guardcap"
-
-/obj/item/keycard/gatedrop/heathen
- name = "Heathen's Key"
- desc = "And thus the Heathen stole away with the key to the forbidden gates. Hiding with his sect of followers until death cometh."
- puzzle_id = "heathen"
-
-/obj/item/keycard/gatedrop/gatekeeper
- name = "GateKeeper's Key"
- desc = "Only by slaying the keeper of the gates may one path through into the depths of The Priest's holiest sanctums."
- puzzle_id = "gatekeeper"
-
-/obj/item/keycard/gatedrop/bishop
- name = "Key of the lost"
- desc = "A key held only by the warring Bishop, forever lost to the Golden City of old."
- puzzle_id = "bishopkey"
-
-/obj/item/keycard/gatedrop/priest
- name = "The Priest's Key"
- desc = "A key belonging to a once peaceful scholar, brought to death and ruin through means of violence by savage outsider."
- puzzle_id = "priestkey"
-
/obj/item/keycard/gatedrop/lavacanyon
name = "Vault Key"
desc = "A dusty key, smudged with dried blood."
@@ -128,6 +113,26 @@
desc = "If nautical nonsense be something you wish."
puzzle_id = "swordfish"
+/obj/machinery/door/keycard/harmfactory
+ name = "keycard locked door"
+ desc = "Seems to have a scanner for the factory keycard"
+ puzzle_id = "factory"
+
+/obj/machinery/door/keycard/harmfactory/stockroom
+ name = "keycard locked door"
+ desc = "Seems to have a scanner for the stockroom keycard"
+ puzzle_id = "stockroom"
+
+/obj/machinery/door/keycard/harmfactory/office
+ name = "keycard locked door"
+ desc = "Seems to have a scanner for the office keycard"
+ puzzle_id = "office"
+
+/obj/machinery/door/keycard/harmfactory/entry
+ name = "keycard locked door"
+ desc = "Seems to have a scanner for the entry keycard"
+ puzzle_id = "entry"
+
/obj/machinery/door/keycard/gates
gender = PLURAL
name = "locked gates"
@@ -155,39 +160,6 @@
. = ..()
icon_state = density ? "closed" : "open"
-/obj/machinery/door/keycard/gates/drakelair
- puzzle_id = "drakelairkey"
-
-/obj/machinery/door/keycard/gates/disciple
- name = "Tithe Gates"
- desc = "Gates protecting the ritual tithe collected by The Priest and his Disciples."
- puzzle_id = "disciplekey"
-
-/obj/machinery/door/keycard/gates/guard
- name = "Armory Gates"
- desc = "Gates protecting the most versatile and dangerous of The Priest's armory."
- puzzle_id = "guardcap"
-
-/obj/machinery/door/keycard/gates/heathen
- name = "Sect Gates"
- desc = "Gates guarding the forbidden treasures stolen away by the Heathen. Bloody in nature, and hidden from sight."
- puzzle_id = "heathen"
-
-/obj/machinery/door/keycard/gates/gatekeeper
- name = "Sanctum Gates"
- desc = "The Gatekeeper holds the key, only through bloodshed can they be opened."
- puzzle_id = "gatekeeper"
-
-/obj/machinery/door/keycard/gates/bishop
- name = "Lost Golden City Gates"
- desc = "He took their lives and locked their culture and heritage behind indestructible gates of virtue. The Bishop spread conversion through death and swallowed the key."
- puzzle_id = "bishopkey"
-
-/obj/machinery/door/keycard/gates/priest
- name = "The Priest's Treasury"
- desc = "Gates holding The Priest's eternal hoarde. Drakeborn, incapable of avoiding the grand desire to collect and learn."
- puzzle_id = "priestkey"
-
/obj/machinery/door/keycard/gates/lavacanyon
puzzle_id = "lavacanyonkey"
diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm
index 3865f961950c..e2507dfb911b 100644
--- a/code/game/objects/items/religion.dm
+++ b/code/game/objects/items/religion.dm
@@ -87,14 +87,6 @@
/obj/item/banner/security/mundane
inspiration_available = FALSE
-/datum/crafting_recipe/security_banner
- name = "Securistan Banner"
- result = /obj/item/banner/security/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/rank/security/officer = 1)
- category = CAT_MISC
-
/obj/item/banner/medical
name = "meditopia banner"
desc = "The banner of Meditopia, generous benefactors that cure wounds and shelter the weak."
@@ -111,14 +103,6 @@
/obj/item/banner/medical/check_inspiration(mob/living/carbon/human/H)
return H.stat //Meditopia is moved to help those in need
-/datum/crafting_recipe/medical_banner
- name = "Meditopia Banner"
- result = /obj/item/banner/medical/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/rank/medical = 1)
- category = CAT_MISC
-
/obj/item/banner/medical/special_inspiration(mob/living/carbon/human/H)
H.adjustToxLoss(-15)
H.setOxyLoss(0)
@@ -140,14 +124,6 @@
/obj/item/banner/science/check_inspiration(mob/living/carbon/human/H)
return H.on_fire //Sciencia is pleased by dedication to the art of Toxins
-/datum/crafting_recipe/science_banner
- name = "Sciencia Banner"
- result = /obj/item/banner/science/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/rank/rnd/scientist = 1)
- category = CAT_MISC
-
/obj/item/banner/cargo
name = "cargonia banner"
desc = "The banner of the eternal Cargonia, with the mystical power of conjuring any object into existence."
@@ -161,14 +137,6 @@
/obj/item/banner/cargo/mundane
inspiration_available = FALSE
-/datum/crafting_recipe/cargo_banner
- name = "Cargonia Banner"
- result = /obj/item/banner/cargo/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/rank/cargo/tech = 1)
- category = CAT_MISC
-
/obj/item/banner/engineering
name = "engitopia banner"
desc = "The banner of Engitopia, wielders of limitless power."
@@ -185,14 +153,6 @@
/obj/item/banner/engineering/special_inspiration(mob/living/carbon/human/H)
H.radiation = 0
-/datum/crafting_recipe/engineering_banner
- name = "Engitopia Banner"
- result = /obj/item/banner/engineering/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/rank/engineering/engineer = 1)
- category = CAT_MISC
-
/obj/item/banner/command
name = "command banner"
desc = "The banner of Command, a staunch and ancient line of bueraucratic kings and queens."
@@ -206,14 +166,6 @@
/obj/item/banner/command/check_inspiration(mob/living/carbon/human/H)
return HAS_TRAIT(H, TRAIT_MINDSHIELD) //Command is stalwart but rewards their allies.
-/datum/crafting_recipe/command_banner
- name = "Command Banner"
- result = /obj/item/banner/command/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/rank/command/captain/parade = 1)
- category = CAT_MISC
-
/obj/item/banner/red
name = "red banner"
icon_state = "banner-red"
@@ -276,51 +228,6 @@
/obj/item/clothing/head/helmet/plate/crusader/red
icon_state = "crusader-red"
-//Prophet helmet
-/obj/item/clothing/head/helmet/plate/crusader/prophet
- name = "Prophet's Hat"
- desc = "A religious-looking hat."
- mob_overlay_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
- flags_1 = 0
- armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 70, "bio" = 50, "rad" = 50, "fire" = 60, "acid" = 60) //religion protects you from disease and radiation, honk.
- worn_x_dimension = 64
- worn_y_dimension = 64
-
-/obj/item/clothing/head/helmet/plate/crusader/prophet/red
- icon_state = "prophet-red"
-
-/obj/item/clothing/head/helmet/plate/crusader/prophet/blue
- icon_state = "prophet-blue"
-
-//Structure conversion staff
-/obj/item/godstaff
- name = "godstaff"
- desc = "It's a stick..?"
- icon_state = "godstaff-red"
- lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
- var/conversion_color = "#ffffff"
- var/staffcooldown = 0
- var/staffwait = 30
-
-
-/obj/item/godstaff/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
- . = ..()
- if(staffcooldown + staffwait > world.time)
- return
- user.visible_message("[user] chants deeply and waves [user.p_their()] staff!")
- if(do_after(user, 20,1,src))
- target.add_atom_colour(conversion_color, WASHABLE_COLOUR_PRIORITY) //wololo
- staffcooldown = world.time
-
-/obj/item/godstaff/red
- icon_state = "godstaff-red"
- conversion_color = "#ff0000"
-
-/obj/item/godstaff/blue
- icon_state = "godstaff-blue"
- conversion_color = "#0000ff"
-
/obj/item/clothing/gloves/plate
name = "Plate Gauntlets"
icon_state = "crusader"
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index c5ebe82f90e9..a0e5865e1528 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -4,7 +4,6 @@
/obj/item/borg
icon = 'icons/mob/robot_items.dmi'
-
/obj/item/borg/stun
name = "electrically-charged arm"
icon_state = "elecarm"
@@ -543,7 +542,7 @@
name = "\improper Hyperkinetic Dampening projector"
desc = "A device that projects a dampening field that weakens kinetic energy above a certain threshold. Projects a field that drains power per second while active, that will weaken and slow damaging projectiles inside its field. Still being a prototype, it tends to induce a charge on ungrounded metallic surfaces."
icon = 'icons/obj/device.dmi'
- icon_state = "shield"
+ icon_state = "shield0"
var/maxenergy = 1500
var/energy = 1500
var/energy_recharge = 7.5
@@ -710,7 +709,7 @@
/obj/item/borg/sight/material
name = "\proper material vision"
sight_mode = BORGMATERIAL
- icon_state = "material"
+ icon_state = "meson"
/obj/item/borg/sight/hud
name = "hud"
diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm
index 8bf29c9a807a..959649c8c59b 100644
--- a/code/game/objects/items/shrapnel.dm
+++ b/code/game/objects/items/shrapnel.dm
@@ -1,6 +1,6 @@
/obj/item/shrapnel // frag grenades
name = "shrapnel shard"
- embedding = list(embed_chance=70, ignore_throwspeed_threshold=TRUE, fall_chance=4, embed_chance_turf_mod=-100)
+ embedding = list(embed_chance=70, ignore_throwspeed_threshold=TRUE, fall_chance=2, embed_chance_turf_mod=-100)
custom_materials = list(/datum/material/iron=50)
armour_penetration = -20
icon = 'icons/obj/shards.dmi'
@@ -8,9 +8,14 @@
w_class = WEIGHT_CLASS_TINY
item_flags = DROPDEL
-/obj/item/shrapnel/stingball // stingbang grenades
- name = "stingball"
- embedding = list(embed_chance=90, fall_chance=3, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=5, jostle_pain_mult=6, rip_time=15, embed_chance_turf_mod=-100)
+/obj/item/shrapnel/hot
+ name = "molten slag"
+ embedding = list(embed_chance=70, ignore_throwspeed_threshold=TRUE, fall_chance=2, embed_chance_turf_mod=-100)
+ damtype = BURN
+
+/obj/item/shrapnel/stingball
+ name = "clump of ballistic gel"
+ embedding = list(embed_chance=15, fall_chance=2, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.8, pain_mult=3, jostle_pain_mult=5, rip_time=15, embed_chance_turf_mod=-100)
icon_state = "tiny"
/obj/item/shrapnel/bullet // bullets
@@ -28,35 +33,79 @@
/obj/projectile/bullet/shrapnel
name = "flying shrapnel shard"
- damage = 9
+ damage = 10
range = 10
- armour_penetration = -30
- dismemberment = 5
+ armour_penetration = -20
+ dismemberment = 25
ricochets_max = 2
ricochet_chance = 40
shrapnel_type = /obj/item/shrapnel
ricochet_incidence_leeway = 60
hit_stunned_targets = TRUE
+/obj/projectile/bullet/shrapnel/Initialize()
+ . = ..()
+ def_zone = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
+
+/obj/projectile/bullet/shrapnel/rusty
+ damage = 8
+ armour_penetration = -35
+ dismemberment = 15
+ ricochets_max = 3//duller = less likely to stick in a wall
+ ricochet_chance = 60
+
/obj/projectile/bullet/shrapnel/mega
+ damage = 20
name = "flying shrapnel hunk"
range = 25
- dismemberment = 10
+ dismemberment = 35
ricochets_max = 4
ricochet_chance = 90
ricochet_decay_chance = 0.9
+/obj/projectile/bullet/shrapnel/hot
+ name = "white-hot metal slag"
+ damage = 8
+ range = 8
+ armour_penetration = -35
+ dismemberment = 10
+ shrapnel_type = /obj/item/shrapnel/hot
+ damage_type = BURN
+
+/obj/projectile/bullet/shrapnel/hot/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ M.adjust_fire_stacks(15)
+ M.IgniteMob()
+
+/obj/projectile/bullet/shrapnel/spicy
+ name = "radioactive slag"
+ damage_type = BURN
+ damage = 10
+ range = 8
+ dismemberment = 10
+ armour_penetration = -35
+ shrapnel_type = /obj/item/shrapnel/hot
+
+/obj/projectile/bullet/shrapnel/spicy/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ M.apply_effect(250,EFFECT_IRRADIATE,0)
+
/obj/projectile/bullet/pellet/stingball
- name = "stingball pellet"
- damage = 3
- stamina = 8
- ricochets_max = 4
+ name = "ballistic gel clump"
+ damage = 5
+ stamina = 15
+ ricochets_max = 6
ricochet_chance = 66
ricochet_decay_chance = 1
ricochet_decay_damage = 0.9
ricochet_auto_aim_angle = 10
ricochet_auto_aim_range = 2
ricochet_incidence_leeway = 0
+ knockdown = 20
shrapnel_type = /obj/item/shrapnel/stingball
/obj/projectile/bullet/pellet/stingball/mega
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 32d923eef985..264ab12646ea 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -31,17 +31,17 @@
return
if(target == user)
playsound(src, islist(apply_sounds) ? pick(apply_sounds) : apply_sounds, 25)
- if(!do_mob(user, target, self_delay, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
- return
if(!silent)
user.visible_message("[user] starts to apply \the [src] on [user.p_them()]self...", "You begin applying \the [src] on yourself...")
+ if(!do_after(user, self_delay, target, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ return
else if(other_delay)
playsound(src, islist(apply_sounds) ? pick(apply_sounds) : apply_sounds, 25)
- if(!do_mob(user, target, other_delay, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
- return
if(!silent)
user.visible_message("[user] starts to apply \the [src] on [target].", "You begin applying \the [src] on [target]...")
+ if(!do_after(user, other_delay, target, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ return
if(heal(target, user))
@@ -137,12 +137,13 @@
/obj/item/stack/medical/gauze
name = "medical gauze"
- desc = "A roll of elastic cloth that is extremely effective at stopping bleeding, but does not heal wounds."
+ desc = "A roll of elastic cloth that is extremely effective at stopping bleeding and slowly heals wounds."
gender = PLURAL
singular_name = "medical gauze"
icon_state = "gauze"
apply_sounds = list('sound/effects/rip1.ogg', 'sound/effects/rip2.ogg')
- var/stop_bleeding = 1800
+ var/bleed_reduction = 0.02
+ var/lifespan = 150
self_delay = 20
max_amount = 12
grind_results = list(/datum/reagent/cellulose = 2)
@@ -152,13 +153,16 @@
amount = 12
/obj/item/stack/medical/gauze/heal(mob/living/target, mob/user)
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- if(!H.bleedsuppress && H.bleed_rate) //so you can't stack bleed suppression
- H.suppress_bloodloss(stop_bleeding)
- to_chat(user, "You stop the bleeding of [target]!")
+ if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ var/obj/item/bodypart/BP = C.get_bodypart(check_zone(user.zone_selected))
+ if(!BP)
+ to_chat(user, span_warning("[C] doesn't have \a [parse_zone(user.zone_selected)]!"))
+ return
+ if(BP.can_bandage(user))
+ BP.apply_bandage(bleed_reduction, lifespan, name)
+ user.visible_message(span_notice("[user] wraps [C]'s [parse_zone(BP.body_zone)] with [src]."), span_notice("You wrap [C]'s [parse_zone(check_zone(user.zone_selected))] with [src]."), span_hear("You hear ruffling cloth."))
return TRUE
- to_chat(user, "You can not use \the [src] on [target]!")
/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness())
@@ -178,8 +182,8 @@
/obj/item/stack/medical/gauze/improvised
name = "improvised gauze"
singular_name = "improvised gauze"
- desc = "A roll of cloth roughly cut from something that can stop bleeding, but does not heal wounds."
- stop_bleeding = 900
+ desc = "A roll of cloth roughly cut from something that can stop bleeding and slowly heal wounds."
+ bleed_reduction = 0.005
/obj/item/stack/medical/gauze/cyborg
custom_materials = null
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index f0be0cdd7e81..b5f78d46e951 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -9,6 +9,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
new/datum/stack_recipe("modern railing corner", /obj/structure/railing/modern/corner, 1, time = 10, window_checks = TRUE), \
new/datum/stack_recipe("modern railing end", /obj/structure/railing/modern/end, 3, time = 18, window_checks = TRUE), \
new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 150, one_per_turf = TRUE, on_floor = FALSE), \
+ new/datum/stack_recipe("handrail", /obj/structure/chair/handrail, 4, time = 15, one_per_turf = TRUE), \
))
/obj/item/stack/rods
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 200fc408768f..9fc6fa808a46 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -160,6 +160,9 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \
/obj/item/stack/sheet/mineral/uranium/twenty
amount = 20
+/obj/item/stack/sheet/mineral/uranium/ten
+ amount = 10
+
/obj/item/stack/sheet/mineral/uranium/five
amount = 5
@@ -210,6 +213,9 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \
/obj/item/stack/sheet/mineral/plasma/twenty
amount = 20
+/obj/item/stack/sheet/mineral/plasma/ten
+ amount = 10
+
/obj/item/stack/sheet/mineral/plasma/five
amount = 5
@@ -326,32 +332,6 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \
/obj/item/stack/sheet/mineral/silver/five
amount = 5
-/*
- * Clown
- */
-/obj/item/stack/sheet/mineral/bananium
- name = "bananium"
- icon_state = "sheet-bananium"
- item_state = "sheet-bananium"
- singular_name = "bananium sheet"
- sheettype = "bananium"
- custom_materials = list(/datum/material/bananium=MINERAL_MATERIAL_AMOUNT)
-
- grind_results = list(/datum/reagent/consumable/banana = 20)
- point_value = 50
- merge_type = /obj/item/stack/sheet/mineral/bananium
- material_type = /datum/material/bananium
- walltype = /turf/closed/wall/mineral/bananium
-
-GLOBAL_LIST_INIT(bananium_recipes, list ( \
- new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \
- new/datum/stack_recipe("Clown Statue", /obj/structure/statue/bananium/clown, 5, one_per_turf = 1, on_floor = 1), \
- ))
-
-/obj/item/stack/sheet/mineral/bananium/get_main_recipes()
- . = ..()
- . += GLOB.bananium_recipes
-
/*
* Titanium
*/
@@ -430,7 +410,6 @@ GLOBAL_LIST_INIT(plastitanium_recipes, list ( \
. = ..()
. += GLOB.plastitanium_recipes
-
/*
* Snow
*/
@@ -459,56 +438,6 @@ GLOBAL_LIST_INIT(snow_recipes, list ( \
. = ..()
. += GLOB.snow_recipes
-/****************************** Others ****************************/
-
-/*
- * Adamantine
-*/
-
-/obj/item/stack/sheet/mineral/adamantine
- name = "adamantine"
- icon_state = "sheet-adamantine"
- item_state = "sheet-adamantine"
- singular_name = "adamantine sheet"
- custom_materials = list(/datum/material/adamantine=MINERAL_MATERIAL_AMOUNT)
- merge_type = /obj/item/stack/sheet/mineral/adamantine
- grind_results = list(/datum/reagent/liquidadamantine = 10)
-
-/obj/item/stack/sheet/mineral/adamantine/ten
- amount = 10
-
-/*
- * Runite
- */
-
-/obj/item/stack/sheet/mineral/runite
- name = "runite"
- desc = "Rare material found in distant lands."
- singular_name = "runite bar"
- icon_state = "sheet-runite"
- item_state = "sheet-runite"
- custom_materials = list(/datum/material/runite=MINERAL_MATERIAL_AMOUNT)
- merge_type = /obj/item/stack/sheet/mineral/runite
- material_type = /datum/material/runite
-
-/obj/item/stack/sheet/mineral/runite/ten
- amount = 10
-
-/*
- * Mythril
- */
-/obj/item/stack/sheet/mineral/mythril
- name = "mythril"
- icon_state = "sheet-mythril"
- item_state = "sheet-mythril"
- singular_name = "mythril sheet"
- novariants = TRUE
- custom_materials = list(/datum/material/mythril=MINERAL_MATERIAL_AMOUNT)
- merge_type = /obj/item/stack/sheet/mineral/mythril
-
-/obj/item/stack/sheet/mineral/mythril/ten
- amount = 10
-
/*
* Alien Alloy
*/
@@ -567,3 +496,35 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \
/obj/item/stack/sheet/mineral/coal/ten
amount = 10
+
+/*
+ * Hellstone
+ */
+/obj/item/stack/sheet/mineral/hidden
+ name = "????????"
+ singular_name = "????????"
+
+/obj/item/stack/sheet/mineral/hidden/hellstone
+ name = "hellstone"
+ icon_state = "sheet-hellstone"
+ item_state = "sheet-hellstone"
+ singular_name = "hellstone bar"
+ sheettype = "hellstone"
+ resistance_flags = FIRE_PROOF | LAVA_PROOF
+ custom_materials = list(/datum/material/hellstone=MINERAL_MATERIAL_AMOUNT)
+ grind_results = list(/datum/reagent/clf3 = 5)
+ point_value = 20
+ merge_type = /obj/item/stack/sheet/mineral/hidden/hellstone
+ material_type = /datum/material/hellstone
+
+/obj/item/stack/sheet/mineral/hidden/hellstone/fifty
+ amount = 50
+
+/obj/item/stack/sheet/mineral/hidden/hellstone/twenty
+ amount = 20
+
+/obj/item/stack/sheet/mineral/hidden/hellstone/ten
+ amount = 10
+
+/obj/item/stack/sheet/mineral/hidden/hellstone/five
+ amount = 5
diff --git a/code/game/objects/items/stacks/sheets/recipes/recipes_metal.dm b/code/game/objects/items/stacks/sheets/recipes/recipes_metal.dm
new file mode 100644
index 000000000000..6860f34be5c7
--- /dev/null
+++ b/code/game/objects/items/stacks/sheets/recipes/recipes_metal.dm
@@ -0,0 +1,250 @@
+GLOBAL_LIST_INIT(metal_recipes, list ( \
+ new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("double bed", /obj/structure/bed/double, 4, one_per_turf = TRUE, on_floor = TRUE), \
+ null, \
+ new/datum/stack_recipe_list("office chairs", list( \
+ new/datum/stack_recipe("gray office chair", /obj/structure/chair/office, 5, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("light office chair", /obj/structure/chair/office/light, 5, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("dark office chair", /obj/structure/chair/office/dark, 5, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("purple office chair", /obj/structure/chair/office/purple, 5, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ new/datum/stack_recipe_list("bench chairs", list( \
+ new/datum/stack_recipe("purple bench chair", /obj/structure/chair/bench/purple, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("beige bench chair", /obj/structure/chair/bench/beige, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("grey bench chair", /obj/structure/chair/bench/grey, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("blue bench chair", /obj/structure/chair/bench/blue, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("red bench chair", /obj/structure/chair/bench/red, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("olive bench chair", /obj/structure/chair/bench/olive, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ new/datum/stack_recipe_list("comfy chairs", list( \
+ new/datum/stack_recipe("purple comfy chair", /obj/structure/chair/comfy/purple, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("beige comfy chair", /obj/structure/chair/comfy/beige, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("grey comfy chair", /obj/structure/chair/comfy/grey, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("orange comfy chair", /obj/structure/chair/comfy/orange, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("blue comfy chair", /obj/structure/chair/comfy/blue, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("red comfy chair", /obj/structure/chair/comfy/red, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("olive comfy chair", /obj/structure/chair/comfy/olive, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ new/datum/stack_recipe_list("comfy chairs (old)", list( \
+ new/datum/stack_recipe("old purple comfy chair", /obj/structure/chair/comfy/purple/old, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old beige comfy chair", /obj/structure/chair/comfy/beige/old, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old grey comfy chair", /obj/structure/chair/comfy/grey/old, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old orange comfy chair", /obj/structure/chair/comfy/orange/old, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old blue comfy chair", /obj/structure/chair/comfy/blue/old, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old red comfy chair", /obj/structure/chair/comfy/red/old, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old olive comfy chair", /obj/structure/chair/comfy/olive/old, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ new/datum/stack_recipe_list("comfy chairs (old - alt)", list( \
+ new/datum/stack_recipe("old purple comfy chair (alt)", /obj/structure/chair/comfy/purple/old/alt, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old beige comfy chair (alt)", /obj/structure/chair/comfy/beige/old/alt, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old grey comfy chair (alt)", /obj/structure/chair/comfy/grey/old/alt, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old orange comfy chair (alt)", /obj/structure/chair/comfy/orange/old/alt, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old blue comfy chair (alt)", /obj/structure/chair/comfy/blue/old/alt, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old red comfy chair (alt)", /obj/structure/chair/comfy/red/old/alt, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old olive comfy chair (alt)", /obj/structure/chair/comfy/olive/old/alt, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ new/datum/stack_recipe_list("comfy chairs (corpo)", list( \
+ new/datum/stack_recipe("purple corpo chair", /obj/structure/chair/comfy/purple/corpo, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("beige corpo chair", /obj/structure/chair/comfy/beige/corpo, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("grey corpo chair", /obj/structure/chair/comfy/grey/corpo, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("orange corpo chair", /obj/structure/chair/comfy/orange/corpo, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("blue corpo chair", /obj/structure/chair/comfy/blue/corpo, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("red corpo chair", /obj/structure/chair/comfy/red/corpo, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("olive corpo chair", /obj/structure/chair/comfy/olive/corpo, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ new/datum/stack_recipe_list("sofas", list( \
+ // New brown Sofa
+ new/datum/stack_recipe("brown sofa (middle)", /obj/structure/chair/sofa/brown, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brown sofa (left)", /obj/structure/chair/sofa/brown/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brown sofa (right)", /obj/structure/chair/sofa/brown/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brown sofa (corner)", /obj/structure/chair/sofa/brown/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brown sofa (internal corner)", /obj/structure/chair/sofa/brown/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // New purple sofa
+ new/datum/stack_recipe("purple sofa (middle)", /obj/structure/chair/sofa/purple, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("purple sofa (left)", /obj/structure/chair/sofa/purple/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("purple sofa (right)", /obj/structure/chair/sofa/purple/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("purple sofa (corner)", /obj/structure/chair/sofa/purple/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("purple sofa (internal corner)", /obj/structure/chair/sofa/purple/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // New blue Sofa
+ new/datum/stack_recipe("blue sofa (middle)", /obj/structure/chair/sofa/blue, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("blue sofa (left)", /obj/structure/chair/sofa/blue/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("blue sofa (right)", /obj/structure/chair/sofa/blue/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("blue sofa (corner)", /obj/structure/chair/sofa/blue/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("blue sofa (internal corner)", /obj/structure/chair/sofa/blue/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // New red Sofa
+ new/datum/stack_recipe("red sofa (middle)", /obj/structure/chair/sofa/red, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("red sofa (left)", /obj/structure/chair/sofa/red/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("red sofa (right)", /obj/structure/chair/sofa/red/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("red sofa (corner)", /obj/structure/chair/sofa/red/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("red sofa (internal corner)", /obj/structure/chair/sofa/red/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // New grey Sofa
+ new/datum/stack_recipe("grey sofa (middle)", /obj/structure/chair/sofa/grey, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("grey sofa (left)", /obj/structure/chair/sofa/grey/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("grey sofa (right)", /obj/structure/chair/sofa/grey/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("grey sofa (corner)", /obj/structure/chair/sofa/grey/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("grey sofa (internal corner)", /obj/structure/chair/sofa/grey/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // New olive Sofa
+ new/datum/stack_recipe("olive sofa (middle)", /obj/structure/chair/sofa/olive, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("olive sofa (left)", /obj/structure/chair/sofa/olive/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("olive sofa (right)", /obj/structure/chair/sofa/olive/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("olive sofa (corner)", /obj/structure/chair/sofa/olive/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("olive sofa (internal corner)", /obj/structure/chair/sofa/olive/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ new/datum/stack_recipe_list("sofas (old)", list(
+ // Old brown Sofa
+ new/datum/stack_recipe("old brown sofa (middle)", /obj/structure/chair/sofa/brown/old, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old brown sofa (left)", /obj/structure/chair/sofa/brown/old/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old brown sofa (right)", /obj/structure/chair/sofa/brown/old/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old brown sofa (corner)", /obj/structure/chair/sofa/brown/old/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old brown sofa (internal corner)", /obj/structure/chair/sofa/brown/old/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // Old purple Sofa
+ new/datum/stack_recipe("old purple sofa (middle)", /obj/structure/chair/sofa/purple/old, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old purple sofa (left)", /obj/structure/chair/sofa/purple/old/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old purple sofa (right)", /obj/structure/chair/sofa/purple/old/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old purple sofa (corner)", /obj/structure/chair/sofa/purple/old/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old purple sofa (internal corner)", /obj/structure/chair/sofa/purple/old/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // Old blue Sofa
+ new/datum/stack_recipe("old blue sofa (middle)", /obj/structure/chair/sofa/blue/old, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old blue sofa (left)", /obj/structure/chair/sofa/blue/old/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old blue sofa (right)", /obj/structure/chair/sofa/blue/old/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old blue sofa (corner)", /obj/structure/chair/sofa/blue/old/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old blue sofa (internal corner)", /obj/structure/chair/sofa/blue/old/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // Old red Sofa
+ new/datum/stack_recipe("old red sofa (middle)", /obj/structure/chair/sofa/red/old, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old red sofa (left)", /obj/structure/chair/sofa/red/old/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old red sofa (right)", /obj/structure/chair/sofa/red/old/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old red sofa (corner)", /obj/structure/chair/sofa/red/old/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old red sofa (internal corner)", /obj/structure/chair/sofa/red/old/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // Old grey Sofa
+ new/datum/stack_recipe("old grey sofa (middle)", /obj/structure/chair/sofa/grey/old, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old grey sofa (left)", /obj/structure/chair/sofa/grey/old/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old grey sofa (right)", /obj/structure/chair/sofa/grey/old/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old grey sofa (corner)", /obj/structure/chair/sofa/grey/old/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old grey sofa (internal corner)", /obj/structure/chair/sofa/grey/old/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // Old olive Sofa
+ new/datum/stack_recipe("old olive sofa (middle)", /obj/structure/chair/sofa/olive/old, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old olive sofa (left)", /obj/structure/chair/sofa/olive/old/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old olive sofa (right)", /obj/structure/chair/sofa/olive/old/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old olive sofa (corner)", /obj/structure/chair/sofa/olive/old/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("old olive sofa (internal corner)", /obj/structure/chair/sofa/olive/old/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ new/datum/stack_recipe_list("sofas (corpo)", list(
+ // Corpo brown Sofa
+ new/datum/stack_recipe("corpo brown sofa (middle)", /obj/structure/chair/sofa/brown/corpo, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo brown sofa (left)", /obj/structure/chair/sofa/brown/corpo/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo brown sofa (right)", /obj/structure/chair/sofa/brown/corpo/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo brown sofa (corner)", /obj/structure/chair/sofa/brown/corpo/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo brown sofa (internal corner)", /obj/structure/chair/sofa/brown/corpo/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // Corpo purple Sofa
+ new/datum/stack_recipe("corpo purple sofa (middle)", /obj/structure/chair/sofa/purple/corpo, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo purple sofa (left)", /obj/structure/chair/sofa/purple/corpo/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo purple sofa (right)", /obj/structure/chair/sofa/purple/corpo/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo purple sofa (corner)", /obj/structure/chair/sofa/purple/corpo/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo purple sofa (internal corner)", /obj/structure/chair/sofa/purple/corpo/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // Corpo blue Sofa
+ new/datum/stack_recipe("corpo blue sofa (middle)", /obj/structure/chair/sofa/blue/corpo, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo blue sofa (left)", /obj/structure/chair/sofa/blue/corpo/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo blue sofa (right)", /obj/structure/chair/sofa/blue/corpo/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo blue sofa (corner)", /obj/structure/chair/sofa/blue/corpo/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo blue sofa (internal corner)", /obj/structure/chair/sofa/blue/corpo/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // Corpo red Sofa
+ new/datum/stack_recipe("corpo red sofa (middle)", /obj/structure/chair/sofa/red/corpo, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo red sofa (left)", /obj/structure/chair/sofa/red/corpo/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo red sofa (right)", /obj/structure/chair/sofa/red/corpo/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo red sofa (corner)", /obj/structure/chair/sofa/red/corpo/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo red sofa (internal corner)", /obj/structure/chair/sofa/red/corpo/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // Corpo grey Sofa
+ new/datum/stack_recipe("corpo grey sofa (middle)", /obj/structure/chair/sofa/grey/corpo, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo grey sofa (left)", /obj/structure/chair/sofa/grey/corpo/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo grey sofa (right)", /obj/structure/chair/sofa/grey/corpo/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo grey sofa (corner)", /obj/structure/chair/sofa/grey/corpo/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo grey sofa (internal corner)", /obj/structure/chair/sofa/grey/corpo/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ // Corpo olive Sofa
+ new/datum/stack_recipe("corpo olive sofa (middle)", /obj/structure/chair/sofa/olive/corpo, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo olive sofa (left)", /obj/structure/chair/sofa/olive/corpo/left, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo olive sofa (right)", /obj/structure/chair/sofa/olive/corpo/right, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo olive sofa (corner)", /obj/structure/chair/sofa/olive/corpo/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("corpo olive sofa (internal corner)", /obj/structure/chair/sofa/olive/corpo/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ null, \
+ new/datum/stack_recipe("rack parts", /obj/item/rack_parts), \
+ new/datum/stack_recipe("crate shelf parts", /obj/item/rack_parts/shelf), \
+ new/datum/stack_recipe_list("closets", list(
+ new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
+ new/datum/stack_recipe("emergency closet", /obj/structure/closet/emcloset/empty, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
+ new/datum/stack_recipe("fire-safety closet", /obj/structure/closet/firecloset/empty, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
+ new/datum/stack_recipe("tool closet", /obj/structure/closet/toolcloset/empty, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
+ new/datum/stack_recipe("radiation closet", /obj/structure/closet/radiation/empty, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE)
+ )),
+ null, \
+ new/datum/stack_recipe_list("crates", list(
+ new/datum/stack_recipe("crate", /obj/structure/closet/crate, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
+ new/datum/stack_recipe("internals crate", /obj/structure/closet/crate/internals, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
+ new/datum/stack_recipe("engineering crate", /obj/structure/closet/crate/engineering, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
+ new/datum/stack_recipe("medical crate", /obj/structure/closet/crate/medical, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
+ new/datum/stack_recipe("science crate", /obj/structure/closet/crate/science, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
+ new/datum/stack_recipe("hydroponics crate", /obj/structure/closet/crate/hydroponics, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE)
+ )),
+ null, \
+ new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
+ null, \
+ new/datum/stack_recipe("plasteel floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
+ new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
+ null, \
+ new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 40, one_per_turf = TRUE, on_floor = TRUE, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75), \
+ null, \
+ new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ null, \
+ new/datum/stack_recipe_list("airlock assemblies", list( \
+ new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("public airlock assembly", /obj/structure/door_assembly/door_assembly_public, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("virology airlock assembly", /obj/structure/door_assembly/door_assembly_viro, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("external maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_extmai, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ )), \
+ null, \
+ new/datum/stack_recipe("firelock frame (fulltile)", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("firelock frame (directional)", /obj/structure/firelock_frame/border, 1, time = 25, on_floor = TRUE), \
+ new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ null, \
+ new/datum/stack_recipe("grenade casing", /obj/item/grenade/chem_grenade), \
+ new/datum/stack_recipe("light fixture frame", /obj/item/wallframe/light_fixture, 2), \
+ new/datum/stack_recipe("small light fixture frame", /obj/item/wallframe/light_fixture/small, 1), \
+ null, \
+ new/datum/stack_recipe("apc frame", /obj/item/wallframe/apc, 2), \
+ new/datum/stack_recipe("air alarm frame", /obj/item/wallframe/airalarm, 2), \
+ new/datum/stack_recipe("airlock controller frame", /obj/item/wallframe/advanced_airlock_controller, 2), \
+ new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2), \
+ new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2), \
+ new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1), \
+ null, \
+ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("voting box", /obj/structure/votebox, 15, time = 50), \
+ new/datum/stack_recipe("mortar", /obj/item/reagent_containers/glass/mortar/metal, 3), \
+ new/datum/stack_recipe("pestle", /obj/item/pestle, 1, time = 50), \
+ new/datum/stack_recipe("hygienebot assembly", /obj/item/bot_assembly/hygienebot, 2, time = 50), \
+ new/datum/stack_recipe_list("weight machines", list( \
+ new/datum/stack_recipe("chest press", /obj/structure/weightmachine/stacklifter, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("bench press", /obj/structure/weightmachine/weightlifter, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ new/datum/stack_recipe("shower", /obj/machinery/shower, 3, time = 25)
+))
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 46d92aa9b6f8..ead6b8aeb8f1 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -14,112 +14,6 @@
/*
* Metal
*/
-GLOBAL_LIST_INIT(metal_recipes, list ( \
- new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("double bed", /obj/structure/bed/double, 4, one_per_turf = TRUE, on_floor = TRUE), \
- null, \
- new/datum/stack_recipe_list("office chairs", list( \
- new/datum/stack_recipe("gray office chair", /obj/structure/chair/office, 5, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("light office chair", /obj/structure/chair/office/light, 5, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("dark office chair", /obj/structure/chair/office/dark, 5, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("purple office chair", /obj/structure/chair/office/purple, 5, one_per_turf = TRUE, on_floor = TRUE), \
- )), \
- new/datum/stack_recipe_list("comfy chairs", list( \
- new/datum/stack_recipe("beige comfy chair", /obj/structure/chair/comfy/beige, 2, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("black comfy chair", /obj/structure/chair/comfy/black, 2, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("brown comfy chair", /obj/structure/chair/comfy/brown, 2, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("lime comfy chair", /obj/structure/chair/comfy/lime, 2, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("teal comfy chair", /obj/structure/chair/comfy/teal, 2, one_per_turf = TRUE, on_floor = TRUE), \
- )), \
- new/datum/stack_recipe_list("sofas", list(
- new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, 1, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, 1, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, 1, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, 1, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("red sofa (middle)", /obj/structure/chair/sofa/red, 1, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("red sofa (left)", /obj/structure/chair/sofa/left, 1, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("red sofa (right)", /obj/structure/chair/sofa/red/right, 1, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("red sofa (corner)", /obj/structure/chair/sofa/red/corner, 1, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("red sofa (internal corner)", /obj/structure/chair/sofa/red/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE)
- )),
- null, \
- new/datum/stack_recipe("rack parts", /obj/item/rack_parts), \
- new/datum/stack_recipe("crate shelf parts", /obj/item/rack_parts/shelf), \
- new/datum/stack_recipe_list("closets", list(
- new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
- new/datum/stack_recipe("emergency closet", /obj/structure/closet/emcloset/empty, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
- new/datum/stack_recipe("fire-safety closet", /obj/structure/closet/firecloset/empty, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
- new/datum/stack_recipe("tool closet", /obj/structure/closet/toolcloset/empty, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
- new/datum/stack_recipe("radiation closet", /obj/structure/closet/radiation/empty, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE)
- )),
- null, \
- new/datum/stack_recipe_list("crates", list(
- new/datum/stack_recipe("crate", /obj/structure/closet/crate, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
- new/datum/stack_recipe("internals crate", /obj/structure/closet/crate/internals, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
- new/datum/stack_recipe("engineering crate", /obj/structure/closet/crate/engineering, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
- new/datum/stack_recipe("medical crate", /obj/structure/closet/crate/medical, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
- new/datum/stack_recipe("science crate", /obj/structure/closet/crate/science, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE),
- new/datum/stack_recipe("hydroponics crate", /obj/structure/closet/crate/hydroponics, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE)
- )),
- null, \
- new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
- null, \
- new/datum/stack_recipe("plasteel floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
- new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
- null, \
- new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 40, one_per_turf = TRUE, on_floor = TRUE, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75), \
- null, \
- new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
- null, \
- new /datum/stack_recipe_list("airlock assemblies", list( \
- new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("public airlock assembly", /obj/structure/door_assembly/door_assembly_public, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("virology airlock assembly", /obj/structure/door_assembly/door_assembly_viro, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("external maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_extmai, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- )), \
- null, \
- new/datum/stack_recipe("firelock frame (fulltile)", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("firelock frame (directional)", /obj/structure/firelock_frame/border, 1, time = 25, on_floor = TRUE), \
- new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
- null, \
- new/datum/stack_recipe("grenade casing", /obj/item/grenade/chem_grenade), \
- new/datum/stack_recipe("light fixture frame", /obj/item/wallframe/light_fixture, 2), \
- new/datum/stack_recipe("small light fixture frame", /obj/item/wallframe/light_fixture/small, 1), \
- null, \
- new/datum/stack_recipe("apc frame", /obj/item/wallframe/apc, 2), \
- new/datum/stack_recipe("air alarm frame", /obj/item/wallframe/airalarm, 2), \
- new/datum/stack_recipe("airlock controller frame", /obj/item/wallframe/advanced_airlock_controller, 2), \
- new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2), \
- new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2), \
- new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1), \
- null, \
- new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("voting box", /obj/structure/votebox, 15, time = 50), \
- new/datum/stack_recipe("mortar", /obj/item/reagent_containers/glass/mortar/metal, 3), \
- new/datum/stack_recipe("pestle", /obj/item/pestle, 1, time = 50), \
- new/datum/stack_recipe("hygienebot assembly", /obj/item/bot_assembly/hygienebot, 2, time = 50), \
- new/datum/stack_recipe("shower", /obj/machinery/shower, 3, time = 25)
-))
/obj/item/stack/sheet/metal
name = "metal"
@@ -137,10 +31,6 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
tableVariant = /obj/structure/table
material_type = /datum/material/iron
-/obj/item/stack/sheet/metal/narsie_act()
- new /obj/item/stack/sheet/runed_metal(loc, amount)
- qdel(src)
-
/obj/item/stack/sheet/metal/fifty
amount = 50
@@ -165,7 +55,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
/*
* Plasteel
*/
-// WS Begin: carpet
+
GLOBAL_LIST_INIT(plasteel_recipes, list ( \
new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = TRUE), \
new/datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 50), \
@@ -185,7 +75,6 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
new/datum/stack_recipe("shutters frame", /obj/structure/poddoor_assembly/shutters, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("blast door frame", /obj/structure/poddoor_assembly, 15, time = 50, one_per_turf = 1, on_floor = 1)
))
-// WS End: carpet
/obj/item/stack/sheet/plasteel
name = "plasteel"
@@ -252,6 +141,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("mortar", /obj/item/reagent_containers/glass/mortar, 3), \
new/datum/stack_recipe("firebrand", /obj/item/match/firebrand, 2, time = 100), \
+ new/datum/stack_recipe("torch", /obj/item/candle/tribal_torch, 4, time = 30), \
null, \
new/datum/stack_recipe_list("pews", list(
new /datum/stack_recipe("pew (middle)", /obj/structure/chair/pew, 3, one_per_turf = TRUE, on_floor = TRUE),
@@ -331,9 +221,9 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \
force = 0
throwforce = 0
merge_type = /obj/item/stack/sheet/cotton
- var/pull_effort = 30
- var/loom_result = /obj/item/stack/sheet/cotton/cloth
grind_results = list(/datum/reagent/cellulose = 20)
+ var/pull_effort = 10
+ var/loom_result = /obj/item/stack/sheet/cotton/cloth
GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("white jumpskirt", /obj/item/clothing/under/color/jumpskirt/white, 3), /*Ladies first*/ \
@@ -355,6 +245,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("rag", /obj/item/reagent_containers/glass/rag, 1), \
new/datum/stack_recipe("towel", /obj/item/towel, 2), \
new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
+ new/datum/stack_recipe("double bedsheet", /obj/item/bedsheet/double, 4), \
new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \
null, \
new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \
@@ -367,6 +258,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("19x19 canvas", /obj/item/canvas/nineteenXnineteen, 3), \
new/datum/stack_recipe("23x19 canvas", /obj/item/canvas/twentythreeXnineteen, 4), \
new/datum/stack_recipe("23x23 canvas", /obj/item/canvas/twentythreeXtwentythree, 5), \
+ new/datum/stack_recipe("punching bag", /obj/structure/punching_bag, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
))
/obj/item/stack/sheet/cotton/cloth
@@ -447,7 +339,6 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
singular_name = "raw durathread ball"
icon_state = "sheet-durathreadraw"
merge_type = /obj/item/stack/sheet/cotton/durathread
- pull_effort = 70
loom_result = /obj/item/stack/sheet/durathread
grind_results = list()
@@ -548,52 +439,6 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
else
. = ..()
-
-/*
- * Runed Metal
- */
-
-GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
- new/datum/stack_recipe("runed door", /obj/machinery/door/airlock/cult, 1, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("runed girder", /obj/structure/girder/cult, 1, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("pylon", /obj/structure/destructible/cult/pylon, 4, time = 40, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("forge", /obj/structure/destructible/cult/forge, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("archives", /obj/structure/destructible/cult/tome, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("altar", /obj/structure/destructible/cult/talisman, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \
- ))
-
-/obj/item/stack/sheet/runed_metal
- name = "runed metal"
- desc = "Sheets of cold metal with shifting inscriptions writ upon them."
- singular_name = "runed metal sheet"
- icon_state = "sheet-runed"
- item_state = "sheet-runed"
- icon = 'icons/obj/stack_objects.dmi'
- custom_materials = list(/datum/material/runedmetal = MINERAL_MATERIAL_AMOUNT)
- merge_type = /obj/item/stack/sheet/runed_metal
- novariants = TRUE
- grind_results = list(/datum/reagent/iron = 5, /datum/reagent/blood = 15)
- material_type = /datum/material/runedmetal
-
-/obj/item/stack/sheet/runed_metal/attack_self(mob/living/user)
- if(!iscultist(user))
- to_chat(user, "Only one with forbidden knowledge could hope to work this metal...")
- return FALSE
- return ..()
-
-/obj/item/stack/sheet/runed_metal/get_main_recipes()
- . = ..()
- . += GLOB.runed_metal_recipes
-
-/obj/item/stack/sheet/runed_metal/fifty
- amount = 50
-
-/obj/item/stack/sheet/runed_metal/ten
- amount = 10
-
-/obj/item/stack/sheet/runed_metal/five
- amount = 5
-
/*
* Bronze
*/
@@ -785,7 +630,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
name = "pepperoni sheetzzas"
desc = "It's a delicious pepperoni sheetzza!"
singular_name = "pepperoni sheetzza"
- icon_state = "sheet-pizza"
+ icon_state = "sheet-meat" //This needs a pizza sheet but we also i dont think anyone will ever make this.
custom_materials = list(/datum/material/pizza = MINERAL_MATERIAL_AMOUNT)
merge_type = /obj/item/stack/sheet/pizza
material_type = /datum/material/pizza
diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm
index d22b1be85344..63fc55116d5a 100644
--- a/code/game/objects/items/stacks/tape.dm
+++ b/code/game/objects/items/stacks/tape.dm
@@ -80,7 +80,8 @@
grind_results = list(/datum/reagent/cellulose = 5)
usesound = 'sound/items/tape.ogg'
- var/stop_bleed = 600
+ var/lifespan = 300
+ var/bleed_reduction = 0.002
var/nonorganic_heal = 5
var/self_delay = 30 //! Also used for the tapecuff delay
var/other_delay = 10
@@ -114,7 +115,7 @@
return
if(use(1))
playsound(loc, usesound, 30, TRUE, -2)
- if(do_mob(user, C, other_delay) && (!C.is_mouth_covered() || !C.is_muzzled()))
+ if(do_after(user, other_delay, C) && (!C.is_mouth_covered() || !C.is_muzzled()))
apply_gag(C, user)
C.visible_message("[user] tapes [C]s mouth shut.", \
"[user] taped your mouth shut!")
@@ -134,7 +135,7 @@
"[user] is trying to put [src.name] on you!")
playsound(loc, usesound, 30, TRUE, -2)
- if(do_mob(user, C, self_delay) && (C.canBeHandcuffed()))
+ if(do_after(user, self_delay, C) && (C.canBeHandcuffed()))
apply_tapecuffs(C, user)
C.visible_message("[user] tapecuffs [C].", \
"[user] tapecuffs you.")
@@ -152,11 +153,11 @@
if(C == user)
playsound(loc, usesound, 30, TRUE, -2)
user.visible_message("[user] starts to apply \the [src] on [user.p_them()]self...", "You begin applying \the [src] on yourself...")
- if(!do_mob(user, C, self_delay, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ if(!do_after(user, self_delay, C, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
return
else if(other_delay)
user.visible_message("[user] starts to apply \the [src] on [C].", "You begin applying \the [src] on [C]...")
- if(!do_mob(user, C, other_delay, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ if(!do_after(user, other_delay, C, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
return
if(heal(C, user))
@@ -173,21 +174,17 @@
if(!affecting) //Missing limb?
to_chat(user, "[C] doesn't have \a [parse_zone(user.zone_selected)]!")
return
- if(!IS_ORGANIC_LIMB(affecting))
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(!H.bleedsuppress && H.bleed_rate)
- H.suppress_bloodloss(stop_bleed)
- to_chat(user, "You tape up the bleeding of [C]!")
- return TRUE
- to_chat(user, "[C] has a problem \the [src] won't fix!")
- else //Robotic patch-up
+ if(IS_ROBOTIC_LIMB(affecting)) //Robotic patch-up
if(affecting.brute_dam)
user.visible_message("[user] applies \the [src] on [C]'s [affecting.name].", "You apply \the [src] on [C]'s [affecting.name].")
if(affecting.heal_damage(nonorganic_heal))
C.update_damage_overlays()
return TRUE
- to_chat(user, "[src] can't patch what [C] has...")
+ if(affecting.can_bandage(user))
+ affecting.apply_bandage(bleed_reduction, lifespan, name)
+ to_chat(user, "You tape up [C]'s [parse_zone(affecting.body_zone)]!")
+ return TRUE
+ to_chat(user, "[src] can't patch what [C] has...")
/obj/item/stack/tape/proc/apply_gag(mob/living/carbon/target, mob/user)
if(target.is_muzzled() || target.is_mouth_covered())
@@ -272,7 +269,7 @@
desc = "This roll of silver sorcery can fix just about anything."
icon_state = "tape_d"
- stop_bleed = 800
+ lifespan = 400
nonorganic_heal = 20
prefix = "super sticky"
conferred_embed = EMBED_HARMLESS_SUPERIOR
@@ -297,7 +294,6 @@
desc = "Specialty insulated strips of adhesive plastic. Made for securing cables."
icon_state = "tape_e"
- stop_bleed = 400
nonorganic_heal = 10
prefix = "insulated sticky"
siemens_coefficient = 0
@@ -321,6 +317,6 @@
desc = "Now THIS is engineering."
icon_state = "tape_y"
- stop_bleed = 1000
+ lifespan = 500
nonorganic_heal = 30
prefix = "industry-standard sticky"
diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm
index c5e05b5212fc..ad00f3902c50 100644
--- a/code/game/objects/items/stacks/tiles/tile_mineral.dm
+++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm
@@ -48,16 +48,6 @@
mineralType = "diamond"
custom_materials = list(/datum/material/diamond=500)
-/obj/item/stack/tile/mineral/bananium
- name = "bananium tile"
- singular_name = "bananium floor tile"
- desc = "A tile made out of bananium, HOOOOOOOOONK!"
- icon_state = "tile_bananium"
- item_state = "tile-bananium"
- turf_type = /turf/open/floor/mineral/bananium
- mineralType = "bananium"
- custom_materials = list(/datum/material/bananium=500)
-
/obj/item/stack/tile/mineral/abductor
name = "alien floor tile"
singular_name = "alien floor tile"
diff --git a/code/game/objects/items/stacks/tiles/tiles_suns.dm b/code/game/objects/items/stacks/tiles/tiles_suns.dm
new file mode 100644
index 000000000000..65cc090b152d
--- /dev/null
+++ b/code/game/objects/items/stacks/tiles/tiles_suns.dm
@@ -0,0 +1,64 @@
+/obj/item/stack/tile/suns
+ name = "white marble tile"
+ singular_name = "white marble floor tile"
+ icon_state = "tile_suns_light"
+ turf_type = /turf/open/floor/suns
+ tile_reskin_types = list(
+ /obj/item/stack/tile/suns/plain,
+ /obj/item/stack/tile/suns/pattern,
+ /obj/item/stack/tile/suns/hatch,
+ /obj/item/stack/tile/suns/diagonal,
+ /obj/item/stack/tile/suns/grid,
+ /obj/item/stack/tile/suns/dark,
+ /obj/item/stack/tile/suns/dark/plain,
+ /obj/item/stack/tile/suns/dark/pattern)
+
+/obj/item/stack/tile/suns/plain
+ name = "white plain marble tile"
+ singular_name = "white plain marble floor tile"
+ icon_state = "tile_suns_lightplain"
+ turf_type = /turf/open/floor/suns/plain
+
+/obj/item/stack/tile/suns/pattern
+ name = "patterned white marble tile"
+ singular_name = "patterned white marble floor tile"
+ icon_state = "tile_suns_lightpattern"
+ turf_type = /turf/open/floor/suns/pattern
+
+/obj/item/stack/tile/suns/hatch
+ name = "hatched white marble tile"
+ singular_name = "hatched white marble floor tile"
+ icon_state = "tile_suns_lighthatched"
+ turf_type = /turf/open/floor/suns/hatch
+
+/obj/item/stack/tile/suns/diagonal
+ name = "diagonal white marble tile"
+ singular_name = "diagonal white marble floor tile"
+ icon_state = "tile_suns_lightdiag"
+ turf_type = /turf/open/floor/suns/diagonal
+
+/obj/item/stack/tile/suns/grid
+ name = "dark grid tile"
+ singular_name = "dark grid floor floor tile"
+ icon_state = "tile_suns_darkchunky"
+ turf_type = /turf/open/floor/suns/grid
+
+/obj/item/stack/tile/suns/dark
+ name = "black marble tile"
+ singular_name = "black marble floor tile"
+ icon_state = "tile_suns_dark"
+ turf_type = /turf/open/floor/suns/dark
+
+/obj/item/stack/tile/suns/dark/plain
+ name = "black plain marble tile"
+ singular_name = "black plain marble floor tile"
+ icon_state = "tile_suns_darkplain"
+ turf_type = /turf/open/floor/suns/dark/plain
+
+/obj/item/stack/tile/suns/dark/pattern
+ name = "patterned black marble tile"
+ singular_name = "patterned black marble floor tile"
+ icon_state = "tile_suns_darkpattern"
+ turf_type = /turf/open/floor/suns/dark/pattern
+
+
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index ac5b14568dad..5d87b42b78e5 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -20,7 +20,7 @@
righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
pickup_sound = "rustle"
drop_sound = "rustle"
- w_class = WEIGHT_CLASS_BULKY
+ w_class = WEIGHT_CLASS_HUGE
slot_flags = ITEM_SLOT_BACK //ERROOOOO
resistance_flags = NONE
max_integrity = 300
@@ -31,9 +31,9 @@
/obj/item/storage/backpack/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_combined_w_class = 21
- STR.max_w_class = WEIGHT_CLASS_NORMAL
- STR.max_items = 21
+ STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT
+ STR.max_volume = STORAGE_VOLUME_BACKPACK
+ STR.max_w_class = MAX_WEIGHT_CLASS_BACKPACK
STR.use_sound = 'sound/items/storage/unzip.ogg'
/*
@@ -58,9 +58,8 @@
/obj/item/storage/backpack/holding/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.allow_big_nesting = TRUE
- STR.max_w_class = WEIGHT_CLASS_GIGANTIC
- STR.max_combined_w_class = 35
+ STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT
+ STR.max_volume = STORAGE_VOLUME_BAG_OF_HOLDING
/obj/item/storage/backpack/santabag
name = "Santa's Gift Bag"
@@ -218,10 +217,16 @@
greyscale_colors = list(list(11, 12), list(17, 18), list(10, 11))
supports_variations = VOX_VARIATION
+/obj/item/storage/backpack/satchel/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_volume = STORAGE_VOLUME_BACKPACK
+ STR.max_w_class = MAX_WEIGHT_CLASS_M_CONTAINER
+
/obj/item/storage/backpack/satchel/leather
name = "leather satchel"
desc = "It's a very fancy satchel made with fine leather."
- icon = 'icons/obj/storage.dmi' //WS Edit - Suitcases
+ icon = 'icons/obj/storage.dmi'
icon_state = "satchel"
item_state = "satchel"
@@ -427,11 +432,13 @@
item_state = "duffel"
slowdown = 1
greyscale_colors = list(list(21, 11), list(14, 19), list(15, 16))
+ w_class = WEIGHT_CLASS_HUGE
/obj/item/storage/backpack/duffelbag/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_combined_w_class = 30
+ STR.max_volume = STORAGE_VOLUME_DUFFLEBAG
+ STR.max_w_class = MAX_WEIGHT_CLASS_DUFFEL
LAZYINITLIST(STR.exception_hold) // This code allows you to fit one mob holder into a duffel bag
STR.exception_hold += typecacheof(/obj/item/clothing/head/mob_holder)
@@ -634,7 +641,7 @@
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents()
new /obj/item/clothing/shoes/magboots/syndie(src)
new /obj/item/storage/firstaid/tactical(src)
- new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy(src)
+ new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot(src)
new /obj/item/ammo_box/foambox/riot(src)
/obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle
@@ -644,7 +651,7 @@
new /obj/item/reagent_containers/spray/chemsprayer/bioterror(src)
new /obj/item/storage/box/syndie_kit/chemical(src)
new /obj/item/gun/syringe/syndicate(src)
- new /obj/item/gun/ballistic/automatic/smg/c20r/toy(src)
+ new /obj/item/gun/ballistic/automatic/smg/c20r/toy/riot(src)
new /obj/item/storage/box/syringes(src)
new /obj/item/ammo_box/foambox/riot(src)
new /obj/item/grenade/chem_grenade/bioterrorfoam(src)
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm
index dc3d2deff0ba..ecee3894ccbb 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -45,10 +45,12 @@
/obj/item/storage/bag/trash/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_w_class = WEIGHT_CLASS_SMALL
- STR.max_combined_w_class = 30
- STR.max_items = 30
+ STR.max_w_class = WEIGHT_CLASS_NORMAL
+ STR.max_combined_w_class = 50
+ STR.max_items = 50
STR.set_holdable(null, list(/obj/item/disk/nuclear))
+ STR.limited_random_access = TRUE
+ STR.limited_random_access_stack_position = 3
/obj/item/storage/bag/trash/update_icon_state()
switch(contents.len)
@@ -83,8 +85,9 @@
/obj/item/storage/bag/trash/bluespace/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_combined_w_class = 60
- STR.max_items = 60
+ STR.max_combined_w_class = 75
+ STR.max_items = 75
+ STR.max_w_class = WEIGHT_CLASS_BULKY
/obj/item/storage/bag/trash/bluespace/cyborg
insertable = FALSE
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 157f9c611f30..802eeee2d45f 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -10,7 +10,7 @@
attack_verb = list("whipped", "lashed", "disciplined")
max_integrity = 300
equip_sound = 'sound/items/equip/toolbelt_equip.ogg'
- w_class = WEIGHT_CLASS_BULKY
+ w_class = WEIGHT_CLASS_NORMAL
var/content_overlays = FALSE //If this is true, the belt will gain overlays based on what it's holding
supports_variations = VOX_VARIATION
greyscale_icon_state = "belt"
@@ -248,6 +248,16 @@
new /obj/item/hypospray/mkii(src)
update_appearance()
+/obj/item/storage/belt/medical/webbing/surgery/PopulateContents()
+ new /obj/item/scalpel(src)
+ new /obj/item/circular_saw(src)
+ new /obj/item/surgicaldrill(src)
+ new /obj/item/retractor(src)
+ new /obj/item/cautery(src)
+ new /obj/item/hemostat(src)
+ new /obj/item/hypospray/mkii(src)
+ update_appearance()
+
/obj/item/storage/belt/security
name = "security belt"
desc = "Can hold security gear like handcuffs and flashes."
@@ -270,7 +280,15 @@
/obj/item/assembly/flash/handheld,
/obj/item/clothing/glasses,
/obj/item/ammo_casing/shotgun,
- /obj/item/ammo_box,
+ /obj/item/ammo_box/magazine,
+ /obj/item/ammo_box/c38, //speed loaders don't have a common path like magazines. pain.
+ /obj/item/ammo_box/a357, //some day we should refactor these into an ammo_box/speedloader type
+ /obj/item/ammo_box/a4570, //but not today
+ /obj/item/ammo_box/a858, //oh boy stripper clips too
+ /obj/item/ammo_box/vickland_a308,
+ /obj/item/ammo_box/a300,
+ /obj/item/ammo_box/aac_300blk_stripper,
+ /obj/item/ammo_box/amagpellet_claris, //that's the last of the clips
/obj/item/reagent_containers/food/snacks/donut,
/obj/item/kitchen/knife/combat,
/obj/item/flashlight/seclite,
@@ -441,7 +459,6 @@
"Snow" = "militarywebbing_snow",
"Urban" = "militarywebbing_urban",
)
- unique_reskin = null
//this might seem obtuse instead of setting allow_post_reskins to TRUE, but reskin menu would open every time on alt click, which is not good for this
/obj/item/storage/belt/military/examine(mob/user)
@@ -521,7 +538,7 @@
name = "agent belt"
desc = "A belt used by abductor agents."
icon = 'icons/obj/abductor.dmi'
- icon_state = "grenadebeltnew"
+ icon_state = "belt"
item_state = "grenadebeltnew"
unique_reskin = null
@@ -593,33 +610,6 @@
/obj/item/multitool = 1)
generate_items_inside(items_inside,src)
-
-/obj/item/storage/belt/wands
- name = "wand belt"
- desc = "A belt designed to hold various rods of power. A veritable fanny pack of exotic magic."
- icon_state = "soulstone"
- item_state = "soulstone"
-
-/obj/item/storage/belt/wands/ComponentInitialize()
- . = ..()
- var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_items = 6
- STR.set_holdable(list(
- /obj/item/gun/magic/wand
- ))
-
-/obj/item/storage/belt/wands/full/PopulateContents()
- new /obj/item/gun/magic/wand/death(src)
- new /obj/item/gun/magic/wand/resurrection(src)
- new /obj/item/gun/magic/wand/polymorph(src)
- new /obj/item/gun/magic/wand/teleport(src)
- new /obj/item/gun/magic/wand/door(src)
- new /obj/item/gun/magic/wand/fireball(src)
-
- for(var/obj/item/gun/magic/wand/W in contents) //All wands in this pack come in the best possible condition
- W.max_charges = initial(W.max_charges)
- W.charges = W.max_charges
-
/obj/item/storage/belt/janitor
name = "janibelt"
desc = "A belt used to hold most janitorial supplies."
@@ -699,6 +689,7 @@
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 40
+ STR.max_combined_w_class = 40
STR.display_numerical_stacking = TRUE
STR.set_holdable(list(
/obj/item/ammo_casing
@@ -913,7 +904,7 @@
item_state = "suns-cane"
w_class = WEIGHT_CLASS_BULKY
-/obj/item/storage/belt/sabre/suns/ComponentInitialize()
+/obj/item/storage/belt/sabre/suns/cmo/ComponentInitialize()
AddComponent(component_type)
AddElement(/datum/element/update_icon_updates_onmob)
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
@@ -924,7 +915,7 @@
/obj/item/melee/sabre/suns/cmo
))
-/obj/item/storage/belt/sabre/suns/PopulateContents()
+/obj/item/storage/belt/sabre/suns/cmo/PopulateContents()
new /obj/item/melee/sabre/suns/cmo(src)
update_appearance()
diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm
index a0ce4670c0bf..67dba503642d 100644
--- a/code/game/objects/items/storage/book.dm
+++ b/code/game/objects/items/storage/book.dm
@@ -1,3 +1,10 @@
+//need to refactor this.
+GLOBAL_LIST_INIT(biblenames, list("Bible", "Quran", "Scrapbook", "Burning Bible", "Clown Bible", "Banana Bible", "Creeper Bible", "White Bible", "Holy Light", "The God Delusion", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "Melted Bible", "Necronomicon", "Insulationism", "Guru Granth Sahib"))
+//If you get these two lists not matching in size, there will be runtimes and I will hurt you in ways you couldn't even begin to imagine
+// if your bible has no custom itemstate, use one of the existing ones
+GLOBAL_LIST_INIT(biblestates, list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon", "insuls", "gurugranthsahib"))
+GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon", "kingyellow", "gurugranthsahib"))
+
/obj/item/storage/book
name = "hollowed book"
desc = "I guess someone didn't like it."
@@ -17,18 +24,6 @@
/obj/item/storage/book/attack_self(mob/user)
to_chat(user, "The pages of [title] have been cut out!")
-GLOBAL_LIST_INIT(biblenames, list("Bible", "Quran", "Scrapbook", "Burning Bible", "Clown Bible", "Banana Bible", "Creeper Bible", "White Bible", "Holy Light", "The God Delusion", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "Melted Bible", "Necronomicon", "Insulationism", "Guru Granth Sahib"))
-//If you get these two lists not matching in size, there will be runtimes and I will hurt you in ways you couldn't even begin to imagine
-// if your bible has no custom itemstate, use one of the existing ones
-GLOBAL_LIST_INIT(biblestates, list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon", "insuls", "gurugranthsahib"))
-GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon", "kingyellow", "gurugranthsahib"))
-
-/mob/proc/bible_check() //The bible, if held, might protect against certain things
- var/obj/item/storage/book/bible/B = locate() in src
- if(is_holding(B))
- return B
- return 0
-
/obj/item/storage/book/bible
name = "bible"
desc = "Apply to head repeatedly."
@@ -41,217 +36,12 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
var/deity_name = "Christ"
force_string = "holy"
-/obj/item/storage/book/bible/Initialize()
- . = ..()
- AddComponent(/datum/component/anti_magic, FALSE, TRUE)
-
-/obj/item/storage/book/bible/attack_self(mob/living/carbon/human/H)
- if(!istype(H))
- return
- if(!H.can_read(src))
- return FALSE
- // If H is the Chaplain, we can set the icon_state of the bible (but only once!)
- if(!GLOB.bible_icon_state && H.mind.holy_role == HOLY_ROLE_HIGHPRIEST)
- var/dat = "Pick Bible Style
Pick a bible style
"
- for(var/i in 1 to GLOB.biblestates.len)
- var/icon/bibleicon = icon('icons/obj/storage.dmi', GLOB.biblestates[i])
- var/nicename = GLOB.biblenames[i]
- H << browse_rsc(bibleicon, nicename)
- dat += {"
"
-#define MAX_MUTANT_ROWS 4
+#define MAX_MUTANT_ROWS 5
/datum/preferences/proc/ShowChoices(mob/user)
show_loadout = (current_tab != 1) ? show_loadout : FALSE
@@ -425,9 +427,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Change "
dat += "Change "
- if(istype(pref_species, /datum/species/ethereal)) //not the best thing to do tbf but I dont know whats better.
+ if(istype(pref_species, /datum/species/elzuose)) //not the best thing to do tbf but I dont know whats better.
- dat += "
Ethereal Color
"
+ dat += "
Elzuosa Color
"
dat += "Change "
@@ -727,6 +729,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "
"
mutant_category = 0
+ if("kepori_head_feathers" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "
Head Feathers
"
+ dat += "[features["kepori_head_feathers"]] "
+ dat += "Change "
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+
if("kepori_body_feathers" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -835,10 +850,22 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//Adds a thing to select which phobia because I can't be assed to put that in the quirks window
if("Phobia" in all_quirks)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
dat += "
Phobia
"
dat += "[phobia] "
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+
+ if("Smoker" in all_quirks)
+ dat += "
Smoker
"
+
+ dat += "[preferred_smoke_brand] "
+
if("body_size" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -852,6 +879,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
mutant_category = 0
+ if(generic_adjective)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "
Character Adjective
"
+
+ dat += "[generic_adjective] "
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+
if("wings" in pref_species.default_features && GLOB.r_wings_list.len >1)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -1665,9 +1705,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
age = clamp(round(text2num(new_age)), pref_species.species_age_min, pref_species.species_age_max)
if("flavor_text")
- var/msg = sanitize(stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", features["flavor_text"], 4096, TRUE))
+ var/msg = stripped_multiline_input(usr, "A snippet of text shown when others examine you, describing what you may look like. This can also be used for OOC notes.", "Flavor Text", html_decode(features["flavor_text"]), MAX_FLAVOR_LEN, TRUE)
if(msg) //WS edit - "Cancel" does not clear flavor text
- features["flavor_text"] = html_decode(msg)
+ features["flavor_text"] = msg
if("hair")
var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference","#"+hair_color) as color|null
@@ -1816,7 +1856,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
to_chat(user, "Invalid color. Your color is not bright enough.")
if("color_ethereal")
- var/new_etherealcolor = input(user, "Choose your elzuosa color:", "Character Preference","#"+features["ethcolor"]) as color|null
+ var/new_etherealcolor = input(user, "Choose your elzuose color:", "Character Preference","#"+features["ethcolor"]) as color|null
if(new_etherealcolor)
var/temp_hsv = RGBtoHSV(new_etherealcolor)
if(ReadHSV(temp_hsv)[3] >= ReadHSV("#505050")[3]) // elzu colors should be bright
@@ -1959,6 +1999,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (new_kepori_feathers)
features["kepori_feathers"] = new_kepori_feathers
+ if("kepori_head_feathers")
+ var/new_kepori_feathers
+ new_kepori_feathers = input(user, "Choose your character's head feathers:", "Character Preference") as null|anything in GLOB.kepori_head_feathers_list
+ if (new_kepori_feathers)
+ features["kepori_head_feathers"] = new_kepori_feathers
+
if("kepori_body_feathers")
var/new_kepori_feathers
new_kepori_feathers = input(user, "Choose your character's body feathers:", "Character Preference") as null|anything in GLOB.kepori_body_feathers_list
@@ -2073,6 +2119,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/phobiaType = input(user, "What are you scared of?", "Character Preference", phobia) as null|anything in SStraumas.phobia_types
if(phobiaType)
phobia = phobiaType
+ if("preferred_smoke_brand")
+ var/smokeBrand = input(user, "What cigarettes are your favorite?", "Character Preference", preferred_smoke_brand) as null|anything in GLOB.valid_smoke_types
+ if(smokeBrand)
+ preferred_smoke_brand = smokeBrand
+
+ if("generic_adjective")
+ var/selectAdj
+ if(istype(pref_species, /datum/species/ipc))
+ selectAdj = input(user, "In one word, how would you describe your character's appereance?", "Character Preference", generic_adjective) as null|anything in GLOB.ipc_preference_adjectives
+ else
+ selectAdj = input(user, "In one word, how would you describe your character's appereance?", "Character Preference", generic_adjective) as null|anything in GLOB.preference_adjectives
+ if(selectAdj)
+ generic_adjective = selectAdj
if ("max_chat_length")
var/desiredlength = input(user, "Choose the max character length of shown Runechat messages. Valid range is 1 to [CHAT_MESSAGE_MAX_LENGTH] (default: [initial(max_chat_length)]))", "Character Preference", max_chat_length) as null|num
@@ -2473,6 +2532,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE)
//Because of how set_species replaces all bodyparts with new ones, hair needs to be set AFTER species.
character.dna.real_name = character.real_name
+ character.generic_adjective = generic_adjective
character.hair_color = hair_color
character.facial_hair_color = facial_hair_color
character.grad_color = features["grad_color"]
@@ -2492,20 +2552,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
/datum/preferences/proc/get_default_name(name_id)
switch(name_id)
- if("human")
- return random_unique_name()
if("ai")
return pick(GLOB.ai_names)
if("cyborg")
return DEFAULT_CYBORG_NAME
- if("clown")
- return pick(GLOB.clown_names)
- if("mime")
- return pick(GLOB.mime_names)
- if("religion")
- return DEFAULT_RELIGION
- if("deity")
- return DEFAULT_DEITY
return random_unique_name()
/datum/preferences/proc/ask_for_custom_name(mob/user,name_id)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 0b95e291b794..3c3040f03906 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -405,6 +405,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
READ_FILE(S["jumpsuit_style"], jumpsuit_style)
READ_FILE(S["uplink_loc"], uplink_spawn_loc)
READ_FILE(S["phobia"], phobia)
+ READ_FILE(S["preferred_smoke_brand"], preferred_smoke_brand)
+ READ_FILE(S["generic_adjective"], generic_adjective)
READ_FILE(S["randomise"], randomise)
READ_FILE(S["body_size"], features["body_size"])
READ_FILE(S["prosthetic_limbs"], prosthetic_limbs)
@@ -436,6 +438,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
READ_FILE(S["feature_ipc_brain"], features["ipc_brain"])
READ_FILE(S["feature_kepori_feathers"], features["kepori_feathers"])
READ_FILE(S["feature_kepori_body_feathers"], features["kepori_body_feathers"])
+ READ_FILE(S["feature_kepori_head_feathers"], features["kepori_head_feathers"])
READ_FILE(S["feature_kepori_tail_feathers"], features["kepori_tail_feathers"])
READ_FILE(S["feature_vox_head_quills"], features["vox_head_quills"])
READ_FILE(S["feature_vox_neck_quills"], features["vox_neck_quills"])
@@ -546,8 +549,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["ipc_chassis"] = sanitize_inlist(features["ipc_chassis"], GLOB.ipc_chassis_list)
features["ipc_brain"] = sanitize_inlist(features["ipc_brain"], GLOB.ipc_brain_list)
features["kepori_feathers"] = sanitize_inlist(features["kepori_feathers"], GLOB.kepori_feathers_list, "Plain")
- features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "Plain")
- features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "Fan")
+ features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "None")
+ features["kepori_head_feathers"] = sanitize_inlist(features["kepori_head_feathers"], GLOB.kepori_head_feathers_list, "None")
+ features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "None")
features["vox_head_quills"] = sanitize_inlist(features["vox_head_quills"], GLOB.vox_head_quills_list, "None")
features["vox_neck_quills"] = sanitize_inlist(features["vox_neck_quills"], GLOB.vox_neck_quills_list, "None")
features["elzu_horns"] = sanitize_inlist(features["elzu_horns"], GLOB.elzu_horns_list)
@@ -593,7 +597,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc)
WRITE_FILE(S["randomise"] , randomise)
WRITE_FILE(S["species"] , pref_species.id)
+ WRITE_FILE(S["preferred_smoke_brand"] , preferred_smoke_brand)
WRITE_FILE(S["phobia"] , phobia)
+ WRITE_FILE(S["generic_adjective"] , generic_adjective)
WRITE_FILE(S["body_size"] , features["body_size"])
WRITE_FILE(S["prosthetic_limbs"] , prosthetic_limbs)
WRITE_FILE(S["feature_mcolor"] , features["mcolor"])
@@ -625,6 +631,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_ipc_brain"] , features["ipc_brain"])
WRITE_FILE(S["feature_kepori_feathers"] , features["kepori_feathers"])
WRITE_FILE(S["feature_kepori_body_feathers"], features["kepori_body_feathers"])
+ WRITE_FILE(S["feature_kepori_head_feathers"], features["feature_kepori_head_feathers"])
WRITE_FILE(S["feature_kepori_tail_feathers"], features["kepori_tail_feathers"])
WRITE_FILE(S["feature_vox_head_quills"] , features["vox_head_quills"])
WRITE_FILE(S["feature_vox_neck_quills"] , features["vox_neck_quills"])
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index b12e7cdf3d00..b40e1702652e 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -443,7 +443,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
//Admin Preferences
/client/proc/toggleadminhelpsound()
set name = "Hear/Silence Adminhelps"
- set category = "Prefs - Admin"
+ set category = "Preferences.Admin"
set desc = "Toggle hearing a notification when admin PMs are received"
if(!holder)
return
@@ -454,7 +454,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
/client/proc/toggleannouncelogin()
set name = "Do/Don't Announce Login"
- set category = "Prefs - Admin"
+ set category = "Preferences.Admin"
set desc = "Toggle if you want an announcement to admins when you login during a round"
if(!holder)
return
@@ -465,7 +465,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
/client/proc/toggle_hear_radio()
set name = "Show/Hide Radio Chatter"
- set category = "Prefs - Admin"
+ set category = "Preferences.Admin"
set desc = "Toggle seeing radiochatter from nearby radios and speakers"
if(!holder)
return
@@ -487,7 +487,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
/client/proc/deadchat()
set name = "Show/Hide Deadchat"
- set category = "Prefs - Admin"
+ set category = "Preferences.Admin"
set desc ="Toggles seeing deadchat"
if(!holder)
return
@@ -498,7 +498,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
/client/proc/toggleprayers()
set name = "Show/Hide Prayers"
- set category = "Prefs - Admin"
+ set category = "Preferences.Admin"
set desc = "Toggles seeing prayers"
if(!holder)
return
@@ -509,7 +509,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
/client/proc/toggle_prayer_sound()
set name = "Hear/Silence Prayer Sounds"
- set category = "Prefs - Admin"
+ set category = "Preferences.Admin"
set desc = "Hear Prayer Sounds"
if(!holder)
return
@@ -520,7 +520,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
/client/proc/colorasay()
set name = "Set Admin Say Color"
- set category = "Prefs - Admin"
+ set category = "Preferences.Admin"
set desc = "Set the color of your ASAY messages"
if(!holder)
return
@@ -537,7 +537,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
/client/proc/resetasaycolor()
set name = "Reset your Admin Say Color"
set desc = "Returns your ASAY Color to default"
- set category = "Prefs - Admin"
+ set category = "Preferences.Admin"
if(!holder)
return
if(!CONFIG_GET(flag/allow_admin_asaycolor))
diff --git a/code/modules/client/verbs/looc.dm b/code/modules/client/verbs/looc.dm
index 47d4e0e82aec..1c66a077a065 100644
--- a/code/modules/client/verbs/looc.dm
+++ b/code/modules/client/verbs/looc.dm
@@ -59,32 +59,33 @@ GLOBAL_VAR_INIT(normal_looc_colour, "#6699CC")
mob.log_talk(raw_msg, LOG_LOOC, tag = "(LOOC)")
- var/list/heard = get_hearers_in_view(7, get_top_level_mob(src.mob))
- for(var/mob/M in heard)
- if(!M.client)
+ var/list/heard = get_hearers_in_view(7, get_top_level_mob(mob))
+ for(var/mob/hearer_mob in heard)
+ var/client/hearer = hearer_mob.client
+
+ if(!hearer)
continue
- var/client/C = M.client
- if(key in C.prefs.ignoring)
+ if(key in hearer.prefs.ignoring)
continue
- if(holder?.fakekey in C.prefs.ignoring)
+ if(holder?.fakekey in hearer.prefs.ignoring)
continue
- if(!(C.prefs.chat_toggles & CHAT_LOOC))
+ if(!(hearer.prefs.chat_toggles & CHAT_LOOC))
continue
//Handled before admins so that they see this if they're in range anyways
- if(C.prefs.chat_on_map && mob.invisibility <= M.see_invisible)
- M.create_chat_message(mob, null, "\[LOOC: [raw_msg]\]", null, LOOC_MESSAGE)
+ if(hearer.prefs.chat_on_map && mob.invisibility <= hearer_mob.see_invisible)
+ hearer_mob.create_chat_message(mob, null, "\[LOOC: [raw_msg]\]", null, LOOC_MESSAGE)
- if(C in GLOB.admins)
+ if(hearer in GLOB.admins)
continue //handled in the next loop
if(GLOB.LOOC_COLOR)
- to_chat(C, "LOOC:[src.mob.name]:[msg]", MESSAGE_TYPE_LOOC)
+ to_chat(hearer, "LOOC:[mob.get_screentip_name(hearer)]:[msg]", MESSAGE_TYPE_LOOC)
else
- to_chat(C, "LOOC:[src.mob.name]:[msg]", MESSAGE_TYPE_LOOC)
+ to_chat(hearer, "LOOC:[mob.get_screentip_name(hearer)]:[msg]", MESSAGE_TYPE_LOOC)
for(var/client/C in GLOB.admins)
if(key in C.prefs.ignoring)
@@ -100,9 +101,9 @@ GLOBAL_VAR_INIT(normal_looc_colour, "#6699CC")
if (C.mob in heard)
prefix = "LOOC"
if(GLOB.LOOC_COLOR)
- to_chat(C, "[ADMIN_FLW(usr)] [prefix]:[src.key]/[src.mob.name]:[msg]", MESSAGE_TYPE_LOOC)
+ to_chat(C, "[ADMIN_FLW(usr)] [prefix]:[key]/[mob.real_name]:[msg]", MESSAGE_TYPE_LOOC)
else
- to_chat(C, "[ADMIN_FLW(usr)] [prefix]:[src.key]/[src.mob.name]:[msg]", MESSAGE_TYPE_LOOC)
+ to_chat(C, "[ADMIN_FLW(usr)] [prefix]:[key]/[mob.real_name]:[msg]", MESSAGE_TYPE_LOOC)
/proc/toggle_looc(toggle = null)
if(toggle == null)
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index 203bcf416b13..f5c37b18997d 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -150,7 +150,7 @@
card.assignment = J.name
card.update_appearance()
card.assignment = old_assignment
- card.update_label()
+ card.name = "[(istype(src, /obj/item/card/id/syndicate)) ? "[initial(name)]" : "access card"][(!old_assignment) ? "" : " ([old_assignment])"]"
H.sec_hud_set_ID()
qdel(outfit)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index b1e1cc1f2105..166f437dc3af 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -286,7 +286,7 @@
if("[layer]" in mob_species.offset_clothing)
// This code taken from Baystation 12
- var/icon/final_I = icon('icons/blanks/32x32.dmi', "nothing")
+ var/icon/final_I = icon('icons/blanks/64x64.dmi', "nothing")
var/list/shifts = mob_species.offset_clothing["[layer]"]
// Apply all pixel shifts for each direction.
@@ -294,9 +294,10 @@
var/list/facing_list = shifts[shift_facing]
var/use_dir = text2num(shift_facing)
var/icon/equip = icon(file2use, icon_state = state2use, dir = use_dir)
- var/icon/canvas = icon('icons/blanks/32x32.dmi', "nothing")
+ var/icon/canvas = icon('icons/blanks/64x64.dmi', "nothing")
canvas.Blend(equip, ICON_OVERLAY, facing_list["x"]+1, facing_list["y"]+1)
final_I.Insert(canvas, dir = use_dir)
+
final_I = fcopy_rsc(final_I)
GLOB.species_clothing_icons[mob_species.id]["[file2use]-[state2use]"] = final_I
return TRUE
diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm
index fe9d68635a2e..72d29ce55b56 100644
--- a/code/modules/clothing/ears/_ears.dm
+++ b/code/modules/clothing/ears/_ears.dm
@@ -2,6 +2,8 @@
//Ears: currently only used for headsets and earmuffs
/obj/item/clothing/ears
name = "ears"
+ lefthand_file = 'icons/mob/inhands/clothing/ears_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/clothing/ears_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
throwforce = 0
slot_flags = ITEM_SLOT_EARS
diff --git a/code/modules/clothing/factions/clip.dm b/code/modules/clothing/factions/clip.dm
index 82e1fdee68b0..97eed2728fb6 100644
--- a/code/modules/clothing/factions/clip.dm
+++ b/code/modules/clothing/factions/clip.dm
@@ -6,6 +6,7 @@
icon = 'icons/obj/clothing/faction/clip/uniforms.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/clip/uniforms.dmi'
+ vox_override_icon = 'icons/mob/clothing/faction/clip/vox.dmi'
icon_state = "clip_deck"
item_state = "b_suit"
@@ -16,7 +17,7 @@
dying_key = DYE_REGISTRY_UNDER //??? // it's for washing machines don't worry about it
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION // a new record!
+ supports_variations = DIGITIGRADE_VARIATION_SAME_ICON_FILE | VOX_VARIATION // a new record! UPDATE 2 MONTHS LATER: :'(
/obj/item/clothing/under/clip/minutemen
name = "clip minutemen fatigues"
@@ -28,7 +29,7 @@
strip_delay = 50
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_SAME_ICON_FILE | VOX_VARIATION
/obj/item/clothing/under/clip/formal
name = "formal clip outfit"
@@ -37,7 +38,7 @@
icon_state = "clip_formal"
armor = null
- supports_variations = null
+ supports_variations = DIGITIGRADE_VARIATION_SAME_ICON_FILE | VOX_VARIATION
/obj/item/clothing/under/clip/formal/alt
name = "formal clip outfit"
@@ -62,6 +63,8 @@
icon_state = "clip_medic"
+ supports_variations = DIGITIGRADE_VARIATION_SAME_ICON_FILE | VOX_VARIATION
+
/obj/item/clothing/under/clip/officer
name = "clip minutemen officer uniform"
desc = "A uniform used by higher ranking officers of the CLIP Minutemen."
@@ -69,6 +72,8 @@
item_state = "g_suit"
can_adjust = FALSE
+ supports_variations = DIGITIGRADE_VARIATION_SAME_ICON_FILE | VOX_VARIATION
+
/obj/item/clothing/under/clip/officer/alt
name = "clip minutemen officer uniform"
desc = "A uniform with a pencil skirt used by higher ranking officers of the CLIP Minutemen."
@@ -109,6 +114,8 @@
icon_state = "clip_general"
item_state = "clip_general"
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+
/obj/item/clothing/suit/armor/vest/capcarapace/clip/admiral
name = "CLIP Minutemen admiral trenchcoat"
desc = "A very fancy trenchcoat used by admirals of the CLIP Minutemen."
@@ -137,7 +144,8 @@
armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
cold_protection = CHEST|LEGS|ARMS
heat_protection = CHEST|LEGS|ARMS
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+
+ supports_variations = DIGITIGRADE_VARIATION_SAME_ICON_FILE
/obj/item/clothing/suit/armor/clip_capcoat
name = "\improper CLIP Minutemen captain's coat"
@@ -152,23 +160,28 @@
armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
cold_protection = CHEST|LEGS|ARMS
heat_protection = CHEST|LEGS|ARMS
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+
+ supports_variations = DIGITIGRADE_VARIATION_SAME_ICON_FILE
//spacesuits
-/obj/item/clothing/suit/space/hardsuit/security/independent/clip //TODO: replace
- name = "\improper CMM Patroller hardsuit"
- desc = "A hardsuit used by the CLIP Minutemen. To reduce costs, its a modified version of a more popular model from a independent manufacturer, and given to patrol vessels. As should be obvious, it's not extremely armored, as it's made for reconnaissance and speed."
+/obj/item/clothing/suit/space/hardsuit/clip_patroller
+ name = "\improper CM-410 'Patroller' EVA Hardsuit"
+ desc = "A CLIP produced hardsuit adapted from an existing design. Intended for reconnaissance and speed, it's not extremely armored, that job goes to the Spotter hardsuit."
icon = 'icons/obj/clothing/faction/clip/suits.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/clip/suits.dmi'
icon_state = "hardsuit-clip-patrol"
hardsuit_type = "hardsuit-clip-patrol"
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/independent/clip
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/clip_patroller
-/obj/item/clothing/head/helmet/space/hardsuit/security/independent/clip //TODO: replace
- name = "\improper CMM Patroller hardsuit helmet"
- desc = "A hardsuit used by the CLIP Minutemen. To reduce costs, its a modified version of a more popular model from a independent manufacturer, and given to patrol vessels. As should be obvious, it's not extremely armored, as it's made for reconnaissance and speed."
+ supports_variations = DIGITIGRADE_VARIATION_SAME_ICON_FILE
+
+ armor = list("melee" = 35, "bullet" = 25, "laser" = 20,"energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
+
+/obj/item/clothing/head/helmet/space/hardsuit/clip_patroller
+ name = "\improper CM-410 'Patroller' EVA Hardsuit helmet"
+ desc = "A CLIP produced hardsuit adapted from an existing design. Intended for reconnaissance and speed, it's not extremely armored, that job goes to the Spotter hardsuit."
icon = 'icons/obj/clothing/faction/clip/head.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/clip/head.dmi'
@@ -176,6 +189,10 @@
icon_state = "hardsuit0-clip-patrol"
hardsuit_type = "clip-patrol"
+ supports_variations = SNOUTED_VARIATION
+
+ armor = list("melee" = 35, "bullet" = 25, "laser" = 20,"energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
+
/obj/item/clothing/suit/space/hardsuit/clip_spotter
name = "CM-490 'Spotter' Combat Hardsuit"
desc = "CLIP's standard EVA combat hardsuit. Due to CLIP's doctrine on range, it doesn't have advanced components that allow swift movement, and thus slows down the user despite the heavy armor."
@@ -193,6 +210,8 @@
resistance_flags = null
slowdown = 1
+ supports_variations = DIGITIGRADE_VARIATION_SAME_ICON_FILE
+
/obj/item/clothing/head/helmet/space/hardsuit/clip_spotter
name = "CM-490 'Spotter' Combat Hardsuit Helmet"
desc = "CLIP's standard EVA combat hardsuit. Due to CLIP's doctrine on range, it doesn't have advanced components that allow swift movement, and thus slows down the user despite the heavy armor."
@@ -206,6 +225,7 @@
armor = list("melee" = 50, "bullet" = 50, "laser" = 30, "energy" = 40, "bomb" = 35, "bio" = 100, "rad" = 60, "fire" = 50, "acid" = 80)
resistance_flags = null
+ supports_variations = SNOUTED_VARIATION
//hats
/obj/item/clothing/head/clip
@@ -213,11 +233,13 @@
desc = "A standard issue soft cap dating back to the original Zohil colonial peroid. While usually given to recruits and volunteers, it's sometimes used by occasionally by some Minutemen."
icon = 'icons/obj/clothing/faction/clip/head.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/clip/head.dmi'
+ vox_override_icon = 'icons/mob/clothing/faction/clip/vox.dmi'
// lefthand_file = 'icons/mob/inhands/faction/clip/gezena_lefthand.dmi'
// righthand_file = 'icons/mob/inhands/faction/clip/gezena_righthand.dmi'
icon_state = "clip_cap"
item_state = "bluecloth"
- armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+ supports_variations = VOX_VARIATION
/obj/item/clothing/head/clip/corpsman
name = "\improper CLIP Minutemen corpsman cap"
@@ -225,28 +247,35 @@
icon_state = "clip_mediccap"
item_state = "whitecloth"
+ supports_variations = VOX_VARIATION
+
/obj/item/clothing/head/clip/slouch
name = "CLIP Minutemen slouch hat"
desc = "A commanding slouch hat used by the CLIP Minutemen."
icon_state = "clip_slouch_hat"
+ supports_variations = VOX_VARIATION
+
/obj/item/clothing/head/clip/slouch/officer
name = "CLIP Minutemen officer's slouch hat"
desc = "A commanding slouch hat adorned with a officer's badge, used by the CLIP Minutemen."
icon_state = "clip_officer_hat"
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30,"energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- strip_delay = 60
+
+ supports_variations = VOX_VARIATION
/obj/item/clothing/head/clip/boonie
name = "CLIP Minutemen boonie hat"
desc = "A wide brimmed cap to keep yourself cool during blistering hot weather."
icon_state = "clip_boonie"
+ supports_variations = VOX_VARIATION
+
/obj/item/clothing/head/clip/bicorne
name = "general's bicorne"
desc = "A fancy bicorne used by generals of the CLIP Minutemen."
icon_state = "clip_general_hat"
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30,"energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+ supports_variations = VOX_VARIATION
/obj/item/clothing/head/helmet/bulletproof/x11/clip
name = "\improper Minutemen X11 Helmet"
@@ -254,22 +283,28 @@
icon = 'icons/obj/clothing/faction/clip/head.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/clip/head.dmi'
+ vox_override_icon = 'icons/mob/clothing/faction/clip/vox.dmi'
icon_state = "clip_x11"
allow_post_reskins = FALSE
unique_reskin = null
+ supports_variations = VOX_VARIATION
+
/obj/item/clothing/head/helmet/bulletproof/m10/clip_vc
name = "\improper Minutemen Vehicle Crewman M10 Helmet"
desc = "A light bulletproof helmet worn by Vehicle Crewmen of the CLIP Minutemen. The ear padding protects the ears from loud noises and the microphone automatically connects with a headset."
icon = 'icons/obj/clothing/faction/clip/head.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/clip/head.dmi'
+ vox_override_icon = 'icons/mob/clothing/faction/clip/vox.dmi'
icon_state = "clip_m10_vc"
allow_post_reskins = FALSE
unique_reskin = null
+ supports_variations = VOX_VARIATION
+
/obj/item/clothing/head/helmet/bulletproof/m10/clip_vc/ComponentInitialize()
. = ..()
AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_HEAD))
@@ -282,6 +317,8 @@
mob_overlay_icon = 'icons/mob/clothing/faction/clip/head.dmi'
icon_state = "riot_clip"
+ supports_variations = SNOUTED_VARIATION
+
//GOLD
/obj/item/clothing/head/fedora/det_hat/clip
name = "GOLD fedora"
@@ -289,11 +326,12 @@
icon = 'icons/obj/clothing/faction/clip/head.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/clip/head.dmi'
+ vox_override_icon = 'icons/mob/clothing/faction/clip/vox.dmi'
icon_state = "clip_fedora"
item_state = "detective"
- armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) //dets hat is armored for some reaon
+ supports_variations = VOX_VARIATION
/obj/item/clothing/head/flatcap/clip
name = "GOLD flatcap"
@@ -301,9 +339,12 @@
icon = 'icons/obj/clothing/faction/clip/head.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/clip/head.dmi'
+ vox_override_icon = 'icons/mob/clothing/faction/clip/vox.dmi'
icon_state = "flatcap_clip"
item_state = "detective"
+
+ supports_variations = VOX_VARIATION
//mask
/obj/item/clothing/mask/gas/clip
@@ -316,6 +357,10 @@
icon_state = "clip-gasmask"
strip_delay = 60
+ flags_inv = HIDEEARS|HIDEFACE|HIDEFACIALHAIR
+
+ supports_variations = SNOUTED_VARIATION
+
//gloves
/obj/item/clothing/gloves/color/latex/nitrile/clip
@@ -324,10 +369,13 @@
icon = 'icons/obj/clothing/faction/clip/hands.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/clip/hands.dmi'
+ vox_override_icon = 'icons/mob/clothing/faction/clip/vox.dmi'
icon_state = "nitrile_clip"
item_state = "nitrile_clip"
+ supports_variations = VOX_VARIATION
+
//boots
//belt
@@ -337,12 +385,15 @@
icon = 'icons/obj/clothing/faction/clip/belt.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/clip/belt.dmi'
+ vox_override_icon = 'icons/mob/clothing/faction/clip/vox.dmi'
icon_state = "clipwebbing"
item_state = "clipwebbing"
unique_reskin = null
+ supports_variations = VOX_VARIATION
+
/obj/item/storage/belt/military/clip/p16/PopulateContents()
for(var/i in 1 to 4)
new /obj/item/ammo_box/magazine/p16(src)
@@ -389,9 +440,12 @@
icon = 'icons/obj/clothing/faction/clip/belt.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/clip/belt.dmi'
+ vox_override_icon = 'icons/mob/clothing/faction/clip/vox.dmi'
icon_state = "clip-medwebbing"
+ supports_variations = VOX_VARIATION
+
/obj/item/storage/belt/medical/webbing/clip/prefilled/PopulateContents()
new /obj/item/reagent_containers/medigel/styptic(src)
new /obj/item/reagent_containers/medigel/styptic(src)
@@ -408,6 +462,8 @@
icon_state = "clippack"
+ supports_variations = VOX_VARIATION
+
/obj/item/storage/backpack/satchel/sec/clip
name = "clip satchel"
desc = "A robust satchel for anti-piracy related needs."
diff --git a/code/modules/clothing/factions/frontiersmen.dm b/code/modules/clothing/factions/frontiersmen.dm
new file mode 100644
index 000000000000..9bac6c40a004
--- /dev/null
+++ b/code/modules/clothing/factions/frontiersmen.dm
@@ -0,0 +1,260 @@
+//////////////
+//Jumpsuits//
+/////////////
+
+/obj/item/clothing/under/frontiersmen
+ name = "\improper frontiersmen uniform"
+ desc = "Fatigues worn by members of the Frontiersmen pirate fleet. Its poor-quality linen is very uncomfortable to move around in."
+ icon_state = "frontier"
+ item_state = "frontier"
+ can_adjust = FALSE
+ icon = 'icons/obj/clothing/faction/frontiersmen/uniforms.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/uniforms.dmi'
+
+/obj/item/clothing/under/frontiersmen/deckhand
+ name = "\improper deckhand jumpsuit"
+ desc = "A cheap olive-green jumpsuit used by the Frontiersmen on their vessels. It has an old smell permeating it."
+ icon_state = "frontier_deckhand"
+ item_state = "frontier_deckhand"
+
+/obj/item/clothing/under/frontiersmen/fireproof
+ name = "\improper fireproof frontiersmen fatigues"
+ desc = "An all-black set of fatigues worn by the flamethrower units of the Frontiersmen. It feels oddly itchy when worn..."
+ icon_state = "frontier_fireproof"
+ item_state = "frontier_fireproof"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/under/frontiersmen/officer
+ name = "\improper Frontiersmen officer's uniform"
+ desc = "Worn by officers of the Frontiersmen pirate fleet. It's less comfortable than it looks."
+ icon_state = "frontier_officer"
+
+/obj/item/clothing/under/frontiersmen/admiral
+ name = "\improper frontiersmen admiral uniform"
+ desc = "Worn by admirals of the Frontiersmen pirate fleet, adorned with a tasteful amount of gold and completed with a very-stylish all-white aesthetic. Quite snobby for a bunch of pirates."
+ icon_state = "frontier_admiral"
+ item_state = "frontier_admiral"
+
+////////////////////
+//Unarmored suits//
+///////////////////
+
+/obj/item/clothing/suit/frontiersmen
+ name = "frontiersmen smock"
+ desc = "A basic white surgical apron worn by the Frontiersmen. It seems it could stain very easily..."
+ icon_state = "frontier_surgery"
+ icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
+
+//////////////////
+//Armored suits//
+/////////////////
+
+/obj/item/clothing/suit/armor/vest/bulletproof/frontier
+ name = "\improper Frontiersmen bulletproof armor"
+ desc = "A scrap piece of armor made of disused protective plates. This one was used to protect the squishy bits of a Frontiersman, once."
+ icon_state = "frontier_armor"
+ icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
+ blood_overlay_type = "armor"
+
+/obj/item/clothing/suit/armor/vest/marine/frontier
+ name = "light tactical armor vest"
+ desc = "A bulky set of stamped plasteel armor plates, coated with the intimidating grey of the Frontiersmen. If you have the time to inspect this vest, either you are about to die, or you have killed the one who wore it originally."
+ icon_state = "marine_frontier"
+ item_state = "armor"
+ icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
+
+/obj/item/clothing/suit/armor/frontier
+ name = "reinforced fur coat"
+ desc = "A stiff olive-green coat, meant for frigid conditions. Commonly worn by Frontiersmen command."
+ icon_state = "frontier_coat"
+ body_parts_covered = CHEST|GROIN|ARMS
+ cold_protection = CHEST|GROIN|ARMS
+ heat_protection = CHEST|GROIN|ARMS
+ icon_state = "frontier_coat"
+ item_state = "frontier_coat"
+ blood_overlay_type = "coat"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
+
+/obj/item/clothing/suit/armor/frontier/fireproof
+ name = "frontiersmen fireproof coat"
+ desc = "A stiff olive-green coat, used particularly by Frontiersmen flame troopers. It seems to be lined with asbestos, to provide maximum heat and fire deterrence... At the cost of comfort. And mesothelioma."
+ icon_state = "frontier_fireproof_suit"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ w_class = WEIGHT_CLASS_BULKY
+ gas_transfer_coefficient = 0.9
+ permeability_coefficient = 0.5
+ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+ slowdown = 0.5
+ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
+ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/tank/internals/plasmaman, /obj/item/extinguisher, /obj/item/crowbar)
+
+///////////////
+//Spacesuits//
+//////////////
+
+/obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
+ name = "\improper Frontiersmen hardsuit helmet"
+ desc = "An old hardsuit helmet based on a even older hardsuit helmet. Used prolifically by the Frontiersmen pirate fleet."
+ icon_state = "hardsuit0-frontier"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+ hardsuit_type = "frontier"
+
+/obj/item/clothing/suit/space/hardsuit/security/independent/frontier
+ name = "\improper Frontiersmen hardsuit"
+ desc = "An old hardsuit based on a even older hardsuit. Used prolifically by the Frontiersmen pirate fleet."
+ icon_state = "hardsuit_frontier"
+ hardsuit_type = "hardsuit_frontier"
+ icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
+
+/////////
+//Hats//
+////////
+
+/obj/item/clothing/head/soft/frontiersmen
+ name = "frontiersman cap"
+ desc = "An olive-green and grey baseball hat, worn by cargo technicians working under the Frontiersmen. Even they have the rights for a cool cap!"
+ icon_state = "frontiersoft"
+ soft_type = "frontiersmen"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+
+/obj/item/clothing/head/beret/sec/frontier
+ name = "\improper Frontiersmen beret"
+ desc = "A scratchy olive green beret, worn by Frontiersmen who want to look good while intimidating freighter crew."
+ icon_state = "frontier_beret"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+
+/obj/item/clothing/head/beret/sec/frontier/officer
+ name = "\improper Frontiersmen officer beret"
+ desc = "A scratchy olive green beret emblazoned with the Frontiersmen insignia, worn by Frontiersmen who want to look good while intimidating freighter captains."
+ icon_state = "frontier_officer_beret"
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+/obj/item/clothing/head/frontier
+ name = "frontier surgical cap"
+ desc = "A white surgical cap used by the quite uncommon doctors part of the Frontiersmen."
+ icon_state = "frontier_surgery"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+
+/obj/item/clothing/head/hardhat/frontier
+ name = "faded white hard hat"
+ desc = "A grimy white hardhat used by the mechanics and engineers of the Frontiersmen fleet. Smells old."
+ icon_state = "frontier_hardhat"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+
+/obj/item/clothing/head/frontier/peaked
+ name = "\improper frontiersmen commander's cap"
+ desc = "An imposing peaked cap, meant for a commander of the Frontiersmen."
+ icon_state = "frontier_cap"
+
+/obj/item/clothing/head/frontier/admiral
+ name = "\improper frontiersmen admiral's cap"
+ desc = "An imposing peaked cap meant for only the highest of officers of the Frontiersmen pirate fleet."
+ icon_state = "frontier_admiral_cap"
+
+/obj/item/clothing/head/helmet/bulletproof/x11/frontier
+ name = "\improper frontiersmen X-11 helmet"
+ desc = "A heavily modified X-11 pattern helmet used by the Frontiersmen pirate fleet."
+ icon_state = "x11helm_frontier"
+ unique_reskin = null
+
+/obj/item/clothing/head/helmet/bulletproof/x11/frontier/fireproof
+ name = "\improper fireproof frontiersmen X-11 helmet"
+ desc = "A subtly but helpful modifcation of the Frontiersmen X11 to make it fireproof."
+ heat_protection = HEAD
+ max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
+ cold_protection = HEAD
+ min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
+ resistance_flags = FIRE_PROOF
+ armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
+
+/obj/item/clothing/head/helmet/marine/frontier
+ name = "frontiersmen reinforced helmet"
+ desc = "A reinforced Frontiersmen X-11. The front plate has a small window to let the user see."
+ icon_state = "marine_frontier"
+ icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
+
+////////////
+//Glasses//
+///////////
+
+//////////
+//Masks//
+/////////
+
+/obj/item/clothing/mask/gas/frontiersmen
+ name = "sack gas mask"
+ desc = "A gas mask that can be connected to an air supply. It's made out of sack, but still works just as good for protecting you."
+ icon_state = "gasmask_frontier"
+ icon = 'icons/obj/clothing/faction/frontiersmen/mask.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/mask.dmi'
+ resistance_flags = FIRE_PROOF
+
+//////////
+//Neck//
+/////////
+
+//////////
+//Belts//
+/////////
+
+/obj/item/storage/belt/security/military/frontiersmen
+ name = "leather bandolier"
+ desc = "A rudimentary leather bandolier, utilized by both independents and frontiersmen alike. Usually slung diagonally, from the shoulder to the waist."
+ icon_state = "frontierwebbing"
+ item_state = "frontierwebbing"
+ icon = 'icons/obj/clothing/faction/frontiersmen/belt.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/belt.dmi'
+
+ unique_reskin = null
+
+/obj/item/storage/belt/medical/webbing/frontiersmen
+ name = "leather medical bandolier"
+ desc = "A rudimentary leather bandolier, utilized by both independents and frontiersmen alike. This one is painted white, usually to be worn by a medic."
+ icon_state = "frontiermedicalwebbing"
+ item_state = "frontiermedicalwebbing"
+ icon = 'icons/obj/clothing/faction/frontiersmen/belt.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/belt.dmi'
+
+/obj/item/storage/belt/medical/webbing/frontiersmen/surgery/PopulateContents()
+ new /obj/item/scalpel(src)
+ new /obj/item/circular_saw(src)
+ new /obj/item/surgicaldrill(src)
+ new /obj/item/retractor(src)
+ new /obj/item/cautery(src)
+ new /obj/item/hemostat(src)
+ new /obj/item/hypospray/mkii(src)
+ update_appearance()
+
+
+/obj/item/storage/belt/security/military/frontiersmen/skm_ammo/PopulateContents()
+ for(var/i in 1 to 4)
+ new /obj/item/ammo_box/magazine/skm_762_40(src)
+ new /obj/item/grenade/frag(src)
+
+/obj/item/storage/belt/security/military/frontiersmen/aps_mp_ammo/PopulateContents() //replace with spitter. remind me.
+ for(var/i in 1 to 4)
+ new /obj/item/ammo_box/magazine/pistolm9mm(src)
+ new /obj/item/grenade/frag(src)
+
+/obj/item/storage/belt/security/military/frontiersmen/flamer/PopulateContents()
+ for(var/i in 1 to 4)
+ new /obj/item/reagent_containers/glass/beaker/large/napalm(src)
+ new /obj/item/grenade/frag(src)
diff --git a/code/modules/clothing/factions/gezena.dm b/code/modules/clothing/factions/gezena.dm
index 5dd227a4d323..fe6a6d9bdb6a 100644
--- a/code/modules/clothing/factions/gezena.dm
+++ b/code/modules/clothing/factions/gezena.dm
@@ -1,5 +1,4 @@
//Jumpsuits
-//thgvr TODO: Make more stuff (backpacks, headsets, doodads, part 2?)
/obj/item/clothing/under/gezena
name = "gezenan navywear"
desc = "Made of a slick synthetic material that is both breathable, and resistant to scale and thorn alike."
@@ -86,12 +85,14 @@
desc = "Raksha - a Kalixcian word for 'protection of the heart'. Sturdy and reliable."
icon_state = "marinevest"
item_state = "marinevest"
+ armor = list("melee" = 35, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) //the laser gun country should probably have laser armor
/obj/item/clothing/suit/armor/gezena/marinecoat
name = "coated Raksha-plating"
desc = "Less practical with the coat than without."
icon_state = "marinecoat"
item_state = "bluecloth"
+ armor = list("melee" = 35, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) //same
//Spacesuits
@@ -151,6 +152,18 @@
icon_state = "marineflap"
item_state = "marinecloth"
+/obj/item/clothing/head/gezena/marine/lead
+ name = "\improper PGFMC Commander Cap"
+ desc = "The standard cap of the PGF military, in Marine Corps colors. The silver markings denote it as a commander's cap."
+ icon_state = "squadhat"
+ item_state = "marinecloth"
+
+/obj/item/clothing/head/gezena/marine/lead/flap
+ name = "\improper PGFMC Commander's' Betzu-il cap"
+ desc = "The standard cap of the PGF military, in Marine Corps colors. “betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. The silver markings denote it as a commander's cap."
+ icon_state = "squadflap"
+ item_state = "marinecloth"
+
/obj/item/clothing/head/gezena/medic
name = "\improper PGF medic cap"
desc = "The standard cap of the PGF military. The coloring indicates the wearer as a medical officer."
@@ -176,6 +189,7 @@
mob_overlay_icon = 'icons/mob/clothing/faction/gezena/head.dmi'
lefthand_file = 'icons/mob/inhands/faction/gezena/gezena_lefthand.dmi'
righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
+ armor = list("melee" = 35, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) //the laser gun country should probably have laser armor
icon_state = "marinehelmet"
item_state = "marinehelm"
@@ -187,7 +201,6 @@
icon = 'icons/obj/clothing/faction/gezena/hands.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/gezena/hands.dmi'
icon_state = "navalgloves"
- item_state = "navalgloves"
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
@@ -196,21 +209,18 @@
name = "\improper PGFMC Ihuz-irra Gloves"
desc = "As the name, “ihuz-irra”, or “sure-grip”, suggests, the gloves employed by the PGF military are designed to ensure the highest possible grip is maintained while also providing protection from blisters in work environments. Carries extra tactile grip on the fingertips for easy use of firearms."
icon_state = "marinegloves"
- item_state = "marinegloves"
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 50)
/obj/item/clothing/gloves/gezena/engi
name = "\improper PGFN Engineering Ihuz-irra Gloves"
desc = "As the name, “ihuz-irra”, or “sure-grip”, suggests, the gloves employed by the PGF military are designed to ensure the highest possible grip is maintained while also providing protection from blisters in work environments. Comes with anti-conductive microfibers interwoven to supply the useer with electrical insulation."
icon_state = "engigloves"
- item_state = "engigloves"
siemens_coefficient = 0
/obj/item/clothing/gloves/gezena/captain
name = "\improper PGFN Captain's Ihuz-irra Gloves"
desc = "As the name, “ihuz-irra”, or “sure-grip”, suggests, the gloves employed by the PGF military are designed to ensure the highest possible grip is maintained while also providing protection from blisters in work environments. Bears the silver standard of a Gezenan captain."
icon_state = "captaingloves"
- item_state = "captaingloves"
siemens_coefficient = 0
//Boots
@@ -221,7 +231,7 @@
icon = 'icons/obj/clothing/faction/gezena/feet.dmi'
//mob_overlay_icon = 'icons/mob/clothing/faction/gezena/feet.dmi' todo: find out why digi breaks here
icon_state = "pgfboots"
- item_state = "pgfboots"
+ item_state = "jackboots"
//Belt
@@ -234,6 +244,7 @@
righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
icon_state = "pouches"
item_state = "bluecloth"
+ unique_reskin = null
/obj/item/storage/belt/medical/gezena
name = "\improper PGF Medical Iho-Usks"
@@ -257,6 +268,12 @@
icon_state = "cape"
item_state = "blackcloth"
+/obj/item/clothing/neck/cloak/gezena/lead
+ name = "sergeant's Azuilhauz"
+ desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as a squad commander."
+ icon_state = "squadcape"
+ item_state = "blackcloth"
+
/obj/item/clothing/neck/cloak/gezena/engi
name = "engineering Aziulhauz"
desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as an officer with an engineering specialization."
@@ -267,10 +284,16 @@
name = "medical Aziulhauz"
desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as an officer with a medical specialization."
icon_state = "medcape"
- item_state = "blackcloth"
+ item_state = "whitecloth"
-/obj/item/clothing/neck/cloak/gezena/captain
+/obj/item/clothing/neck/cloak/gezena/command
name = "officer's Azuilhauz"
+ desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as an officer."
+ icon_state = "commandcape"
+ item_state = "whitecloth"
+
+/obj/item/clothing/neck/cloak/gezena/captain
+ name = "captain's Azuilhauz"
desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as a high ranking officer."
icon_state = "captaincape"
- item_state = "blackcloth"
+ item_state = "whitecloth"
diff --git a/code/modules/clothing/factions/hardliners.dm b/code/modules/clothing/factions/hardliners.dm
new file mode 100644
index 000000000000..5c3423f745c0
--- /dev/null
+++ b/code/modules/clothing/factions/hardliners.dm
@@ -0,0 +1,181 @@
+//////////////
+//Jumpsuits//
+/////////////
+
+/obj/item/clothing/under/syndicate/hardliners
+ name = "hardliners uniform"
+ desc = "A crimson combat uniform, reminiscent of the Gorlex Marauders at the height of the Inter-Corporate Wars. It's oddly comfortable, and warm."
+ icon_state = "hardliners"
+ item_state = "hardliners"
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
+ can_adjust = FALSE
+ icon = 'icons/obj/clothing/faction/hardliners/uniforms.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/uniforms.dmi'
+
+/obj/item/clothing/under/syndicate/hardliners/jumpsuit
+ name = "hardliners jumpsuit"
+ desc = "A black jumpsuit with white overalls, a scant reminder of the old miners of Gorlex VII."
+ icon_state = "hl_jumpsuit"
+ item_state = "hl_jumpsuit"
+
+/obj/item/clothing/under/syndicate/hardliners/officer
+ name = "hardliners officer uniform"
+ desc = "A button-up uniform with cargo pants, certainly more tactical than most officer uniforms."
+ icon_state = "hl_officer"
+ item_state = "hl_officer"
+
+////////////////////
+//Unarmored suits//
+///////////////////
+
+/obj/item/clothing/suit/hardliners
+ name = "white smock"
+ desc = "A plain-white surgical smock typically worn by both Hardliners and Cybersun staff. Even mercenaries need medical attention!"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ icon_state = "hl_apron"
+ item_state = "whitecloth"
+
+/obj/item/clothing/suit/hazardvest/hardliners
+ name = "blood-red hazard vest"
+ desc = "A white high-visibility vest, worn by mechanics associated with Hardliners. Safety first!"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ icon_state = "hl_hazard"
+ item_state = "whitecloth"
+
+//////////////////
+//Armored suits//
+/////////////////
+
+/obj/item/clothing/suit/armor/hardliners
+ name = "hardliners armor vest"
+ desc = "A slim Type I armored vest, painted in a classic white associated with the Hardliners. It would probably make bloodstains very obvious..."
+ icon_state = "hl_vest"
+ item_state = "armor"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ blood_overlay_type = "armor"
+
+/obj/item/clothing/suit/armor/hardliners/jacket
+ name = "hardliners armored kutte"
+ desc = "A leather Kutte with a slim Type I armored vest, painted in a classic white associated with the Hardliners. The patch of the Hardliner movement can be seen behind the leather kutte, a nostalgic callback to the leather outfits used by the civilians of Gorlex VII."
+ icon_state = "hl_jacket"
+ item_state = "armor"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ blood_overlay_type = "armor"
+
+/obj/item/clothing/suit/armor/hardliners/sergeant
+ name = "hardliners sergeant jacket"
+ desc = "An armored jacket typically worn by sergeant of the Hardliners. They're reminiscent of the garb worn by old Gorlex navymen, prior to its destruction."
+ body_parts_covered = CHEST|GROIN|ARMS
+ icon_state = "hl_sergeant"
+ item_state = "hl_sergeant"
+ blood_overlay_type = "coat"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+/obj/item/clothing/suit/toggle/armor/vest/hardliners
+ name = "hardliners captain coat"
+ desc = "An imposing armored coat worn by captains of Hardliner fleets, hand-designed by Cybersun tailors to provide maximum protection to its wearer."
+ body_parts_covered = CHEST|GROIN|ARMS
+ icon_state = "hl_captain"
+ item_state = "hl_captain"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ blood_overlay_type = "coat"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ togglename = "buttons"
+
+///////////////
+//Spacesuits//
+//////////////
+
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/hl
+ name = "white-red hardsuit helmet"
+ desc = "An advanced dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by white. It is in EVA mode. Manufactured by Cybersun Biodynamics."
+ alt_desc = "An advanced dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by white. It is in combat mode. Manufactured by Cybersun Biodynamics."
+ icon_state = "hardsuit1-hl"
+ item_state = "hardsuit1-hl"
+ icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
+ hardsuit_type = "hl"
+
+/obj/item/clothing/suit/space/hardsuit/syndi/hl
+ name = "white-red hardsuit"
+ desc = "An advanced dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by white. It is in EVA mode. Manufactured by Cybersun Biodynamics."
+ alt_desc = "An advanced dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by white. It is in combat mode. Manufactured by Cybersun Biodynamics."
+ icon_state = "hardsuit1-hl"
+ item_state = "hardsuit1-hl"
+ hardsuit_type = "hl"
+ icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/hl
+ lightweight = 1
+ jetpack = null
+
+/////////
+//Hats//
+////////
+
+/obj/item/clothing/head/hardliners
+ name = "white surgical cap"
+ desc = "A surgical cap used by doctors of Hardliner fleets, matching their white smocks."
+ icon_state = "hl_surgery"
+ icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
+
+
+/obj/item/clothing/head/hardhat/hardliners
+ name = "white-red hard hat"
+ desc = "A white-red hardhat typically used by both miners and mechanics under the Hardliner fleets."
+ icon_state = "hl_hardhat"
+ icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
+
+/obj/item/clothing/head/hardliners/peaked
+ name = "Hardliner peaked cap"
+ desc = "A stylish peaked cap utilized by high-ranking officers of the Hardliner movement. Most who wear it are likely to have been a veteran of the ICW, still vying for revenge against Nanotrasen..."
+ icon_state = "hl_officer"
+ item_state = "hl_officer"
+
+/obj/item/clothing/head/helmet/hardliners
+ name = "hardliners X-11 helmet"
+ desc = "A well-armored helmet utilized by the Hardliners, though painted in their iconic white. Either it makes them stick out like a sore thumb, or it provides excellent camouflage in snow-covered planets."
+ icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
+ armor = list("melee" = 40, "bullet" = 60, "laser" = 35, "energy" = 35, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) // The guys who specialize in ballistics would probably have better bullet armor. Maybe.
+ icon_state = "hl_x11"
+ item_state = "hl_x11"
+
+/obj/item/clothing/head/helmet/hardliners/swat
+ name = "hardliners pilot helmet"
+ desc = "A modified X-11 helmet utilized by regular pilots, as well as the feared mech pilots of the Hardliner movement. The attached visor helps protect against sudden flashes from explosions."
+ flash_protect = FLASH_PROTECTION_WELDER
+ icon_state = "hl_pilot"
+ item_state = "hl_pilot"
+
+////////////
+//Glasses//
+///////////
+
+/obj/item/clothing/glasses/hud/security/sunglasses/hardliners
+ name = "hardliners security goggles"
+ desc = "Tinted-red flash-proof goggles used by Hardliners, with an integrated security HUD, courtesy of their partners, Cybersun."
+ icon_state = "hl_goggles"
+ item_state = "hl_goggles"
+ icon = 'icons/obj/clothing/faction/hardliners/eyes.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/eyes.dmi'
+ glass_colour_type = /datum/client_colour/glass_colour/red
+
+//////////
+//Belts//
+/////////
+
+/obj/item/storage/belt/security/webbing/hardliners
+ name = "hardliners webbing"
+ desc = "A set of tactical webbing for operators of the Hardliner movement, can hold security gear."
+ icon_state = "hl_webbing"
+ item_state = "hl_webbing"
+ icon = 'icons/obj/clothing/faction/hardliners/belt.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/belt.dmi'
diff --git a/code/modules/clothing/factions/nanotrasen.dm b/code/modules/clothing/factions/nanotrasen.dm
new file mode 100644
index 000000000000..664c534d236e
--- /dev/null
+++ b/code/modules/clothing/factions/nanotrasen.dm
@@ -0,0 +1,391 @@
+// Uniforms //
+
+/obj/item/clothing/under/nanotrasen
+ name = "deckhand's uniform"
+ desc = "A plain grey work uniform with a Nanotrasen, Inc. logo embroidered on the front. Typical of entry-level employees."
+ icon = 'icons/obj/clothing/faction/nanotrasen/uniforms.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/nanotrasen/uniforms.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_righthand.dmi'
+ icon_state = "deckhand"
+ item_state = "graycloth"
+ supports_variations = DIGITIGRADE_VARIATION
+
+// Engineering uniforms
+/obj/item/clothing/under/nanotrasen/engineering
+ name = "engineering jumpsuit"
+ desc = "A dirty grey jumpsuit with reflective blue flashes on the limbs and a wrench icon on the back. A Nanotrasen, Inc. logo is stitched into the collar."
+ icon_state = "engi"
+ item_state = "greycloth"
+
+/obj/item/clothing/under/nanotrasen/engineering/atmos
+ name = "atmospherics jumpsuit"
+ desc = "A thick grey jumpsuit with black stripes and an 'O2' icon on the back. A Nanotrasen, Inc. logo is stitched into the collar."
+ icon_state = "atmos_tech"
+ item_state = "greycloth"
+
+/obj/item/clothing/under/nanotrasen/engineering/director
+ name = "engineering director's overalls"
+ desc = "Thick black overalls over a blue office shirt. Unlike most managerial staff, Nanotrasen engineering directors still need to get hands-on with their work."
+ icon_state = "engi_director"
+ item_state = "blackcloth"
+
+//Supply uniforms
+/obj/item/clothing/under/nanotrasen/supply
+ name = "cargo handler shorts"
+ desc = "A cheap work shirt and black shorts, typical of cargo handlers and clerks at N+S Logistics."
+ icon_state = "supply"
+ item_state = "browncloth"
+
+/obj/item/clothing/under/nanotrasen/supply/qm
+ name = "supply director slacks"
+ desc = "Crisp slacks and a pressed brown shirt that any supply director could be proud of. N+S Logistics' compass rose logo is embossed on every button."
+ icon_state = "supply_director"
+ item_state = "browncloth"
+
+/obj/item/clothing/under/nanotrasen/supply/miner
+ name = "mining overalls"
+ desc = "Cheap brown overalls over a grey jumpsuit, already slightly frayed and saturated with rock dust. N+S Logistics logos are prominently sewn on in several places."
+ icon_state = "miner"
+ item_state = "browncloth"
+
+//Science uniforms
+/obj/item/clothing/under/nanotrasen/science
+ name = "science slacks"
+ desc = "A thick buttoned shirt and slacks for some protection against low-level lab hazards. The basic uniform of Nanotrasen, Inc.'s research division."
+ icon_state = "sci"
+ item_state = "whitecloth"
+
+/obj/item/clothing/under/nanotrasen/science/robotics
+ name = "robotics jumpsuit"
+ desc = "A cheap black jumpsuit with blue arm flashes. Expendable armor against oil and sparks, issued en masse to Nanotrasen robotics technicians."
+ icon_state = "robotics"
+ item_state = "blackcloth"
+
+/obj/item/clothing/under/nanotrasen/science/director
+ name = "science director's slacks"
+ desc = "A well-made black shirt with blue slacks, practically begging to be paired with a garish tie of some description. Nanotrasen logos are neatly stitched into the collar and cuffs."
+ icon_state = "sci_director"
+ item_state = "blackcloth"
+
+//Medical uniforms
+/obj/item/clothing/under/nanotrasen/medical
+ name = "medical slacks"
+ desc = "A crisp white shirt with blue stripes on the arms, identifying the owner as trained Nanotrasen medical staff. The faint smell of antiseptic won't wash out."
+ icon_state = "doctor"
+ item_state = "whitecloth"
+
+/obj/item/clothing/under/nanotrasen/medical/paramedic
+ name = "paramedic uniform"
+ desc = "Tough synthetic pants and a white uniform shirt, designed to handle all manner of scrapes and splashes in the line of duty. The tag identifies this as property of Nanotrasen, Inc."
+ icon_state = "paramedic"
+ item_state = "whitecloth"
+
+/obj/item/clothing/under/nanotrasen/medical/director
+ name = "medical director's slacks"
+ desc = "A neat blue shirt with white arm bands and comfortable black slacks. Nanotrasen logos are finely stitched into the collar and cuffs. It smells like burnt coffee and antiseptic."
+ icon_state = "medical_director"
+ item_state = "bluecloth"
+
+//Security/civilian uniforms
+
+/obj/item/clothing/under/nanotrasen/janitor
+ name = "custodial jumpsuit"
+ desc = "A grey jumpsuit with purple sleeves and faint stains on the elbows and knees. It looks stiff and cheap, but is surprisingly comfortable."
+ icon_state = "janitor"
+ item_state = "graycloth"
+
+/obj/item/clothing/under/nanotrasen/affairs
+ name = "neatly pleated slacks"
+ desc = "Flawlessly pleated slacks and a linen shirt with the Nanotrasen logo stitched repeatedly into the cuffs and collar. It exudes an aura of quiet authority."
+ icon_state = "affairs"
+ item_state = "whitecloth"
+
+/obj/item/clothing/under/nanotrasen/security
+ name = "security slacks"
+ desc = "A starched grey uniform with red arm flashes, of a type seen throughout the core worlds. The Vigilitas Interstellar logo is proudly emblazoned on the front."
+ icon_state = "security"
+ item_state = "graycloth"
+
+/obj/item/clothing/under/nanotrasen/security/director
+ name = "security director's slacks"
+ desc = "A robust crimson uniform, heavily starched, with a Vigilitas logo neatly stitched onto either end of the collar. The last line of defense for Vigilitas's managerial staff."
+ icon_state = "security_director"
+ item_state = "redcloth"
+
+//Command uniforms
+/obj/item/clothing/under/nanotrasen/captain
+ name = "blue captain's slacks"
+ desc = "A quality uniform in Nanotrasen Blue, with gold trim. Gold Nanotrasen logo pins adorn the collar and cuffs. The fine fabrics and comfortable fit set this apart from the more utilitarian uniforms worn by lower-level employees."
+ icon_state = "nt_captain"
+ item_state = "bluecloth"
+
+/obj/item/clothing/under/nanotrasen/captain/skirt
+ name = "blue captain's skirt"
+ desc = "A quality uniform in Nanotrasen Blue, with gold trim. Gold Nanotrasen logo pins adorn the collar and cuffs. The fine fabrics and comfortable fit set this apart from the more utilitarian uniforms worn by lower-level employees."
+ icon_state = "nt_captain_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+
+/*
+/obj/item/clothing/under/nanotrasen/captain/parade
+ name = ""
+ desc = ""
+ icon_state = "captain_parade"
+ can_adjust = FALSE
+*/
+
+/obj/item/clothing/under/nanotrasen/officer
+ name = "officer's slacks"
+ desc = "An unadorned uniform in Nanotrasen Blue. While it isn't as nice as a captain's uniform, the color and quality still mark its owner as part of Nanotrasen's managerial class."
+ icon_state = "officer"
+ item_state = "bluecloth"
+
+/obj/item/clothing/under/nanotrasen/officer/skirt
+ name = "officer's skirt"
+ desc = "An unadorned uniform in Nanotrasen Blue. While it isn't as nice as a captain's uniform, the color and quality still mark its owner as part of Nanotrasen's managerial class."
+ icon_state = "officer_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+
+// Suits //
+
+/obj/item/clothing/suit/nanotrasen //Base type, do not use
+ name = "Suit"
+ desc = "You shouldn't be here."
+ icon = 'icons/obj/clothing/faction/nanotrasen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/nanotrasen/suits.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_righthand.dmi'
+
+/obj/item/clothing/suit/nanotrasen/medical_smock
+ name = "surgical smock"
+ desc = "A thick fluid-repelling smock rendered in what is unmistakeably Nanotrasen Blue. The tag on the inside declares it property of Nanotrasen, Inc."
+ icon_state = "med_smock"
+ item_state = "bluecloth"
+
+/obj/item/clothing/suit/nanotrasen/suitjacket
+ name = "fancy black suit jacket"
+ desc = "A fine black linen suit jacket with blue markings and a Nanotrasen lapel pin. It has a strangely menacing aura."
+ icon_state = "suit_jacket"
+ item_state = "blackcloth"
+
+/obj/item/clothing/suit/nanotrasen/vest
+ name = "black hazard vest"
+ desc = "A thin black vest with reflective markings, worn to guarantee visibility when operating around industrial equipment or in dark or dusty conditions. Property of Nanotrasen, Inc."
+ icon_state = "engi_vest"
+ item_state = "blackcloth"
+
+/obj/item/clothing/suit/nanotrasen/vest/blue
+ name = "blue hazard vest"
+ desc = "A thin vest with reflective stripes, worn to guarantee visibility in dangerous conditions. The vest itself is an offensively bright shade of Nanotrasen Blue. Property of Nanotrasen, Inc."
+ icon_state = "atmos_vest"
+ item_state = "bluecloth"
+
+/obj/item/clothing/suit/toggle/nanotrasen
+ name = "officer's coat"
+ desc = "A smart blue uniform jacket with red silk accents and a large buckle with an engraved Nanotrasen logo. Standard wear for command officers aboard Nanotrasen, Inc. ships."
+ icon = 'icons/obj/clothing/faction/nanotrasen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/nanotrasen/suits.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_righthand.dmi'
+ icon_state = "officer_formal"
+ item_state = "bluecloth"
+
+/obj/item/clothing/suit/toggle/labcoat/nanotrasen
+ name = "corporate labcoat"
+ desc = "A standardized white labcoat used by Nanotrasen, Inc.'s medical and research divisions. A simplified Nanotrasen logo is stitched on the front."
+ icon = 'icons/obj/clothing/faction/nanotrasen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/nanotrasen/suits.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_righthand.dmi'
+ icon_state = "labcoat"
+ item_state = "whitecloth"
+
+/obj/item/clothing/suit/toggle/labcoat/nanotrasen/blue
+ name = "medical director's labcoat"
+ desc = "A well-made, fitted labcoat, crafted from high-quality materials and sporting blue markings around the arms and hem. A Nanotrasen logo is neatly embroidered on the front. Stylish, practical, and exceptionally professional."
+ icon_state = "med_labcoat"
+ item_state = "whitecloth"
+
+/obj/item/clothing/suit/toggle/labcoat/nanotrasen/black
+ name = "science director's labcoat"
+ desc = "An overdesigned and rather intimidating black labcoat with a very high collar, as impervious to lab hazards as one can get without a full-body suit. Nanotrasen, Inc.'s logo is proudly emblazoned on the chest."
+ icon_state = "black_labcoat"
+ item_state = "blackcloth"
+
+/obj/item/clothing/suit/toggle/labcoat/nanotrasen/paramedic
+ name = "bright blue paramedic jacket"
+ desc = "A thick, protective blue jacket with reflective visibility stripes and a Nanotrasen logo stitched into the chest. Safe against all manner of scrapes and splashes."
+ icon_state = "med_jacket"
+ item_state = "bluecloth"
+
+/obj/item/clothing/suit/armor/nanotrasen
+ name = "armor vest"
+ desc = "A sturdy vest designed to protect Vigilitas Interstellar officers from a variety of basic threats. Sports a stylish red stripe down the front."
+ icon = 'icons/obj/clothing/faction/nanotrasen/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/nanotrasen/suits.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_righthand.dmi'
+ icon_state = "armor"
+ item_state = "blackcloth"
+ body_parts_covered = CHEST|GROIN
+ armor = list("melee" = 30, "bullet" = 40, "laser" = 30, "energy" = 50, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90)
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/suit/armor/nanotrasen/slim
+ name = "slim armor vest"
+ icon_state = "armor_slim"
+
+/obj/item/clothing/suit/armor/nanotrasen/sec_director
+ name = "security director's overcoat"
+ desc = "A tailored black overcoat, made from cutting-edge ballistic fabrics and composites. Vigilitas's 'VI' logo is embossed on every button. Intimidating and profoundly stylish."
+ icon_state = "command_coat"
+ body_parts_covered = CHEST|GROIN|ARMS
+ armor = list("melee" = 30, "bullet" = 0, "laser" = 30, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90)
+
+/obj/item/clothing/suit/armor/nanotrasen/captain
+ name = "captain's jacket"
+ desc = "A sturdy jacket in Nanotrasen Blue, accentuated with gold thread and lined with a layer of ballistic fabric. Its large, shiny belt buckle is embossed with Nanotrasen's corporate logo."
+ icon_state = "armor_captain"
+ item_state = "bluecloth"
+ body_parts_covered = CHEST|GROIN
+ armor = list("melee" = 50, "bullet" = 60, "laser" = 60, "energy" = 50, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90)
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/suit/armor/nanotrasen/captain/parade
+ name = "ostentatious captain's coat"
+ desc = "An exquisitely-decorated fine blue jacket, suitable for especially formal situations, or for a commanding officer who wants to flaunt their status even more than usual. Richly decorated with gold thread and embroidered Nanotrasen logos."
+ icon_state = "captain_formal"
+ item_state = "bluecloth"
+ body_parts_covered = CHEST|GROIN|ARMS
+ armor = list("melee" = 30, "bullet" = 0, "laser" = 30, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90)
+
+// Hats //
+
+/obj/item/clothing/head/nanotrasen
+ name = "blue flatcap"
+ desc = "A simple blue flat cap with a Nanotrasen logo on the side. Not standard uniform, but occasionally worn by Nanotrasen office workers."
+ icon = 'icons/obj/clothing/faction/nanotrasen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/nanotrasen/head.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_righthand.dmi'
+ icon_state = "com_flatcap"
+ item_state = "bluecloth"
+
+/obj/item/clothing/head/nanotrasen/beret
+ name = "fancy blue beret"
+ desc = "A well-made beret in Nanotrasen Blue with a corporate logo on the side, often seen topping the heads of Nanotrasen, Inc. managerial staff."
+ icon_state = "beret_blue"
+ item_state = "bluecloth"
+
+/obj/item/clothing/head/nanotrasen/beret/security
+ name = "fancy red beret"
+ desc = "A cherry-red beret issued to Vigilitas security officers for formal occasions. Vigilitas Interstellar's 'VI' logo is stitched into the side."
+ icon_state = "beret_red"
+ item_state = "redcloth"
+
+/obj/item/clothing/head/nanotrasen/beret/security/command
+ name = "fancy black beret"
+ desc = "A deep black beret with a Vigilitas Interstellar 'VI' badge on the front. An unmistakeable hallmark of Vigilitas managerial staff."
+ icon_state = "beret_black"
+ item_state = "blackcloth"
+
+/obj/item/clothing/head/nanotrasen/surgical
+ name = "white surgical cap"
+ desc = "A white surgical cap with a Nanotrasen Blue stripe down the middle."
+ icon_state = "surgical_white"
+ item_state = "whitecloth"
+
+/obj/item/clothing/head/nanotrasen/surgical/blue
+ name = "blue surgical cap"
+ desc = "A Nanotrasen Blue surgical cap with a white stripe down the middle, issued to NT medical directors as the last line of recognizability, should their uniforms, coats, and unflappable nature ever fail."
+ icon_state = "surgical_blue"
+ item_state = "bluecloth"
+
+/obj/item/clothing/head/nanotrasen/cap // Base type, do not use
+ name = "generic cap"
+ desc = "You don't belong here."
+
+/obj/item/clothing/head/nanotrasen/cap/security
+ name = "red softcap"
+ desc = "A cherry red cap with a white 'VI' logo embroidered on the front. Issued to Vigilitas security guards as casual wear and low-threat workwear. Surprisingly durable, and very popular among current and retired employees."
+ icon_state = "cap_red"
+ item_state = "redcloth"
+
+/obj/item/clothing/head/nanotrasen/cap/supply
+ name = "brown softcap"
+ desc = "A brown cap with N+S Logistics' compass rose logo on the front. Issued to almost every N+S employee, although its wear is optional."
+ icon_state = "cap_brown"
+ item_state = "browncloth"
+
+/obj/item/clothing/head/nanotrasen/cap/janitor
+ name = "purple softcap"
+ desc = "A rich purple soft cap with a Nanotrasen logo on the front. For some reason, this peculiar shade of purple is only used by custodial personnel instead of the Nanotrasen Blue used by every other division. It's already slightly stained."
+ icon_state = "cap_purple"
+ //item_state = "purplecloth" //todo: purple
+
+/obj/item/clothing/head/nanotrasen/cap/medical
+ name = "blue medical softcap"
+ desc = "A soft cap in Nanotrasen Blue, with a large white cross on the front marking the wearer as a trained medical worker. Wearing this without medical training is a violation of Nanotrasen, Inc. employee guidelines."
+ icon_state = "cap_blue"
+ item_state = "bluecloth"
+
+/obj/item/clothing/head/nanotrasen/officer
+ name = "officer's hat"
+ desc = "A blue peaked hat with red silk decoration and an embroidered Nanotrasen logo, worn exclusively by management."
+ icon_state = "officer_peaked"
+ item_state = "bluecloth"
+
+/obj/item/clothing/head/nanotrasen/officer
+ name = "officer's fedora"
+ desc = "A fedora in a violent shade of Nanotrasen Blue, with a red silk band."
+ icon_state = "officer_fedora"
+ item_state = "bluecloth"
+
+/obj/item/clothing/head/nanotrasen/captain
+ name = "captain's broad hat"
+ desc = "A curious rounded hat, decorated with gold thread and a Nanotrasen logo badge. Particular to Nanotrasen, Inc. captains, though nobody is quite certain where this distinctive design originated."
+ icon_state = "com_hat"
+ item_state = "bluecloth"
+
+/obj/item/clothing/head/nanotrasen/captain/peaked
+ name = "captain's peaked cap"
+ desc = "A decorated blue peaked cap, rife with laurels and gold thread, with a large badge on the front displaying the Nanotrasen, Inc. logo. This hat practically oozes authority."
+ icon_state = "com_peaked"
+ item_state = "bluecloth"
+
+/obj/item/clothing/head/hardhat/nanotrasen //TODO: inhands for hardhats
+ name = "black heavy-duty hat"
+ desc = "A tough plastic helmet with a suspension rig, designed to protect against blunt impacts. This one is a sober shade of black, with a Nanotrasen logo on the front."
+ icon = 'icons/obj/clothing/faction/nanotrasen/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/nanotrasen/head.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_righthand.dmi'
+ icon_state = "hardhat_black"
+ item_state = "blackcloth"
+
+/obj/item/clothing/head/hardhat/nanotrasen/blue
+ name = "blue heavy-duty hat"
+ desc = "A tough plastic helmet with suspension rig, designed to protect against blunt impacts. This one is brightly colored in Nanotrasen Blue, with the company logo on the front."
+ icon_state = "hardhat_blue"
+ item_state = "bluecloth"
+
+/obj/item/clothing/head/hardhat/nanotrasen/white
+ name = "white heavy-duty hat"
+ desc = "An extremely tough plastic helmet with suspension rig, designed to protect against blunt impacts. This one is colored bright white, typical of managerial staff, and has a Nanotrasen logo on the front."
+ icon_state = "hardhat_white"
+ item_state = "graycloth"
+
+
+// Neck //
+
+/obj/item/clothing/neck/cloak/nanotrasen
+ name = "command sash"
+ desc = "A fine red silk sash that would pair nicely with a formal uniform. A small tag inside declares this property of Nanotrasen, Inc."
+ icon = 'icons/obj/clothing/faction/nanotrasen/neck.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/nanotrasen/neck.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/nanotrasen/nt_righthand.dmi'
+ icon_state = "sash"
+ item_state = "redcloth"
diff --git a/code/modules/clothing/factions/ngr.dm b/code/modules/clothing/factions/ngr.dm
new file mode 100644
index 000000000000..7892a098b50d
--- /dev/null
+++ b/code/modules/clothing/factions/ngr.dm
@@ -0,0 +1,244 @@
+//////////////
+//Jumpsuits//
+/////////////
+
+/obj/item/clothing/under/syndicate/ngr
+ name = "\improper NGR uniform"
+ desc = "A button-up in a tasteful beige with black pants, used as the basic uniform of the New Gorlex Republic."
+ icon_state = "ngr"
+ item_state = "ngr"
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
+ can_adjust = FALSE
+ icon = 'icons/obj/clothing/faction/ngr/uniforms.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/uniforms.dmi'
+
+/obj/item/clothing/under/syndicate/ngr/fatigues
+ name = "\improper NGR fatigues"
+ desc = "Beige fatigues used primarily by the ship and mech pilots of the New Gorlex Republic."
+ icon_state = "ngr_fatigues"
+ item_state = "ngr_fatigues"
+
+/obj/item/clothing/under/syndicate/ngr/jumpsuit
+ name = "\improper NGR jumpsuit"
+ desc = "A beige jumpsuit with black overalls used by wreckers of the New Gorlex Republic. A reminder of Gorlex VII's history as a mining colony, prior to its destruction."
+ icon_state = "ngr_jumpsuit"
+ item_state = "ngr_jumpsuit"
+
+/obj/item/clothing/under/syndicate/ngr/officer
+ name = "\improper NGR officer uniform"
+ desc = "A button-up in a tasteful black with beige pants, used by officers of the New Gorlex Republic."
+ icon_state = "ngr_officer"
+ item_state = "ngr_officer"
+
+/obj/item/clothing/under/plasmaman/ngr
+ name = "\improper NGR phorid envirosuit"
+ desc = "A button-up envirosuit with use intended for phorids of the New Gorlex Republic. Ensures they don't die of combustion."
+ icon_state = "ngr_envirosuit"
+ item_state = "ngr_envirosuit"
+ icon = 'icons/obj/clothing/faction/ngr/uniforms.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/uniforms.dmi'
+
+
+////////////////////
+//Unarmored suits//
+///////////////////
+
+/obj/item/clothing/suit/ngr
+ name = "foreman's jacket"
+ desc = "A beige high-visibility jacket worn by the Foreman of the New Gorlex Republic."
+ icon = 'icons/obj/clothing/faction/ngr/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/suits.dmi'
+ icon_state = "ngr_foreman"
+ item_state = "blackcloth"
+
+/obj/item/clothing/suit/ngr/smock
+ name = "blood red smock"
+ desc = "A blood-red surgical smock typically worn by field medics of the New Gorlex Republic. It hides red blood really well!"
+ icon_state = "ngr_apron"
+ item_state = "redcloth"
+
+/obj/item/clothing/suit/hazardvest/ngr
+ name = "blood-red hazard vest"
+ desc = "A blood-red high-visibility vest typically used in work zones by the New Gorlex Republic."
+ icon = 'icons/obj/clothing/faction/ngr/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/suits.dmi'
+ icon_state = "ngr_hazard"
+ item_state = "redcloth"
+
+//////////////////
+//Armored suits//
+/////////////////
+
+/obj/item/clothing/suit/armor/ngr
+ name = "NGR armor vest"
+ desc = "A slim Type I armored vest, utilized by the 2nd Battlegroup of the New Gorlex Republic that provides decent protection against most types of damage."
+ icon_state = "ngr_vest"
+ item_state = "armor"
+ icon = 'icons/obj/clothing/faction/ngr/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/suits.dmi'
+ blood_overlay_type = "armor"
+
+/obj/item/clothing/suit/armor/ngr/lieutenant
+ name = "\improper 2nd Battlegroup overcoat"
+ desc = "An armored overcoat worn by the lieutenants of the New Gorlex Republic's 2nd Battlegroup."
+ body_parts_covered = CHEST|GROIN|ARMS
+ icon_state = "ngr_lieutenant"
+ item_state = "ngr_lieutenant"
+ blood_overlay_type = "coat"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+/obj/item/clothing/suit/armor/ngr/captain
+ name = "\improper 2nd Battlegroup coat"
+ desc = "An armored coat worn by captains the New Gorlex Republic's 2nd Battlegroup."
+ body_parts_covered = CHEST|GROIN|ARMS
+ icon_state = "ngr_captain"
+ item_state = "ngr_captain"
+ blood_overlay_type = "coat"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+///////////////
+//Spacesuits//
+//////////////
+
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/ngr
+ name = "beige-red hardsuit helmet"
+ desc = "A standardized dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by beige. It is in EVA mode. Manufactured by Second Battlegroup."
+ alt_desc = "A standardized dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by beige. It is in combat mode. Manufactured by Second Battlegroup."
+ icon_state = "hardsuit1-ngr"
+ item_state = "hardsuit1-ngr"
+ icon = 'icons/obj/clothing/faction/ngr/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/head.dmi'
+ hardsuit_type = "ngr"
+
+/obj/item/clothing/suit/space/hardsuit/syndi/ngr
+ name = "beige-red hardsuit"
+ desc = "A standardized dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by beige. It is in EVA mode. Manufactured by Second Battlegroup."
+ alt_desc = "A standardized dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by beige. It is in combat mode. Manufactured by the Second Battlegroup."
+ icon_state = "hardsuit1-ngr"
+ item_state = "hardsuit1-ngr"
+ hardsuit_type = "ngr"
+ icon = 'icons/obj/clothing/faction/ngr/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/suits.dmi'
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/ngr
+ lightweight = 1
+ jetpack = null
+
+/obj/item/clothing/head/helmet/space/plasmaman/ngr
+ name = "NGR phorid envirosuit helmet"
+ desc = "An envirohelmet designed for phorids of the New Gorlex Republic, with intimidating blood-red stripes."
+ icon_state = "ngr_envirohelm"
+ item_state = "ngr_envirohelm"
+ icon = 'icons/obj/clothing/faction/ngr/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/head.dmi'
+
+/////////
+//Hats//
+////////
+
+/obj/item/clothing/head/ngr
+ name = "beige garrison cap"
+ desc = "A garrison cap used by low-ranking members of the New Gorlex Republic's 2nd Battlegroup when off-duty."
+ icon_state = "ngr_garrison"
+ icon = 'icons/obj/clothing/faction/ngr/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/head.dmi'
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+/obj/item/clothing/head/ngr/flap
+ name = "beige flap cap"
+ desc = "A flap cap used by soldiers of the New Gorlex Republic's 2nd Battlegroup in desert environments."
+ icon_state = "ngr_flap"
+
+/obj/item/clothing/head/ngr/surgical
+ name = "blood-red surgical cap"
+ desc = "A surgical cap used by field medics of the New Gorlex Republic's 2nd Battlegroup."
+ icon_state = "ngr_surgery"
+
+/obj/item/clothing/head/hardhat/ngr
+ name = "blood-red hard hat"
+ desc = "A blood-red hardhat typically used by Wreckers and Ship Engineers of the New Gorlex Republic."
+ icon_state = "ngr_hardhat"
+ icon = 'icons/obj/clothing/faction/ngr/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/head.dmi'
+
+/obj/item/clothing/head/hardhat/ngr/foreman
+ name = "beige hard hat"
+ desc = "A beige hardhat used exclusively by the Foreman of the New Gorlex Republic."
+ icon_state = "ngr_foreman"
+
+/obj/item/clothing/head/ngr/peaked
+ name = "2nd Battlegroup peaked cap"
+ desc = "A cap worn by officers of the New Gorlex Republic's 2nd Battlegroup."
+ icon_state = "ngr_officer"
+ item_state = "ngr_officer"
+
+/obj/item/clothing/head/helmet/ngr
+ name = "\improper NGR X-11 helmet"
+ desc = "A well-armored helmet utilized by the New Gorlex Republic's 2nd Battlegroup, far better at protecting one's head than the softer caps."
+ icon = 'icons/obj/clothing/faction/ngr/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/head.dmi'
+ armor = list("melee" = 40, "bullet" = 60, "laser" = 35, "energy" = 35, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) // The guys who specialize in ballistics would probably have better bullet armor. Maybe.
+ icon_state = "ngr_x11"
+ item_state = "ngr_x11"
+
+/obj/item/clothing/head/helmet/ngr/swat
+ name = "\improper NGR pilot helmet"
+ desc = "A modified X-11 helmet utilized by the pilots of the New Gorlex Republic's 2nd Battlegroup. The attached visor helps protect against sudden flashes from explosions."
+ flash_protect = FLASH_PROTECTION_WELDER
+ icon_state = "ngr_pilot"
+ item_state = "ngr_pilot"
+
+////////////
+//Glasses//
+///////////
+
+/obj/item/clothing/glasses/hud/security/sunglasses/ngr
+ name = "NGR modified mesons"
+ desc = "A modified version of widely-used optical meson scanners, with a flash-proof tint and integrated security HUD. Unfortunately, the opaque visor disables the meson functionality."
+ icon_state = "ngr_goggles"
+ item_state = "ngr_goggles"
+ icon = 'icons/obj/clothing/faction/ngr/eyes.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/eyes.dmi'
+ glass_colour_type = /datum/client_colour/glass_colour/green
+
+//////////
+//Masks//
+/////////
+
+/obj/item/clothing/mask/gas/sechailer/balaclava/ngr
+ name = "NGR combat balaclava"
+ desc = "A surprisingly advanced balaclava. while it doesn't muffle your voice it has a miniature rebreather for internals. Comfy to boot! This version is commonly used by the soldiers of the New Gorlex Republic to protect against sandstorms."
+ icon_state = "ngr_balaclava"
+ item_state = "ngr_balaclava"
+ icon = 'icons/obj/clothing/faction/ngr/mask.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/mask.dmi'
+
+/obj/item/clothing/mask/gas/syndicate/ngr
+ name = "NGR face mask"
+ desc = "A face mask that covers the nose, mouth and neck of those who wear it. Favored by field medics over the balaclava due to lessened heat while wearing."
+ icon_state = "ngr_facemask"
+ item_state = "ngr_facemask"
+ icon = 'icons/obj/clothing/faction/ngr/mask.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/mask.dmi'
+
+//////////
+//Neck//
+/////////
+
+/obj/item/clothing/neck/shemagh/ngr
+ name = "shemagh"
+ desc = "An oversized shemagh, in a tacticool blood-red for use in the 2nd Battlegroup."
+ icon_state = "ngr_shemagh"
+ icon = 'icons/obj/clothing/faction/ngr/neck.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/neck.dmi'
+
+//////////
+//Belts//
+/////////
+
+/obj/item/storage/belt/security/webbing/ngr
+ name = "NGR webbing"
+ desc = "A set of tactical webbing for operators of the New Gorlex Republic, can hold security gear."
+ icon_state = "ngr_webbing"
+ item_state = "ngr_webbing"
+ icon = 'icons/obj/clothing/faction/ngr/belt.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/ngr/belt.dmi'
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 70a9fe677263..f33a789156e9 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -2,6 +2,8 @@
/obj/item/clothing/glasses
name = "glasses"
icon = 'icons/obj/clothing/glasses.dmi'
+ lefthand_file = 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/clothing/glasses_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
flags_cover = GLASSESCOVERSEYES
slot_flags = ITEM_SLOT_EYES
@@ -165,7 +167,6 @@
name = "monocle"
desc = "Such a dapper eyepiece!"
icon_state = "monocle"
- item_state = "headset" // lol
supports_variations = VOX_VARIATION
/obj/item/clothing/glasses/material
diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm
index 05ec517c4afc..afeb37e30c8b 100644
--- a/code/modules/clothing/glasses/engine_goggles.dm
+++ b/code/modules/clothing/glasses/engine_goggles.dm
@@ -161,7 +161,7 @@
/obj/item/clothing/glasses/meson/sunglasses
name = "optical meson scannerglasses"
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions. This pair is built into a pair of sunglasses."
- icon_state = "sunnmeson"
+ icon_state = "sunmeson"
flash_protect = FLASH_PROTECTION_FLASH
#undef MODE_NONE
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index b267db209293..0698981207bf 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -212,7 +212,7 @@
/obj/item/clothing/glasses/hud/toggle/thermal
name = "thermal HUD scanner"
desc = "Thermal imaging HUD in the shape of glasses."
- icon_state = "thermal"
+ icon_state = "thermalgoggles"
hud_type = DATA_HUD_SECURITY_ADVANCED
vision_flags = SEE_MOBS
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
@@ -222,13 +222,13 @@
..()
switch (hud_type)
if (DATA_HUD_MEDICAL_ADVANCED)
- icon_state = "meson"
+ icon_state = "mesongoggles"
change_glass_color(user, /datum/client_colour/glass_colour/green)
if (DATA_HUD_SECURITY_ADVANCED)
- icon_state = "thermal"
+ icon_state = "thermalgoggles"
change_glass_color(user, /datum/client_colour/glass_colour/red)
else
- icon_state = "purple"
+ icon_state = "scigoggles"
change_glass_color(user, /datum/client_colour/glass_colour/purple)
user.update_inv_glasses()
@@ -248,7 +248,6 @@
tint = 1
glass_colour_type = /datum/client_colour/glass_colour/gray
-
/obj/item/clothing/glasses/hud/spacecop/hidden // for the undercover cop
name = "sunglasses"
desc = "These sunglasses are special, and let you view potential criminals."
@@ -274,4 +273,3 @@
desc = "A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records. This pair also corrects nearsightedness."
icon_state = "prescriptionsecurityhud"
vision_correction = 1
-
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index 8db83c860da7..61c06125d8f8 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -1,8 +1,11 @@
/obj/item/clothing/gloves
name = "gloves"
+ lefthand_file = 'icons/mob/inhands/clothing/gloves_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/clothing/gloves_righthand.dmi'
gender = PLURAL //Carn: for grammarically correct text-parsing
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/clothing/gloves.dmi'
+ item_state = "bgloves"
siemens_coefficient = 0.5
body_parts_covered = HANDS
slot_flags = ITEM_SLOT_GLOVES
diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm
index 68f64cdd515e..e2807b48dcf1 100644
--- a/code/modules/clothing/gloves/boxing.dm
+++ b/code/modules/clothing/gloves/boxing.dm
@@ -2,18 +2,15 @@
name = "boxing gloves"
desc = "Because you really needed another excuse to punch your crewmates."
icon_state = "boxing"
- item_state = "boxing"
equip_delay_other = 60
supports_variations = VOX_VARIATION
/obj/item/clothing/gloves/boxing/green
icon_state = "boxinggreen"
- item_state = "boxinggreen"
/obj/item/clothing/gloves/boxing/blue
icon_state = "boxingblue"
- item_state = "boxingblue"
/obj/item/clothing/gloves/boxing/yellow
icon_state = "boxingyellow"
- item_state = "boxingyellow"
+ item_state = "ygloves"
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 291b1c1b25b6..cbac3e0e8901 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -38,7 +38,6 @@
desc = "How're you gonna get 'em off, nerd?"
name = "spray-on insulated gloves"
icon_state = "sprayon"
- item_state = "sprayon"
permeability_coefficient = 0
resistance_flags = ACID_PROOF
var/shocks_remaining = 10
@@ -64,7 +63,7 @@
name = "taped-on insulated gloves"
desc = "This is a totally safe idea."
icon_state = "yellowtape"
- item_state = "ygloves"
+ mob_overlay_state = "sprayon"
shocks_remaining = 3
/obj/item/clothing/gloves/color/yellow/sprayon/tape/Initialize()
@@ -109,7 +108,6 @@
desc = "These gloves are fire-resistant."
name = "black gloves"
icon_state = "black"
- item_state = "blackgloves"
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
@@ -130,14 +128,11 @@
name = "orange gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "orange"
- item_state = "orangegloves"
/obj/item/clothing/gloves/color/red
name = "red gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "red"
- item_state = "redgloves"
-
/obj/item/clothing/gloves/color/red/insulated
name = "insulated gloves"
@@ -150,49 +145,41 @@
name = "rainbow gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "rainbow"
- item_state = "rainbowgloves"
/obj/item/clothing/gloves/color/blue
name = "blue gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "blue"
- item_state = "bluegloves"
/obj/item/clothing/gloves/color/purple
name = "purple gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "purple"
- item_state = "purplegloves"
/obj/item/clothing/gloves/color/green
name = "green gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "green"
- item_state = "greengloves"
/obj/item/clothing/gloves/color/grey
name = "grey gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "gray"
- item_state = "graygloves"
/obj/item/clothing/gloves/color/light_brown
name = "light brown gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "lightbrown"
- item_state = "lightbrowngloves"
/obj/item/clothing/gloves/color/brown
name = "brown gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "brown"
- item_state = "browngloves"
/obj/item/clothing/gloves/color/captain
desc = "Regal white gloves, with a nice gold trim, a diamond anti-shock coating, and an integrated thermal barrier, and armoured bracers. Swanky."
name = "captain's gloves"
icon_state = "captain"
- item_state = "egloves"
siemens_coefficient = 0
permeability_coefficient = 0.05
cold_protection = HANDS
@@ -206,13 +193,12 @@
desc = "Regal blue gloves, with a nice gold trim, a diamond anti-shock coating, and an integrated thermal barrier, and armoured bracers. Swanky."
name = "captain's gloves"
icon_state = "captainnt"
- item_state = "egloves"
/obj/item/clothing/gloves/color/latex
name = "latex gloves"
desc = "Cheap sterile gloves made from latex. Transfers minor paramedic knowledge to the user via budget nanochips."
icon_state = "latex"
- item_state = "latex"
+ item_state = "lgloves"
siemens_coefficient = 0.3
permeability_coefficient = 0.01
transfer_prints = TRUE
@@ -232,22 +218,19 @@
name = "nitrile gloves"
desc = "Pricy sterile gloves that are thicker than latex. Transfers intimate paramedic knowledge into the user via nanochips."
icon_state = "nitrile"
- item_state = "nitrilegloves"
transfer_prints = FALSE
carrytrait = TRAIT_QUICKER_CARRY
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/gloves/color/latex/nitrile/evil
name = "red nitrile gloves"
desc = "Thick sterile gloves that reach up to the elbows, in exactly the same color as fresh blood. Transfers combat medic knowledge into the user via nanochips."
icon_state = "nitrile_evil"
- item_state = "nitrile_evil"
/obj/item/clothing/gloves/color/latex/nitrile/infiltrator
name = "infiltrator gloves"
desc = "Specialized combat gloves for carrying people around. Transfers tactical kidnapping knowledge into the user via nanochips."
icon_state = "infiltrator"
- item_state = "infiltrator"
siemens_coefficient = 0
permeability_coefficient = 0.3
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -257,11 +240,8 @@
desc = "Overdesigned engineering gloves that have automated construction subrutines dialed in, allowing for faster construction while worn."
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_gauntlets"
- item_state = "clockwork_gauntlets"
- siemens_coefficient = 0 //WS Station eddit "Tinkers Gloves Insuls"
- permeability_coefficient = 0.05 //WS Station eddit "Tinkers Gloves Insuls"
- //siemens_coefficient = 0.8 WS Station eddit "Tinkers Gloves Insuls"
- //permeability_coefficient = 0.3 WS Station eddit "Tinkers Gloves Insuls"
+ siemens_coefficient = 0
+ permeability_coefficient = 0.05
carrytrait = TRAIT_QUICK_BUILD
custom_materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000)
@@ -269,14 +249,14 @@
name = "white gloves"
desc = "These look pretty fancy."
icon_state = "white"
- item_state = "wgloves"
+ item_state = "lgloves"
custom_price = 200
/obj/item/clothing/gloves/color/evening
name = "evening gloves"
desc = "White satin gloves that rise up to the elbows. Excessively fancy."
icon_state = "evening_gloves"
- item_state = "evening_gloves"
+ item_state = "lgloves"
custom_price = 200
/obj/effect/spawner/lootdrop/gloves
@@ -294,9 +274,11 @@
/obj/item/clothing/gloves/color/light_brown = 1,
/obj/item/clothing/gloves/color/brown = 1,
/obj/item/clothing/gloves/color/white = 1,
- /obj/item/clothing/gloves/color/rainbow = 1)
+ /obj/item/clothing/gloves/color/rainbow = 1,
+ )
/obj/item/clothing/gloves/maid
name = "maid arm covers"
desc = "Cylindrical looking tubes that go over your arm, weird."
icon_state = "maid_arms"
+ item_state = "lgloves"
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index d402847a613e..9d8db3c035d8 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -3,7 +3,6 @@
name = "fingerless gloves"
desc = "Plain black gloves without fingertips for the hard working."
icon_state = "fingerless"
- item_state = "fingerless"
transfer_prints = TRUE
strip_delay = 40
equip_delay_other = 20
@@ -30,7 +29,6 @@
name = "combat gloves"
desc = "These tactical gloves are fireproof and electrically insulated."
icon_state = "combat"
- item_state = "combat"
siemens_coefficient = 0
permeability_coefficient = 0.05
strip_delay = 80
@@ -40,25 +38,22 @@
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/gloves/combat/maid
name = "combat maid sleeves"
desc = "These 'tactical' gloves and sleeves are fireproof and electrically insulated. Warm to boot."
icon_state = "syndimaid_arms"
- item_state = "syndimaid_arms"
/obj/item/clothing/gloves/combat/maid/inteq
name = "inteq combat maid sleeves"
desc = "Tacticute and comfy, along with being both fireproof and electrically insulated."
icon_state = "inteqmaid_arms"
- item_state = "inteqmaid_arms"
/obj/item/clothing/gloves/bracer
name = "bone bracers"
desc = "For when you're expecting to get slapped on the wrist. Offers modest protection to your arms."
icon_state = "bracers"
- item_state = "bracers"
transfer_prints = TRUE
strip_delay = 40
equip_delay_other = 20
@@ -73,7 +68,6 @@
name = "Gloves of the North Star"
desc = "Just looking at these fills you with an urge to beat the shit out of people."
icon_state = "rapid"
- item_state = "rapid"
transfer_prints = TRUE
cuttable = FALSE
@@ -86,7 +80,6 @@
desc = "Covers up those scandalous boney hands."
name = "plasma envirogloves"
icon_state = "plasmaman"
- item_state = "plasmaman"
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
@@ -98,65 +91,56 @@
/obj/item/clothing/gloves/color/plasmaman/black
name = "black envirogloves"
icon_state = "blackplasma"
- item_state = "blackplasma"
/obj/item/clothing/gloves/color/plasmaman/white
name = "white envirogloves"
icon_state = "whiteplasma"
- item_state = "whiteplasma"
+ item_state = "lgloves"
/obj/item/clothing/gloves/color/plasmaman/robot
name = "roboticist envirogloves"
icon_state = "robotplasma"
- item_state = "robotplasma"
/obj/item/clothing/gloves/color/plasmaman/janny
name = "janitor envirogloves"
icon_state = "jannyplasma"
- item_state = "jannyplasma"
/obj/item/clothing/gloves/color/plasmaman/cargo
name = "cargo envirogloves"
icon_state = "cargoplasma"
- item_state = "cargoplasma"
/obj/item/clothing/gloves/color/plasmaman/engineer
name = "engineering envirogloves"
icon_state = "engieplasma"
- item_state = "engieplasma"
+ item_state = "ygloves"
siemens_coefficient = 0
/obj/item/clothing/gloves/color/plasmaman/atmos
name = "atmos envirogloves"
icon_state = "atmosplasma"
- item_state = "atmosplasma"
+ item_state = "ygloves"
siemens_coefficient = 0
/obj/item/clothing/gloves/color/plasmaman/explorer
name = "explorer envirogloves"
icon_state = "explorerplasma"
- item_state = "explorerplasma"
/obj/item/clothing/gloves/color/botanic_leather/plasmaman
name = "botany envirogloves"
desc = "Covers up those scandalous boney hands."
icon_state = "botanyplasma"
- item_state = "botanyplasma"
permeability_coefficient = 0.05
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
/obj/item/clothing/gloves/color/plasmaman/prototype
name = "prototype envirogloves"
icon_state = "protoplasma"
- item_state = "protoplasma"
/obj/item/clothing/gloves/color/plasmaman/clown
name = "clown envirogloves"
icon_state = "clownplasma"
- item_state = "clownplasma"
/obj/item/clothing/gloves/combat/wizard
name = "enchanted gloves"
desc = "These gloves have been enchanted with a spell that makes them electrically insulated and fireproof."
icon_state = "wizard"
- item_state = "purplegloves"
diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm
index 58bee929a0d7..0ae7f48089e9 100644
--- a/code/modules/clothing/gloves/tacklers.dm
+++ b/code/modules/clothing/gloves/tacklers.dm
@@ -2,7 +2,6 @@
name = "gripper gloves"
desc = "Special gloves that manipulate the blood vessels in the wearer's hands, granting them the ability to launch headfirst into walls."
icon_state = "tackle"
- item_state = "tackle"
transfer_prints = TRUE
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
@@ -43,8 +42,6 @@
name = "dolphin gloves"
desc = "Sleek, aerodynamic gripper gloves that are less effective at actually performing takedowns, but more effective at letting the user sail through the hallways and cause accidents."
icon_state = "tackledolphin"
- item_state = "tackledolphin"
-
tackle_stam_cost = 15
base_knockdown = 0.5 SECONDS
tackle_range = 5
@@ -56,13 +53,10 @@
name = "gorilla gloves"
desc = "Premium quality combative gloves, heavily reinforced to give the user an edge in close combat tackles, though they are more taxing to use than normal gripper gloves. Fireproof to boot!"
icon_state = "black"
- item_state = "blackgloves"
-
tackle_stam_cost = 35
base_knockdown = 1.5 SECONDS
tackle_range = 5
skill_mod = 2
-
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
@@ -73,7 +67,6 @@
name = "guerrilla gloves"
desc = "Superior quality combative gloves, good for performing tackle takedowns as well as absorbing electrical shocks."
icon_state = "combat"
- item_state = "combat"
siemens_coefficient = 0
permeability_coefficient = 0.05
@@ -81,8 +74,6 @@
name = "rocket gloves"
desc = "The ultimate in high risk, high reward, perfect for when you need to stop a criminal from fifty feet away or die trying. Banned in most Spinward gridiron football and rugby leagues."
icon_state = "tacklerocket"
- item_state = "tacklerocket"
-
tackle_stam_cost = 50
base_knockdown = 2 SECONDS
tackle_range = 10
@@ -94,8 +85,6 @@
name = "improvised gripper gloves"
desc = "Ratty looking fingerless gloves wrapped with sticky tape. Beware anyone wearing these, for they clearly have no shame and nothing to lose."
icon_state = "fingerless"
- item_state = "fingerless"
-
tackle_stam_cost = 30
base_knockdown = 1.75 SECONDS
min_distance = 2
diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm
index 11deb4ac8b53..4039402588fd 100644
--- a/code/modules/clothing/head/_head.dm
+++ b/code/modules/clothing/head/_head.dm
@@ -1,7 +1,9 @@
/obj/item/clothing/head
name = BODY_ZONE_HEAD
icon = 'icons/obj/clothing/hats.dmi'
- icon_state = "top_hat"
+ lefthand_file = 'icons/mob/inhands/clothing/hats_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/clothing/hats_righthand.dmi'
+ icon_state = "tophat"
item_state = "that"
body_parts_covered = HEAD
slot_flags = ITEM_SLOT_HEAD
diff --git a/code/modules/clothing/head/berets.dm b/code/modules/clothing/head/berets.dm
index 30a291dcb327..9d3ca21ed4f0 100644
--- a/code/modules/clothing/head/berets.dm
+++ b/code/modules/clothing/head/berets.dm
@@ -32,9 +32,9 @@
/obj/item/clothing/head/beret/durathread
name = "durathread beret"
- desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer."
+ desc = "A beret made from durathread, its resilient fibres provide a modicum of fire protection to the wearer."
icon_state = "beretdurathread"
- armor = list("melee" = 15, "bullet" = 5, "laser" = 15, "energy" = 25, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 5)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 15, "acid" = 5)
//Civilian
/obj/item/clothing/head/beret/grey
@@ -56,7 +56,6 @@
name = "quartermaster beret"
desc = "A cargo beret with a faded medal haphazardly stitched into it. Worn by a true cargonian, it commands respect from everyone."
icon_state = "beret_qm"
- armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5)
/obj/item/clothing/head/beret/cargo
name = "cargo beret"
@@ -65,30 +64,25 @@
/obj/item/clothing/head/beret/mining
name = "mining beret"
- desc = "A grey beret with a pickaxe insignia sewn into it. Seems to be padded and fireproofed to offer the wearer some protection."
+ desc = "A grey beret with a pickaxe insignia sewn into it."
icon_state = "beret_mining"
- armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 15, "bomb" = 30, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
//Sec
/obj/item/clothing/head/beret/sec
name = "security beret"
- desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection."
+ desc = "A robust beret with the security insignia emblazoned on it."
icon_state = "beret_sec"
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30,"energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- strip_delay = 60
dog_fashion = null
/obj/item/clothing/head/beret/sec/hos
name = "head of security's black beret"
desc = "A black beret with the Head of Security's insignia emblazoned on it. A symbol of excellence, a badge of courage, a mark of distinction."
icon_state = "beret_hos"
- armor = list("melee" = 40, "bullet" = 30, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60)
/obj/item/clothing/head/beret/sec/warden
name = "warden's beret"
desc = "A beret made with black reinforced fabric with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "beret_warden"
- armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60)
/obj/item/clothing/head/beret/sec/officer
desc = "A beret made out of black reinforced fabric with the security insignia emblazoned on it. For officers with class."
@@ -103,7 +97,7 @@
name = "engineering beret"
desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety."
icon_state = "beret_engineering"
- armor = list("rad" = 10, "fire" = 10)
+ armor = list("rad" = 5, "fire" = 10)
/obj/item/clothing/head/beret/eng/hazard
name = "engineering hazardberet"
@@ -114,13 +108,13 @@
name = "atmospherics beret"
desc = "A beret for those who have shown immaculate proficienty in piping. Or plumbing. Mostly piping."
icon_state = "beret_atmospherics"
- armor = list("rad" = 10, "fire" = 10)
+ armor = list("rad" = 5, "fire" = 10)
/obj/item/clothing/head/beret/ce
name = "chief engineer beret"
desc = "A white beret with the engineering insignia emblazoned on it. Its owner knows what they're doing. Probably."
icon_state = "beret_ce"
- armor = list("rad" = 20, "fire" = 30)
+ armor = list("rad" = 10, "fire" = 30)
//Science
/obj/item/clothing/head/beret/sci
@@ -170,22 +164,16 @@
name = "captain beret"
desc = "A lovely blue Captain beret with a gold and white insignia. Truly fit for only the finest officers."
icon_state = "beret_captain"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- strip_delay = 90
/obj/item/clothing/head/beret/hop
name = "head of personnel beret"
desc = "A lovely blue Head of Personnel's beret with a silver and white insignia. It smells faintly of paper and dogs."
icon_state = "beret_hop"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- strip_delay = 90
/obj/item/clothing/head/beret/command
name = "command beret"
desc = "A modest blue command beret with a silver rank insignia. Smells of power and the sweat of assistants."
icon_state = "beret_com"
- armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 25, "acid" = 25)
- strip_delay = 90
// SolGov
@@ -193,26 +181,21 @@
name = "\improper SolGov beret"
desc = "A beret with SolGov's emblem emblazoned on it. Colored in SolGov blue."
icon_state = "beret_solgov"
- item_state = "beret_solgov"
- armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60)
/obj/item/clothing/head/beret/solgov/plain
name = "\improper SolGov beret"
desc = "A plain blue beret. It looks like it's missing something."
icon_state = "beret_solgovplain"
- item_state = "beret_solgovplain"
/obj/item/clothing/head/beret/solgov/terragov
name = "\improper TerraGov beret"
desc = "A beret with SolGov's emblem emblazoned on it. It's still colored in original TerraGov green."
icon_state = "beret_terragov"
- item_state = "beret_terragov"
/obj/item/clothing/head/beret/solgov/terragov/plain
name = "\improper TerraGov beret"
desc = "A plain beret colored in original TerraGov green. It looks like it's missing something."
icon_state = "beret_terragovplain"
- item_state = "beret_terragovplain"
// Inteq
@@ -220,39 +203,24 @@
name = "inteq beret"
desc = "A comfortable looking brown beret with a badge of the golden shield of the IRMG. Denotes the wearer as part of the IRMG."
icon_state = "inteq_beret"
- item_state = "inteq_beret"
/obj/item/clothing/head/beret/sec/hos/inteq
name = "inteq vanguard beret"
desc = "A comfortable looking brown beret with a badge of the golden shield of the IRMG. Denotes the wearer as a vanguard of the IRMG. The padding inside feels thicker."
icon_state = "inteq_beret"
- item_state = "inteq_beret"
/obj/item/clothing/head/beret/sec/hos/inteq/honorable
name = "honorable vanguard beret"
desc = "A snow white beret with an air of distinction around it, emblazoned with the golden shield of the IRMG as the badge."
icon_state = "inteq_honorable_beret"
- item_state = "inteq_honorable_beret"
- armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90)
-
-// Frontier
-
-/obj/item/clothing/head/beret/sec/frontier
- name = "\improper Frontiersmen beret"
- desc = "A scratchy olive green beret, worn by Frontiersmen who want to look good while intimidating freighter crew."
- icon_state = "frontier_beret"
-
-/obj/item/clothing/head/beret/sec/frontier/officer
- name = "\improper Frontiersmen officer beret"
- desc = "A scratchy olive green beret emblazoned with the Frontiersmen insignia, worn by Frontiersmen who want to look good while intimidating freighter captains."
- icon_state = "frontier_officer_beret"
-
// CentCom
/obj/item/clothing/head/beret/centcom_formal
name = "\improper CentCom Formal Beret"
desc = "Sometimes, a compromise between fashion and defense needs to be made. Thanks to Nanotrasen's most recent nano-fabric durability enhancements, this time, it's not the case."
+ icon = 'icons/obj/clothing/head/spacesuits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/spacesuits.dmi'
icon_state = "beret_badge"
greyscale_colors = "#46b946#f2c42e"
armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "fire" = 100, "acid" = 90)
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index 7dbe408eb39a..036d6ffbd417 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -20,7 +20,7 @@
name = "collectable chef's hat"
desc = "A rare chef's hat meant for hat collectors!"
icon_state = "chef"
- item_state = "chef"
+ item_state = "chefhat"
dog_fashion = /datum/dog_fashion/head/chef
@@ -28,7 +28,6 @@
name = "collectable paper hat"
desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from water, fire, and Curators."
icon_state = "paper"
-
dog_fashion = /datum/dog_fashion/head
/obj/item/clothing/head/collectable/tophat
@@ -41,22 +40,21 @@
name = "collectable captain's hat"
desc = "A collectable hat that'll make you look just like a real comdom!"
icon_state = "captain"
- item_state = "caphat"
dog_fashion = /datum/dog_fashion/head/captain
/obj/item/clothing/head/collectable/police
name = "collectable police officer's hat"
desc = "A collectable police officer's Hat. This hat emphasizes that you are THE LAW."
+ icon = 'icons/obj/clothing/head/armor.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/armor.dmi'
icon_state = "policehelm"
-
dog_fashion = /datum/dog_fashion/head/warden
/obj/item/clothing/head/collectable/beret
name = "collectable beret"
desc = "A collectable red beret. It smells faintly of garlic."
icon_state = "beret"
-
dog_fashion = /datum/dog_fashion/head/beret
/obj/item/clothing/head/collectable/welding
@@ -70,28 +68,26 @@
name = "collectable slime hat"
desc = "Just like a real brain slug!"
icon_state = "headslime"
- item_state = "headslime"
clothing_flags = SNUG_FIT
/obj/item/clothing/head/collectable/flatcap
name = "collectable flat cap"
desc = "A collectible laborer's flat cap! Smells like No. 9 coal..."
icon_state = "flat_cap"
- item_state = "detective"
+ item_state = "det_hat"
/obj/item/clothing/head/collectable/pirate
name = "collectable pirate hat"
desc = "You'd make a great Dread Syndie Roberts!"
+ icon = 'icons/obj/clothing/head/spacesuits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/spacesuits.dmi'
icon_state = "pirate"
- item_state = "pirate"
-
dog_fashion = /datum/dog_fashion/head/pirate
/obj/item/clothing/head/collectable/kitty
name = "collectable kitty ears"
desc = "The fur feels... a bit too realistic."
icon_state = "kitty"
- item_state = "kitty"
dog_fashion = /datum/dog_fashion/head/kitty
@@ -99,7 +95,6 @@
name = "collectable rabbit ears"
desc = "Not as lucky as the feet!"
icon_state = "bunny"
- item_state = "bunny"
dog_fashion = /datum/dog_fashion/head/rabbit
@@ -107,7 +102,6 @@
name = "collectable wizard's hat"
desc = "NOTE: Any magical powers gained from wearing this hat are purely coincidental."
icon_state = "wizard"
-
dog_fashion = /datum/dog_fashion/head/blue_wizard
/obj/item/clothing/head/collectable/hardhat
@@ -115,8 +109,6 @@
desc = "WARNING! Offers no real protection, but damn, is it fancy!"
clothing_flags = SNUG_FIT
icon_state = "hardhat_standard"
- item_state = "hardhat_standard"
-
dog_fashion = /datum/dog_fashion/head
/obj/item/clothing/head/collectable/HoS
@@ -133,14 +125,17 @@
/obj/item/clothing/head/collectable/thunderdome
name = "collectable Thunderdome helmet"
desc = "Go Red! I mean Green! I mean Red! No Green!"
+ icon = 'icons/obj/clothing/head/armor.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/armor.dmi'
icon_state = "thunderdome"
- item_state = "thunderdome"
clothing_flags = SNUG_FIT
flags_inv = HIDEHAIR
/obj/item/clothing/head/collectable/swat
name = "collectable SWAT helmet"
desc = "That's not real blood. That's red paint." //Reference to the actual description
+ icon = 'icons/obj/clothing/head/armor.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/armor.dmi'
icon_state = "swat"
item_state = "swat"
clothing_flags = SNUG_FIT
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 0eba8a277915..dba4c2f80406 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -2,7 +2,6 @@
name = "safety helmet"
desc = "A yellow hard hat used in dangerous work settings to protect the head from falling items and errant swinging toolboxes."
icon_state = "hardhat_standard"
- item_state = "hardhat_standard"
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
flags_inv = 0
clothing_flags = SNUG_FIT
@@ -12,7 +11,6 @@
name = "hard hat"
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight."
icon_state = "hardhat_yellow"
- item_state = "hardhat_yellow"
light_color = "#FFCC66"
light_power = 0.8
armor = list("melee" = 15, "bullet" = 5, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50) // surprisingly robust against head trauma
@@ -50,10 +48,8 @@
/obj/item/clothing/head/hardhat/update_icon_state()
if(on)
icon_state = "[initial(icon_state)]-on"
- item_state = "[initial(icon_state)]-on"
else
icon_state = "[initial(icon_state)]"
- item_state = "[initial(icon_state)]"
return ..()
/obj/item/clothing/head/hardhat/proc/turn_on(mob/user)
@@ -64,13 +60,11 @@
/obj/item/clothing/head/hardhat/orange
icon_state = "hardhat_orange"
- item_state = "hardhat_orange"
dog_fashion = null
/obj/item/clothing/head/hardhat/red
name = "firefighter helmet"
icon_state = "hardhat_red"
- item_state = "hardhat_red"
clothing_flags = STOPSPRESSUREDAMAGE
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
@@ -81,14 +75,12 @@
name = "workplace-ready firefighter helmet"
desc = "By applying state of the art lighting technology to a fire helmet, and using photo-chemical hardening methods, this hardhat will protect you from robust workplace hazards."
icon_state = "hardhat_purple"
- item_state = "hardhat_purple"
light_range = 5
resistance_flags = FIRE_PROOF | ACID_PROOF
custom_materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 3000, /datum/material/silver = 500)
/obj/item/clothing/head/hardhat/white
icon_state = "hardhat_white"
- item_state = "hardhat_white"
clothing_flags = STOPSPRESSUREDAMAGE
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
@@ -98,7 +90,6 @@
/obj/item/clothing/head/hardhat/green
icon_state = "hardhat_green"
- item_state = "hardhat_green"
clothing_flags = STOPSPRESSUREDAMAGE
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
@@ -108,17 +99,14 @@
/obj/item/clothing/head/hardhat/dblue
icon_state = "hardhat_dblue"
- item_state = "hardhat_dblue"
dog_fashion = null
/obj/item/clothing/head/hardhat/solgov
icon_state = "hardhat_solgov"
- item_state = "hardhat_solgov"
dog_fashion = null
/obj/item/clothing/head/hardhat/atmos
icon_state = "hardhat_atmos"
- item_state = "hardhat_atmos"
dog_fashion = null
name = "atmospheric technician's firefighting helmet"
desc = "A firefighter's helmet, able to keep the user cool in any situation."
@@ -134,7 +122,6 @@
name = "mining helmet"
desc = "A yellow hard hat used in dangerous mining settings to protect the head from falling rocks and from natives who had advanced in the areas of toolbox swinging technology."
icon_state = "hardhat_mining"
- item_state = "hardhat_mining"
dog_fashion = null
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
@@ -186,12 +173,10 @@
/obj/item/clothing/head/hardhat/weldhat/orange
icon_state = "hardhat_orange"
- item_state = "hardhat_orange"
/obj/item/clothing/head/hardhat/weldhat/white
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield!" //This bulb is not smaller
icon_state = "hardhat_white"
- item_state = "hardhat_white"
light_range = 4 //Boss always takes the best stuff
hat_type = "white"
clothing_flags = STOPSPRESSUREDAMAGE
@@ -202,4 +187,3 @@
/obj/item/clothing/head/hardhat/weldhat/dblue
icon_state = "hardhat_dblue"
- item_state = "hardhat_dblue"
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index f96d23fa9ba2..352349783bae 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -1,6 +1,8 @@
/obj/item/clothing/head/helmet
name = "helmet"
desc = "Standard Security gear. Protects the head from impacts."
+ icon = 'icons/obj/clothing/head/armor.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/armor.dmi'
icon_state = "helmet"
item_state = "helmet"
var/flashlight_state = "helmet_flight_overlay"
@@ -16,10 +18,15 @@
dog_fashion = /datum/dog_fashion/head/helmet
- var/can_flashlight = FALSE //if a flashlight can be mounted. if it has a flashlight and this is false, it is permanently attached.
+ //if a flashlight can be mounted. if it has a flashlight and this is false, it is permanently attached.
+ var/can_flashlight = FALSE
var/obj/item/flashlight/seclite/attached_light
var/datum/action/item_action/toggle_helmet_flashlight/action_light
+ pocket_storage_component_path = /datum/component/storage/concrete/pockets/helmet
+ // should we overlay the items inside our helmet
+ var/content_overlays = FALSE
+
/obj/item/clothing/head/helmet/Initialize()
. = ..()
if(attached_light)
@@ -171,16 +178,21 @@
var/mutable_appearance/flashlightlight_overlay
if(isinhands)
return
- if(!attached_light)
- return
- if(attached_light.on)
- flashlightlight_overlay = mutable_appearance('icons/mob/clothing/head.dmi', "[flashlight_state]_on")
+ if(attached_light)
+ if(attached_light.on)
+ flashlightlight_overlay = mutable_appearance('icons/mob/clothing/head.dmi', "[flashlight_state]_on")
+ else
+ flashlightlight_overlay = mutable_appearance('icons/mob/clothing/head.dmi', flashlight_state)
+ . += flashlightlight_overlay
+ if(content_overlays)
+ for(var/obj/item/I in contents)
+ . += I.get_helmet_overlay()
else
- flashlightlight_overlay = mutable_appearance('icons/mob/clothing/head.dmi', flashlight_state)
- . += flashlightlight_overlay
+ return
/obj/item/clothing/head/helmet/sec
can_flashlight = TRUE
+ content_overlays = TRUE
/obj/item/clothing/head/helmet/sec/attackby(obj/item/I, mob/user, params)
if(issignaler(I))
@@ -214,13 +226,15 @@
"Snow" = "helmetalt_snow",
"Urban" = "helmetalt_urban",
)
+ content_overlays = TRUE
/obj/item/clothing/head/helmet/marine
name = "tactical combat helmet"
- desc = "A tactical black helmet, sealed from outside hazards with a plate of reinforced glass."
+ desc = "A tactical black helmet, sealed from outside hazards with a reinforced visor."
icon_state = "marine_command"
item_state = "helmetalt"
- armor = list("melee" = 50, "bullet" = 50, "laser" = 30, "energy" = 25, "bomb" = 50, "bio" = 100, "fire" = 40, "acid" = 50)
+ armor = list("melee" = 50, "bullet" = 75, "laser" = 55, "energy" = 25, "bomb" = 60, "bio" = 100, "fire" = 70, "acid" = 50)
+ slowdown = 0.3
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
clothing_flags = STOPSPRESSUREDAMAGE
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -469,16 +483,6 @@
armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 40, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 50)
strip_delay = 60
-/obj/item/clothing/head/helmet/r_trapper
- name = "reinforced trapper hat"
- desc = "An occasional sight on the heads of Frontiersmen stationed on cold worlds. 200% bear."
- icon_state = "rus_ushanka"
- item_state = "rus_ushanka"
- body_parts_covered = HEAD
- cold_protection = HEAD
- min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
- armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 30, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50)
-
/obj/item/clothing/head/helmet/infiltrator
name = "infiltrator helmet"
desc = "The galaxy isn't big enough for the two of us."
@@ -497,6 +501,8 @@
icon_state = "inteq_swat"
item_state = "inteq_swat"
flags_inv = HIDEHAIR
+ supports_variations = KEPORI_VARIATION
+ content_overlays = TRUE
/obj/item/clothing/head/helmet/inteq
name = "inteq helmet"
@@ -504,11 +510,12 @@
icon_state = "inteq_helmet"
icon_state = "inteq_helmet"
can_flashlight = TRUE
+ supports_variations = KEPORI_VARIATION
+ content_overlays = TRUE
/obj/item/clothing/head/solgov
name = "\improper SolGov officer's cap"
desc = "A blue cap worn by high-ranking officers of SolGov."
- armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60)
icon_state = "cap_solgov"
item_state = "cap_solgov"
strip_delay = 80
@@ -516,7 +523,6 @@
/obj/item/clothing/head/solgov/terragov
name = "\improper TerraGov officer's cap"
desc = "A cap worn by high-ranking officers of SolGov. This one is still in original TerraGov green."
- armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60)
icon_state = "cap_terragov"
item_state = "cap_terragov"
@@ -527,7 +533,6 @@
item_state = "sonnensoldner_hat"
worn_y_offset = 4
dog_fashion = null
- armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60)
/obj/item/clothing/head/solgov/captain
name = "\improper SolGov bicorne hat"
@@ -536,7 +541,6 @@
item_state = "solgov_bicorne"
worn_y_offset = 2
dog_fashion = null
- armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60)
/obj/item/clothing/head/helmet/space/plasmaman/solgov
name = "\improper SolGov envirosuit helmet"
@@ -549,6 +553,7 @@
desc = "A robust combat helmet commonly employed by Syndicate forces, regardless of alignment."
icon_state = "operator"
item_state = "operator"
+ content_overlays = TRUE
/obj/item/clothing/head/helmet/medical
name = "\improper trauma team helmet"
@@ -584,9 +589,3 @@
"Snow" = "x11helm_snow",
"Urban" = "x11helm_urban",
)
-
-/obj/item/clothing/head/helmet/bulletproof/x11/frontier
- name = "\improper Frontiersmen X11 Helmet"
- desc = "A heavily modified X11 used by the Frontiersmen pirate fleet."
- icon_state = "x11helm_frontier"
- unique_reskin = null
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 663af5e6f758..eb76c13fb541 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -21,18 +21,13 @@
icon_state = "captain"
item_state = "that"
flags_inv = 0
- armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- strip_delay = 60
dog_fashion = /datum/dog_fashion/head/captain
-//Captain: This is no longer space-worthy
/obj/item/clothing/head/caphat/parade
name = "captain's parade cap"
desc = "Worn only by Captains with an abundance of class."
icon_state = "capcap"
- dog_fashion = null
-
/obj/item/clothing/head/caphat/cowboy
name = "general's hat"
desc = "A commanding white stetson adorned with a general's badge. Why this belongs to a captain is anybody's guess."
@@ -42,12 +37,12 @@
name = "captain's hat"
icon_state = "captain_nt"
-/obj/item/clothing/head/caphat/frontier
+/obj/item/clothing/head/frontier/peaked
name = "\improper Frontiersmen commander's cap"
desc = "An imposing peaked cap, meant for a commander of the Frontiersmen."
icon_state = "frontier_cap"
-/obj/item/clothing/head/caphat/frontier/admiral
+/obj/item/clothing/head/frontier/peaked/admiral
name = "\improper Frontiersmen admiral's cap"
desc = "An imposing peaked cap meant for only the highest of officers of the Frontiersmen pirate fleet."
icon_state = "frontier_admiral_cap"
@@ -57,7 +52,6 @@
name = "head of personnel's cap"
icon_state = "hopcap"
desc = "The symbol of true bureaucratic micromanagement."
- armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
dog_fashion = /datum/dog_fashion/head/head_of_personnel
/obj/item/clothing/head/hopcap/nt
@@ -92,7 +86,6 @@
/obj/item/clothing/head/fedora/det_hat
name = "detective's fedora"
desc = "There's only one man who can sniff out the dirty stench of crime, and he's likely wearing this hat."
- armor = list("melee" = 25, "bullet" = 5, "laser" = 25, "energy" = 35, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 50)
icon_state = "detective"
var/candy_cooldown = 0
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/fedora/detective
@@ -132,8 +125,6 @@
name = "head of security cap"
desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
- armor = list("melee" = 40, "bullet" = 30, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60)
- strip_delay = 80
/obj/item/clothing/head/HoS/cowboy
name = "sheriff's hat"
@@ -144,10 +135,8 @@
/obj/item/clothing/head/cowboy/sec
name = "deputy hat"
- desc = "A robust stetson adorned with a deputy's badge. It has a reinforced lining under the imitation leather."
+ desc = "A robust stetson adorned with a deputy's badge. Its imitation leather is thick and worn."
icon_state = "cowboysec"
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30,"energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- strip_delay = 60
/obj/item/clothing/head/cowboy/sec/roumain
name = "hunter's hat"
@@ -181,41 +170,39 @@
/obj/item/clothing/head/HoS/beret/syndicate
name = "syndicate beret"
- desc = "A black beret with thick armor padding inside. Stylish and robust."
+ desc = "A nondescript black beret. Stylish and robust."
icon_state = "beret_officer"
item_state = "beret_officer"
/obj/item/clothing/head/warden
name = "warden's police hat"
- desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts."
+ desc = "It's a special hat issued to the Warden of a security force. A classic symbol of middling authority."
+ icon = 'icons/obj/clothing/head/armor.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/armor.dmi'
icon_state = "policehelm"
- armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60)
- strip_delay = 60
dog_fashion = /datum/dog_fashion/head/warden
/obj/item/clothing/head/warden/red
name = "warden's red hat"
desc = "A warden's red hat. Looking at it gives you the feeling of wanting to keep people in cells for as long as possible."
icon_state = "wardenhat"
- armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60)
- strip_delay = 60
dog_fashion = /datum/dog_fashion/head/warden_red
/obj/item/clothing/head/warden/cowboy
name = "jailor's hat"
- desc = "A menacing black stetson adorned with a jailor's badge. It has a heavily reinforced lining under the imitation leather."
+ desc = "A menacing black stetson adorned with a jailor's badge. Made of thick imitation leather."
icon_state = "cowboywarden"
dog_fashion = /datum/dog_fashion/head/cowboy
/obj/item/clothing/head/warden/inteq
name = "master at arms' campaign hat"
- desc = "A special armored campaign hat with the IRMG insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection."
+ desc = "A special brown campaign hat with the IRMG insignia emblazoned on it. For yelling at clueless recruits in style."
icon_state = "maahat"
/obj/item/clothing/head/warden/drill
name = "warden's campaign hat"
- desc = "A special armored campaign hat with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection."
+ desc = "A special campaign hat with the security insignia emblazoned on it."
icon_state = "wardendrill"
item_state = "wardendrill"
dog_fashion = null
@@ -285,3 +272,12 @@
#undef DRILL_SHOUTING
#undef DRILL_YELLING
#undef DRILL_CANADIAN
+
+/obj/item/clothing/head/witchunter
+ name = "witchunter hat"
+ desc = "This hat saw much use back in the day."
+ icon_state = "witchhunterhat"
+ item_state = "witchhunterhat"
+ flags_cover = HEADCOVERSEYES
+ flags_inv = HIDEEYES|HIDEHAIR
+ armor = list("melee" = 30, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index b2ea72519d77..61f032b5ef61 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -70,6 +70,8 @@
/obj/item/clothing/head/syndicatefake
name = "black space-helmet replica"
+ icon = 'icons/obj/clothing/head/spacesuits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/spacesuits.dmi'
icon_state = "syndicate-helm-black-red"
item_state = "syndicate-helm-black-red"
desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!"
@@ -129,6 +131,8 @@
/obj/item/clothing/head/pirate
name = "pirate hat"
desc = "Yarr."
+ icon = 'icons/obj/clothing/head/spacesuits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/spacesuits.dmi'
icon_state = "pirate"
item_state = "pirate"
dog_fashion = /datum/dog_fashion/head/pirate
@@ -161,6 +165,8 @@
/obj/item/clothing/head/bandana
name = "pirate bandana"
desc = "Yarr."
+ icon = 'icons/obj/clothing/head/spacesuits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/spacesuits.dmi'
icon_state = "bandana"
item_state = "bandana"
@@ -266,9 +272,6 @@
/obj/item/clothing/head/hunter
name = "bounty hunting hat"
desc = "Ain't nobody gonna cheat the hangman in my town."
- icon_state = "hunter"
- item_state = "hunter"
- armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/head/cone
@@ -323,7 +326,6 @@
name = "crown"
desc = "A crown fit for a king, a petty king maybe."
icon_state = "crown"
- armor = list("melee" = 15, "bullet" = 0, "laser" = 0,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/item/clothing/head/crown/fancy
@@ -438,13 +440,6 @@
icon_state = "intern_hat"
item_state = "intern_hat"
-/obj/item/clothing/head/coordinator
- name = "coordinator cap"
- desc = "A cap for a party coordinator, stylish!."
- icon_state = "capcap"
- item_state = "that"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
-
/obj/item/clothing/head/goatpelt
name = "goat pelt hat"
desc = "Fuzzy and Warm!"
@@ -457,15 +452,6 @@
icon_state = "JackFrostHat"
item_state = "JackFrostHat"
-/obj/item/clothing/head/ngrcap
- name = "2nd Battlegroup peaked cap"
- desc = "A cap worn by officers of the New Gorlex Republic's 2nd Battlegroup."
- icon_state = "ngrcap"
- item_state = "ngrcap"
- flags_inv = 0
- armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- strip_delay = 60
-
/obj/item/clothing/head/maidheadband/syndicate
name = "tactical maid headband"
desc = "Tacticute."
@@ -484,8 +470,6 @@
icon_state = "inteq_peaked"
item_state = "inteq_peaked"
flags_inv = 0
- armor = list("melee" = 40, "bullet" = 30, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60)
- strip_delay = 60
/obj/item/clothing/head/maidheadband
name = "maid headband"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index b9e828ab3974..c04b61563f53 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -315,13 +315,6 @@
var/datum/brain_trauma/mild/phobia/conspiracies/paranoia
var/warped = FALSE
-/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_REF(warp_up)))
- else
- warp_up()
-
/obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot)
. = ..()
if(slot != ITEM_SLOT_HEAD || warped)
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index 4cae19eb5c83..3e5052cacc92 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -121,13 +121,11 @@
desc = "It's a robust baseball hat in tasteful red colour."
icon_state = "secsoft"
soft_type = "sec"
- armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50)
- strip_delay = 60
dog_fashion = null
/obj/item/clothing/head/soft/sec/brig_phys
name = "security medic cap"
- icon_state = "secmedsoft"
+ icon_state = "secsoft"
/obj/item/clothing/head/soft/paramedic
name = "paramedic cap"
@@ -155,7 +153,6 @@
desc = "A rich brown utility cover with the golden shield of the IRMG on it."
icon_state = "inteqsoft"
soft_type = "inteq"
- armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50)
dog_fashion = null
/obj/item/clothing/head/soft/inteq/corpsman
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index 739e0f832faa..03ca246b60af 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -1,6 +1,8 @@
/obj/item/clothing/mask
name = "mask"
icon = 'icons/obj/clothing/masks.dmi'
+ lefthand_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/clothing/masks_righthand.dmi'
body_parts_covered = HEAD
slot_flags = ITEM_SLOT_MASK
strip_delay = 40
diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm
index 66e329a0e9c6..78bbc032e861 100644
--- a/code/modules/clothing/masks/hailer.dm
+++ b/code/modules/clothing/masks/hailer.dm
@@ -33,6 +33,7 @@
desc = "A set of recognizable pre-recorded messages for cyborgs to use when apprehending criminals."
icon = 'icons/obj/device.dmi'
icon_state = "taperecorder_idle"
+ mob_overlay_state = "sechailer"
/obj/item/clothing/mask/gas/sechailer/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/adjust))
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index cde7c87b8bbf..8d5251e9e8c8 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -22,7 +22,6 @@
/obj/item/clothing/neck/tie
name = "tie"
desc = "A neosilk clip-on tie. Special material allows it to be reskinned by Alt-clicking it, but only once."
- icon = 'icons/obj/clothing/neck.dmi'
unique_reskin = list("red tie" = "redtie",
"orange tie" = "orangetie",
"green tie" = "greentie",
@@ -312,7 +311,6 @@
/obj/item/clothing/neck/necklace/dope
name = "gold necklace"
desc = "Damn, it feels good to be a gangster."
- icon = 'icons/obj/clothing/neck.dmi'
icon_state = "bling"
cuttable = FALSE
@@ -383,7 +381,6 @@
/obj/item/clothing/neck/beads
name = "plastic bead necklace"
desc = "A cheap, plastic bead necklace. Show team spirit! Collect them! Throw them away! The posibilites are endless!"
- icon = 'icons/obj/clothing/neck.dmi'
icon_state = "beads"
color = "#ffffff"
custom_price = 10
diff --git a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
index f0fd3bb81eb2..b3a2b20f687c 100644
--- a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
+++ b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
@@ -1,11 +1,10 @@
-/datum/outfit/job/frontiersmen/ert
+/datum/outfit/job/frontiersmen/ert //most basic of grunts
name = "ERT - Frontiersman Basic"
- head = /obj/item/clothing/head/beret/sec/frontier
- mask = /obj/item/clothing/mask/gas/sechailer/balaclava
+ head = /obj/item/clothing/head/helmet/bulletproof/x11/frontier
suit = /obj/item/clothing/suit/armor/vest/bulletproof/frontier
suit_store = /obj/item/gun/ballistic/rifle/illestren
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
+ uniform = /obj/item/clothing/under/frontiersmen
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/color/black
ears = /obj/item/radio/headset/pirate/alt
@@ -13,9 +12,10 @@
l_pocket = /obj/item/flashlight/seclite
r_pocket = /obj/item/tank/internals/emergency_oxygen/double
+ box = /obj/item/storage/box/survival/frontier
id = null // lol
- backpack_contents = list(/obj/item/ammo_box/magazine/illestren_a850r=5, /obj/item/grenade/frag=1)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/ammo_box/magazine/illestren_a850r=5, /obj/item/grenade/frag=1)
/datum/outfit/job/frontiersmen/ert/random
name = "ERT - Frontiersman Randomized"
@@ -48,7 +48,7 @@
if(prob(30))
mask = pickweight(list(
- /obj/item/clothing/mask/gas = 5,
+ /obj/item/clothing/mask/gas/frontiersmen = 5,
/obj/item/clothing/mask/gas/sechailer/balaclava = 5,
/obj/item/clothing/mask/breath = 5,
/obj/item/clothing/mask/whistle = 3))
@@ -61,6 +61,7 @@
/obj/item/melee/baton/cattleprod/loaded = 5,
/obj/item/reagent_containers/food/snacks/baguette = 2, // yes you can put this on your back
/obj/item/deployable_turret_folded = 1,
+ /obj/item/gun/ballistic/automatic/hmg/skm_lmg/extended = 1,
))
if(prob(90))
@@ -74,6 +75,8 @@
if("Doctor")
backpack_contents += list(/obj/item/storage/firstaid/regular = 1)
gloves = /obj/item/clothing/gloves/color/latex
+ suit = /obj/item/clothing/suit/frontiersmen
+ head = /obj/item/clothing/head/frontier
if(prob(50))
belt = /obj/item/storage/belt/medical/surgery
if(prob(30))
@@ -83,7 +86,16 @@
if(prob(10))
belt = /obj/item/storage/belt/grenade/full
if("Ammo Carrier")
- backpack_contents += list(/obj/item/ammo_box/a762_40 = 1)
+ var/loops = rand(1,3)
+ for(var/i in 1 to loops)
+ var/ammotype = pick(list(
+ /obj/item/ammo_box/c8x50mm_box,
+ /obj/item/ammo_box/c45,
+ /obj/item/ammo_box/a357_box,
+ /obj/item/ammo_box/c45,
+ /obj/item/ammo_box/a4570,
+ /obj/item/stock_parts/cell/gun/mini))
+ backpack_contents += ammotype
var/weapon = pick(list("Bolt-Action", "Pistol", "Melee"))
switch(weapon)
@@ -96,50 +108,78 @@
if("Pistol")
r_hand = pick(list(
/obj/item/gun/ballistic/automatic/pistol/disposable,
- /obj/item/gun/ballistic/automatic/pistol,
+ /obj/item/gun/ballistic/automatic/pistol/candor,
/obj/item/gun/ballistic/revolver/firebrand,
+ /obj/item/gun/ballistic/revolver/shadow,
+ /obj/item/gun/ballistic/shotgun/doublebarrel/beacon/presawn,
/obj/item/gun/energy/e_gun/mini))
if(prob(30))
l_hand = pick(list(
/obj/item/gun/ballistic/automatic/pistol/disposable,
- /obj/item/gun/ballistic/automatic/pistol,
+ /obj/item/gun/ballistic/automatic/pistol/candor,
/obj/item/gun/ballistic/revolver/firebrand,
+ /obj/item/gun/ballistic/revolver/shadow,
+ /obj/item/gun/ballistic/shotgun/doublebarrel/beacon/presawn,
/obj/item/gun/energy/e_gun/mini))
if("Melee")
r_hand = pickweight(list(
- /obj/item/kitchen/knife = 15,
+ /obj/item/kitchen/knife/combat/survival = 15,
/obj/item/melee/baseball_bat = 10,
- /obj/item/melee/cleric_mace = 7,
/obj/item/melee/roastingstick = 2,
/obj/item/kitchen/fork = 1,
/obj/item/melee/flyswatter = 1,
))
+/datum/outfit/job/frontiersmen/ert/grunt //better armed, use for quick creating pirate ships
+ name = "ERT - Frontiersman Grunt (Unarmed)"
+
+ suit_store = null
+ belt = /obj/item/storage/belt/security/military/frontiersmen
+
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen)
+
+/datum/outfit/job/frontiersmen/ert/grunt/skm
+ name = "ERT - Frontiersman Grunt (SKM-24)"
+
+ suit_store = /obj/item/gun/ballistic/automatic/assault/skm
+ belt = /obj/item/storage/belt/security/military/frontiersmen/skm_ammo
+
+/datum/outfit/job/frontiersmen/ert/grunt/aps_mp //remember. Remind me to replace this with the spitter.
+ name = "ERT - Frontiersman Grunt (Stechkin APS)"
+
+ suit_store = /obj/item/gun/ballistic/automatic/pistol/APS
+ belt = /obj/item/storage/belt/security/military/frontiersmen/aps_mp_ammo
/datum/outfit/job/frontiersmen/ert/leader
name = "ERT - Frontiersman Officer"
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
+ uniform = /obj/item/clothing/under/frontiersmen/officer
head = /obj/item/clothing/head/beret/sec/frontier/officer
ears = /obj/item/radio/headset/pirate/alt/captain
back = /obj/item/storage/backpack/satchel/leather
suit = /obj/item/clothing/suit/armor/frontier
- suit_store = /obj/item/gun/ballistic/revolver
- belt = /obj/item/storage/belt/military/assault
+ suit_store = /obj/item/gun/ballistic/automatic/pistol/deagle
+
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/ammo_box/magazine/m50=2, /obj/item/binoculars=1, /obj/item/kitchen/knife/combat/survival)
+
+/datum/outfit/job/frontiersmen/ert/leader/unnarmed
+ name = "ERT - Frontiersman Officer (Unnarmed)"
+
+ suit_store = null
- backpack_contents = list(/obj/item/ammo_box/a357=3, /obj/item/binoculars=1, /obj/item/kitchen/knife/combat/survival)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/binoculars=1, /obj/item/kitchen/knife/combat/survival)
/datum/outfit/job/frontiersmen/ert/medic
name = "ERT - Frontiersman Medic"
+ head = /obj/item/clothing/head/frontier
back = /obj/item/storage/backpack/medic
mask = /obj/item/clothing/mask/surgical
gloves = /obj/item/clothing/gloves/color/latex/nitrile
- belt = /obj/item/storage/belt/medical/surgery
- suit = null
- suit_store = null
+ belt = /obj/item/storage/belt/medical/webbing/frontiersmen/surgery
+ suit_store = /obj/item/gun/ballistic/automatic/pistol/APS
- backpack_contents = list(/obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack=3)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack=3, /obj/item/ammo_box/magazine/pistolm9mm=2)
/datum/outfit/job/frontiersmen/ert/engineer
@@ -147,8 +187,38 @@
back = /obj/item/storage/backpack/industrial
belt = /obj/item/storage/belt/utility/full
- head = /obj/item/clothing/head/hardhat/weldhat
+ head = /obj/item/clothing/head/hardhat/frontier
+ glasses = /obj/item/clothing/glasses/welding
suit_store = null
- backpack_contents = list(/obj/item/grenade/c4=3, /obj/item/crowbar/large=1)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/grenade/c4=3, /obj/item/crowbar/large=1)
+
+/datum/outfit/job/frontiersmen/ert/flamer
+ name = "ERT - Frontiersman Flame Trooper"
+
+ head = /obj/item/clothing/head/helmet/bulletproof/x11/frontier/fireproof
+ mask = /obj/item/clothing/mask/gas/frontiersmen
+ suit = /obj/item/clothing/suit/armor/frontier/fireproof
+ suit_store = /obj/item/tank/internals/oxygen/red
+ uniform = /obj/item/clothing/under/frontiersmen/fireproof
+ gloves = /obj/item/clothing/gloves/combat
+ back = /obj/item/storage/backpack
+ belt = /obj/item/storage/belt/security/military/frontiersmen/flamer
+
+ l_hand = /obj/item/flamethrower/full/tank
+
+ backpack_contents = list(/obj/item/gun/ballistic/shotgun/doublebarrel/presawn=1,/obj/item/ammo_box/a12g=1,/obj/item/extinguisher=2,/obj/item/radio=1)
+
+
+/datum/outfit/job/frontiersmen/ert/sentry_lmg
+ name = "ERT - Frontiersman Sentry (SKM-24v)"
+
+ head = /obj/item/clothing/head/helmet/marine/frontier
+ mask = /obj/item/clothing/mask/gas/sechailer/balaclava
+ suit = /obj/item/clothing/suit/armor/vest/marine/frontier
+ suit_store = /obj/item/gun/ballistic/automatic/hmg/skm_lmg/drum_mag
+ gloves = /obj/item/clothing/gloves/combat
+
+ belt = /obj/item/gun/ballistic/revolver/mateba
+ backpack_contents = list(/obj/item/ammo_box/magazine/skm_762_40/drum=2,/obj/item/ammo_box/a357=2,/obj/item/grenade/frag=1,/obj/item/radio=1)
diff --git a/code/modules/clothing/outfits/ert/nanotrasen_ert.dm b/code/modules/clothing/outfits/ert/nanotrasen_ert.dm
index 7e39f0b2f32a..4cec7ad56f8a 100644
--- a/code/modules/clothing/outfits/ert/nanotrasen_ert.dm
+++ b/code/modules/clothing/outfits/ert/nanotrasen_ert.dm
@@ -29,7 +29,7 @@
belt = /obj/item/storage/belt/security/full
backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\
/obj/item/melee/baton/loaded=1)
- l_pocket = /obj/item/switchblade
+ l_pocket = /obj/item/kitchen/knife/switchblade
/datum/outfit/centcom/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
@@ -47,7 +47,7 @@
glasses = /obj/item/clothing/glasses/thermal/eyepatch
backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\
/obj/item/melee/baton/loaded=1,\
- /obj/item/gun/energy/pulse/pistol/loyalpin=1)
+ /obj/item/gun/energy/pulse/pistol=1)
l_pocket = /obj/item/melee/transforming/energy/sword/saber
/datum/outfit/centcom/ert/security
@@ -77,7 +77,7 @@
/datum/outfit/centcom/ert/security/alert
name = "ERT Security - High Alert"
- suit_store = /obj/item/gun/energy/pulse/carbine/loyalpin
+ suit_store = /obj/item/gun/energy/pulse/carbine
mask = /obj/item/clothing/mask/gas/sechailer/swat
backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\
/obj/item/storage/box/handcuffs=1,\
@@ -114,7 +114,7 @@
mask = /obj/item/clothing/mask/gas/sechailer/swat
backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\
/obj/item/melee/baton/loaded=1,\
- /obj/item/gun/energy/pulse/pistol/loyalpin=1,\
+ /obj/item/gun/energy/pulse/pistol=1,\
/obj/item/reagent_containers/hypospray/combat/nanites=1,\
/obj/item/gun/medbeam=1)
@@ -150,7 +150,7 @@
mask = /obj/item/clothing/mask/gas/sechailer/swat
backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\
/obj/item/melee/baton/loaded=1,\
- /obj/item/gun/energy/pulse/pistol/loyalpin=1,\
+ /obj/item/gun/energy/pulse/pistol=1,\
/obj/item/construction/rcd/combat=1)
// official
@@ -282,7 +282,7 @@
suit = /obj/item/clothing/suit/armor/vest/marine
back = /obj/item/storage/backpack/ert
backpack_contents = list(
- /obj/item/storage/box/survival/engineer/radio = 1,
+ /obj/item/storage/box/survival/engineer = 1,
/obj/item/gun_voucher/nanotrasen = 1
)
belt = /obj/item/storage/belt/military/assault
@@ -332,7 +332,7 @@
l_pocket = /obj/item/healthanalyzer
head = /obj/item/clothing/head/helmet/marine/medic
backpack_contents = list(
- /obj/item/storage/box/survival/engineer/radio = 1,
+ /obj/item/storage/box/survival/engineer = 1,
/obj/item/gun_voucher/nanotrasen = 1,
/obj/item/reagent_containers/hypospray/combat = 1,
/obj/item/storage/firstaid/regular = 1,
@@ -359,7 +359,7 @@
head = /obj/item/clothing/head/helmet/marine/engineer
back = /obj/item/storage/backpack/ert/engineer
backpack_contents = list(
- /obj/item/storage/box/survival/engineer/radio = 1,
+ /obj/item/storage/box/survival/engineer = 1,
/obj/item/gun_voucher/nanotrasen = 1,
/obj/item/rcd_ammo/large = 2,
)
@@ -460,6 +460,5 @@
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
back = /obj/item/storage/backpack/ert
- box = /obj/item/storage/box/survival/radio
l_pocket = /obj/item/megaphone/command
r_pocket = /obj/item/binoculars
diff --git a/code/modules/clothing/outfits/factions/frontiersmen.dm b/code/modules/clothing/outfits/factions/frontiersmen.dm
index c30de3d40432..7045f5182188 100644
--- a/code/modules/clothing/outfits/factions/frontiersmen.dm
+++ b/code/modules/clothing/outfits/factions/frontiersmen.dm
@@ -3,7 +3,7 @@
// faction_icon = "bg_frontiersmen"
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
+ uniform = /obj/item/clothing/under/frontiersmen
r_pocket = /obj/item/radio
shoes = /obj/item/clothing/shoes/jackboots
ears = /obj/item/radio/headset/pirate
@@ -24,12 +24,14 @@
// Assistant
/datum/outfit/job/frontiersmen/assistant
- name = "Frontiersmen - Rookie"
- id_assignment = "Rookie"
+ name = "Frontiersmen - Deckhand"
+ id_assignment = "Deckhand"
job_icon = "assistant"
jobtype = /datum/job/assistant
+ uniform = /obj/item/clothing/under/frontiersmen/deckhand
head = /obj/item/clothing/head/beret/sec/frontier
+ shoes = /obj/item/clothing/shoes/workboots
// Atmospheric Technician
@@ -39,7 +41,7 @@
jobtype = /datum/job/atmos
accessory = /obj/item/clothing/accessory/armband/engine
- head = /obj/item/clothing/head/hardhat
+ head = /obj/item/clothing/head/hardhat/frontier
// Cargo Technician
@@ -49,9 +51,8 @@
jobtype = /datum/job/cargo_tech
accessory = /obj/item/clothing/accessory/armband/cargo
- suit = /obj/item/clothing/suit/hazardvest
shoes = /obj/item/clothing/shoes/workboots
- head = /obj/item/clothing/head/soft
+ head = /obj/item/clothing/head/soft/frontiersmen
backpack_contents = list(/obj/item/modular_computer/tablet/preset/cargo)
// Captain
@@ -62,26 +63,22 @@
jobtype = /datum/job/captain
ears = /obj/item/radio/headset/pirate/alt/captain
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
- head = /obj/item/clothing/head/caphat/frontier
- mask = /obj/item/clothing/mask/gas/sechailer
+ uniform = /obj/item/clothing/under/frontiersmen/officer
+ head = /obj/item/clothing/head/frontier/peaked
suit = /obj/item/clothing/suit/armor/frontier
- shoes = /obj/item/clothing/shoes/cowboy/black
+ shoes = /obj/item/clothing/shoes/jackboots
gloves = /obj/item/clothing/gloves/combat
- glasses = /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch
/datum/outfit/job/frontiersmen/captain/admiral
name = "Frontiersmen - Admiral"
id_assignment = "Admiral"
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/admiral
- head = /obj/item/clothing/head/caphat/frontier/admiral
- shoes = /obj/item/clothing/shoes/cowboy/white
+ uniform = /obj/item/clothing/under/frontiersmen/admiral
+ head = /obj/item/clothing/head/frontier/peaked/admiral
+ shoes = /obj/item/clothing/shoes/jackboots
ears = /obj/item/radio/headset/pirate/captain
- gloves = /obj/item/clothing/gloves/color/evening
+ gloves = /obj/item/clothing/gloves/combat
suit = null
- mask = null
- glasses = null
// Chief Engineer
/datum/outfit/job/frontiersmen/ce
@@ -92,8 +89,8 @@
accessory = /obj/item/clothing/accessory/armband/engine
ears = /obj/item/radio/headset/pirate/captain
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
- head = /obj/item/clothing/head/hardhat/weldhat/white
+ uniform = /obj/item/clothing/under/frontiersmen/officer
+ head = /obj/item/clothing/head/hardhat/frontier
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
belt = /obj/item/storage/belt/utility/full
@@ -106,13 +103,9 @@
jobtype = /datum/job/engineer
accessory = /obj/item/clothing/accessory/armband/engine
- belt = /obj/item/storage/belt/utility/full/engi
- suit = /obj/item/clothing/suit/toggle/industrial
shoes = /obj/item/clothing/shoes/workboots
- glasses = /obj/item/clothing/glasses/welding
- head = /obj/item/clothing/head/beret/sec/frontier
+ head = /obj/item/clothing/head/hardhat/frontier
- l_pocket = /obj/item/radio
r_pocket = /obj/item/analyzer
// Cook
@@ -123,7 +116,7 @@
job_icon = "cook"
jobtype = /datum/job/cook
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
+ uniform = /obj/item/clothing/under/frontiersmen
head = /obj/item/clothing/head/chefhat
suit = /obj/item/clothing/suit/apron/chef
@@ -136,8 +129,8 @@
jobtype = /datum/job/head_of_personnel
ears = /obj/item/radio/headset/pirate/alt
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
- shoes = /obj/item/clothing/shoes/cowboy/black
+ uniform = /obj/item/clothing/under/frontiersmen/officer
+ shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/beret/sec/frontier/officer
gloves = /obj/item/clothing/gloves/combat
r_pocket = /obj/item/kitchen/knife/combat/survival
@@ -150,12 +143,12 @@
jobtype = /datum/job/hos
accessory = /obj/item/clothing/accessory/armband
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
+ uniform = /obj/item/clothing/under/frontiersmen/officer
head = /obj/item/clothing/head/beret/sec/frontier/officer
suit = /obj/item/clothing/suit/armor/vest/bulletproof/frontier
- shoes = /obj/item/clothing/shoes/cowboy/black
+ shoes = /obj/item/clothing/shoes/jackboots
gloves = /obj/item/clothing/gloves/combat
- backpack_contents = list(/obj/item/melee/baton/loaded=1)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/melee/baton/loaded=1)
suit_store = null
// Security Officer
@@ -167,17 +160,19 @@
jobtype = /datum/job/officer
accessory = /obj/item/clothing/accessory/armband
- head = /obj/item/clothing/head/beret/sec/frontier
- mask = /obj/item/clothing/mask/gas/sechailer/balaclava
suit = null
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
+ uniform = /obj/item/clothing/under/frontiersmen
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/color/black
ears = /obj/item/radio/headset/pirate/alt
+ box = /obj/item/storage/box/survival/frontier
+
l_pocket = /obj/item/flashlight/seclite
r_pocket = /obj/item/tank/internals/emergency_oxygen/double
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen)
+
// Medical Doctor
/datum/outfit/job/frontiersmen/doctor
@@ -187,7 +182,9 @@
jobtype = /datum/job/doctor
accessory = /obj/item/clothing/accessory/armband/med
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
- glasses = /obj/item/clothing/glasses/hud/health/prescription
+ uniform = /obj/item/clothing/under/frontiersmen
+ glasses = /obj/item/clothing/glasses/hud/health
r_pocket = /obj/item/kitchen/knife/combat/survival
- backpack_contents = list(/obj/item/storage/firstaid/medical)
+ suit = /obj/item/clothing/suit/frontiersmen
+ head = /obj/item/clothing/head/frontier
+ belt = /obj/item/storage/belt/medical/webbing/frontiersmen
diff --git a/code/modules/clothing/outfits/factions/gezena.dm b/code/modules/clothing/outfits/factions/gezena.dm
index e2262eb77891..df7a5145e47f 100644
--- a/code/modules/clothing/outfits/factions/gezena.dm
+++ b/code/modules/clothing/outfits/factions/gezena.dm
@@ -7,6 +7,7 @@
if(visualsOnly)
return
H.faction |= list(FACTION_PLAYER_GEZENA)
+ H.grant_language(/datum/language/draconic)
//Playable Roles (put in ships):
/datum/outfit/job/gezena/assistant
@@ -19,6 +20,11 @@
shoes = /obj/item/clothing/shoes/combat/gezena
neck = /obj/item/clothing/neck/cloak/gezena
+/datum/outfit/job/gezena/assistant/bridge
+ name = "PGF - Bridge Crew"
+ id_assignment = "Bridge Crew"
+ jobtype = /datum/job/head_of_personnel
+
/datum/outfit/job/gezena/engineer
name = "PGF - Navy Engineer"
id_assignment = "Naval Engineer"
@@ -29,6 +35,11 @@
shoes = /obj/item/clothing/shoes/combat/gezena
neck = /obj/item/clothing/neck/cloak/gezena/engi
+ backpack = /obj/item/storage/backpack/industrial
+ satchel = /obj/item/storage/backpack/satchel/eng
+ duffelbag = /obj/item/storage/backpack/duffelbag/engineering
+ courierbag = /obj/item/storage/backpack/messenger/engi
+
/datum/outfit/job/gezena/doctor
name = "PGF - Navy Doctor"
jobtype = /datum/job/doctor
@@ -38,6 +49,12 @@
shoes = /obj/item/clothing/shoes/combat/gezena
neck = /obj/item/clothing/neck/cloak/gezena/med
+ backpack = /obj/item/storage/backpack/medic
+ satchel = /obj/item/storage/backpack/satchel/med
+ duffelbag = /obj/item/storage/backpack/duffelbag/med
+ courierbag = /obj/item/storage/backpack/messenger/med
+ box = /obj/item/storage/box/survival/medical
+
/datum/outfit/job/gezena/security
name = "PGF - Marine"
id_assignment = "Marine"
@@ -48,6 +65,12 @@
shoes = /obj/item/clothing/shoes/combat/gezena
neck = /obj/item/clothing/neck/cloak/gezena
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/sec
+ courierbag = /obj/item/storage/backpack/messenger/sec
+ box = /obj/item/storage/box/survival/security
+
/datum/outfit/job/gezena/hos
name = "PGF - Marine Sergeant"
id_assignment = "Sergeant"
@@ -55,8 +78,29 @@
job_icon = "headofsecurity"
uniform = /obj/item/clothing/under/gezena/marine
+ head = /obj/item/clothing/head/gezena/marine/lead
shoes = /obj/item/clothing/shoes/combat/gezena
- neck = /obj/item/clothing/neck/cloak/gezena/captain
+ neck = /obj/item/clothing/neck/cloak/gezena/lead
+
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/sec
+ courierbag = /obj/item/storage/backpack/messenger/sec
+ box = /obj/item/storage/box/survival/security
+
+/datum/outfit/job/gezena/hop
+ name = "PGF - Bridge Officer"
+ jobtype = /datum/job/head_of_personnel
+ job_icon = "headofpersonnel"
+
+ uniform = /obj/item/clothing/under/gezena
+ shoes = /obj/item/clothing/shoes/combat/gezena
+ neck = /obj/item/clothing/neck/cloak/gezena/command
+
+ backpack = /obj/item/storage/backpack/captain
+ satchel = /obj/item/storage/backpack/satchel/cap
+ duffelbag = /obj/item/storage/backpack/duffelbag/captain
+ courierbag = /obj/item/storage/backpack/messenger/com
/datum/outfit/job/gezena/captain
name = "PGF - Captain"
@@ -67,6 +111,11 @@
shoes = /obj/item/clothing/shoes/combat/gezena
neck = /obj/item/clothing/neck/cloak/gezena/captain
+ backpack = /obj/item/storage/backpack/captain
+ satchel = /obj/item/storage/backpack/satchel/cap
+ duffelbag = /obj/item/storage/backpack/duffelbag/captain
+ courierbag = /obj/item/storage/backpack/messenger/com
+
//Adminspawn Roles (for events):
/datum/outfit/job/gezena/assistant/geared
@@ -94,6 +143,11 @@
shoes = /obj/item/clothing/shoes/combat/gezena
neck = /obj/item/clothing/neck/cloak/gezena/engi
+ backpack = /obj/item/storage/backpack/industrial
+ satchel = /obj/item/storage/backpack/satchel/eng
+ duffelbag = /obj/item/storage/backpack/duffelbag/engineering
+ courierbag = /obj/item/storage/backpack/messenger/engi
+
/datum/outfit/job/gezena/doctor/geared
name = "PGF - Navy Doctor - Equipped"
jobtype = /datum/job/doctor
@@ -106,6 +160,12 @@
shoes = /obj/item/clothing/shoes/combat/gezena
neck = /obj/item/clothing/neck/cloak/gezena/med
+ backpack = /obj/item/storage/backpack/medic
+ satchel = /obj/item/storage/backpack/satchel/med
+ duffelbag = /obj/item/storage/backpack/duffelbag/med
+ courierbag = /obj/item/storage/backpack/messenger/med
+ box = /obj/item/storage/box/survival/medical
+
/datum/outfit/job/gezena/security/geared
name = "PGF - Marine - Equipped"
jobtype = /datum/job/officer
@@ -120,6 +180,12 @@
neck = /obj/item/clothing/neck/cloak/gezena
r_hand = /obj/item/gun/energy/kalix/pgf/heavy
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/sec
+ courierbag = /obj/item/storage/backpack/messenger/sec
+ box = /obj/item/storage/box/survival/security
+
/datum/outfit/job/gezena/hos/geared
name = "PGF - Marine Sergeant - Equipped"
jobtype = /datum/job/hos
@@ -127,13 +193,19 @@
uniform = /obj/item/clothing/under/gezena/marine
suit = /obj/item/clothing/suit/armor/gezena/marine
- head = /obj/item/clothing/head/helmet/gezena
+ head = /obj/item/clothing/head/gezena/marine/lead
belt = /obj/item/storage/belt/military/gezena
gloves = /obj/item/clothing/gloves/gezena/marine
shoes = /obj/item/clothing/shoes/combat/gezena
- neck = /obj/item/clothing/neck/cloak/gezena/captain
+ neck = /obj/item/clothing/neck/cloak/gezena/lead
r_hand = /obj/item/gun/energy/kalix/pgf
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/sec
+ courierbag = /obj/item/storage/backpack/messenger/sec
+ box = /obj/item/storage/box/survival/security
+
/datum/outfit/job/gezena/paramedic
name = "PGF - Marine Medic - Equipped"
jobtype = /datum/job/paramedic
@@ -148,6 +220,29 @@
neck = /obj/item/clothing/neck/cloak/gezena/med
r_hand = /obj/item/gun/energy/kalix/pgf
+ backpack = /obj/item/storage/backpack/medic
+ satchel = /obj/item/storage/backpack/satchel/med
+ duffelbag = /obj/item/storage/backpack/duffelbag/med
+ courierbag = /obj/item/storage/backpack/messenger/para
+ box = /obj/item/storage/box/survival/medical
+
+/datum/outfit/job/gezena/hop/geared
+ name = "PGF - Naval Bridge Officer - Equipped"
+ jobtype = /datum/job/head_of_personnel
+ job_icon = "headofpersonnel"
+
+ uniform = /obj/item/clothing/under/gezena
+ suit = /obj/item/clothing/suit/armor/gezena
+ head = /obj/item/clothing/head/gezena
+ gloves = /obj/item/clothing/gloves/gezena
+ shoes = /obj/item/clothing/shoes/combat/gezena
+ neck = /obj/item/clothing/neck/cloak/gezena/command
+ r_hand = /obj/item/gun/energy/kalix/pgf
+
+ backpack = /obj/item/storage/backpack/captain
+ satchel = /obj/item/storage/backpack/satchel/cap
+ duffelbag = /obj/item/storage/backpack/duffelbag/captain
+ courierbag = /obj/item/storage/backpack/messenger/com
/datum/outfit/job/gezena/captain/geared
name = "PGF - Captain - Equipped"
@@ -160,3 +255,8 @@
gloves = /obj/item/clothing/gloves/gezena/captain
shoes = /obj/item/clothing/shoes/combat/gezena
neck = /obj/item/clothing/neck/cloak/gezena/captain
+
+ backpack = /obj/item/storage/backpack/captain
+ satchel = /obj/item/storage/backpack/satchel/cap
+ duffelbag = /obj/item/storage/backpack/duffelbag/captain
+ courierbag = /obj/item/storage/backpack/messenger/com
diff --git a/code/modules/clothing/outfits/factions/independent.dm b/code/modules/clothing/outfits/factions/independent.dm
index a3795b7ee057..24b3201573d3 100644
--- a/code/modules/clothing/outfits/factions/independent.dm
+++ b/code/modules/clothing/outfits/factions/independent.dm
@@ -19,8 +19,21 @@
/datum/outfit/job/independent/assistant/waiter
name = "Independent - Assistant (Waiter)"
+
uniform = /obj/item/clothing/under/suit/waiter
+ alt_uniform = /obj/item/clothing/under/suit/waiter/syndicate
+ gloves = /obj/item/clothing/gloves/color/evening
+ ears = /obj/item/radio/headset/headset_srv
shoes = /obj/item/clothing/shoes/laceup
+ l_pocket = /obj/item/lighter
+ r_pocket = /obj/item/reagent_containers/glass/rag
+
+/datum/outfit/job/independent/assistant/waiter/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ ..()
+ if(visualsOnly)
+ return
+ var/obj/item/card/id/W = H.wear_id
+ W.access += list(ACCESS_KITCHEN)
/datum/outfit/job/independent/assistant/fancy
name = "Independent - Assistant (Formal Uniform)"
@@ -91,6 +104,11 @@
chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/captain)
+/datum/outfit/job/independent/captain/cheap //for Miskilamo ships
+ name = "Independent - Captain (Low Budget)"
+ gloves = /obj/item/clothing/gloves/color/white //poverty gloves
+ shoes = /obj/item/clothing/shoes/sneakers/brown
+
/datum/outfit/job/independent/captain/western
name = "Independent - Captain (Western)"
head = /obj/item/clothing/head/caphat/cowboy
@@ -133,6 +151,18 @@
implants = list(/obj/item/implant/radio)
accessory = null
+/datum/outfit/job/independent/captain/manager
+ name = "Independent - Captain (Manager)"
+
+ id = /obj/item/card/id
+ gloves = /obj/item/clothing/gloves/color/white
+ uniform = /obj/item/clothing/under/suit/black_really
+ alt_uniform = /obj/item/clothing/under/suit/blacktwopiece
+ dcoat = null
+ glasses = /obj/item/clothing/glasses/sunglasses
+ head = null
+ accessory = null
+
// Head of Personnel
/datum/outfit/job/independent/hop
@@ -253,7 +283,6 @@
uniform = /obj/item/clothing/under/rank/security/officer/blueshirt
shoes = /obj/item/clothing/shoes/jackboots
- glasses = /obj/item/clothing/glasses/hud/security/sunglasses
head = /obj/item/clothing/head/cowboy/sec
/datum/outfit/job/independent/security/pirate
@@ -582,7 +611,8 @@
job_icon = "cook"
ears = /obj/item/radio/headset/headset_srv
- uniform = /obj/item/clothing/under/rank/civilian/chef //WS Edit - Alt Uniforms
+ shoes = /obj/item/clothing/shoes/laceup
+ uniform = /obj/item/clothing/under/rank/civilian/chef
suit = /obj/item/clothing/suit/toggle/chef
alt_suit = /obj/item/clothing/suit/apron/chef
head = /obj/item/clothing/head/chefhat
@@ -597,8 +627,6 @@
var/chosen_box = pick(possible_boxes)
var/obj/item/storage/box/I = new chosen_box(src)
H.equip_to_slot_or_del(I,ITEM_SLOT_BACKPACK)
- var/datum/martial_art/cqc/under_siege/justacook = new
- justacook.teach(H)
// Bartender
@@ -613,6 +641,14 @@
suit = /obj/item/clothing/suit/armor/vest
backpack_contents = list(/obj/item/storage/box/beanbag=1)
shoes = /obj/item/clothing/shoes/laceup
+ accessory = /obj/item/clothing/accessory/waistcoat
+
+/datum/outfit/job/independent/bartender/disarmed //No armor, no shotgun ammo.
+ name = "Independent - Bartender (Disarmed)"
+
+ suit = null
+ alt_suit = null
+ backpack_contents = null
/datum/outfit/job/independent/bartender/pharma
name = "Independent - Bartender (Mixologist)"
@@ -624,6 +660,7 @@
belt = /obj/item/storage/belt
gloves = /obj/item/clothing/gloves/color/latex/nitrile
uniform = /obj/item/clothing/under/suit/black
+ accessory = null
// Lawyer
@@ -725,7 +762,6 @@
/datum/outfit/job/independent/chemist/pharma
name = "Independent - Chemist (Pharmacology Student)"
- uniform = /obj/item/clothing/under/rank/medical
shoes = /obj/item/clothing/shoes/sneakers/white
accessory = /obj/item/clothing/neck/scarf/orange
l_pocket = /obj/item/pda/medical
diff --git a/code/modules/clothing/outfits/factions/minutemen.dm b/code/modules/clothing/outfits/factions/minutemen.dm
index 9de9c0d152c3..a8ce0907a35a 100644
--- a/code/modules/clothing/outfits/factions/minutemen.dm
+++ b/code/modules/clothing/outfits/factions/minutemen.dm
@@ -308,7 +308,7 @@
suit = /obj/item/clothing/suit/armor/vest/capcarapace/clip
shoes = /obj/item/clothing/shoes/combat
- box = /obj/item/storage/box/survival/engineer/radio
+ box = /obj/item/storage/box/survival/engineer
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/gun/ballistic/revolver/mateba=1)
/datum/outfit/job/clip/minutemen/captain/general/admiral // for flavor, might remove outright
diff --git a/code/modules/clothing/outfits/factions/nanotrasen.dm b/code/modules/clothing/outfits/factions/nanotrasen.dm
index f0fdb0e4ac1d..93f1ee3a347c 100644
--- a/code/modules/clothing/outfits/factions/nanotrasen.dm
+++ b/code/modules/clothing/outfits/factions/nanotrasen.dm
@@ -1,3 +1,9 @@
+/*
+ * OUTFIT DATUMS THAT NEED MAKING:
+ * Research Director
+ * Medical Director
+*/
+
/datum/outfit/job/nanotrasen
name = "Nanotrasen - Base Outfit"
faction_icon = "bg_nanotrasen"
@@ -5,26 +11,15 @@
box = /obj/item/storage/box/survival
id = /obj/item/card/id
-
/datum/outfit/job/nanotrasen/post_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
if(visualsOnly)
return
H.faction |= list(FACTION_PLAYER_NANOTRASEN)
-// Assistant
-
-/datum/outfit/job/nanotrasen/assistant
- name = "Nanotrasen - Assistant"
- jobtype = /datum/job/assistant
- job_icon = "assistant"
-
- uniform = /obj/item/clothing/under/color/grey
- shoes = /obj/item/clothing/shoes/sneakers/black
- belt = /obj/item/pda
+// Command //
// Captain
-
/datum/outfit/job/nanotrasen/captain
name = "Nanotrasen - Captain"
job_icon = "captain"
@@ -34,11 +29,14 @@
belt = /obj/item/pda/captain
gloves = /obj/item/clothing/gloves/color/captain/nt
ears = /obj/item/radio/headset/nanotrasen/captain
- uniform = /obj/item/clothing/under/rank/command/captain/nt
- alt_uniform = /obj/item/clothing/under/rank/command/captain/parade
+ uniform = /obj/item/clothing/under/nanotrasen/captain
+ alt_uniform = /obj/item/clothing/under/nanotrasen/captain/skirt
+ suit = /obj/item/clothing/suit/armor/nanotrasen/captain
+ alt_suit = /obj/item/clothing/suit/armor/nanotrasen/captain/parade
dcoat = /obj/item/clothing/suit/hooded/wintercoat/captain
shoes = /obj/item/clothing/shoes/laceup
- head = /obj/item/clothing/head/caphat/nt
+ neck = /obj/item/clothing/neck/cloak/nanotrasen
+ head = /obj/item/clothing/head/nanotrasen/captain/peaked
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1)
backpack = /obj/item/storage/backpack/captain
@@ -50,24 +48,17 @@
chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/captain)
-/datum/outfit/job/nanotrasen/captain/lp
- name = "Nanotrasen - Loss Prevention Lieutenant"
- id_assignment = "Lieutenant"
+/datum/outfit/job/nanotrasen/captain/ns
+ name = "Nanotrasen - Captain (N+S Logistics)"
- implants = list(/obj/item/implant/mindshield)
- ears = /obj/item/radio/headset/nanotrasen/alt/captain
- id = /obj/item/card/id/lplieu
- belt = /obj/item/pda/captain
- gloves = /obj/item/clothing/gloves/color/black
- uniform = /obj/item/clothing/under/rank/security/head_of_security/alt/lp
- alt_uniform = /obj/item/clothing/under/rank/security/head_of_security/alt/skirt/lp
- dcoat = /obj/item/clothing/suit/jacket
- shoes = /obj/item/clothing/shoes/jackboots
- head = /obj/item/clothing/head/beret/command
+ head = /obj/item/clothing/head/nanotrasen/cap/supply
+ uniform = /obj/item/clothing/under/nanotrasen/supply/qm
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/cargo
+ shoes = /obj/item/clothing/shoes/sneakers/brown
+ glasses = /obj/item/clothing/glasses/sunglasses
+ l_hand = /obj/item/clipboard
- satchel = /obj/item/storage/backpack/satchel/cap
- duffelbag = /obj/item/storage/backpack/duffelbag/captain
- courierbag = /obj/item/storage/backpack/messenger/com
+ chameleon_extras = /obj/item/stamp/qm
/datum/outfit/job/nanotrasen/captain/centcom
name = "Nanotrasen - Captain (Central Command)"
@@ -77,7 +68,6 @@
head = /obj/item/clothing/head/centhat
// Head of Personnel
-
/datum/outfit/job/nanotrasen/hop
name = "Nanotrasen - Head of Personnel"
job_icon = "headofpersonnel"
@@ -86,23 +76,30 @@
belt = /obj/item/pda/heads/head_of_personnel
id = /obj/item/card/id/silver
ears = /obj/item/radio/headset/headset_com
- uniform = /obj/item/clothing/under/rank/command/head_of_personnel/nt
- alt_suit = /obj/item/clothing/suit/ianshirt
+ uniform = /obj/item/clothing/under/nanotrasen/officer
+ alt_uniform = /obj/item/clothing/under/nanotrasen/officer/skirt
+ suit = /obj/item/clothing/suit/toggle/nanotrasen
dcoat = /obj/item/clothing/suit/hooded/wintercoat/captain
shoes = /obj/item/clothing/shoes/laceup
- head = /obj/item/clothing/head/hopcap/nt
- backpack_contents = list(/obj/item/storage/box/ids=1,\
- /obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
+ head = /obj/item/clothing/head/nanotrasen/officer
+
+ backpack_contents = list(
+ /obj/item/storage/box/ids=1,
+ /obj/item/melee/classic_baton/telescopic=1,
+ /obj/item/modular_computer/tablet/preset/advanced = 1,
+ )
backpack = /obj/item/storage/backpack/captain
satchel = /obj/item/storage/backpack/satchel/cap
duffelbag = /obj/item/storage/backpack/duffelbag/captain
courierbag = /obj/item/storage/backpack/messenger/com
- chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/head_of_personnel)
+ chameleon_extras = list(
+ /obj/item/gun/energy/e_gun,
+ /obj/item/stamp/head_of_personnel,
+ )
// Head of Security
-
/datum/outfit/job/nanotrasen/hos
name = "Nanotrasen - Head of Security"
job_icon = "headofsecurity"
@@ -111,14 +108,14 @@
id = /obj/item/card/id/silver
belt = /obj/item/pda/heads/hos
ears = /obj/item/radio/headset/nanotrasen/alt
- uniform = /obj/item/clothing/under/rank/security/head_of_security/nt
+ uniform = /obj/item/clothing/under/nanotrasen/security/director
alt_uniform = null
shoes = /obj/item/clothing/shoes/jackboots
- suit = /obj/item/clothing/suit/armor/hos/trenchcoat
- alt_suit = /obj/item/clothing/suit/armor/vest/security/hos
+ suit = /obj/item/clothing/suit/armor/nanotrasen/slim
+ alt_suit = /obj/item/clothing/suit/armor/nanotrasen/sec_director
dcoat = /obj/item/clothing/suit/hooded/wintercoat/security
gloves = /obj/item/clothing/gloves/color/black
- head = /obj/item/clothing/head/beret/sec/hos
+ head = /obj/item/clothing/head/nanotrasen/beret/security/command
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
suit_store = null
r_pocket = /obj/item/assembly/flash/handheld
@@ -135,74 +132,18 @@
chameleon_extras = list(/obj/item/gun/energy/e_gun/hos, /obj/item/stamp/hos)
-// Roboticist
-
-/datum/outfit/job/nanotrasen/roboticist
- name = "Nanotrasen - Mech Technician"
- id_assignment = "Mech Technician"
- job_icon = "roboticist"
- jobtype = /datum/job/roboticist
-
- uniform = /obj/item/clothing/under/rank/rnd/roboticist
- suit = /obj/item/clothing/suit/longcoat/robowhite
- ears = /obj/item/radio/headset/nanotrasen
- glasses = /obj/item/clothing/glasses/welding
-
- backpack_contents = list(/obj/item/weldingtool/hugetank)
-
-// Pilot. idk
-
-/datum/outfit/job/nanotrasen/pilot
- name = "Nanotrasen - Pilot"
- id_assignment = "Pilot"
-
- uniform = /obj/item/clothing/under/rank/security/officer/military
- suit = /obj/item/clothing/suit/jacket/leather/duster
- glasses = /obj/item/clothing/glasses/hud/spacecop
- accessory = /obj/item/clothing/accessory/holster
- head = /obj/item/clothing/head/beret/command
-
-// Lawyer
-
-/datum/outfit/job/nanotrasen/lawyer
- name = "Nanotrasen - Lawyer"
- job_icon = "lawyer"
- jobtype = /datum/job/lawyer
-
- ears = /obj/item/radio/headset/headset_srvsec
- uniform = /obj/item/clothing/under/suit/navy
- suit = /obj/item/clothing/suit/toggle/lawyer/navy
- shoes = /obj/item/clothing/shoes/laceup
- l_hand = /obj/item/storage/briefcase/lawyer
- l_pocket = /obj/item/laser_pointer
- r_pocket = /obj/item/clothing/accessory/lawyers_badge
-
- chameleon_extras = /obj/item/stamp/law
-
-/datum/outfit/job/nanotrasen/lawyer/corporaterepresentative
- name = "Nanotrasen - Corporate Representative"
- id_assignment = "Corporate Representative"
- job_icon = "nanotrasen"
-
- uniform = /obj/item/clothing/under/rank/command/head_of_personnel/suit
- suit = null
- ears = /obj/item/radio/headset/headset_cent
- l_hand = /obj/item/clipboard
- r_pocket = /obj/item/pen/fountain
-
// Security Officer
-
/datum/outfit/job/nanotrasen/security
name = "Nanotrasen - Security Officer"
jobtype = /datum/job/officer
job_icon = "securityofficer"
ears = /obj/item/radio/headset/alt
- uniform = /obj/item/clothing/under/rank/security/officer/nt
+ uniform = /obj/item/clothing/under/nanotrasen/security
gloves = /obj/item/clothing/gloves/color/black
- head = /obj/item/clothing/head/helmet/sec
- suit = /obj/item/clothing/suit/armor/vest
- alt_suit = /obj/item/clothing/suit/armor/vest/security/officer
+ head = /obj/item/clothing/head/nanotrasen/cap/security
+ suit = /obj/item/clothing/suit/armor/nanotrasen
+ alt_suit = /obj/item/clothing/suit/armor/nanotrasen/slim
dcoat = /obj/item/clothing/suit/hooded/wintercoat/security
shoes = /obj/item/clothing/shoes/jackboots
l_pocket = /obj/item/restraints/handcuffs
@@ -218,73 +159,36 @@
chameleon_extras = list(/obj/item/gun/energy/disabler, /obj/item/clothing/glasses/hud/security/sunglasses, /obj/item/clothing/head/helmet)
//The helmet is necessary because /obj/item/clothing/head/helmet/sec is overwritten in the chameleon list by the standard helmet, which has the same name and icon state
-/datum/outfit/job/nanotrasen/security/ert
- name = "Nanotrasen - ERT Officer"
-
- uniform = /obj/item/clothing/under/rank/security/officer/camo
- head = null
- backpack = /obj/item/storage/backpack/ert/security
- belt = /obj/item/storage/belt/military
- id = /obj/item/card/id/ert/security
- r_pocket = /obj/item/kitchen/knife/combat/survival
- backpack_contents = list(/obj/item/radio, /obj/item/flashlight/seclite)
-
-/datum/outfit/job/nanotrasen/security/ert/engi
- name = "Nanotrasen - ERT Engineering Officer"
-
- uniform = /obj/item/clothing/under/rank/security/officer/camo
- head = null
- backpack = /obj/item/storage/backpack/ert/engineer
- belt = /obj/item/storage/belt/utility/full/ert
- id = /obj/item/card/id/ert/security
- r_pocket = /obj/item/kitchen/knife/combat/survival
- backpack_contents = list(/obj/item/radio, /obj/item/flashlight/seclite)
- accessory = /obj/item/clothing/accessory/armband/engine
- glasses = /obj/item/clothing/glasses/hud/diagnostic/sunglasses
-
-/datum/outfit/job/nanotrasen/security/ert/med
- name = "Nanotrasen - ERT Medical Officer"
-
- uniform = /obj/item/clothing/under/rank/security/officer/camo
- head = /obj/item/clothing/head/beret/med
- backpack = /obj/item/storage/backpack/ert/medical
- belt = /obj/item/storage/belt/medical/webbing/paramedic
- id = /obj/item/card/id/ert/security
- r_pocket = /obj/item/kitchen/knife/combat/survival
- backpack_contents = list(/obj/item/radio, /obj/item/flashlight/seclite)
- accessory = /obj/item/clothing/accessory/armband/med
- glasses = /obj/item/clothing/glasses/hud/health/night
-
-/datum/outfit/job/nanotrasen/security/mech_pilot
- name = "Nanotrasen - Mech Pilot"
- id_assignment = "Mech Pilot"
-
- uniform = /obj/item/clothing/under/rank/security/officer/military/eng
- head = /obj/item/clothing/head/beret/sec/officer
- suit = /obj/item/clothing/suit/armor/vest/bulletproof
- backpack_contents = list(/obj/item/radio, /obj/item/flashlight/seclite)
-
-/datum/outfit/job/nanotrasen/security/lp
- name = "Nanotrasen - LP Security Specialist"
- id_assignment = "Security Specialist"
+// Warden
+/datum/outfit/job/nanotrasen/warden
+ name = "Nanotrasen - Warden"
+ job_icon = "warden"
+ jobtype = /datum/job/warden
- implants = list(/obj/item/implant/mindshield)
- ears = /obj/item/radio/headset/nanotrasen/alt/captain
- id = /obj/item/card/id/lpsec
- belt = /obj/item/pda/security
- gloves = /obj/item/clothing/gloves/color/black
- uniform = /obj/item/clothing/under/rank/security/head_of_security/nt/lp
- alt_uniform = /obj/item/clothing/under/rank/security/head_of_security/nt/skirt/lp
- dcoat = /obj/item/clothing/suit/hooded/wintercoat/security
+ ears = /obj/item/radio/headset/headset_sec/alt
+ uniform = /obj/item/clothing/under/rank/security/warden/nt
shoes = /obj/item/clothing/shoes/jackboots
- head = /obj/item/clothing/head/beret/sec
+ suit = /obj/item/clothing/suit/armor/vest/security/warden/alt/nt
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/security
+ gloves = /obj/item/clothing/gloves/color/black
+ head = /obj/item/clothing/head/warden/red
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ r_pocket = /obj/item/assembly/flash/handheld
+ l_pocket = /obj/item/restraints/handcuffs
+ suit_store = null
+ backpack_contents = list(/obj/item/melee/classic_baton)
+ backpack = /obj/item/storage/backpack/security
satchel = /obj/item/storage/backpack/satchel/sec
duffelbag = /obj/item/storage/backpack/duffelbag/sec
courierbag = /obj/item/storage/backpack/messenger/sec
+ box = /obj/item/storage/box/survival/security
-// Engineer
+ chameleon_extras = /obj/item/gun/ballistic/shotgun/automatic/combat/compact
+
+// Engineering //
+// Engineer
/datum/outfit/job/nanotrasen/engineer
name = "Nanotrasen - Engineer"
job_icon = "stationengineer"
@@ -293,10 +197,11 @@
belt = /obj/item/storage/belt/utility/full/engi
l_pocket = /obj/item/pda/engineering
ears = /obj/item/radio/headset/headset_eng
- uniform = /obj/item/clothing/under/rank/engineering/engineer/nt
+ uniform = /obj/item/clothing/under/nanotrasen/engineering
+ head = /obj/item/clothing/head/hardhat/nanotrasen
+ suit = /obj/item/clothing/suit/nanotrasen/vest
dcoat = /obj/item/clothing/suit/hooded/wintercoat/engineering
shoes = /obj/item/clothing/shoes/workboots
- head = /obj/item/clothing/head/hardhat
r_pocket = /obj/item/t_scanner
backpack = /obj/item/storage/backpack/industrial
@@ -307,53 +212,7 @@
box = /obj/item/storage/box/survival/engineer
backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
-/datum/outfit/job/nanotrasen/engineer/lp
- name = "Nanotrasen - LP Engineering Specialist"
-
- implants = list(/obj/item/implant/mindshield)
- ears = /obj/item/radio/headset/nanotrasen/alt/captain
- id = /obj/item/card/id/lpengie
- gloves = /obj/item/clothing/gloves/color/yellow
- uniform = /obj/item/clothing/under/rank/engineering/engineer/nt/lp
- alt_uniform = /obj/item/clothing/under/rank/engineering/engineer/nt/skirt/lp
- dcoat = /obj/item/clothing/suit/hooded/wintercoat/engineering
- shoes = /obj/item/clothing/shoes/jackboots
- head = /obj/item/clothing/head/beret/eng
-
- satchel = /obj/item/storage/backpack/satchel/eng
- duffelbag = /obj/item/storage/backpack/duffelbag/engineering
- courierbag = /obj/item/storage/backpack/messenger/engi
-
-// Warden
-
-/datum/outfit/job/nanotrasen/warden
- name = "Nanotrasen - Warden"
- job_icon = "warden"
- jobtype = /datum/job/warden
-
- ears = /obj/item/radio/headset/headset_sec/alt
- uniform = /obj/item/clothing/under/rank/security/warden/nt
- shoes = /obj/item/clothing/shoes/jackboots
- suit = /obj/item/clothing/suit/armor/vest/security/warden/alt/nt
- dcoat = /obj/item/clothing/suit/hooded/wintercoat/security
- gloves = /obj/item/clothing/gloves/color/black
- head = /obj/item/clothing/head/warden/red
- glasses = /obj/item/clothing/glasses/hud/security/sunglasses
- r_pocket = /obj/item/assembly/flash/handheld
- l_pocket = /obj/item/restraints/handcuffs
- suit_store = null
- backpack_contents = list(/obj/item/melee/classic_baton)
-
- backpack = /obj/item/storage/backpack/security
- satchel = /obj/item/storage/backpack/satchel/sec
- duffelbag = /obj/item/storage/backpack/duffelbag/sec
- courierbag = /obj/item/storage/backpack/messenger/sec
- box = /obj/item/storage/box/survival/security
-
- chameleon_extras = /obj/item/gun/ballistic/shotgun/automatic/combat/compact
-
// Chief Engineer
-
/datum/outfit/job/nanotrasen/ce
name = "Nanotrasen - Chief Engineer"
jobtype = /datum/job/chief_engineer
@@ -363,12 +222,16 @@
belt = /obj/item/storage/belt/utility/chief/full
l_pocket = /obj/item/storage/wallet
ears = /obj/item/radio/headset/headset_com
- uniform = /obj/item/clothing/under/rank/engineering/chief_engineer
+ uniform = /obj/item/clothing/under/nanotrasen/engineering/director
dcoat = /obj/item/clothing/suit/hooded/wintercoat/engineering
shoes = /obj/item/clothing/shoes/sneakers/brown
- head = /obj/item/clothing/head/hardhat/white
+ head = /obj/item/clothing/head/hardhat/nanotrasen/white
gloves = /obj/item/clothing/gloves/color/black
- backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced=1)
+
+ backpack_contents = list(
+ /obj/item/melee/classic_baton/telescopic=1,
+ /obj/item/modular_computer/tablet/preset/advanced=1,
+ )
backpack = /obj/item/storage/backpack/industrial
satchel = /obj/item/storage/backpack/satchel/eng
@@ -378,49 +241,91 @@
box = /obj/item/storage/box/survival/engineer
chameleon_extras = /obj/item/stamp/ce
-// Medical Doctor
+// Atmos Tech
+/datum/outfit/job/nanotrasen/atmos
+ name = "Nanotrasen - Atmos Tech"
+ jobtype = /datum/job/atmos
+ job_icon = "atmospherictechnician"
-/datum/outfit/job/nanotrasen/doctor
- name = "Nanotrasen - Medical Doctor"
- job_icon = "medicaldoctor"
- jobtype = /datum/job/doctor
+ belt = /obj/item/storage/belt/utility/atmostech
+ ears = /obj/item/radio/headset/headset_eng
+ uniform = /obj/item/clothing/under/nanotrasen/engineering/atmos
+ head = /obj/item/clothing/head/hardhat/nanotrasen/blue
+ suit = /obj/item/clothing/suit/nanotrasen/vest/blue
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/engineering
- belt = /obj/item/pda/medical
- ears = /obj/item/radio/headset/headset_med
- uniform = /obj/item/clothing/under/rank/medical/doctor
- shoes = /obj/item/clothing/shoes/sneakers/white
- suit = /obj/item/clothing/suit/toggle/labcoat
- alt_suit = /obj/item/clothing/suit/apron/surgical
- dcoat = /obj/item/clothing/suit/hooded/wintercoat/medical
+ backpack = /obj/item/storage/backpack/industrial
+ satchel = /obj/item/storage/backpack/satchel/eng
+ duffelbag = /obj/item/storage/backpack/duffelbag/engineering
+ courierbag = /obj/item/storage/backpack/messenger/engi
+ box = /obj/item/storage/box/survival/engineer
+ backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
- backpack = /obj/item/storage/backpack/medic
- satchel = /obj/item/storage/backpack/satchel/med
- duffelbag = /obj/item/storage/backpack/duffelbag/med
- courierbag = /obj/item/storage/backpack/messenger/med
- box = /obj/item/storage/box/survival/medical
+// Brig Physician
-/datum/outfit/job/nanotrasen/doctor/lp
- name = "Nanotrasen - LP Medical Specialist"
- id_assignment = "Medical Specialist"
+/datum/outfit/job/nanotrasen/brig_phys
+ name = "Nanotrasen - Brig Physician"
+ jobtype = /datum/job/brig_phys
+ job_icon = "brigphysician"
- implants = list(/obj/item/implant/mindshield)
- ears = /obj/item/radio/headset/nanotrasen/alt/captain
- id = /obj/item/card/id/lpmed
- belt = /obj/item/pda/medical
- gloves = /obj/item/clothing/gloves/color/latex/nitrile
- uniform = /obj/item/clothing/under/rank/medical/paramedic/lp
- alt_uniform = /obj/item/clothing/under/rank/medical/paramedic/skirt/lp
- dcoat = /obj/item/clothing/suit/hooded/wintercoat/medical
- shoes = /obj/item/clothing/shoes/sneakers/white
- head = /obj/item/clothing/head/beret/med
+ ears = /obj/item/radio/headset/headset_medsec/alt
+ uniform = /obj/item/clothing/under/rank/security/brig_phys/nt
+ shoes = /obj/item/clothing/shoes/jackboots
+ glasses = /obj/item/clothing/glasses/hud/health/sunglasses
+ suit = /obj/item/clothing/suit/toggle/labcoat/brig_phys
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/security
+ head = /obj/item/clothing/head/soft/sec/brig_phys
+ implants = list(/obj/item/implant/mindshield)
- satchel = /obj/item/storage/backpack/satchel/med
- duffelbag = /obj/item/storage/backpack/duffelbag/med
- courierbag = /obj/item/storage/backpack/messenger/med
- box = /obj/item/storage/box/survival/medical
+// Supply //
-// Cargo Tech
+// Quartermaster
+/datum/outfit/job/nanotrasen/quartermaster
+ name = "Nanotrasen - Quartermaster"
+ jobtype = /datum/job/qm
+ job_icon = "quartermaster"
+
+ ears = /obj/item/radio/headset/headset_cargo
+ head = /obj/item/clothing/head/nanotrasen/cap/supply
+ uniform = /obj/item/clothing/under/nanotrasen/supply/qm
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/cargo
+ shoes = /obj/item/clothing/shoes/sneakers/brown
+ glasses = /obj/item/clothing/glasses/sunglasses
+ l_hand = /obj/item/clipboard
+ backpack_contents = list(/obj/item/modular_computer/tablet/preset/cargo=1)
+ chameleon_extras = /obj/item/stamp/qm
+
+//Miner
+/datum/outfit/job/nanotrasen/miner
+ name = "Nanotrasen - Miner"
+ jobtype = /datum/job/mining
+ job_icon = "shaftminer"
+
+ ears = /obj/item/radio/headset/headset_cargo/mining
+ shoes = /obj/item/clothing/shoes/workboots/mining
+ head = /obj/item/clothing/head/hardhat/nanotrasen
+ gloves = /obj/item/clothing/gloves/color/black
+ uniform = /obj/item/clothing/under/nanotrasen/supply/miner
+ suit = /obj/item/clothing/suit/nanotrasen/vest
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/miner
+ r_pocket = /obj/item/storage/bag/ore
+
+ backpack_contents = list(
+ /obj/item/flashlight/seclite=1,
+ /obj/item/kitchen/knife/combat/survival=1,
+ /obj/item/stack/marker_beacon/ten=1,
+ /obj/item/radio/weather_monitor=1,
+ )
+
+ backpack = /obj/item/storage/backpack/explorer
+ satchel = /obj/item/storage/backpack/satchel/explorer
+ duffelbag = /obj/item/storage/backpack/duffelbag
+ box = /obj/item/storage/box/survival/mining
+
+ chameleon_extras = /obj/item/gun/energy/kinetic_accelerator
+
+// Cargo Tech
/datum/outfit/job/nanotrasen/cargo_tech
name = "Nanotrasen - Cargo Tech"
jobtype = /datum/job/cargo_tech
@@ -428,126 +333,264 @@
belt = /obj/item/pda/cargo
ears = /obj/item/radio/headset/headset_cargo
- uniform = /obj/item/clothing/under/rank/cargo/tech
+ head = /obj/item/clothing/head/nanotrasen/cap/supply
+ uniform = /obj/item/clothing/under/nanotrasen/supply
dcoat = /obj/item/clothing/suit/hooded/wintercoat/cargo
backpack_contents = list(/obj/item/modular_computer/tablet/preset/cargo=1)
-// Atmos Tech
+// Medical //
-/datum/outfit/job/nanotrasen/atmos
- name = "Nanotrasen - Atmos Tech"
- jobtype = /datum/job/atmos
- job_icon = "atmospherictechnician"
+// Medical Doctor
+/datum/outfit/job/nanotrasen/doctor
+ name = "Nanotrasen - Medical Doctor"
+ job_icon = "medicaldoctor"
+ jobtype = /datum/job/doctor
- belt = /obj/item/storage/belt/utility/atmostech
- ears = /obj/item/radio/headset/headset_eng
- uniform = /obj/item/clothing/under/rank/engineering/atmospheric_technician
- alt_suit = /obj/item/clothing/suit/hazardvest
- dcoat = /obj/item/clothing/suit/hooded/wintercoat/engineering
+ belt = /obj/item/pda/medical
+ ears = /obj/item/radio/headset/headset_med
+ head = /obj/item/clothing/head/nanotrasen/surgical
+ uniform = /obj/item/clothing/under/nanotrasen/medical
+ shoes = /obj/item/clothing/shoes/sneakers/white
+ suit = /obj/item/clothing/suit/nanotrasen/medical_smock
+ alt_suit = /obj/item/clothing/suit/toggle/labcoat/nanotrasen
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/medical
- backpack = /obj/item/storage/backpack/industrial
- satchel = /obj/item/storage/backpack/satchel/eng
- duffelbag = /obj/item/storage/backpack/duffelbag/engineering
- courierbag = /obj/item/storage/backpack/messenger/engi
- box = /obj/item/storage/box/survival/engineer
- backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
+ backpack = /obj/item/storage/backpack/medic
+ satchel = /obj/item/storage/backpack/satchel/med
+ duffelbag = /obj/item/storage/backpack/duffelbag/med
+ courierbag = /obj/item/storage/backpack/messenger/med
+ box = /obj/item/storage/box/survival/medical
-// Scientist
+// Paramedic
+/datum/outfit/job/nanotrasen/paramedic
+ name = "Nanotrasen - Paramedic"
+ jobtype = /datum/job/paramedic
+ job_icon = "paramedic"
+
+ ears = /obj/item/radio/headset/headset_med
+ uniform = /obj/item/clothing/under/nanotrasen/medical/paramedic
+ head = /obj/item/clothing/head/nanotrasen/cap/medical
+ shoes = /obj/item/clothing/shoes/sneakers/blue
+ suit = /obj/item/clothing/suit/toggle/labcoat/nanotrasen/paramedic
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/medical/paramedic
+ gloves = /obj/item/clothing/gloves/color/latex/nitrile
+ id = /obj/item/card/id
+
+ backpack_contents = list(/obj/item/roller=1)
+
+ backpack = /obj/item/storage/backpack/medic
+ satchel = /obj/item/storage/backpack/satchel/med
+ duffelbag = /obj/item/storage/backpack/duffelbag/med
+ courierbag = /obj/item/storage/backpack/messenger/para
+ box = /obj/item/storage/box/survival/medical
+
+ chameleon_extras = /obj/item/gun/syringe
+
+// Civilian //
+
+// Assistant
+/datum/outfit/job/nanotrasen/assistant
+ name = "Nanotrasen - Assistant"
+ jobtype = /datum/job/assistant
+ job_icon = "assistant"
+
+ uniform = /obj/item/clothing/under/nanotrasen
+ shoes = /obj/item/clothing/shoes/sneakers/black
+ belt = /obj/item/pda
+
+// Lawyer
+/datum/outfit/job/nanotrasen/lawyer
+ name = "Nanotrasen - Lawyer"
+ job_icon = "lawyer"
+ jobtype = /datum/job/lawyer
+
+ ears = /obj/item/radio/headset/headset_srvsec
+ uniform = /obj/item/clothing/under/nanotrasen/affairs
+ suit = /obj/item/clothing/suit/nanotrasen/suitjacket
+ shoes = /obj/item/clothing/shoes/laceup
+ l_hand = /obj/item/storage/briefcase/lawyer
+ l_pocket = /obj/item/laser_pointer
+ r_pocket = /obj/item/clothing/accessory/lawyers_badge
+
+ chameleon_extras = /obj/item/stamp/law
+
+// Corp. Rep
+/datum/outfit/job/nanotrasen/lawyer/corporaterepresentative
+ name = "Nanotrasen - Corporate Representative"
+ id_assignment = "Corporate Representative"
+ job_icon = "nanotrasen"
+
+ uniform = /obj/item/clothing/under/rank/command/head_of_personnel/suit
+ suit = null
+ ears = /obj/item/radio/headset/headset_cent
+ l_hand = /obj/item/clipboard
+ r_pocket = /obj/item/pen/fountain
+// Science //
+
+// Scientist
/datum/outfit/job/nanotrasen/scientist
name = "Nanotrasen - Scientist"
jobtype = /datum/job/scientist
job_icon = "scientist"
ears = /obj/item/radio/headset/headset_sci
- uniform = /obj/item/clothing/under/rank/rnd/scientist
+ uniform = /obj/item/clothing/under/nanotrasen/science
shoes = /obj/item/clothing/shoes/sneakers/white
- suit = /obj/item/clothing/suit/toggle/labcoat/science
+ suit = /obj/item/clothing/suit/toggle/labcoat/nanotrasen
dcoat = /obj/item/clothing/suit/hooded/wintercoat/science
backpack = /obj/item/storage/backpack/science
satchel = /obj/item/storage/backpack/satchel/tox
courierbag = /obj/item/storage/backpack/messenger/tox
-// Brig Physician
+// Roboticist
+/datum/outfit/job/nanotrasen/roboticist
+ name = "Nanotrasen - Roboticist"
+ id_assignment = "Roboticist"
+ job_icon = "roboticist"
+ jobtype = /datum/job/roboticist
-/datum/outfit/job/nanotrasen/brig_phys
- name = "Nanotrasen - Brig Physician"
- jobtype = /datum/job/brig_phys
- job_icon = "brigphysician"
+ uniform = /obj/item/clothing/under/nanotrasen/science/robotics
+ suit = /obj/item/clothing/suit/toggle/labcoat/nanotrasen
+ ears = /obj/item/radio/headset/nanotrasen
+ glasses = /obj/item/clothing/glasses/welding
- ears = /obj/item/radio/headset/headset_medsec/alt
- uniform = /obj/item/clothing/under/rank/security/brig_phys/nt
+ backpack_contents = list(/obj/item/weldingtool/hugetank)
+
+// Pilot. idk
+/datum/outfit/job/nanotrasen/pilot
+ name = "Nanotrasen - Pilot"
+ id_assignment = "Pilot"
+
+ uniform = /obj/item/clothing/under/rank/security/officer/military
+ suit = /obj/item/clothing/suit/jacket/leather/duster
+ glasses = /obj/item/clothing/glasses/hud/spacecop
+ accessory = /obj/item/clothing/accessory/holster
+ head = /obj/item/clothing/head/beret/command
+
+// Mech Pilot
+/datum/outfit/job/nanotrasen/security/mech_pilot
+ name = "Nanotrasen - Mech Pilot"
+ id_assignment = "Mech Pilot"
+
+ uniform = /obj/item/clothing/under/rank/security/officer/military/eng
+ head = /obj/item/clothing/head/beret/sec/officer
+ suit = /obj/item/clothing/suit/armor/vest/bulletproof
+ backpack_contents = list(/obj/item/radio, /obj/item/flashlight/seclite)
+
+// LP - for Ranger ship //
+
+/datum/outfit/job/nanotrasen/captain/lp
+ name = "Nanotrasen - Loss Prevention Lieutenant"
+ id_assignment = "Lieutenant"
+
+ implants = list(/obj/item/implant/mindshield)
+ ears = /obj/item/radio/headset/nanotrasen/alt/captain
+ id = /obj/item/card/id/lplieu
+ belt = /obj/item/pda/captain
+ gloves = /obj/item/clothing/gloves/color/black
+ uniform = /obj/item/clothing/under/rank/security/head_of_security/alt/lp
+ alt_uniform = /obj/item/clothing/under/rank/security/head_of_security/alt/skirt/lp
+ dcoat = /obj/item/clothing/suit/jacket
shoes = /obj/item/clothing/shoes/jackboots
- glasses = /obj/item/clothing/glasses/hud/health/sunglasses
- suit = /obj/item/clothing/suit/toggle/labcoat/brig_phys
+ head = /obj/item/clothing/head/beret/command
+
+ satchel = /obj/item/storage/backpack/satchel/cap
+ duffelbag = /obj/item/storage/backpack/duffelbag/captain
+ courierbag = /obj/item/storage/backpack/messenger/com
+
+/datum/outfit/job/nanotrasen/security/lp
+ name = "Nanotrasen - LP Security Specialist"
+ id_assignment = "Security Specialist"
+
+ implants = list(/obj/item/implant/mindshield)
+ ears = /obj/item/radio/headset/nanotrasen/alt/captain
+ id = /obj/item/card/id/lpsec
+ belt = /obj/item/pda/security
+ gloves = /obj/item/clothing/gloves/color/black
+ uniform = /obj/item/clothing/under/rank/security/head_of_security/nt/lp
+ alt_uniform = /obj/item/clothing/under/rank/security/head_of_security/nt/skirt/lp
dcoat = /obj/item/clothing/suit/hooded/wintercoat/security
- head = /obj/item/clothing/head/soft/sec/brig_phys
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/beret/sec
+
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/sec
+ courierbag = /obj/item/storage/backpack/messenger/sec
+
+/datum/outfit/job/nanotrasen/engineer/lp
+ name = "Nanotrasen - LP Engineering Specialist"
+
implants = list(/obj/item/implant/mindshield)
+ ears = /obj/item/radio/headset/nanotrasen/alt/captain
+ id = /obj/item/card/id/lpengie
+ gloves = /obj/item/clothing/gloves/color/yellow
+ uniform = /obj/item/clothing/under/rank/engineering/engineer/nt/lp
+ alt_uniform = /obj/item/clothing/under/rank/engineering/engineer/nt/skirt/lp
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/engineering
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/beret/eng
-// Paramedic
+ satchel = /obj/item/storage/backpack/satchel/eng
+ duffelbag = /obj/item/storage/backpack/duffelbag/engineering
+ courierbag = /obj/item/storage/backpack/messenger/engi
-/datum/outfit/job/nanotrasen/paramedic
- name = "Nanotrasen - Paramedic"
- jobtype = /datum/job/paramedic
- job_icon = "paramedic"
+/datum/outfit/job/nanotrasen/doctor/lp
+ name = "Nanotrasen - LP Medical Specialist"
+ id_assignment = "Medical Specialist"
- ears = /obj/item/radio/headset/headset_med
- uniform = /obj/item/clothing/under/rank/medical/paramedic
- head = /obj/item/clothing/head/soft/paramedic
- shoes = /obj/item/clothing/shoes/sneakers/blue
- suit = /obj/item/clothing/suit/toggle/labcoat/paramedic
- dcoat = /obj/item/clothing/suit/hooded/wintercoat/medical/paramedic
+ implants = list(/obj/item/implant/mindshield)
+ ears = /obj/item/radio/headset/nanotrasen/alt/captain
+ id = /obj/item/card/id/lpmed
+ belt = /obj/item/pda/medical
gloves = /obj/item/clothing/gloves/color/latex/nitrile
- id = /obj/item/card/id
- backpack_contents = list(/obj/item/roller=1)
+ uniform = /obj/item/clothing/under/rank/medical/paramedic/lp
+ alt_uniform = /obj/item/clothing/under/rank/medical/paramedic/skirt/lp
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/medical
+ shoes = /obj/item/clothing/shoes/sneakers/white
+ head = /obj/item/clothing/head/beret/med
- backpack = /obj/item/storage/backpack/medic
satchel = /obj/item/storage/backpack/satchel/med
duffelbag = /obj/item/storage/backpack/duffelbag/med
- courierbag = /obj/item/storage/backpack/messenger/para
+ courierbag = /obj/item/storage/backpack/messenger/med
box = /obj/item/storage/box/survival/medical
- chameleon_extras = /obj/item/gun/syringe
+// ERT //
-// Quartermaster
-
-/datum/outfit/job/nanotrasen/quartermaster
- name = "Nanotrasen - Quartermaster"
- jobtype = /datum/job/qm
- job_icon = "quartermaster"
-
- ears = /obj/item/radio/headset/headset_cargo
- uniform = /obj/item/clothing/under/rank/cargo/qm
- dcoat = /obj/item/clothing/suit/hooded/wintercoat/cargo
- shoes = /obj/item/clothing/shoes/sneakers/brown
- glasses = /obj/item/clothing/glasses/sunglasses
- l_hand = /obj/item/clipboard
- backpack_contents = list(/obj/item/modular_computer/tablet/preset/cargo=1)
+/datum/outfit/job/nanotrasen/security/ert
+ name = "Nanotrasen - ERT Officer"
- chameleon_extras = /obj/item/stamp/qm
+ uniform = /obj/item/clothing/under/rank/security/officer/camo
+ head = null
+ backpack = /obj/item/storage/backpack/ert/security
+ belt = /obj/item/storage/belt/military
+ id = /obj/item/card/id/ert/security
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ backpack_contents = list(/obj/item/radio, /obj/item/flashlight/seclite)
-/datum/outfit/job/nanotrasen/miner
- name = "Nanotrasen - Miner"
- jobtype = /datum/job/mining
- job_icon = "shaftminer"
+/datum/outfit/job/nanotrasen/security/ert/engi
+ name = "Nanotrasen - ERT Engineering Officer"
- ears = /obj/item/radio/headset/headset_cargo/mining
- shoes = /obj/item/clothing/shoes/workboots/mining
- gloves = /obj/item/clothing/gloves/explorer
- uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland
- suit = /obj/item/clothing/suit/hazardvest
- dcoat = /obj/item/clothing/suit/hooded/wintercoat/miner
- r_pocket = /obj/item/storage/bag/ore
- backpack_contents = list(
- /obj/item/flashlight/seclite=1,\
- /obj/item/kitchen/knife/combat/survival=1,\
- /obj/item/stack/marker_beacon/ten=1,\
- /obj/item/radio/weather_monitor=1)
+ uniform = /obj/item/clothing/under/rank/security/officer/camo
+ head = null
+ backpack = /obj/item/storage/backpack/ert/engineer
+ belt = /obj/item/storage/belt/utility/full/ert
+ id = /obj/item/card/id/ert/security
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ backpack_contents = list(/obj/item/radio, /obj/item/flashlight/seclite)
+ accessory = /obj/item/clothing/accessory/armband/engine
+ glasses = /obj/item/clothing/glasses/hud/diagnostic/sunglasses
- backpack = /obj/item/storage/backpack/explorer
- satchel = /obj/item/storage/backpack/satchel/explorer
- duffelbag = /obj/item/storage/backpack/duffelbag
- box = /obj/item/storage/box/survival/mining
+/datum/outfit/job/nanotrasen/security/ert/med
+ name = "Nanotrasen - ERT Medical Officer"
- chameleon_extras = /obj/item/gun/energy/kinetic_accelerator
+ uniform = /obj/item/clothing/under/rank/security/officer/camo
+ head = /obj/item/clothing/head/beret/med
+ backpack = /obj/item/storage/backpack/ert/medical
+ belt = /obj/item/storage/belt/medical/webbing/paramedic
+ id = /obj/item/card/id/ert/security
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ backpack_contents = list(/obj/item/radio, /obj/item/flashlight/seclite)
+ accessory = /obj/item/clothing/accessory/armband/med
+ glasses = /obj/item/clothing/glasses/hud/health/night
diff --git a/code/modules/clothing/outfits/factions/syndicate.dm b/code/modules/clothing/outfits/factions/syndicate.dm
index 44199ac361a3..5e04d87d88c6 100644
--- a/code/modules/clothing/outfits/factions/syndicate.dm
+++ b/code/modules/clothing/outfits/factions/syndicate.dm
@@ -54,10 +54,20 @@
box = /obj/item/storage/box/survival/syndie
/datum/outfit/job/syndicate/assistant/gorlex
- name = "Syndicate - Junior Agent (Gorlex Marauders)"
+ name = "Syndicate - Junior Agent (Hardliner)"
- uniform = /obj/item/clothing/under/syndicate/gorlex
- alt_uniform = /obj/item/clothing/under/syndicate
+ uniform = /obj/item/clothing/under/syndicate/hardliners
+ alt_uniform = /obj/item/clothing/under/syndicate/hardliners/jumpsuit
+
+/datum/outfit/job/syndicate/assistant/ngr
+ name = "Syndicate - Initiate (New Gorlex Republic)"
+ id_assignment = "Initiate"
+
+ head = /obj/item/clothing/head/ngr
+ uniform = /obj/item/clothing/under/syndicate/ngr
+ shoes = /obj/item/clothing/shoes/combat
+
+ alt_uniform = null
/datum/outfit/job/syndicate/assistant/gec
name = "Syndicate - Deckhand (GEC)"
@@ -296,11 +306,20 @@
/datum/outfit/job/syndicate/captain/gorlex
- name = "Syndicate - Captain (Gorlex Marauders)"
- uniform = /obj/item/clothing/under/syndicate/ngr/officer
+ name = "Syndicate - Captain (Hardliner)"
+ uniform = /obj/item/clothing/under/syndicate/hardliners/officer
+
+ head = /obj/item/clothing/head/hardliners/peaked
+ suit = /obj/item/clothing/suit/toggle/armor/vest/hardliners
+ shoes = /obj/item/clothing/shoes/combat
- head = /obj/item/clothing/head/ngrcap
- suit = /obj/item/clothing/suit/armor/vest/capcarapace/ngr_captain
+/datum/outfit/job/syndicate/captain/ngr
+ name = "Syndicate - Captain (New Gorlex Republic)"
+
+ uniform = /obj/item/clothing/under/syndicate/ngr/officer
+ head = /obj/item/clothing/head/ngr/peaked
+ suit = /obj/item/clothing/suit/armor/ngr/captain
+ shoes = /obj/item/clothing/shoes/combat
/datum/outfit/job/syndicate/captain/cybersun
name = "Syndicate - Captain (Cybersun)"
@@ -410,17 +429,19 @@
id = /obj/item/card/id/syndicate_command/captain_id
gloves = /obj/item/clothing/gloves/combat
-/datum/outfit/job/syndicate/ce/gorlex
- name = "Syndicate - Foreman (Gorlex Marauders)"
+/datum/outfit/job/syndicate/ce/ngr
+ name = "Syndicate - Foreman (New Gorlex Republic)"
+ head = /obj/item/clothing/head/hardhat/ngr/foreman
ears = /obj/item/radio/headset/syndicate/alt
- uniform = /obj/item/clothing/under/syndicate/gorlex
+ uniform = /obj/item/clothing/under/syndicate/ngr/officer
alt_uniform = null
- suit = /obj/item/clothing/suit/toggle/hazard
+ suit = /obj/item/clothing/suit/ngr
alt_suit = null
- shoes = /obj/item/clothing/shoes/jackboots
+ shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
+
//Chief Medical Officer
/datum/outfit/job/syndicate/cmo
@@ -535,9 +556,28 @@
backpack_contents = list(/obj/item/melee/baton/loaded=1)
/datum/outfit/job/syndicate/hos/gorlex
- name = "Syndicate - Sergeant (Gorlex)"
+ name = "Syndicate - Sergeant (Hardliner)"
id_assignment = "Sergeant"
+ uniform = /obj/item/clothing/under/syndicate/hardliners/officer
+ head = /obj/item/clothing/head/hardliners/peaked
+ suit = /obj/item/clothing/suit/armor/hardliners/sergeant
+ id = /obj/item/card/id/syndicate_command/crew_id
+ shoes = /obj/item/clothing/shoes/combat
+ suit_store = /obj/item/gun/ballistic/automatic/pistol
+
+/datum/outfit/job/syndicate/hos/ngr
+ name = "Syndicate - Lieutenant (New Gorlex Republic)"
+ id_assignment = "Lieutenant"
+
+ uniform = /obj/item/clothing/under/syndicate/ngr/officer
+ head = /obj/item/clothing/head/ngr/peaked
+ suit = /obj/item/clothing/suit/armor/ngr/lieutenant
+ id = /obj/item/card/id/syndicate_command/crew_id
+ shoes = /obj/item/clothing/shoes/combat
+ suit_store = /obj/item/gun/ballistic/automatic/pistol
+
+
/datum/outfit/job/syndicate/hos/twink
name = "Syndicate - Lieutenant (Twinkleshine, NGR)"
id_assignment = "Lieutenant"
@@ -644,13 +684,27 @@
uniform = /obj/item/clothing/under/syndicate/medic
accessory = /obj/item/clothing/accessory/armband/medblue
- shoes = /obj/item/clothing/shoes/jackboots
+ shoes = /obj/item/clothing/shoes/combat
/datum/outfit/job/syndicate/doctor/gorlex
- name = "Syndicate - Medical Doctor (Gorlex)"
+ name = "Syndicate - Medical Doctor (Hardliner)"
- uniform = /obj/item/clothing/under/syndicate/gorlex
- glasses = /obj/item/clothing/glasses/hud/health/prescription
+ uniform = /obj/item/clothing/under/syndicate/hardliners
+ head = /obj/item/clothing/head/hardliners
+ suit = /obj/item/clothing/suit/hardliners
+ glasses = /obj/item/clothing/glasses/hud/health
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ back = /obj/item/storage/backpack/duffelbag/syndie/med
+ id = /obj/item/card/id/syndicate_command/crew_id
+ backpack_contents = list(/obj/item/storage/box/survival/syndie=1, /obj/item/storage/firstaid/medical,)
+
+/datum/outfit/job/syndicate/doctor/ngr
+ name = "Syndicate - Medical Doctor (New Gorlex Republic)"
+
+ uniform = /obj/item/clothing/under/syndicate/ngr
+ head = /obj/item/clothing/head/ngr/surgical
+ suit = /obj/item/clothing/suit/ngr/smock
+ glasses = /obj/item/clothing/glasses/hud/health
r_pocket = /obj/item/kitchen/knife/combat/survival
back = /obj/item/storage/backpack/duffelbag/syndie/med
id = /obj/item/card/id/syndicate_command/crew_id
@@ -845,7 +899,47 @@
/datum/outfit/job/syndicate/security/gorlex
- name = "Syndicate - Assault Operative (Gorlex)"
+ name = "Syndicate - Trooper (Hardliner)"
+ id_assignment = "Trooper"
+ job_icon = "securityofficer"
+
+ uniform = /obj/item/clothing/under/syndicate/hardliners
+ belt = /obj/item/storage/belt/security/webbing/hardliners
+ suit = /obj/item/clothing/suit/armor/hardliners
+ gloves = /obj/item/clothing/gloves/color/black
+ head = /obj/item/clothing/head/helmet/hardliners
+ shoes = /obj/item/clothing/shoes/combat
+ l_pocket = /obj/item/restraints/handcuffs
+ r_pocket = /obj/item/assembly/flash/handheld
+
+/datum/outfit/job/syndicate/security/gorlex
+ name = "Syndicate - Pilot (Hardliner)"
+ id_assignment = "Pilot"
+ job_icon = "securityofficer"
+
+ head = /obj/item/clothing/head/helmet/hardliners/swat
+
+/datum/outfit/job/syndicate/security/ngr
+ name = "Syndicate - Operative (New Gorlex Republic)"
+ id_assignment = "Operative"
+ job_icon = "securityofficer"
+
+ uniform = /obj/item/clothing/under/syndicate/ngr
+ belt = /obj/item/storage/belt/security/webbing/ngr
+ suit = /obj/item/clothing/suit/armor/ngr
+ gloves = /obj/item/clothing/gloves/color/black
+ head = /obj/item/clothing/head/helmet/ngr
+ shoes = /obj/item/clothing/shoes/combat
+ l_pocket = /obj/item/restraints/handcuffs
+ r_pocket = /obj/item/assembly/flash/handheld
+
+/datum/outfit/job/syndicate/security/ngr/pilot
+ name = "Syndicate - Pilot (New Gorlex Republic)"
+ id_assignment = "Pilot"
+ job_icon = "securityofficer"
+
+ uniform = /obj/item/clothing/under/syndicate/ngr/fatigues
+ head = /obj/item/clothing/head/helmet/ngr/swat
/datum/outfit/job/syndicate/security/twink
name = "Syndicate - Operative (Twinkleshine)"
@@ -914,10 +1008,24 @@
/obj/item/stack/marker_beacon/ten=1)
/datum/outfit/job/syndicate/miner/gorlex
- name = "Syndicate - Wrecker (Gorlex Marauders)"
+ name = "Syndicate - Wrecker (Hardliner)"
id_assignment = "Wrecker"
- uniform = /obj/item/clothing/under/syndicate/gorlex
+ head = /obj/item/clothing/head/hardhat/hardliners
+ suit = /obj/item/clothing/suit/hazardvest/hardliners
+ uniform = /obj/item/clothing/under/syndicate/hardliners/jumpsuit
+ accessory = /obj/item/clothing/accessory/armband/cargo
+ shoes = /obj/item/clothing/shoes/workboots
+ ears = /obj/item/radio/headset/alt
+
+/datum/outfit/job/syndicate/miner/ngr
+ name = "Syndicate - Wrecker (New Gorlex Republic)"
+ id_assignment = "Wrecker"
+
+ head = /obj/item/clothing/head/hardhat/ngr
+ suit = /obj/item/clothing/suit/hazardvest/ngr
+ uniform = /obj/item/clothing/under/syndicate/ngr/jumpsuit
+ accessory = /obj/item/clothing/accessory/armband/cargo
shoes = /obj/item/clothing/shoes/workboots
ears = /obj/item/radio/headset/alt
@@ -1005,10 +1113,22 @@
id = /obj/item/card/id/syndicate_command/crew_id
/datum/outfit/job/syndicate/engineer/gorlex
- name = "Syndicate - Mechanic (Gorlex Marauders)"
+ name = "Syndicate - Mechanic (Hardliner)"
id_assignment = "Mechanic"
- uniform = /obj/item/clothing/under/syndicate/gorlex
+ head = /obj/item/clothing/head/hardhat/hardliners
+ suit = /obj/item/clothing/suit/hazardvest/hardliners
+ uniform = /obj/item/clothing/under/syndicate/hardliners
+ shoes = /obj/item/clothing/shoes/workboots
+ glasses = null
+
+/datum/outfit/job/syndicate/engineer/ngr
+ name = "Syndicate - Mechanic (New Gorlex Republic)"
+ id_assignment = "Mechanic"
+
+ head = /obj/item/clothing/head/hardhat/ngr
+ suit = /obj/item/clothing/suit/hazardvest/ngr
+ uniform = /obj/item/clothing/under/syndicate/ngr
shoes = /obj/item/clothing/shoes/workboots
glasses = null
diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm
index ba38a4a9240b..05b8c0e1a42c 100644
--- a/code/modules/clothing/outfits/plasmaman.dm
+++ b/code/modules/clothing/outfits/plasmaman.dm
@@ -217,3 +217,9 @@
head = /obj/item/clothing/head/helmet/space/plasmaman/solgov
uniform = /obj/item/clothing/under/plasmaman/solgov
gloves = /obj/item/clothing/gloves/color/plasmaman/white
+
+/datum/outfit/plasmaman/ngr
+ name = "Plasmangr"
+ head = /obj/item/clothing/head/helmet/space/plasmaman/ngr
+ uniform= /obj/item/clothing/under/plasmaman/ngr
+ gloves = /obj/item/clothing/gloves/color/plasmaman/black
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index 7a848b9ca330..100cc7ff0f52 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -169,7 +169,7 @@
r_pocket = /obj/item/shield/energy
suit_store = /obj/item/tank/internals/emergency_oxygen/double
belt = /obj/item/gun/ballistic/revolver/mateba
- r_hand = /obj/item/gun/energy/pulse/loyalpin
+ r_hand = /obj/item/gun/energy/pulse
id = /obj/item/card/id/ert/deathsquad
ears = /obj/item/radio/headset/headset_cent/alt
@@ -226,8 +226,6 @@
backpack_contents = list(
/obj/item/melee/transforming/energy/axe=1,\
/obj/item/storage/part_replacer/bluespace/tier4=1,\
- /obj/item/gun/magic/wand/resurrection/debug=1,\
- /obj/item/gun/magic/wand/death/debug=1,\
/obj/item/debug/human_spawner=1,\
/obj/item/debug/omnitool=1
)
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 05db2331fc49..336ac43c7d4d 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -1,6 +1,8 @@
/obj/item/clothing/shoes
name = "shoes"
icon = 'icons/obj/clothing/shoes.dmi'
+ lefthand_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi'
desc = "Comfortable-looking shoes."
gender = PLURAL //Carn: for grammarically correct text-parsing
var/chained = 0
@@ -132,9 +134,12 @@
return
if(user == loc && tied != SHOES_TIED) // if they're our own shoes, go tie-wards
+ if(DOING_INTERACTION_WITH_TARGET(user, our_guy))
+ to_chat(user, span_warning("You're already interacting with [src]!"))
+ return
user.visible_message("[user] begins [tied ? "unknotting" : "tying"] the laces of [user.p_their()] [src.name].", "You begin [tied ? "unknotting" : "tying"] the laces of your [src.name]...")
- if(do_after(user, lace_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, PROC_REF(still_shoed), our_guy)))
+ if(do_after(user, lace_time, target = our_guy, extra_checks = CALLBACK(src, PROC_REF(still_shoed), our_guy)))
to_chat(user, "You [tied ? "unknot" : "tie"] the laces of your [src.name].")
if(tied == SHOES_UNTIED)
adjust_laces(SHOES_TIED, user)
@@ -149,13 +154,16 @@
if(tied == SHOES_KNOTTED)
to_chat(user, "The laces on [loc]'s [src.name] are already a hopelessly tangled mess!")
return
+ if(DOING_INTERACTION_WITH_TARGET(user, our_guy))
+ to_chat(user, span_warning("You're already interacting with [src]!"))
+ return
var/mod_time = lace_time
to_chat(user, "You quietly set to work [tied ? "untying" : "knotting"] [loc]'s [src.name]...")
if(HAS_TRAIT(user, TRAIT_CLUMSY)) // based clowns trained their whole lives for this
mod_time *= 0.75
- if(do_after(user, mod_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, PROC_REF(still_shoed), our_guy)))
+ if(do_after(user, mod_time, target = our_guy, extra_checks = CALLBACK(src, PROC_REF(still_shoed), our_guy)))
to_chat(user, "You [tied ? "untie" : "knot"] the laces on [loc]'s [src.name].")
if(tied == SHOES_UNTIED)
adjust_laces(SHOES_KNOTTED, user)
@@ -230,8 +238,12 @@
/obj/item/clothing/shoes/attack_self(mob/user)
. = ..()
+ if(DOING_INTERACTION_WITH_TARGET(user, src))
+ to_chat(user, "You're already interacting with [src]!")
+ return
+
to_chat(user, "You begin [tied ? "untying" : "tying"] the laces on [src]...")
- if(do_after(user, lace_time, needhand=TRUE, target=src,extra_checks=CALLBACK(src, PROC_REF(still_shoed), user)))
+ if(do_after(user, lace_time, target = src,extra_checks = CALLBACK(src, PROC_REF(still_shoed), user)))
to_chat(user, "You [tied ? "untie" : "tie"] the laces on [src].")
adjust_laces(tied ? SHOES_TIED : SHOES_UNTIED, user)
diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm
index a09ea07a3250..4ed246a587be 100644
--- a/code/modules/clothing/shoes/bananashoes.dm
+++ b/code/modules/clothing/shoes/bananashoes.dm
@@ -16,7 +16,7 @@
/obj/item/clothing/shoes/clown_shoes/banana_shoes/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
- AddComponent(/datum/component/material_container, list(/datum/material/bananium), 200000, TRUE, /obj/item/stack)
+ AddComponent(/datum/component/material_container, list(/datum/material/hellstone), 200000, TRUE, /obj/item/stack)
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 75, falloff_exponent = 20)
/obj/item/clothing/shoes/clown_shoes/banana_shoes/step_action()
@@ -24,7 +24,7 @@
var/mob/wearer = loc
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
if(on && istype(wearer))
- if(bananium.get_material_amount(/datum/material/bananium) < 100)
+ if(bananium.get_material_amount(/datum/material/hellstone) < 100)
on = !on
if(!always_noslip)
clothing_flags &= ~NOSLIP
@@ -32,7 +32,7 @@
to_chat(loc, "You ran out of bananium!")
else
new /obj/item/grown/bananapeel/specialpeel(get_step(src,turn(wearer.dir, 180))) //honk
- bananium.use_amount_mat(100, /datum/material/bananium)
+ bananium.use_amount_mat(100, /datum/material/hellstone)
/obj/item/clothing/shoes/clown_shoes/banana_shoes/attack_self(mob/user)
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
@@ -48,7 +48,7 @@
/obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click(mob/user)
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
- if(bananium.get_material_amount(/datum/material/bananium))
+ if(bananium.get_material_amount(/datum/material/hellstone))
on = !on
update_appearance()
to_chat(user, "You [on ? "activate" : "deactivate"] the prototype shoes.")
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index a738bee8f8ed..4c078a7e0ad1 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -1,10 +1,6 @@
/obj/item/clothing/shoes/proc/step_action() //this was made to rewrite clown shoes squeaking
SEND_SIGNAL(src, COMSIG_SHOES_STEP_ACTION)
-/obj/item/clothing/shoes/sneakers/mime
- name = "mime shoes"
- icon_state = "mime"
-
/obj/item/clothing/shoes/combat //basic syndicate combat boots for nuke ops and mob corpses
name = "combat boots"
desc = "High speed, low drag combat boots."
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index 4b19735b5f62..cb98f607089c 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -2,6 +2,8 @@
// Meaning the the suit is defined directly after the corrisponding helmet. Just like below!
/obj/item/clothing/head/helmet/space
name = "space helmet"
+ icon = 'icons/obj/clothing/head/spacesuits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/spacesuits.dmi'
icon_state = "spaceold"
desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays."
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS //WS Port - Cit Internals
@@ -19,6 +21,8 @@
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
resistance_flags = NONE
dog_fashion = null
+ content_overlays = FALSE
+ pocket_storage_component_path = null
/obj/item/clothing/suit/space
name = "space suit"
@@ -36,7 +40,7 @@
slowdown = 1
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
- cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
+ cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 1ea5af9f1ea4..557a69c5acb2 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -444,26 +444,6 @@
combat_slowdown = 0.5
jetpack = null
-//2nd Battlegroup Syndie suit
-/obj/item/clothing/head/helmet/space/hardsuit/syndi/sbg
- name = "beige-red hardsuit helmet"
- desc = "A standardized dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by beige. It is in EVA mode. Manufactured by Second Battlegroup."
- alt_desc = "A standardized dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by beige. It is in combat mode. Manufactured by Second Battlegroup."
- icon_state = "hardsuit1-sbg"
- item_state = "hardsuit1-sbg"
- hardsuit_type = "sbg"
-
-/obj/item/clothing/suit/space/hardsuit/syndi/sbg
- name = "beige-red hardsuit"
- desc = "A standardized dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by beige. It is in EVA mode. Manufactured by Second Battlegroup."
- alt_desc = "A standardized dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by beige. It is in combat mode. Manufactured by the Second Battlegroup."
- icon_state = "hardsuit1-sbg"
- item_state = "hardsuit1-sbg"
- hardsuit_type = "sbg"
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/sbg
- lightweight = 1
- jetpack = null
-
//Hardliner Syndie suit
/obj/item/clothing/head/helmet/space/hardsuit/syndi/hl
name = "white-red hardsuit helmet"
@@ -605,11 +585,6 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/wizard
-/obj/item/clothing/suit/space/hardsuit/wizard/Initialize()
- . = ..()
- AddComponent(/datum/component/anti_magic, TRUE, FALSE, FALSE, ITEM_SLOT_OCLOTHING, INFINITY, FALSE)
-
-
//Medical hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/medical
name = "medical hardsuit helmet"
@@ -1093,12 +1068,6 @@
armor = list("melee" = 35, "bullet" = 25, "laser" = 20,"energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
supports_variations = VOX_VARIATION
-/obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
- name = "\improper Frontiersmen hardsuit helmet"
- desc = "An old hardsuit helmet based on a even older hardsuit helmet. Used prolifically by the Frontiersmen pirate fleet."
- icon_state = "hardsuit0-frontier"
- hardsuit_type = "frontier"
-
/obj/item/clothing/suit/space/hardsuit/security/independent
icon_state = "hardsuit-independent-sec"
name = "security hardsuit"
@@ -1110,13 +1079,6 @@
armor = list("melee" = 35, "bullet" = 25, "laser" = 20, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
supports_variations = VOX_VARIATION
-/obj/item/clothing/suit/space/hardsuit/security/independent/frontier
- name = "\improper Frontiersmen hardsuit"
- desc = "An old hardsuit based on a even older hardsuit. Used prolifically by the Frontiersmen pirate fleet."
- icon_state = "hardsuit_frontier"
- hardsuit_type = "hardsuit_frontier"
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
-
//Mining
/obj/item/clothing/head/helmet/space/hardsuit/mining/independent
name = "mining hardsuit helmet"
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index aa0367f12ead..67dc7ce529b3 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -151,8 +151,6 @@ Contains:
/obj/item/clothing/suit/space/pirate
name = "pirate coat"
desc = "Yarr."
- icon_state = "pirate"
- item_state = "pirate"
w_class = WEIGHT_CLASS_NORMAL
flags_inv = 0
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/melee/transforming/energy/sword/saber/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum)
@@ -283,28 +281,6 @@ Contains:
flash_protect = FLASH_PROTECTION_NONE
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65)
-/obj/item/clothing/head/helmet/space/freedom
- name = "eagle helmet"
- desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
- icon_state = "griffinhat"
- item_state = "griffinhat"
- armor = list("melee" = 20, "bullet" = 40, "laser" = 30, "energy" = 40, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
- strip_delay = 130
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- resistance_flags = ACID_PROOF | FIRE_PROOF
-
-/obj/item/clothing/suit/space/freedom
- name = "eagle suit"
- desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be integrated into the suit and the wings appear to be stuck in 'freedom' mode."
- icon_state = "freedom"
- item_state = "freedom"
- allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
- armor = list("melee" = 20, "bullet" = 40, "laser" = 30,"energy" = 40, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
- strip_delay = 130
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- resistance_flags = ACID_PROOF | FIRE_PROOF
- slowdown = 0
-
//Carpsuit, bestsuit, lovesuit
/obj/item/clothing/head/helmet/space/hardsuit/carp
name = "carp helmet"
@@ -356,10 +332,6 @@ Contains:
actions_types = list()
resistance_flags = FIRE_PROOF
-/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize()
- . = ..()
- AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_OCLOTHING)
-
/obj/item/clothing/suit/space/hardsuit/ert/paranormal
name = "paranormal response team hardsuit"
desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats."
@@ -369,10 +341,6 @@ Contains:
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
-/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize()
- . = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE, ITEM_SLOT_OCLOTHING)
-
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
name = "inquisitor's hardsuit"
icon_state = "hardsuit-inq"
@@ -397,11 +365,6 @@ Contains:
resistance_flags = FIRE_PROOF
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife, /obj/item/kinetic_crusher, /obj/item/resonator, /obj/item/melee/transforming/cleaving_saw)
-
-/obj/item/clothing/suit/space/hardsuit/berserker/Initialize()
- . = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE, ITEM_SLOT_OCLOTHING)
-
/obj/item/clothing/suit/space/hardsuit/berserker/RemoveHelmet()
var/obj/item/clothing/head/helmet/space/hardsuit/berserker/helm = helmet
if(helm?.berserk_active)
@@ -583,14 +546,3 @@ Contains:
icon_state = "space-inteq"
armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 15, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/clothing/suit/space/scar
- name = "Scar Suit"
- desc = "A heavily modified eva suit, custom made for the captain of the ember."
- icon_state = "hostile_env"
- item_state = "hostile_env"
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF
- slowdown = 0.5
- armor = list("melee" = 40, "bullet" = 35, "laser" = 30, "energy" = 25, "bomb" = 70, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
- allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy, /obj/item/tank/internals)
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index 358f6a8ba187..0e7edb63f068 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -1,5 +1,7 @@
/obj/item/clothing/suit
icon = 'icons/obj/clothing/suits.dmi'
+ lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
name = "suit"
var/fire_resist = T0C+100
allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 953899ca40ce..ee72151d9567 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -15,6 +15,8 @@
greyscale_colors = list(list(18, 19), list(13, 18), list(20, 15))
greyscale_icon_state = "armor"
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
+
/obj/item/clothing/suit/armor/Initialize()
. = ..()
if(!allowed)
@@ -32,21 +34,27 @@
desc = "A Type I armored vest that provides decent protection against most types of damage."
icon_state = "armor_alt"
item_state = "armoralt"
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
+
+/obj/item/clothing/suit/armor/vest/trauma
+ name = "cybersun trauma team armor vest"
+ icon_state = "traumavest"
+ desc = "A set of stamped plasteel armor plates decorated with a medical cross and colors associated with the medical division of Cybersun."
/obj/item/clothing/suit/armor/vest/marine
- name = "light tactical armor vest"
- desc = "A set of the finest mass-produced stamped plasteel armor plates money can buy."
+ name = "tactical armor vest"
+ desc = "A heavy set of the finest mass-produced stamped plasteel armor plates money can buy."
icon_state = "marine_light"
item_state = "armor"
clothing_flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list("melee" = 50, "bullet" = 50, "laser" = 30, "energy" = 25, "bomb" = 50, "bio" = 100, "fire" = 40, "acid" = 50)
+ armor = list("melee" = 50, "bullet" = 75, "laser" = 55, "energy" = 25, "bomb" = 60, "bio" = 100, "fire" = 70, "acid" = 50)
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
resistance_flags = FIRE_PROOF | ACID_PROOF
supports_variations = VOX_VARIATION | DIGITIGRADE_VARIATION_NO_NEW_ICON
+ slowdown = 0.5
/obj/item/clothing/suit/armor/vest/marine/medium
name = "medium tactical armor vest"
@@ -56,11 +64,6 @@
name = "large tactical armor vest"
icon_state = "marine_heavy"
-/obj/item/clothing/suit/armor/vest/marine/trauma
- name = "cybersun trauma team armor vest"
- icon_state = "traumavest"
- desc = "A set of stamped plasteel armor plates decorated with a medical cross and colors associated with the medical division of Cybersun."
-
/obj/item/clothing/suit/armor/vest/old
name = "degrading armor vest"
desc = "Older generation Type 1 armored vest. Due to degradation over time the vest is far less maneuverable to move in."
@@ -157,21 +160,6 @@
desc = "An extraordinarily fashionable haori, utilized by Cybersun captains. Weaved with armored fabric to protect the user from gunshots."
icon_state = "carapace_cybersun"
-/obj/item/clothing/suit/armor/vest/capcarapace/ngr_captain
- name = "\improper 2nd Battlegroup jacket"
- desc = "An armored jacket worn by the New Gorlex Republic's 2nd Battlegroup."
- body_parts_covered = CHEST|GROIN|ARMS|HANDS
- icon_state = "carapace_ngr"
- item_state = "carapace_ngr"
- blood_overlay_type = "coat"
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
-
-/obj/item/clothing/suit/armor/vest/capcarapace/alt
- name = "captain's parade jacket"
- desc = "For when an armoured vest isn't fashionable enough."
- icon_state = "carapace_ntformal"
- item_state = "capspacesuit"
-
/obj/item/clothing/suit/armor/vest/capcarapace/captunic
name = "captain's parade coat"
desc = "Worn by a captain to show their class."
@@ -215,11 +203,6 @@
strip_delay = 70
equip_delay_other = 50
-/obj/item/clothing/suit/armor/vest/bulletproof/frontier
- name = "\improper Frontiersmen bulletproof armor"
- desc = "A scrap piece of armor made of disused protective plates. This one was used to protect the squishy bits of a Frontiersman, once."
- icon_state = "frontier_armor"
-
/obj/item/clothing/suit/armor/laserproof
name = "reflector vest"
desc = "A vest that excels in protecting the wearer against energy projectiles, as well as occasionally reflecting them."
@@ -339,7 +322,7 @@
desc = "A luxurious brown coat made from a crossweave of kevlar and ballistic fibre, the collar and wrist trims are made from genuine wolf fur. as protective as it is stylish."
icon_state = "armor_inteq_battlecoat"
item_state = "inteq_battlecoat"
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/obj/item/clothing/suit/armor/hos/inteq/honorable //Basically CC higherup clothing for inteq
name = "honorable vanguard battlecoat"
@@ -347,7 +330,7 @@
icon_state = "armor_inteq_honorable_battlecoat"
item_state = "inteq_honorable_battlecoat"
armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90)
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/armor/inteq/corpsman
name = "inteq corpsman vest"
@@ -499,14 +482,6 @@
icon_state = "armor_brigphysjacket"
body_parts_covered = CHEST|ARMS
-/obj/item/clothing/suit/armor/frontier
- name = "reinforced fur coat"
- desc = "A stiff coat, meant for frigid conditions."
- icon_state = "frontier_coat"
- body_parts_covered = CHEST|GROIN|ARMS
- cold_protection = CHEST|GROIN|ARMS
- heat_protection = CHEST|GROIN|ARMS
-
/obj/item/clothing/suit/toggle/armor/vest/centcom_formal
name = "\improper CentCom formal coat"
desc = "A stylish coat given to CentCom Commanders. Perfect for sending ERTs to suicide missions with style!"
diff --git a/code/modules/clothing/suits/chaplainsuits.dm b/code/modules/clothing/suits/chaplainsuits.dm
index 949265f83371..58802e01b8a1 100644
--- a/code/modules/clothing/suits/chaplainsuits.dm
+++ b/code/modules/clothing/suits/chaplainsuits.dm
@@ -31,20 +31,6 @@
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
-/obj/item/clothing/suit/chaplainsuit/studentuni
- name = "student robe"
- desc = "The uniform of a bygone institute of learning."
- icon_state = "studentuni"
- item_state = "studentuni"
- body_parts_covered = ARMS|CHEST
-
-/obj/item/clothing/suit/chaplainsuit/witchhunter
- name = "witchunter garb"
- desc = "This worn outfit saw much use back in the day."
- icon_state = "witchhunter"
- item_state = "witchhunter"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
-
/obj/item/clothing/suit/hooded/chaplainsuit/monkhabit
name = "monk's habit"
desc = "A few steps above rended sackcloth."
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index 14f721334462..4e3f6d5e3a9c 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -67,6 +67,11 @@
desc = "Worn by high ranking vampires of the transylvanian society of vampires."
icon_state = "trans"
+/obj/item/clothing/neck/cloak/bi
+ name = "solarian marine biologist cloak"
+ desc = "Commonly worn by members of the Solarian Marine Biologist Society, dedicated to the study and preservation of marine wildlife."
+ icon_state = "bi"
+
/obj/item/clothing/suit/hooded/cloak/goliath
name = "goliath cloak"
icon_state = "goliath_cloak"
@@ -186,7 +191,8 @@
/obj/item/clothing/head/hooded/cloakhood/goliath/polar
name = "polar cloak"
- icon_state = "polhood"
+ icon_state = "hoodie_gray"
+ mob_overlay_state = "polhood"
desc = "Wear bear on head show little man you big man, kill bear for cloak."
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
cold_protection = HEAD
diff --git a/code/modules/clothing/suits/hoodies.dm b/code/modules/clothing/suits/hoodies.dm
index 1feea7adfd0f..f58d445c53f0 100644
--- a/code/modules/clothing/suits/hoodies.dm
+++ b/code/modules/clothing/suits/hoodies.dm
@@ -1,7 +1,7 @@
-/obj/item/clothing/suit/hooded/hoodie/
+/obj/item/clothing/suit/hooded/hoodie
name = "hoodie"
desc = "HOW"
- hoodtype = /obj/item/clothing/head/hooded/hood/
+ hoodtype = /obj/item/clothing/head/hooded/hood
body_parts_covered = CHEST|ARMS
pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo/large
allowed = list( /obj/item/flashlight,
@@ -15,7 +15,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) //it's just a hoodie.
supports_variations = KEPORI_VARIATION
-/obj/item/clothing/head/hooded/hood/
+/obj/item/clothing/head/hooded/hood
name = "hood"
desc = "HOW"
body_parts_covered = HEAD
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 0db75bbb1921..56018c288b6a 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -129,6 +129,8 @@
body_parts_covered = CHEST|ARMS
togglename = "buttons"
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+
/obj/item/clothing/suit/toggle/lawyer/purple
name = "purple suit jacket"
desc = "A foppish dress jacket."
@@ -205,24 +207,6 @@
icon_state = "surgical"
allowed = list(/obj/item/scalpel, /obj/item/cautery, /obj/item/hemostat, /obj/item/retractor)
-//Robotocist
-
-/obj/item/clothing/suit/hooded/techpriest
- name = "techpriest robes"
- desc = "For those who REALLY love their toasters."
- icon_state = "techpriest"
- item_state = "techpriest"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- hoodtype = /obj/item/clothing/head/hooded/techpriest
-
-/obj/item/clothing/head/hooded/techpriest
- name = "techpriest's hood"
- desc = "A hood for those who REALLY love their toasters."
- icon_state = "techpriesthood"
- item_state = "techpriesthood"
- body_parts_covered = HEAD
- flags_inv = HIDEHAIR|HIDEEARS
-
//SolGov suits
/obj/item/clothing/suit/solgov
@@ -302,3 +286,10 @@
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE|HIDEFACIALHAIR
+/obj/item/clothing/suit/armor/witchhunter
+ name = "witchunter garb"
+ desc = "This worn outfit saw much use back in the day."
+ icon_state = "chaplain_witchhunter"
+ item_state = "witchhunter"
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ allowed = list(/obj/item/storage/book/bible, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index 24836f6f2404..f95a91ab27fe 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -4,7 +4,7 @@
icon_state = "labcoat"
item_state = "labcoat"
blood_overlay_type = "coat"
- body_parts_covered = CHEST|ARMS
+ body_parts_covered = CHEST|ARMS|GROIN
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/soap, /obj/item/sensor_device, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
togglename = "buttons"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 126e34db4f4a..f8e8c3f69909 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -65,6 +65,7 @@
desc = "Suit for a cyborg costume."
icon_state = "death"
item_state = "death"
+ mob_overlay_state = "cardborg"
flags_1 = CONDUCT_1
fire_resist = T0C+5200
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -325,6 +326,8 @@
/obj/item/clothing/head/hooded/human_head
name = "bloated human head"
desc = "A horribly bloated and mismatched human head."
+ icon = 'icons/obj/clothing/head/spacesuits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/spacesuits.dmi'
icon_state = "lingspacehelmet"
body_parts_covered = HEAD
flags_cover = HEADCOVERSEYES
@@ -511,8 +514,9 @@
/obj/item/clothing/suit/caution
name = "wet floor sign"
- desc = "Caution! Wet Floor!"
+ desc = "No running."
icon_state = "caution"
+ icon = 'icons/obj/janitor.dmi'
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
force = 1
@@ -658,16 +662,9 @@
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR|HIDEFACE|HIDEMASK
-/obj/item/clothing/suit/coordinator
- name = "coordinator jacket"
- desc = "A jacket for a party ooordinator, stylish!."
- icon_state = "capformal"
- item_state = "capspacesuit"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
-
/obj/item/clothing/suit/hawaiian
- name = "hawaiian overshirt"
- desc = "A cool shirt for chilling on the beach."
+ name = "floral shirt"
+ desc = "From grills to guns, this shirt's seen it all."
icon_state = "hawaiian_blue"
item_state = "hawaiian_blue"
diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm
index 588a8f1600de..9b141148e5a2 100644
--- a/code/modules/clothing/suits/wintercoats.dm
+++ b/code/modules/clothing/suits/wintercoats.dm
@@ -1,5 +1,7 @@
// WINTER COATS
+//Someone please make the allowed lists globals or something
+
/obj/item/clothing/suit/hooded/wintercoat
name = "winter coat"
desc = "A heavy jacket made from 'synthetic' animal furs."
@@ -10,14 +12,14 @@
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
- allowed = list( /obj/item/flashlight,
- /obj/item/tank/internals/emergency_oxygen,
- /obj/item/tank/internals/plasmaman,
- /obj/item/toy,
- /obj/item/storage/fancy/cigarettes,
- /obj/item/lighter,
- )
+ allowed = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ )
/obj/item/clothing/head/hooded/winterhood
name = "winter hood"
@@ -29,13 +31,11 @@
cold_protection = HEAD
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEHAIR|HIDEEARS
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/clothing/suit/hooded/wintercoat/captain
name = "captain's winter coat"
icon_state = "coatcaptain"
item_state = "coatcaptain"
- armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
hoodtype = /obj/item/clothing/head/hooded/winterhood/captain
/obj/item/clothing/suit/hooded/wintercoat/captain/Initialize()
@@ -44,13 +44,11 @@
/obj/item/clothing/head/hooded/winterhood/captain
icon_state = "hood_captain"
- armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
/obj/item/clothing/suit/hooded/wintercoat/security
name = "security winter coat"
icon_state = "coatsecurity"
item_state = "coatsecurity"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/security
/obj/item/clothing/suit/hooded/wintercoat/security/Initialize()
@@ -59,19 +57,37 @@
/obj/item/clothing/head/hooded/winterhood/security
icon_state = "hood_security"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
/obj/item/clothing/suit/hooded/wintercoat/medical
name = "medical winter coat"
icon_state = "coatmedical"
item_state = "coatmedical"
- allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/medical
+ allowed = list(
+ /obj/item/analyzer,
+ /obj/item/sensor_device,
+ /obj/item/stack/medical,
+ /obj/item/dnainjector,
+ /obj/item/reagent_containers/dropper,
+ /obj/item/reagent_containers/syringe,
+ /obj/item/reagent_containers/hypospray,
+ /obj/item/healthanalyzer,
+ /obj/item/flashlight/pen,
+ /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/pill,
+ /obj/item/storage/pill_bottle,
+ /obj/item/paper,
+ /obj/item/melee/classic_baton/telescopic,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ )
/obj/item/clothing/head/hooded/winterhood/medical
icon_state = "hood_medical"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
/obj/item/clothing/suit/hooded/wintercoat/medical/paramedic
name = "paramedic winter coat"
@@ -86,25 +102,52 @@
name = "science winter coat"
icon_state = "coatscience"
item_state = "coatscience"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/science
+ allowed = list(
+ /obj/item/analyzer,
+ /obj/item/stack/medical,
+ /obj/item/dnainjector,
+ /obj/item/reagent_containers/dropper,
+ /obj/item/reagent_containers/syringe,
+ /obj/item/reagent_containers/hypospray,
+ /obj/item/healthanalyzer,
+ /obj/item/flashlight/pen,
+ /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/pill,
+ /obj/item/storage/pill_bottle,
+ /obj/item/paper,
+ /obj/item/melee/classic_baton/telescopic,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ )
/obj/item/clothing/head/hooded/winterhood/science
icon_state = "hood_science"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/clothing/suit/hooded/wintercoat/engineering
name = "engineering winter coat"
icon_state = "coatengineer"
item_state = "coatengineer"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45)
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering
+ allowed = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ /obj/item/t_scanner,
+ /obj/item/construction/rcd,
+ /obj/item/pipe_dispenser,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ )
+
/obj/item/clothing/head/hooded/winterhood/engineering
icon_state = "hood_engineer"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45)
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos
name = "atmospherics winter coat"
@@ -119,8 +162,22 @@
name = "hydroponics winter coat"
icon_state = "coathydro"
item_state = "coathydro"
- allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants, /obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro
+ allowed = list(
+ /obj/item/reagent_containers/spray/plantbgone,
+ /obj/item/plant_analyzer,
+ /obj/item/seeds,
+ /obj/item/reagent_containers/glass/bottle,
+ /obj/item/cultivator,
+ /obj/item/reagent_containers/spray/pestspray,
+ /obj/item/hatchet,
+ /obj/item/storage/bag/plants,
+ /obj/item/toy,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ )
/obj/item/clothing/head/hooded/winterhood/hydro
icon_state = "hood_hydro"
@@ -138,13 +195,18 @@
name = "mining winter coat"
icon_state = "coatminer"
item_state = "coatminer"
- allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/miner
+ allowed = list(
+ /obj/item/pickaxe,
+ /obj/item/flashlight,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ )
/obj/item/clothing/head/hooded/winterhood/miner
icon_state = "hood_miner"
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
// Inteq
@@ -154,18 +216,17 @@
icon_state = "coatinteq"
item_state = "coatinteq"
hoodtype = /obj/item/clothing/head/hooded/winterhood/security/inteq
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/head/hooded/winterhood/security/inteq
icon_state = "hood_inteq"
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/suit/hooded/wintercoat/security/inteq/alt
name = "inteq hooded coat"
desc = "A hooded coat with a fur trim around the hood, comfy! It has a small 'IRMG' embroidered onto the shoulder."
icon_state = "coatinteq_alt"
item_state = "coatinteq_alt"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/security/inteq/alt
/obj/item/clothing/head/hooded/winterhood/security/inteq/alt
@@ -173,15 +234,14 @@
desc = "A comfortable looking brown hood."
icon_state = "hood_inteq_alt"
item_state = "hood_inteq_alt"
- armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
// CentCom
+
/obj/item/clothing/suit/hooded/wintercoat/centcom
name = "centcom winter coat"
desc = "A luxurious winter coat woven in the bright green and gold colours of Central Command. It has a small pin in the shape of the Nanotrasen logo for a zipper."
icon_state = "coatcentcom"
item_state = "coatcentcom"
- armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60)
hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom
/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize(mapload)
@@ -190,7 +250,6 @@
/obj/item/clothing/head/hooded/winterhood/centcom
icon_state = "hood_centcom"
- armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60)
// SolGov
@@ -199,9 +258,7 @@
desc = "An environment-resistant wintercoat in the colors of the Solarian Confederation."
icon_state = "coatsolgov"
item_state = "coatsolgov"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/solgov
/obj/item/clothing/head/hooded/winterhood/solgov
icon_state = "hood_solgov"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45)
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 8bc5646f2218..451d428760f3 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -55,6 +55,8 @@
/obj/item/clothing/head/wizard/santa
name = "Santa's hat"
desc = "Ho ho ho. Merrry X-mas!"
+ icon = 'icons/obj/clothing/head/spacesuits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/spacesuits.dmi'
icon_state = "santahat"
flags_inv = HIDEHAIR|HIDEFACIALHAIR
dog_fashion = null
@@ -146,39 +148,6 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
resistance_flags = FLAMMABLE
-/obj/item/clothing/suit/wizrobe/paper
- name = "papier-mache robe" // no non-latin characters!
- desc = "A robe held together by various bits of clear-tape and paste."
- icon_state = "wizard-paper"
- item_state = "wizard-paper"
- var/robe_charge = TRUE
- actions_types = list(/datum/action/item_action/stickmen)
-
-
-/obj/item/clothing/suit/wizrobe/paper/ui_action_click(mob/user, action)
- stickmen()
-
-
-/obj/item/clothing/suit/wizrobe/paper/verb/stickmen()
- set category = "Object"
- set name = "Summon Stick Minions"
- set src in usr
- if(!isliving(usr))
- return
- if(!robe_charge)
- to_chat(usr, "The robe's internal magic supply is still recharging!")
- return
-
- usr.say("Rise, my creation! Off your page into this realm!", forced = "stickman summoning")
- playsound(src.loc, 'sound/magic/summon_magic.ogg', 50, TRUE, TRUE)
- var/mob/living/M = new /mob/living/simple_animal/hostile/stickman(get_turf(usr))
- var/list/factions = usr.faction
- M.faction = factions
- src.robe_charge = FALSE
- sleep(30)
- src.robe_charge = TRUE
- to_chat(usr, "The robe hums, its internal magic supply restored.")
-
/obj/item/clothing/suit/space/hardsuit/shielded/wizard
name = "battlemage armour"
desc = "Not all wizards are afraid of getting up close and personal."
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 356bef71acac..a28d6d323a83 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -2,6 +2,8 @@
name = "under"
icon = 'icons/obj/clothing/under/default.dmi'
mob_overlay_icon = 'icons/mob/clothing/under/default.dmi'
+ lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
body_parts_covered = CHEST|GROIN|LEGS|ARMS
permeability_coefficient = 0.9
slot_flags = ITEM_SLOT_ICLOTHING
@@ -84,7 +86,6 @@
if(attached_accessory && slot != ITEM_SLOT_HANDS && ishuman(user))
var/mob/living/carbon/human/H = user
attached_accessory.on_uniform_equip(src, user)
- H.fan_hud_set_fandom()
if(attached_accessory.above_suit)
H.update_inv_wear_suit()
@@ -99,7 +100,6 @@
attached_accessory.on_uniform_dropped(src, user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
- H.fan_hud_set_fandom()
if(attached_accessory.above_suit)
H.update_inv_wear_suit()
@@ -134,7 +134,6 @@
var/mob/living/carbon/human/H = loc
H.update_inv_w_uniform()
H.update_inv_wear_suit()
- H.fan_hud_set_fandom()
return TRUE
@@ -156,7 +155,6 @@
var/mob/living/carbon/human/H = loc
H.update_inv_w_uniform()
H.update_inv_wear_suit()
- H.fan_hud_set_fandom()
/obj/item/clothing/under/examine(mob/user)
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 2f0660bffebf..76de51b173cd 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -376,45 +376,6 @@
for(var/i in 1 to 3)
new /obj/item/lipstick/random(src)
-////////////////
-//REAL BIG FAN//
-////////////////
-
-/obj/item/clothing/accessory/fan_clown_pin
- name = "Clown Pin"
- desc = "A pin to show off your appreciation for clowns and clowning"
- icon_state = "fan_clown_pin"
- above_suit = FALSE
- minimize_when_attached = TRUE
- attachment_slot = CHEST
-
-/obj/item/clothing/accessory/fan_clown_pin/on_uniform_equip(obj/item/clothing/under/U, user)
- var/mob/living/L = user
- if(HAS_TRAIT(L, TRAIT_FAN_CLOWN))
- SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "fan_clown_pin", /datum/mood_event/fan_clown_pin)
-
-/obj/item/clothing/accessory/fan_clown_pin/on_uniform_dropped(obj/item/clothing/under/U, user)
- var/mob/living/L = user
- if(HAS_TRAIT(L, TRAIT_FAN_CLOWN))
- SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "fan_clown_pin")
-
-/obj/item/clothing/accessory/fan_mime_pin
- name = "Mime Pin"
- desc = "A pin to show off your appreciation for mimes and miming"
- icon_state = "fan_mime_pin"
- above_suit = FALSE
- minimize_when_attached = TRUE
- attachment_slot = CHEST
-
-/obj/item/clothing/accessory/fan_mime_pin/on_uniform_equip(obj/item/clothing/under/U, user)
- var/mob/living/L = user
- if(HAS_TRAIT(L, TRAIT_FAN_MIME))
- SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "fan_mime_pin", /datum/mood_event/fan_mime_pin)
-
-/obj/item/clothing/accessory/fan_mime_pin/on_uniform_dropped(obj/item/clothing/under/U, user)
- var/mob/living/L = user
- if(HAS_TRAIT(L, TRAIT_FAN_MIME))
- SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "fan_mime_pin")
////////////////
//OONGA BOONGA//
@@ -475,16 +436,12 @@
/obj/item/clothing/accessory/holster/nukie
name = "operative holster"
desc = "A deep shoulder holster capable of holding almost any form of ballistic weaponry."
- icon_state = "syndicate_holster"
- item_state = "syndicate_holster"
w_class = WEIGHT_CLASS_BULKY
pocket_storage_component_path = /datum/component/storage/concrete/pockets/holster/nukie
/obj/item/clothing/accessory/holster/chameleon
name = "syndicate holster"
desc = "A two pouched hip holster that uses chameleon technology to disguise itself and any guns in it."
- icon_state = "syndicate_holster"
- item_state = "syndicate_holster"
var/datum/action/item_action/chameleon/change/chameleon_action
pocket_storage_component_path = /datum/component/storage/concrete/pockets/holster/chameleon
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 1a2cfdd33fd7..bbd0d962601f 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -11,6 +11,7 @@
/obj/item/clothing/under/color/random
icon_state = "random_jumpsuit"
+ mob_overlay_state = "rainbow" // if you somehow equip it like that
/obj/item/clothing/under/color/random/Initialize()
..()
@@ -24,6 +25,7 @@
/obj/item/clothing/under/color/jumpskirt/random
icon_state = "random_jumpsuit" //Skirt variant needed
+ mob_overlay_state = "rainbow"
/obj/item/clothing/under/color/jumpskirt/random/Initialize()
..()
diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
index 59b83eb7e3e5..0f58017a2e73 100644
--- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
+++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
@@ -151,4 +151,3 @@
desc = "It's very colourful on the inside."
icon_state = "mime_enviroskirt"
item_state = "mime_enviroskirt"
-
diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm
index c5426e63883e..0af578bfd452 100644
--- a/code/modules/clothing/under/jobs/cargo.dm
+++ b/code/modules/clothing/under/jobs/cargo.dm
@@ -1,7 +1,7 @@
/obj/item/clothing/under/rank/cargo
icon = 'icons/obj/clothing/under/cargo.dmi'
mob_overlay_icon = 'icons/mob/clothing/under/cargo.dmi'
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/under/rank/cargo/qm
name = "quartermaster's jumpsuit"
@@ -16,7 +16,7 @@
item_state = "lb_suit"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/obj/item/clothing/under/rank/cargo/tech
name = "cargo technician's jumpsuit"
@@ -24,7 +24,7 @@
icon_state = "cargotech"
item_state = "lb_suit"
body_parts_covered = CHEST|GROIN|ARMS
- supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
alt_covers_chest = TRUE
/obj/item/clothing/under/rank/cargo/tech/skirt
@@ -33,7 +33,7 @@
icon_state = "cargo_skirt"
item_state = "lb_suit"
body_parts_covered = CHEST|GROIN|ARMS
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
can_adjust = FALSE
/obj/item/clothing/under/rank/cargo/miner
@@ -43,22 +43,22 @@
item_state = "miner"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 0)
resistance_flags = NONE
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
/obj/item/clothing/under/rank/cargo/miner/lavaland
- desc = "A light uniform for operating in hazardous environments, manufactured en-masse by EXOCON for the profitable frontier prospector market. Adventurous khaki jeans included."
+ desc = "A light uniform for operating in hazardous environments, manufactured en-masse by EXOCOM for the profitable frontier prospector market. Adventurous khaki jeans included."
name = "prospector jumpsuit"
icon_state = "explorer"
item_state = "explorer"
can_adjust = TRUE
- supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
/obj/item/clothing/under/rank/cargo/miner/hazard
desc = "A thick jumpsuit with reflective stripes for hazardous, low-visibility environments. It's coated in a thick layer of asteroid dust."
name = "asteroid miner's jumpsuit"
icon_state = "hazard"
item_state = "hazard"
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/rank/cargo/miner/lavaland/old
icon_state = "explorerold"
diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm
index 965ec45c3d18..8a95cee6c3ed 100644
--- a/code/modules/clothing/under/jobs/civilian/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian/civilian.dm
@@ -222,11 +222,6 @@
icon_state = "lawyer_galaxy_red"
item_state = "r_suit"
-/obj/item/clothing/under/rank/civilian/cookjorts
- name = "grilling shorts"
- desc = "For when all you want in life is to grill for god's sake!"
- icon_state = "cookjorts"
-
/obj/item/clothing/under/rank/civilian/janitor
name = "janitor's jumpsuit"
desc = "It's the official uniform of a Nanotrasen janitor. It has minor protection from biohazards."
diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm
index 55b20b328ac8..c2584679cb5c 100644
--- a/code/modules/clothing/under/jobs/command.dm
+++ b/code/modules/clothing/under/jobs/command.dm
@@ -50,12 +50,6 @@
can_adjust = FALSE
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
-/obj/item/clothing/under/rank/command/captain/parade
- name = "captain's parade uniform"
- desc = "A captain's luxury-wear, for special occasions."
- icon_state = "captain_parade"
- item_state = "b_suit"
- can_adjust = FALSE
//Head of Personnel
@@ -73,16 +67,6 @@
can_adjust = FALSE
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
-/obj/item/clothing/under/rank/command/head_of_personnel/nt
- icon_state = "hop_nt"
-
-/obj/item/clothing/under/rank/command/head_of_personnel/nt/skirt
- name = "head of personnel's jumpskirt"
- desc = "It's a jumpskirt worn by someone who works in the position of \"Head of Personnel\"."
- icon_state = "hop_nt"
- body_parts_covered = CHEST|GROIN|ARMS
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
-
/obj/item/clothing/under/rank/command/head_of_personnel/suit
name = "head of personnel's suit"
desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble."
@@ -98,15 +82,3 @@
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
-
-/obj/item/clothing/under/rank/command/captain/nt
- desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"."
- icon_state = "captain_nt"
- item_state = "b_suit"
-
-/obj/item/clothing/under/rank/command/captain/nt/skirt
- name = "captain's jumpskirt"
- desc = "It's a blue jumpskirt with some gold markings denoting the rank of \"Captain\"."
- icon_state = "captain_nt_skirt"
- body_parts_covered = CHEST|GROIN|ARMS
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm
index 7a95273c22f2..183e957d2338 100644
--- a/code/modules/clothing/under/jobs/medical.dm
+++ b/code/modules/clothing/under/jobs/medical.dm
@@ -136,7 +136,7 @@
/obj/item/clothing/under/rank/medical/paramedic
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic."
name = "paramedic jumpsuit"
- icon_state = "paramedic"
+ icon_state = "pmedic"
item_state = "w_suit"
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
@@ -144,7 +144,7 @@
/obj/item/clothing/under/rank/medical/paramedic/skirt
name = "paramedic jumpskirt"
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic."
- icon_state = "paramedic_skirt"
+ icon_state = "pmedic_skirt"
item_state = "w_suit"
body_parts_covered = CHEST|GROIN|ARMS
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
@@ -174,7 +174,7 @@
desc = "A light white gown that allows easy access to any patient who wears this."
icon_state = "gownwhite"
item_state = "gownwhite"
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
can_adjust = FALSE
/obj/item/clothing/under/rank/medical/gown/green
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index cf08ad4ed4c6..46a1ff275d15 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -99,16 +99,19 @@
/obj/item/clothing/under/rank/security/brig_phys/nt
name = "security medic's uniform"
desc = "A lightly armored uniform worn by members of Nanotrasen's Asset Protection Medical Corps."
- icon_state = "rbrig_phys"
+ icon_state = "security_medic"
item_state = "r_suit"
+ mob_overlay_state = "rbrig_phys"
/obj/item/clothing/under/rank/security/brig_phys/nt/skirt
name = "security medic's uniform"
desc = "A lightly armored uniform, with a skirt, worn by members of Nanotrasen's Asset Protection Medical Corps."
- icon_state = "rbrig_phys_skirt"
+ icon_state = "security_medic_skirt"
+ mob_overlay_state = "rbrig_phys_skirt"
body_parts_covered = CHEST|GROIN|ARMS
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+
// Warden //
/obj/item/clothing/under/rank/security/warden
name = "warden's security suit"
@@ -287,18 +290,18 @@
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
-/obj/item/clothing/under/rank/security/officer/frontier
+/obj/item/clothing/under/frontiersmen
name = "\improper Frontiersmen uniform"
desc = "Worn by members of the Frontiersmen pirate fleet. It's very uncomfortable to move around in."
icon_state = "frontier"
item_state = "gy_suit"
-/obj/item/clothing/under/rank/security/officer/frontier/officer
+/obj/item/clothing/under/frontiersmen/officer
name = "\improper Frontiersmen officer's uniform"
desc = "Worn by officers of the Frontiersmen pirate fleet. It's less comfortable than it looks."
icon_state = "frontier_officer"
-/obj/item/clothing/under/rank/security/officer/frontier/admiral
+/obj/item/clothing/under/frontiersmen/admiral
name = "\improper Frontiersmen admiral's uniform"
desc = "Worn by admirals of the Frontiersmen pirate fleet. It's the only Frontiersman uniform that isn't mass produced."
icon_state = "frontier_admiral"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 5e3d288adca5..019d731a2708 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -113,15 +113,6 @@
armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
cuttable = FALSE
-/obj/item/clothing/under/misc/coordinator
- name = "coordinator jumpsuit"
- desc = "A jumpsuit made by party people, from party people, for party people."
- icon = 'icons/obj/clothing/under/command.dmi'
- mob_overlay_icon = 'icons/mob/clothing/under/command.dmi'
- icon_state = "captain_parade"
- item_state = "by_suit"
- can_adjust = FALSE
-
/obj/item/clothing/under/utility
icon = 'icons/obj/clothing/under/misc.dmi'
mob_overlay_icon = 'icons/mob/clothing/under/misc.dmi'
diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm
index 8f30c0cab2ce..58e83cf71284 100644
--- a/code/modules/clothing/under/shorts.dm
+++ b/code/modules/clothing/under/shorts.dm
@@ -33,3 +33,8 @@
/obj/item/clothing/under/shorts/purple
name = "purple athletic shorts"
icon_state = "purpleshorts"
+
+/obj/item/clothing/under/shorts/cookjorts
+ name = "grilling shorts"
+ desc = "For when all you want in life is to grill for god's sake!"
+ icon_state = "greyshorts"
diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm
index 1dabceb6db24..f74748f71fbb 100644
--- a/code/modules/clothing/under/skirt_dress.dm
+++ b/code/modules/clothing/under/skirt_dress.dm
@@ -93,4 +93,4 @@
desc = "A pretty red dress with big pink ribbons attached. Intended to be worn by Kepori cosplayers, but also fits other species."
icon_state = "rilena_dress"
item_state = "rilena_dress"
- supports_variations = KEPORI_VARIATION
+ //supports_variations = KEPORI_VARIATION
diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm
index 786f2dcd5fa3..5344ec98d06b 100644
--- a/code/modules/clothing/under/suits.dm
+++ b/code/modules/clothing/under/suits.dm
@@ -29,7 +29,6 @@
item_state = "waiter"
/obj/item/clothing/under/suit/waiter/syndicate
- name = "syndicate waiter's outfit"
icon_state = "waiter_s"
item_state = "waiter_s"
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 36cc7c96220e..85c9996489e2 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -7,7 +7,7 @@
alt_covers_chest = TRUE
icon = 'icons/obj/clothing/under/syndicate.dmi'
mob_overlay_icon = 'icons/mob/clothing/under/syndicate.dmi'
- supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
/obj/item/clothing/under/syndicate/skirt
name = "tactical skirtleneck"
@@ -17,7 +17,7 @@
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
alt_covers_chest = TRUE
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/obj/item/clothing/under/syndicate/bloodred
name = "blood-red sneaksuit"
@@ -27,7 +27,7 @@
armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 50, "acid" = 40)
resistance_flags = FIRE_PROOF | ACID_PROOF
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/bloodred/sleepytime
name = "blood-red pajamas"
@@ -35,7 +35,7 @@
icon_state = "bloodred_pajamas"
item_state = "bl_suit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/tacticool
name = "tacticool turtleneck"
@@ -43,7 +43,7 @@
icon_state = "tactifool"
item_state = "bl_suit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
- supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
/obj/item/clothing/under/syndicate/tacticool/skirt
name = "tacticool skirtleneck"
@@ -52,7 +52,7 @@
item_state = "bl_suit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/syndicate/sniper
name = "Tactical turtleneck suit"
@@ -75,7 +75,7 @@
desc = "With a suit lined with this many pockets, you are ready to operate."
icon_state = "syndicate_combat"
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/rus_army
name = "advanced military tracksuit"
@@ -93,22 +93,6 @@
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
alt_covers_chest = TRUE
-/obj/item/clothing/under/syndicate/ngr/officer
- name = "NGR officer uniform"
- desc = "A black uniform worn by officers of the New Gorlex Republic."
- icon_state = "ngr_officer"
- can_adjust = FALSE
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
- alt_covers_chest = TRUE
-
-/obj/item/clothing/under/syndicate/ngr
- name = "NGR uniform"
- desc = "A button-up in a tasteful shade of gray with red pants, used as the basic uniform of the New Gorlex Republic."
- icon_state = "ngr_grunt"
- can_adjust = FALSE
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
- alt_covers_chest = TRUE
-
/obj/item/clothing/under/syndicate/gorlex
name = "Gorlex Marauder uniform"
desc = "Originally worn by the miners of the Gorlex VII colony, it is now donned by veteran Gorlex Marauders."
@@ -116,7 +100,7 @@
can_adjust = FALSE
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
alt_covers_chest = TRUE
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/cybersun
name = "cybersun jumpsuit"
@@ -131,7 +115,7 @@
icon_state = "cybersun"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 100)
alt_covers_chest = TRUE
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/cybersun/officer
name = "cybersun officer's suit"
@@ -146,7 +130,7 @@
icon_state = "cybersun_med"
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/obj/item/clothing/under/syndicate/medic/skirt
name = "Cybersun medical jumpskirt"
@@ -154,7 +138,7 @@
icon_state = "cybersun_med_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/obj/item/clothing/under/syndicate/donk
name = "Donk! Co. employee uniform"
@@ -164,14 +148,14 @@
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
body_parts_covered = CHEST|GROIN|ARMS
alt_covers_chest = TRUE
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/syndicate/donk/qm
name = "Donk! Co. manager uniform"
desc = "The standard uniform of Donk Co. managers. Direct all complaints here."
icon_state = "donk_qm"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/suit/hazardvest/donk
name = "Donk! Co. employee vest"
diff --git a/code/modules/donator/_donator.dm b/code/modules/donator/_donator.dm
index b18dbe8f78b3..dd4df369cfea 100644
--- a/code/modules/donator/_donator.dm
+++ b/code/modules/donator/_donator.dm
@@ -23,7 +23,7 @@ GLOBAL_PROTECT(donators)
/client/proc/do_donator_redemption()
set name = "Redeem Donator Reward"
- set category = "Donator"
+ set category = "OOC.Donator"
set desc = "Redeem a reward"
var/mob/client_mob = mob
@@ -38,7 +38,7 @@ GLOBAL_PROTECT(donators)
/client/proc/do_donator_wcir()
set name = "What Can I Redeem"
- set category = "Donator"
+ set category = "OOC.Donator"
set desc = "Currently available redemptions"
donator?.what_can_i_redeem(src.mob)
diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm
index f580aca9c0c9..64280475664a 100644
--- a/code/modules/economy/account.dm
+++ b/code/modules/economy/account.dm
@@ -1,55 +1,46 @@
-#define DUMPTIME 3000
-
/datum/bank_account
var/account_holder = "Rusty Venture"
var/account_balance = 0
- var/datum/job/account_job
var/list/bank_cards = list()
- ///If the account has been frozen by someone at an account management terminal.
- var/frozen = FALSE
var/add_to_accounts = TRUE
var/account_id
- var/being_dumped = FALSE //pink levels are rising
- var/withdrawDelay = 0
/datum/bank_account/New(newname, job)
if(add_to_accounts)
SSeconomy.bank_accounts += src
account_holder = newname
- account_job = job
account_id = rand(111111,999999)
/datum/bank_account/Destroy()
if(add_to_accounts)
SSeconomy.bank_accounts -= src
- for(var/obj/item/card/id/id_card in bank_cards)
+ for(var/obj/item/card/id/id_card as anything in bank_cards)
id_card.registered_account = null
+ SSeconomy.bank_money -= account_balance
return ..()
-/datum/bank_account/proc/dumpeet()
- being_dumped = TRUE
- withdrawDelay = world.time + DUMPTIME
-
/datum/bank_account/proc/_adjust_money(amt)
account_balance += amt
if(account_balance < 0)
account_balance = 0
/datum/bank_account/proc/has_money(amt)
- return account_balance >= amt && !frozen
+ return account_balance >= amt
-/datum/bank_account/proc/adjust_money(amt)
- if((amt < 0 && has_money(-amt)) || amt > 0 && !frozen)
+/datum/bank_account/proc/adjust_money(amt, reason = "cash")
+ if((amt < 0 && has_money(-amt)) || amt > 0)
+ SSblackbox.record_feedback("tally", "credits", amt, reason)
+ SSeconomy.bank_money += amt
_adjust_money(amt)
return TRUE
return FALSE
/datum/bank_account/proc/transfer_money(datum/bank_account/from, amount)
if(from.has_money(amount))
- adjust_money(amount)
+ adjust_money(amount, "transfer")
SSblackbox.record_feedback("amount", "credits_transferred", amount)
log_econ("[amount] credits were transferred from [from.account_holder]'s account to [src.account_holder]")
- from.adjust_money(-amount)
+ from.adjust_money(-amount, "transfer_out")
return TRUE
return FALSE
@@ -94,20 +85,4 @@
/datum/bank_account/ship/New(newname, budget)
account_holder = newname
- account_balance = budget
-
-/datum/bank_account/department
- account_holder = "Guild Credit Agency"
- var/department_id = "REPLACE_ME"
- add_to_accounts = FALSE
-
-/datum/bank_account/department/New(dep_id, budget)
- department_id = dep_id
- account_balance = budget
- account_holder = SSeconomy.department_accounts[dep_id]
- SSeconomy.generated_accounts += src
-
-/datum/bank_account/remote // Bank account not belonging to the local station
- add_to_accounts = FALSE
-
-#undef DUMPTIME
+ adjust_money(budget, "starting_money")
diff --git a/code/modules/economy/pay_stand.dm b/code/modules/economy/pay_stand.dm
index 071971c2a894..af7d9be4b947 100644
--- a/code/modules/economy/pay_stand.dm
+++ b/code/modules/economy/pay_stand.dm
@@ -54,7 +54,7 @@
if(momsdebitcard < 1)
to_chat(user, "ERROR: Invalid amount designated.")
return
- if(vbucks.registered_account.adjust_money(-momsdebitcard))
+ if(vbucks.registered_account.adjust_money(-momsdebitcard, "transfer"))
purchase(vbucks.registered_account.account_holder, momsdebitcard)
to_chat(user, "Thanks for purchasing! The vendor has been informed.")
return
@@ -117,7 +117,7 @@
return ..()
/obj/machinery/paystand/proc/purchase(buyer, price)
- my_card.registered_account.adjust_money(price)
+ my_card.registered_account.adjust_money(price, "transfer")
my_card.registered_account.bank_card_talk("Purchase made at your vendor by [buyer] for [price] credits.")
amount_deposited = amount_deposited + price
if(signaler && amount_deposited >= signaler_threshold)
diff --git a/code/modules/economy/selling_pad.dm b/code/modules/economy/selling_pad.dm
index 46d660c5cec3..cf155ad251bd 100644
--- a/code/modules/economy/selling_pad.dm
+++ b/code/modules/economy/selling_pad.dm
@@ -34,15 +34,9 @@
sell_account = port.current_ship?.ship_account
/obj/machinery/computer/selling_pad_control/attackby(obj/item/I, mob/user)
- var/value = 0
- if(istype(I, /obj/item/spacecash/bundle))
- var/obj/item/spacecash/bundle/C = I
- value = C.value
- else if(istype(I, /obj/item/holochip))
- var/obj/item/holochip/H = I
- value = H.credits
+ var/value = I.get_item_credit_value()
if(value)
- sell_account.adjust_money(value)
+ sell_account.adjust_money(value, "selling_pad")
to_chat(user, "You deposit [I]. The Vessel Budget is now [sell_account.account_balance] cr.")
qdel(I)
return TRUE
@@ -156,7 +150,7 @@
total_report.total_amount[E] += ex.total_amount[E]
total_report.total_value[E] += ex.total_value[E]
- sell_account.adjust_money(value)
+ sell_account.adjust_money(value, "selling_pad")
if(!value)
status_report += "Nothing"
diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm
deleted file mode 100644
index 68a38f0479e1..000000000000
--- a/code/modules/events/wizard/magicarp.dm
+++ /dev/null
@@ -1,75 +0,0 @@
-/datum/round_event_control/wizard/magicarp //these fish is loaded
- name = "Magicarp"
- weight = 1
- typepath = /datum/round_event/wizard/magicarp
- max_occurrences = 1
- earliest_start = 0 MINUTES
-
-/datum/round_event/wizard/magicarp
- announceWhen = 3
- startWhen = 50
-
-/datum/round_event/wizard/magicarp/setup()
- startWhen = rand(40, 60)
-
-/datum/round_event/wizard/magicarp/announce(fake)
- priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
-
-/datum/round_event/wizard/magicarp/start()
- for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
- if(prob(5))
- new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc)
- else
- new /mob/living/simple_animal/hostile/carp/ranged(C.loc)
-
-/mob/living/simple_animal/hostile/carp/ranged
- name = "magicarp"
- desc = "50% magic, 50% carp, 100% horrible."
- icon_state = "magicarp"
- icon_living = "magicarp"
- icon_dead = "magicarp_dead"
- icon_gib = "magicarp_gib"
- ranged = 1
- retreat_distance = 2
- minimum_distance = 0 //Between shots they can and will close in to nash
- projectiletype = /obj/projectile/magic
- projectilesound = 'sound/weapons/emitter.ogg'
- maxHealth = 50
- health = 50
- gold_core_spawnable = NO_SPAWN
- random_color = FALSE
- food_type = list()
- tame_chance = 0
- bonus_tame_chance = 0
- var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection,
- /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
- /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage)
-
-/mob/living/simple_animal/hostile/carp/ranged/Initialize()
- projectiletype = pick(allowed_projectile_types)
- . = ..()
-
-/mob/living/simple_animal/hostile/carp/ranged/chaos
- name = "chaos magicarp"
- desc = "50% carp, 100% magic, 150% horrible."
- color = "#00FFFF"
- maxHealth = 75
- health = 75
- gold_core_spawnable = NO_SPAWN
-
-/mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot()
- projectiletype = pick(allowed_projectile_types)
- ..()
-
-/mob/living/simple_animal/hostile/carp/ranged/xenobiology // these are for the xenobio gold slime pool
- gold_core_spawnable = HOSTILE_SPAWN
- allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport,
- /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage,
- /obj/projectile/magic/spell/magic_missile, /obj/projectile/magic/aoe/lightning, /obj/projectile/magic/locker) //thanks Lett1 /finally, we can synthesize the lockerfish
-
-/mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology
- gold_core_spawnable = HOSTILE_SPAWN
- allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection,
- /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
- /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/nothing,
- /obj/projectile/magic/aoe/lightning, /obj/projectile/magic/necropotence, /obj/projectile/magic/fortify, /obj/projectile/magic/spell/magic_missile)//now THIS is chaos
diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm
index 82edb0698208..f474018739d0 100644
--- a/code/modules/fishing/fish/_fish.dm
+++ b/code/modules/fishing/fish/_fish.dm
@@ -3,7 +3,7 @@
name = "generic looking aquarium fish"
desc = "very bland"
icon = 'icons/obj/aquarium.dmi'
- icon_state = "bugfish"
+ icon_state = "trout" //Replace this with "bugfish" from tg please
w_class = WEIGHT_CLASS_TINY
diff --git a/code/modules/fishing/fishing_portal_machine.dm b/code/modules/fishing/fishing_portal_machine.dm
index 0cbeae7c3dac..a070e7b7f797 100644
--- a/code/modules/fishing/fishing_portal_machine.dm
+++ b/code/modules/fishing/fishing_portal_machine.dm
@@ -6,7 +6,7 @@
icon_state = "portal_off"
idle_power_usage = 0
- active_power_usage = 2000
+ active_power_usage = ACTIVE_DRAW_HIGH
anchored = FALSE
density = TRUE
@@ -35,12 +35,12 @@
/obj/machinery/fishing_portal_generator/proc/activate()
active = AddComponent(/datum/component/fishing_spot, fishing_source)
- use_power = ACTIVE_POWER_USE
+ set_active_power()
update_appearance()
/obj/machinery/fishing_portal_generator/proc/deactivate()
QDEL_NULL(active)
- use_power = IDLE_POWER_USE
+ set_idle_power()
update_appearance()
/obj/machinery/fishing_portal_generator/on_set_is_operational(old_value)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 258e9a56217f..ced086e1dfc6 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -525,11 +525,11 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/datum/hallucination/delusion
var/list/image/delusions = list()
-/datum/hallucination/delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = 300,skip_nearby = TRUE, custom_icon = null, custom_icon_file = null, custom_name = null)
+/datum/hallucination/delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = rand(30,300),skip_nearby = TRUE, custom_icon = null, custom_icon_file = null, custom_name = null)
set waitfor = FALSE
. = ..()
var/image/A = null
- var/kind = force_kind ? force_kind : pick("nothing","monkey","corgi","carp","skeleton","demon","zombie")
+ var/kind = force_kind ? force_kind : pick("doe","mi-go","carp","hermit","frontiersman","ramzi")
feedback_details += "Type: [kind]"
var/list/nearby
if(skip_nearby)
@@ -540,27 +540,24 @@ GLOBAL_LIST_INIT(hallucination_list, list(
if(skip_nearby && (H in nearby))
continue
switch(kind)
- if("nothing")
- A = image('icons/effects/effects.dmi',H,"nothing")
- A.name = "..."
- if("monkey")//Monkey
- A = image('icons/mob/monkey.dmi',H,"monkey1")
- A.name = "Monkey ([rand(1,999)])"
+ if("doe")//Doe
+ A = image('icons/mob/animal.dmi',H,"deer-doe")
+ A.name = "Doe"
if("carp")//Carp
A = image('icons/mob/carp.dmi',H,"carp")
A.name = "Space Carp"
- if("corgi")//Corgi
- A = image('icons/mob/pets.dmi',H,"corgi")
- A.name = "Corgi"
- if("skeleton")//Skeletons
- A = image('icons/mob/human.dmi',H,"skeleton")
- A.name = "Skeleton"
- if("zombie")//Zombies
- A = image('icons/mob/human.dmi',H,"zombie")
- A.name = "Zombie"
- if("demon")//Demon
- A = image('icons/mob/mob.dmi',H,"daemon")
- A.name = "Demon"
+ if("mi-go")//Mi-go
+ A = image('icons/mob/animal.dmi',H,"mi-go")
+ A.name = "Mi-go"
+ if("hermit")//Hermit
+ A = image('icons/mob/simple_human.dmi',H,"survivor_gunslinger")
+ A.name = "Hermit Soldier"
+ if("frontiersman")//Frontiersman
+ A = image('icons/mob/simple_human.dmi',H,"frontiersmanrangedminigun")
+ A.name = "Frontiersman"
+ if("ramzi")//Ramzi
+ A = image('icons/mob/simple_human.dmi',H,"ramzi_base")
+ A.name = "Ramzi Commando"
if("custom")
A = image(custom_icon_file, H, custom_icon)
A.name = custom_name
@@ -568,8 +565,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
if(target.client)
delusions |= A
target.client.images |= A
- if(duration)
- QDEL_IN(src, duration)
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), duration)
/datum/hallucination/delusion/Destroy()
for(var/image/I in delusions)
@@ -580,25 +576,28 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/datum/hallucination/self_delusion
var/image/delusion
-/datum/hallucination/self_delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = 300, custom_icon = null, custom_icon_file = null, wabbajack = TRUE) //set wabbajack to false if you want to use another fake source
+/datum/hallucination/self_delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = rand(30,300), custom_icon = null, custom_icon_file = null, wabbajack = TRUE) //set wabbajack to false if you want to use another fake source
set waitfor = FALSE
..()
var/image/A = null
- var/kind = force_kind ? force_kind : pick("monkey","corgi","carp","skeleton","demon","zombie","robot")
+ var/kind = force_kind ? force_kind : pick("doe","mi-go","carp","hermit","frontiersman","ramzi","pai","robot")
feedback_details += "Type: [kind]"
switch(kind)
- if("monkey")//Monkey
- A = image('icons/mob/monkey.dmi',target,"monkey1")
+ if("doe")//Doe
+ A = image('icons/mob/animal.dmi',target,"deer-doe")
if("carp")//Carp
A = image('icons/mob/animal.dmi',target,"carp")
- if("corgi")//Corgi
- A = image('icons/mob/pets.dmi',target,"corgi")
- if("skeleton")//Skeletons
- A = image('icons/mob/human.dmi',target,"skeleton")
- if("zombie")//Zombies
- A = image('icons/mob/human.dmi',target,"zombie")
- if("demon")//Demon
- A = image('icons/mob/mob.dmi',target,"daemon")
+ if("mi-go")//Mi-go
+ A = image('icons/mob/animal.dmi',target,"mi-go")
+ if("hermit")//Hermit
+ A = image('icons/mob/simple_human.dmi',target,"survivor_base")
+ if("frontiersman")//Frontiersman
+ A = image('icons/mob/simple_human.dmi',target,"frontiersmanranged")
+ if("ramzi")//Ramzi
+ A = image('icons/mob/simple_human.dmi',target,"ramzi_base")
+ if("pai")//pAI
+ A = image('icons/mob/pai.dmi',target,"repairbot")
+ target.playsound_local(target,'sound/effects/pai_boot.ogg', 75, 1)
if("robot")//Cyborg
A = image('icons/mob/robots.dmi',target,"robot")
target.playsound_local(target,'sound/voice/liveagain.ogg', 75, 1)
@@ -610,7 +609,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
to_chat(target, "...you look down and notice... you aren't the same as you used to be...")
delusion = A
target.client.images |= A
- QDEL_IN(src, duration)
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), duration)
/datum/hallucination/self_delusion/Destroy()
if(target.client)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 64bb4fdae667..2eb4b1e8564b 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -4,7 +4,7 @@
/obj/item/reagent_containers/food/drinks
name = "drink"
desc = "yummy"
- icon = 'icons/obj/drinks.dmi'
+ icon = 'icons/obj/drinks/drinks.dmi'
icon_state = null
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
@@ -39,7 +39,7 @@
else
M.visible_message("[user] attempts to feed [M] the contents of [src].", \
"[user] attempts to feed you the contents of [src].")
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return
if(!reagents || !reagents.total_volume)
return // The drink might be empty after the delay, such as by spam-feeding
@@ -120,27 +120,36 @@
if(!.) //if the bottle wasn't caught
smash(hit_atom, throwingdatum?.thrower, TRUE)
-/obj/item/reagent_containers/food/drinks/proc/smash(atom/target, mob/thrower, ranged = FALSE)
+/obj/item/reagent_containers/food/drinks/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
+ smash()
+ ..()
+
+/obj/item/reagent_containers/food/drinks/proc/smash(atom/target = FALSE, mob/thrower = FALSE, ranged = FALSE)
if(!isGlass)
return
- if(QDELING(src) || !target || !(flags_1 & INITIALIZED_1)) //Invalid loc
+ if(QDELING(src) || !(flags_1 & INITIALIZED_1)) //Invalid loc
return
- if(bartender_check(target) && ranged)
- return
- var/obj/item/broken_bottle/B = new (loc)
- B.icon_state = icon_state
- var/icon/I = new(icon, icon_state)
- I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
- I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
- B.icon = I
- B.name = "broken [name]"
+ if(target)
+ if(bartender_check(target) && ranged)
+ return
+ var/obj/item/broken_bottle/smashed_bottle = new (loc)
+ if(!ranged && thrower)
+ thrower.put_in_hands(smashed_bottle)
+ smashed_bottle.icon_state = icon_state
+ var/icon/new_icon = new(icon, icon_state)
+ new_icon.Blend(smashed_bottle.broken_outline, ICON_OVERLAY, rand(5), 1)
+ new_icon.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
+ smashed_bottle.icon = new_icon
+ smashed_bottle.name = "broken [name]"
if(prob(33))
- var/obj/item/shard/S = new(drop_location())
- target.Bumped(S)
+ var/obj/item/shard/new_shard = new(drop_location())
+ if(target)
+ target.Bumped(new_shard)
playsound(src, "shatter", 70, TRUE)
- transfer_fingerprints_to(B)
+ transfer_fingerprints_to(smashed_bottle)
qdel(src)
- target.Bumped(B)
+ if(target)
+ target.Bumped(smashed_bottle)
/obj/item/reagent_containers/food/drinks/bullet_act(obj/projectile/P)
. = ..()
@@ -287,7 +296,7 @@
/obj/item/reagent_containers/food/drinks/waterbottle
name = "bottle of water"
desc = "A bottle of water filled at an old Earth bottling facility."
- icon = 'icons/obj/drinks.dmi'
+ icon = 'icons/obj/drinks/drinks.dmi'
icon_state = "smallbottle"
item_state = "bottle"
list_reagents = list(/datum/reagent/water = 49.5, /datum/reagent/fluorine = 0.5)//see desc, don't think about it too hard
@@ -407,7 +416,7 @@
return
var/obj/item/broken_bottle/B = new (loc)
B.icon_state = icon_state
- var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
+ var/icon/I = new('icons/obj/drinks/drinks.dmi', src.icon_state)
I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
B.icon = I
@@ -466,7 +475,7 @@
/obj/item/reagent_containers/food/drinks/colocup
name = "colo cup"
desc = "A cheap, mass produced style of cup, typically used at parties. They never seem to come out red, for some reason..."
- icon = 'icons/obj/drinks.dmi'
+ icon = 'icons/obj/drinks/drinks.dmi'
icon_state = "colocup"
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
@@ -654,16 +663,12 @@
list_reagents = list(/datum/reagent/consumable/sodawater = 50)
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime
- name = "orange soda"
- desc = "You wanted ORANGE. It gave you Lemon Lime."
+ name = "lemon-lime soda"
+ desc = "Is it lemon? Is it lime? The expert opinions vary."
icon_state = "lemon-lime"
list_reagents = list(/datum/reagent/consumable/lemon_lime = 30)
foodtype = FRUIT
-/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/Initialize()
- . = ..()
- name = "lemon-lime soda"
-
/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry
name = "Sol Dry"
desc = "Maybe this will help your tummy feel better. Maybe not."
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index b4d8cf8090c9..3ea468d19c1f 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -34,39 +34,7 @@
volume = 50
custom_price = 55
-/obj/item/reagent_containers/food/drinks/bottle/smash(mob/living/target, mob/thrower, ranged = FALSE)
- if(QDELING(src) || !target || !(flags_1 & INITIALIZED_1)) //Invalid loc
- return
- //Creates a shattering noise and replaces the bottle with a broken_bottle
- if(bartender_check(target) && ranged)
- return
- var/obj/item/broken_bottle/B = new (loc)
- if(!ranged && thrower)
- thrower.put_in_hands(B)
- B.icon_state = icon_state
-
- var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
- I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
- I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
- B.icon = I
-
- if(isGlass)
- if(prob(33))
- var/obj/item/shard/S = new(drop_location())
- target.Bumped(S)
- playsound(src, "shatter", 70, TRUE)
- else
- B.force = 0
- B.throwforce = 0
- B.desc = "A carton with the bottom half burst open. Might give you a papercut."
- B.name = "broken [name]"
- transfer_fingerprints_to(B)
-
- qdel(src)
- target.Bumped(B)
-
/obj/item/reagent_containers/food/drinks/bottle/attack(mob/living/target, mob/living/user)
-
if(!target)
return
@@ -138,7 +106,7 @@
/obj/item/broken_bottle
name = "broken bottle"
desc = "A bottle with a sharp broken bottom."
- icon = 'icons/obj/drinks.dmi'
+ icon = 'icons/obj/drinks/drinks.dmi'
icon_state = "broken_bottle"
force = 9
throwforce = 5
@@ -149,7 +117,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("stabbed", "slashed", "attacked")
sharpness = IS_SHARP
- var/static/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken")
+ var/static/icon/broken_outline = icon('icons/obj/drinks/drinks.dmi', "broken")
/obj/item/broken_bottle/Initialize()
. = ..()
@@ -360,6 +328,12 @@
icon_state = "fernetbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/fernet = 100)
+/obj/item/reagent_containers/food/drinks/bottle/triplesec
+ name = "Teeka-Gih's triple sec liqueur"
+ desc = "A bottle of triple sec originating from Bezuts."
+ icon_state = "triplesecbottle"
+ list_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 100)
+
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
@@ -374,6 +348,18 @@
list_reagents = list(/datum/reagent/consumable/orangejuice = 100)
foodtype = FRUIT | BREAKFAST
+/obj/item/reagent_containers/food/drinks/bottle/lemonjuice
+ name = "lemon juice"
+ desc = "Lemonade for everyone!"
+ custom_price = 100
+ icon_state = "lemonjuice"
+ item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+ isGlass = FALSE
+ list_reagents = list(/datum/reagent/consumable/lemonjuice = 100)
+ foodtype = FRUIT
+
/obj/item/reagent_containers/food/drinks/bottle/cream
name = "milk cream"
desc = "It's cream. Made from milk. What else did you think you'd find in there?"
@@ -494,6 +480,20 @@
list_reagents = list(/datum/reagent/consumable/ethanol/creme_de_coconut = 100)
isGlass = TRUE
+/obj/item/reagent_containers/food/drinks/bottle/cacao
+ name = "Sharai's Pure Cacao Delight"
+ desc = "Seems to be some promotional product for a Teceti video game. You're pretty certain this stuff is synthetic."
+ icon_state = "cacaobottle"
+ list_reagents = list(/datum/reagent/consumable/ethanol/creme_de_cacao = 100)
+ isGlass = TRUE
+
+/obj/item/reagent_containers/food/drinks/bottle/menthe
+ name = "Mora's Pure Mint Delight"
+ desc = "Seems to be some promotional product for a Teceti video game. You're pretty certain this stuff is synthetic."
+ icon_state = "mintbottle"
+ list_reagents = list(/datum/reagent/consumable/ethanol/creme_de_menthe = 100)
+ isGlass = TRUE
+
////////////////////////// MOLOTOV ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/molotov
name = "molotov cocktail"
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index 589e986aaeeb..0adf98ba5666 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -79,7 +79,7 @@
else
M.visible_message("[user] attempts to feed [M] from [src].", \
"[user] attempts to feed you from [src].")
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return
if(!reagents || !reagents.total_volume)
return // The condiment might be empty after the delay.
@@ -322,14 +322,3 @@
desc = "A delicious oil used in cooking"
icon_state = "oliveoil"
list_reagents = list(/datum/reagent/consumable/cornoil = 50)
-
-/obj/item/reagent_containers/food/condiment/pack/sugar
- name = "sugar pack"
- originalname = "sugar"
- list_reagents = list(/datum/reagent/consumable/sugar = 5)
-
-/obj/item/reagent_containers/food/condiment/pack/creamer
- name = "creamer" /// dont laugh you child
- originalname = "cream"
- list_reagents = list(/datum/reagent/consumable/cream = 5)
-
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 2dd04174ba85..b64d52eea54a 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -126,7 +126,7 @@ All foods are distributed among various categories. Use common sense.
"[user] cannot force any more of [src] down your throat!")
return FALSE
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return
log_combat(user, M, "fed", reagents.log_list())
M.visible_message("[user] forces [M] to eat [src]!", \
diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm
index 8bff9db3384f..94477d1932aa 100644
--- a/code/modules/food_and_drinks/food/snacks_vend.dm
+++ b/code/modules/food_and_drinks/food/snacks_vend.dm
@@ -140,7 +140,7 @@
/obj/item/reagent_containers/food/snacks/energybar
name = "High-power energy bars"
icon_state = "energybar"
- desc = "An energy bar with a lot of punch, you probably shouldn't eat this if you're not an Ethereal."
+ desc = "An energy bar with a lot of punch, you probably shouldn't eat this if you're not an Elzuosa."
trash = /obj/item/trash/energybar
list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/liquidelectricity = 3)
filling_color = "#97ee63"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/coffeemaker.dm b/code/modules/food_and_drinks/kitchen_machinery/coffeemaker.dm
deleted file mode 100644
index 7b98be6a16c4..000000000000
--- a/code/modules/food_and_drinks/kitchen_machinery/coffeemaker.dm
+++ /dev/null
@@ -1,689 +0,0 @@
-#define BEAN_CAPACITY 10 //amount of coffee beans that can fit inside the impressa coffeemaker
-
-/obj/machinery/coffeemaker
- name = "coffeemaker"
- desc = "A Modello 3 Coffeemaker that brews coffee and holds it at the perfect temperature of 176 fahrenheit. Made by Piccionaia Home Appliances."
- icon = 'icons/obj/machines/coffeemaker.dmi'
- icon_state = "coffeemaker_nopot_nocart"
- base_icon_state = "coffeemaker"
- resistance_flags = FIRE_PROOF | ACID_PROOF
- circuit = /obj/item/circuitboard/machine/coffeemaker
- var/obj/item/reagent_containers/food/drinks/bottle/coffeepot/coffeepot = null
- var/brewing = FALSE
- var/brew_time = 20 SECONDS
- var/speed = 1
- /// The coffee cartridge to make coffee from. In the future, coffee grounds are like printer ink.
- var/obj/item/coffee_cartridge/cartridge = null
- /// The type path to instantiate for the coffee cartridge the device initially comes with, eg. /obj/item/coffee_cartridge
- var/initial_cartridge = /obj/item/coffee_cartridge
- /// The number of cups left
- var/coffee_cups = 15
- var/max_coffee_cups = 15
- /// The amount of sugar packets left
- var/sugar_packs = 10
- var/max_sugar_packs = 10
- /// The amount of sweetener packets left
- var/sweetener_packs = 10
- var/max_sweetener_packs = 10
- /// The amount of creamer packets left
- var/creamer_packs = 10
- var/max_creamer_packs = 10
-
- var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine")
- var/static/radial_brew = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_brew")
- var/static/radial_eject_pot = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject_pot")
- var/static/radial_eject_cartridge = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject_cartridge")
- var/static/radial_take_cup = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_take_cup")
- var/static/radial_take_sugar = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_take_sugar")
- var/static/radial_take_sweetener = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_take_sweetener")
- var/static/radial_take_creamer = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_take_creamer")
-
-/obj/machinery/coffeemaker/Initialize(mapload)
- . = ..()
- if(mapload)
- coffeepot = new /obj/item/reagent_containers/food/drinks/bottle/coffeepot(src)
- cartridge = new /obj/item/coffee_cartridge(src)
-
-/obj/machinery/coffeemaker/deconstruct()
- coffeepot?.forceMove(drop_location())
- cartridge?.forceMove(drop_location())
- return ..()
-
-/obj/machinery/coffeemaker/Destroy()
- QDEL_NULL(coffeepot)
- QDEL_NULL(cartridge)
- return ..()
-
-/obj/machinery/coffeemaker/Exited(atom/movable/gone, direction)
- . = ..()
- if(gone == coffeepot)
- coffeepot = null
- update_appearance(UPDATE_OVERLAYS)
- if(gone == cartridge)
- cartridge = null
- update_appearance(UPDATE_OVERLAYS)
-/obj/machinery/coffeemaker/examine(mob/user)
- . = ..()
- if(!in_range(user, src) && !issilicon(user) && !isobserver(user))
- . += span_warning("You're too far away to examine [src]'s contents and display!")
- return
-
- if(brewing)
- . += span_warning("\The [src] is brewing.")
- return
-
- if(panel_open)
- . += span_notice("[src]'s maintenance hatch is open!")
- return
-
- if(coffeepot || cartridge)
- . += span_notice("\The [src] contains:")
- if(coffeepot)
- . += span_notice("- \A [coffeepot].")
- if(cartridge)
- . += span_notice("- \A [cartridge].")
- return
-
- if(!(machine_stat & (NOPOWER|BROKEN)))
- . += "[span_notice("The status display reads:")]\n"+\
- span_notice("- Brewing coffee at [speed*100]%.")
- if(coffeepot)
- for(var/datum/reagent/consumable/cawfee as anything in coffeepot.reagents.reagent_list)
- . += span_notice("- [cawfee.volume] units of coffee in pot.")
- if(cartridge)
- if(cartridge.charges < 1)
- . += span_notice("- grounds cartridge is empty.")
- else
- . += span_notice("- grounds cartridge has [cartridge.charges] charges remaining.")
-
- if (coffee_cups >= 1)
- . += span_notice("There [coffee_cups == 1 ? "is" : "are"] [coffee_cups] coffee cup[coffee_cups != 1 && "s"] left.")
- else
- . += span_notice("There are no cups left.")
-
- if (sugar_packs >= 1)
- . += span_notice("There [sugar_packs == 1 ? "is" : "are"] [sugar_packs] packet[sugar_packs != 1 && "s"] of sugar left.")
- else
- . += span_notice("There is no sugar left.")
-
- if (sweetener_packs >= 1)
- . += span_notice("There [sweetener_packs == 1 ? "is" : "are"] [sweetener_packs] packet[sweetener_packs != 1 && "s"] of sweetener left.")
- else
- . += span_notice("There is no sweetener left.")
-
- if (creamer_packs > 1)
- . += span_notice("There [creamer_packs == 1 ? "is" : "are"] [creamer_packs] packet[creamer_packs != 1 && "s"] of creamer left.")
- else
- . += span_notice("There is no creamer left.")
-
-
-/obj/machinery/coffeemaker/update_overlays()
- . = ..()
- . += overlay_checks()
-
-/obj/machinery/coffeemaker/proc/overlay_checks()
- . = list()
- if(coffeepot)
- . += "coffeemaker_pot"
- if(cartridge)
- . += "coffeemaker_cartidge"
- return .
-
-/obj/machinery/coffeemaker/proc/replace_pot(mob/living/user, /obj/item/reagent_containers/food/drinks/bottle/coffeepot)
- if(!user)
- return FALSE
- if(coffeepot)
- try_put_in_hand(coffeepot, user)
- balloon_alert(user, "replaced pot")
- update_appearance(UPDATE_OVERLAYS)
- return TRUE
-
-/obj/machinery/coffeemaker/proc/replace_cartridge(mob/living/user, obj/item/coffee_cartridge/new_cartridge)
- if(!user)
- return FALSE
- if(cartridge)
- try_put_in_hand(cartridge, user)
- if(new_cartridge)
- cartridge = new_cartridge
- update_appearance(UPDATE_OVERLAYS)
- return TRUE
-
-/obj/machinery/coffeemaker/wrench_act(mob/living/user, obj/item/tool)
- . = ..()
- default_unfasten_wrench(user, tool)
- return TOOL_ACT_TOOLTYPE_SUCCESS
-
-/obj/machinery/coffeemaker/attackby(obj/item/attack_item, mob/living/user, params)
- //You can only screw open empty grinder
- if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item))
- return FALSE
-
- if(default_deconstruction_crowbar(attack_item))
- return
-
- if(panel_open) //Can't insert objects when its screwed open
- return TRUE
-
- if (istype(attack_item, /obj/item/reagent_containers/food/drinks/bottle/coffeepot) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container())
- var/obj/item/reagent_containers/food/drinks/bottle/coffeepot/new_pot = attack_item
- . = TRUE //no afterattack
- if(!user.transferItemToLoc(new_pot, src))
- return TRUE
- replace_pot(user, new_pot)
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
- if (istype(attack_item, /obj/item/reagent_containers/glass/coffee_cup) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container())
- var/obj/item/reagent_containers/glass/coffee_cup/new_cup = attack_item
- if(new_cup.reagents.total_volume > 0)
- balloon_alert(user, "the cup must be empty!")
- return
- if(coffee_cups >= max_coffee_cups)
- balloon_alert(user, "the cup holder is full!")
- return
- if(!user.transferItemToLoc(attack_item, src))
- return
- coffee_cups++
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
- if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/sugar))
- var/obj/item/reagent_containers/food/condiment/pack/sugar/new_pack = attack_item
- if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume)
- balloon_alert(user, "the pack must be full!")
- return
- if(sugar_packs >= max_sugar_packs)
- balloon_alert(user, "the sugar compartment is full!")
- return
- if(!user.transferItemToLoc(attack_item, src))
- return
- sugar_packs++
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
- if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/creamer))
- var/obj/item/reagent_containers/food/condiment/pack/creamer/new_pack = attack_item
- if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume)
- balloon_alert(user, "the pack must be full!")
- return
- if(creamer_packs >= max_creamer_packs)
- balloon_alert(user, "the creamer compartment is full!")
- return
- if(!user.transferItemToLoc(attack_item, src))
- return
- creamer_packs++
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
- if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/astrotame))
- var/obj/item/reagent_containers/food/condiment/pack/astrotame/new_pack = attack_item
- if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume)
- balloon_alert(user, "the pack must be full!")
- return
- else if(sweetener_packs >= max_sweetener_packs)
- balloon_alert(user, "the sweetener compartment is full!")
- return
- else if(!user.transferItemToLoc(attack_item, src))
- return
- sweetener_packs++
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
- if (istype(attack_item, /obj/item/coffee_cartridge) && !(attack_item.item_flags & ABSTRACT))
- var/obj/item/coffee_cartridge/new_cartridge = attack_item
- if(!user.transferItemToLoc(new_cartridge, src))
- return
- replace_cartridge(user, new_cartridge)
- balloon_alert(user, "added cartridge")
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
-/obj/machinery/coffeemaker/proc/try_brew()
- if(!cartridge)
- balloon_alert(usr, "no coffee cartridge inserted!")
- return FALSE
- if(cartridge.charges < 1)
- balloon_alert(usr, "coffee cartridge empty!")
- return FALSE
- if(!coffeepot)
- balloon_alert(usr, "no coffeepot inside!")
- return FALSE
- if(machine_stat & (NOPOWER|BROKEN))
- balloon_alert(usr, "machine unpowered!")
- return FALSE
- if(coffeepot.reagents.total_volume >= coffeepot.reagents.maximum_volume)
- balloon_alert(usr, "the coffeepot is already full!")
- return FALSE
- return TRUE
-
-/obj/machinery/coffeemaker/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave //I am positively certain that this is not a microwave
- . = ..()
-
- if(brewing || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user)))
- return
-
- var/list/options = list()
-
- if(coffeepot)
- options["Eject Pot"] = radial_eject_pot
-
- if(cartridge)
- options["Eject Cartridge"] = radial_eject_cartridge
-
- options["Brew"] = radial_brew //brew is always available as an option, when the machine is unable to brew the player is told by balloon alerts whats exactly wrong
-
- if(coffee_cups > 0)
- options["Take Cup"] = radial_take_cup
-
- if(sugar_packs > 0)
- options["Take Sugar"] = radial_take_sugar
-
- if(sweetener_packs > 0)
- options["Take Sweetener"] = radial_take_sweetener
-
- if(creamer_packs > 0)
- options["Take Creamer"] = radial_take_creamer
-
- if(isAI(user))
- if(machine_stat & NOPOWER)
- return
- options["Examine"] = radial_examine
-
- var/choice
-
- if(length(options) < 1)
- return
- if(length(options) == 1)
- choice = options[1]
- else
- choice = show_radial_menu(user, src, options, require_near = !issilicon(user))
-
- // post choice verification
- if(brewing || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user)))
- return
-
- switch(choice)
- if("Brew")
- brew(user)
- if("Eject Pot")
- eject_pot(user)
- if("Eject Cartridge")
- eject_cartridge(user)
- if("Examine")
- examine(user)
- if("Take Cup")
- take_cup(user)
- if("Take Sugar")
- take_sugar(user)
- if("Take Sweetener")
- take_sweetener(user)
- if("Take Creamer")
- take_creamer(user)
-
-/obj/machinery/coffeemaker/proc/eject_pot(mob/user)
- if(coffeepot)
- replace_pot(user)
-
-/obj/machinery/coffeemaker/proc/eject_cartridge(mob/user)
- if(cartridge)
- replace_cartridge(user)
-
-/obj/machinery/coffeemaker/proc/take_cup(mob/user)
- if(!coffee_cups) //shouldn't happen, but we all know how stuff manages to break
- balloon_alert(user, "no cups left!")
- return
- var/obj/item/reagent_containers/glass/coffee_cup/new_cup = new(get_turf(src))
- user.put_in_hands(new_cup)
- coffee_cups--
- update_appearance(UPDATE_OVERLAYS)
-
-/obj/machinery/coffeemaker/proc/take_sugar(mob/user)
- if(!sugar_packs)
- balloon_alert(user, "no sugar left!")
- return
- var/obj/item/reagent_containers/food/condiment/pack/sugar/new_pack = new(get_turf(src))
- user.put_in_hands(new_pack)
- sugar_packs--
- update_appearance(UPDATE_OVERLAYS)
-
-/obj/machinery/coffeemaker/proc/take_sweetener(mob/user)
- if(!sweetener_packs)
- balloon_alert(user, "no sweetener left!")
- return
- var/obj/item/reagent_containers/food/condiment/pack/astrotame/new_pack = new(get_turf(src))
- user.put_in_hands(new_pack)
- sweetener_packs--
- update_appearance(UPDATE_OVERLAYS)
-
-/obj/machinery/coffeemaker/proc/take_creamer(mob/user)
- if(!creamer_packs)
- balloon_alert(user, "no creamer left!")
- return
- var/obj/item/reagent_containers/food/condiment/pack/creamer/new_pack = new(drop_location())
- user.put_in_hands(new_pack)
- creamer_packs--
- update_appearance(UPDATE_OVERLAYS)
-
-///Updates the smoke state to something else, setting particles if relevant
-/obj/machinery/coffeemaker/proc/toggle_steam()
- QDEL_NULL(particles)
- if(brewing)
- particles.position = list(-6, 0, 0)
-
-/obj/machinery/coffeemaker/proc/operate_for(time, silent = FALSE)
- brewing = TRUE
- if(!silent)
- playsound(src, 'sound/machines/coffeemaker_brew.ogg', 20, vary = TRUE)
- toggle_steam()
- use_power(active_power_usage * time * 0.1) // .1 needed here to convert time (in deciseconds) to seconds such that watts * seconds = joules
- addtimer(CALLBACK(src, PROC_REF(stop_operating)), time / speed)
-
-/obj/machinery/coffeemaker/proc/stop_operating()
- brewing = FALSE
- toggle_steam()
-
-/obj/machinery/coffeemaker/proc/brew()
- power_change()
- if(!try_brew())
- return
- operate_for(brew_time)
- coffeepot.reagents.add_reagent_list(cartridge.drink_type)
- cartridge.charges--
-
-//Coffee Cartridges: like toner, but for your coffee!
-/obj/item/coffee_cartridge
- name = "coffeemaker cartridge- Caffè Generico"
- desc = "A coffee cartridge manufactured by Piccionaia Coffee, for use with the Modello 3 system."
- icon = 'icons/obj/machines/coffeemaker.dmi'
- icon_state = "cartridge_basic"
- var/charges = 4
- var/list/drink_type = list(/datum/reagent/consumable/coffee = 120)
-
-/obj/item/coffee_cartridge/examine(mob/user)
- . = ..()
- if(charges)
- . += span_warning("The cartridge has [charges] portions of grounds remaining.")
- else
- . += span_warning("The cartridge has no unspent grounds remaining.")
-
-/obj/item/coffee_cartridge/fancy
- name = "coffeemaker cartridge - Caffè Fantasioso"
- desc = "A fancy coffee cartridge manufactured by Piccionaia Coffee, for use with the Modello 3 system."
- icon_state = "cartridge_blend"
-
-//Here's the joke before I get 50 issue reports: they're all the same, and that's intentional
-/obj/item/coffee_cartridge/fancy/Initialize(mapload)
- . = ..()
- var/coffee_type = pick("blend", "blue_mountain", "kilimanjaro", "mocha")
- switch(coffee_type)
- if("blend")
- name = "coffeemaker cartridge - Miscela di Piccione"
- icon_state = "cartridge_blend"
- if("blue_mountain")
- name = "coffeemaker cartridge - Montagna Blu"
- icon_state = "cartridge_blue_mtn"
- if("kilimanjaro")
- name = "coffeemaker cartridge - Kilimangiaro"
- icon_state = "cartridge_kilimanjaro"
- if("mocha")
- name = "coffeemaker cartridge - Moka Arabica"
- icon_state = "cartridge_mocha"
-
-/obj/item/coffee_cartridge/decaf
- name = "coffeemaker cartridge - Caffè Decaffeinato"
- desc = "A decaf coffee cartridge manufactured by Piccionaia Coffee, for use with the Modello 3 system."
- icon_state = "cartridge_decaf"
-
-// no you can't just squeeze the juice bag into a glass!
-/obj/item/coffee_cartridge/bootleg
- name = "coffeemaker cartridge - Botany Blend"
- desc = "A jury-rigged coffee cartridge. Should work with a Modello 3 system, though it might void the warranty."
- icon_state = "cartridge_bootleg"
-
-// blank cartridge for crafting's sake, can be made at the service lathe
-/obj/item/blank_coffee_cartridge
- name = "blank coffee cartridge"
- desc = "A blank coffee cartridge, ready to be filled with coffee paste."
- icon = 'icons/obj/machines/coffeemaker.dmi'
- icon_state = "cartridge_blank"
-
-//now, how do you store coffee carts? well, in a rack, of course!
-/obj/item/storage/box/coffee_cart_rack
- name = "coffeemaker cartridge box"
- desc = "A small rack for storing coffeemaker cartridges."
- var/cartridge_type = /obj/item/coffee_cartridge
-
-/obj/item/storage/box/coffee_cart_rack/Initialize(mapload)
- . = ..()
- var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_items = 8
- STR.can_hold = typecacheof(list(/obj/item/coffee_cartridge))
-
-
-/obj/item/storage/box/coffee_cart_rack/PopulateContents()
- for(var/i in 1 to 4)
- new cartridge_type(src)
- new /obj/item/coffee_cartridge/decaf(src)
- new /obj/item/coffee_cartridge/fancy(src)
- new /obj/item/coffee_cartridge(src)
-
-/*
- * impressa coffee maker
- * its supposed to be a premium line product, so its cargo-only, the board cant be therefore researched
- */
-
-/obj/machinery/coffeemaker/impressa
- name = "impressa coffeemaker"
- desc = "An industry-grade Impressa Modello 5 Coffeemaker of the Piccionaia Home Appliances premium coffeemakers product line. Makes coffee from fresh dried whole beans."
- icon = 'icons/obj/machines/coffeemaker.dmi'
- icon_state = "coffeemaker_impressa"
- circuit = /obj/item/circuitboard/machine/coffeemaker/impressa
- initial_cartridge = null //no cartridge, just coffee beans
- brew_time = 15 SECONDS //industrial grade, its faster than the regular one
- density = TRUE
- pass_flags = PASSTABLE
- /// Current amount of coffee beans stored
- var/coffee_amount = 0
- /// List of coffee bean objects are stored
- var/list/coffee = list()
-
-/obj/machinery/coffeemaker/impressa/Initialize(mapload)
- . = ..()
- if(mapload)
- coffeepot = new /obj/item/reagent_containers/food/drinks/bottle/coffeepot(src)
- cartridge = null
-
-/obj/machinery/coffeemaker/impressa/Destroy()
- QDEL_NULL(coffeepot)
- QDEL_NULL(coffee)
- return ..()
-
-/obj/machinery/coffeemaker/impressa/examine(mob/user)
- . = ..()
- if(coffee)
- . += span_notice("The internal grinder contains [length(coffee)] scoop\s of coffee beans")
-
-/obj/machinery/coffeemaker/impressa/update_overlays()
- . = ..()
- . += overlay_checks()
-
-/obj/machinery/coffeemaker/impressa/overlay_checks()
- . = list()
- if(coffeepot)
- if(coffeepot.reagents.total_volume > 0)
- . += "pot_full"
- else
- . += "pot_empty"
- if(coffee_cups > 0)
- if(coffee_cups >= max_coffee_cups/3)
- if(coffee_cups > max_coffee_cups/1.5)
- . += "cups_3"
- else
- . += "cups_2"
- else
- . += "cups_1"
- if(sugar_packs)
- . += "extras_1"
- if(creamer_packs)
- . += "extras_2"
- if(sweetener_packs)
- . += "extras_3"
- if(coffee_amount)
- if(coffee_amount < 0.7*BEAN_CAPACITY)
- . += "grinder_half"
- else
- . += "grinder_full"
- return .
-
-/obj/machinery/coffeemaker/impressa/Exited(atom/movable/gone, direction)
- . = ..()
- if(gone in coffee)
- coffee -= gone
- update_appearance(UPDATE_OVERLAYS)
-
-/obj/machinery/coffeemaker/impressa/try_brew(mob/living/user)
- if(coffee_amount <= 0)
- balloon_alert(user, "no coffee beans added!")
- return FALSE
- if(!coffeepot)
- balloon_alert(user, "no coffeepot inside!")
- return FALSE
- if(machine_stat & (NOPOWER|BROKEN))
- balloon_alert(user, "machine unpowered!")
- return FALSE
- if(coffeepot.reagents.total_volume >= coffeepot.reagents.maximum_volume)
- balloon_alert(user, "the coffeepot is already full!")
- return FALSE
- return TRUE
-
-/obj/machinery/coffeemaker/impressa/attackby(obj/item/attack_item, mob/living/user, params)
- //You can only screw open empty grinder
- if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item))
- return
-
- if(default_deconstruction_crowbar(attack_item))
- return
-
- if(panel_open) //Can't insert objects when its screwed open
- return TRUE
-
- if (istype(attack_item, /obj/item/reagent_containers/food/drinks/bottle/coffeepot) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container())
- var/obj/item/reagent_containers/food/drinks/bottle/coffeepot/new_pot = attack_item
- if(!user.transferItemToLoc(new_pot, src))
- return TRUE
- replace_pot(user, new_pot)
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
- if (istype(attack_item, /obj/item/reagent_containers/glass/coffee_cup) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container())
- var/obj/item/reagent_containers/glass/coffee_cup/new_cup = attack_item //different type of cup
- if(new_cup.reagents.total_volume > 0)
- balloon_alert(user, "the cup must be empty!")
- return
- if(coffee_cups >= max_coffee_cups)
- balloon_alert(user, "the cup holder is full!")
- return
- if(!user.transferItemToLoc(attack_item, src))
- return
- coffee_cups++
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
- if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/sugar))
- var/obj/item/reagent_containers/food/condiment/pack/sugar/new_pack = attack_item
- if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume)
- balloon_alert(user, "the pack must be full!")
- return
- if(sugar_packs >= max_sugar_packs)
- balloon_alert(user, "the sugar compartment is full!")
- return
- if(!user.transferItemToLoc(attack_item, src))
- return
- sugar_packs++
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
- if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/creamer))
- var/obj/item/reagent_containers/food/condiment/pack/creamer/new_pack = attack_item
- if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume)
- balloon_alert(user, "the pack must be full!")
- return
- if(creamer_packs >= max_creamer_packs)
- balloon_alert(user, "the creamer compartment is full!")
- return
- if(!user.transferItemToLoc(attack_item, src))
- return
- creamer_packs++
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
- if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/astrotame))
- var/obj/item/reagent_containers/food/condiment/pack/astrotame/new_pack = attack_item
- if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume)
- balloon_alert(user, "the pack must be full!")
- return
- if(sweetener_packs >= max_sweetener_packs)
- balloon_alert(user, "the sweetener compartment is full!")
- return
- if(!user.transferItemToLoc(attack_item, src))
- return
- sweetener_packs++
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
- if (istype(attack_item, /obj/item/reagent_containers/food/snacks/grown/coffee) && !(attack_item.item_flags & ABSTRACT))
- if(coffee_amount >= BEAN_CAPACITY)
- balloon_alert(user, "the coffee container is full!")
- return
- var/obj/item/reagent_containers/food/snacks/grown/coffee/new_coffee = attack_item
- if(!user.transferItemToLoc(new_coffee, src))
- return
- coffee += new_coffee
- coffee_amount++
- balloon_alert(user, "added coffee")
-
-
- if (istype(attack_item, /obj/item/storage/box/coffeepack))
- if(coffee_amount >= BEAN_CAPACITY)
- balloon_alert(user, "the coffee container is full!")
- return
- var/obj/item/storage/box/coffeepack/new_coffee_pack = attack_item
- for(var/obj/item/reagent_containers/food/snacks/grown/coffee/new_coffee in new_coffee_pack.contents)
- if(coffee_amount < BEAN_CAPACITY)
- if(user.transferItemToLoc(new_coffee, src))
- coffee += new_coffee
- coffee_amount++
- new_coffee.forceMove(src)
- balloon_alert(user, "added coffee")
- update_appearance(UPDATE_OVERLAYS)
- else
- return
- update_appearance(UPDATE_OVERLAYS)
- return TRUE //no afterattack
-
-/obj/machinery/coffeemaker/impressa/take_cup(mob/user)
- if(!coffee_cups) //shouldn't happen, but we all know how stuff manages to break
- balloon_alert(user, "no cups left!")
- return
- balloon_alert_to_viewers("took cup")
- var/obj/item/reagent_containers/food/drinks/coffee/new_cup = new(get_turf(src))
- user.put_in_hands(new_cup)
- coffee_cups--
- update_appearance(UPDATE_OVERLAYS)
-
-/obj/machinery/coffeemaker/impressa/toggle_steam()
- QDEL_NULL(particles)
- if(brewing)
- particles.position = list(-2, 1, 0)
-
-/obj/machinery/coffeemaker/impressa/brew()
- power_change()
- if(!try_brew())
- return
- operate_for(brew_time)
- coffeepot.reagents.add_reagent_list(list(/datum/reagent/consumable/coffee = 120))
- coffee.Cut(1,2) //remove the first item from the list
- coffee_amount--
- update_appearance(UPDATE_OVERLAYS)
-
-#undef BEAN_CAPACITY
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 4fa5354339c5..8eccd04c8404 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -25,7 +25,7 @@
icon_state = "fryer_off"
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 5
+ idle_power_usage = IDLE_DRAW_LOW
layer = BELOW_OBJ_LAYER
var/obj/item/reagent_containers/food/snacks/deepfryholder/frying //What's being fried RIGHT NOW?
var/cook_time = 0
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index fad3c3bc963f..7be027c012f4 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -5,8 +5,8 @@
icon_state = "grinder"
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 2
- active_power_usage = 500
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MEDIUM
circuit = /obj/item/circuitboard/machine/gibber
var/operating = FALSE //Is it on?
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 4a739d2ab7fc..2762892110f8 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -8,8 +8,8 @@
layer = BELOW_OBJ_LAYER
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 5
- active_power_usage = 100
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MEDIUM
circuit = /obj/item/circuitboard/machine/microwave
pass_flags = PASSTABLE
light_color = LIGHT_COLOR_YELLOW
@@ -275,6 +275,7 @@
/obj/machinery/microwave/proc/start()
wzhzhzh()
+ set_active_power()
loop(MICROWAVE_NORMAL, 10)
/obj/machinery/microwave/proc/start_can_fail()
@@ -303,11 +304,11 @@
pre_success()
return
time--
- use_power(500)
addtimer(CALLBACK(src, PROC_REF(loop), type, time, wait), wait)
/obj/machinery/microwave/proc/loop_finish()
operating = FALSE
+ set_idle_power()
var/metal = 0
for(var/obj/item/O in ingredients)
@@ -330,6 +331,7 @@
/obj/machinery/microwave/proc/pre_fail()
broken = 2
operating = FALSE
+ set_idle_power()
spark()
after_finish_loop()
@@ -338,6 +340,7 @@
/obj/machinery/microwave/proc/muck_finish()
visible_message("\The [src] gets covered in muck!")
+ set_idle_power()
dirty = 100
dirty_anim_playing = FALSE
@@ -382,6 +385,12 @@
playsound(src, 'sound/items/cig_light.ogg', 50, 1)
moveToNullspace()
+
+/obj/item/ration_heater/get_temperature()
+ if(!uses)
+ return 0
+ . = ..()
+
/obj/item/ration_heater/proc/clear_cooking(datum/source)
SIGNAL_HANDLER
UnregisterSignal(tocook, COMSIG_PARENT_QDELETING)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
index 005ffa7632ba..79382343e1ae 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
@@ -8,8 +8,8 @@ GLOBAL_LIST_EMPTY(monkey_recyclers)
layer = BELOW_OBJ_LAYER
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 5
- active_power_usage = 50
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MEDIUM
circuit = /obj/item/circuitboard/machine/monkey_recycler
var/stored_matter = 0
var/cube_production = 0.2
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index ba26a265f8ee..bc17a9fd22af 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -7,8 +7,8 @@
layer = BELOW_OBJ_LAYER
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 5
- active_power_usage = 50
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MEDIUM
circuit = /obj/item/circuitboard/machine/processor
var/broken = FALSE
var/processing = FALSE
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index ed1347fb5124..5852ea34742b 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -9,8 +9,8 @@
layer = BELOW_OBJ_LAYER
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 5
- active_power_usage = 100
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
circuit = /obj/item/circuitboard/machine/smartfridge
var/max_n_of_items = 1500
@@ -245,8 +245,9 @@
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "drying_rack"
use_power = IDLE_POWER_USE
- idle_power_usage = 5
- active_power_usage = 200
+ circuit = null
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
visible_contents = FALSE
var/drying = FALSE
@@ -258,7 +259,6 @@
/obj/machinery/smartfridge/drying_rack/on_deconstruction()
new /obj/item/stack/sheet/mineral/wood(drop_location(), 10)
- ..()
/obj/machinery/smartfridge/drying_rack/RefreshParts()
/obj/machinery/smartfridge/drying_rack/default_deconstruction_screwdriver()
@@ -326,10 +326,10 @@
/obj/machinery/smartfridge/drying_rack/proc/toggle_drying(forceoff)
if(drying || forceoff)
drying = FALSE
- use_power = IDLE_POWER_USE
+ set_idle_power()
else
drying = TRUE
- use_power = ACTIVE_POWER_USE
+ set_active_power()
update_appearance()
/obj/machinery/smartfridge/drying_rack/proc/rack_dry()
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
index 0d7f403b538d..d0558f94fdb5 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
@@ -152,7 +152,7 @@
/datum/reagent/water = 10,
/obj/item/reagent_containers/glass/bowl = 1,
/obj/item/reagent_containers/food/snacks/grown/banana = 1,
- /obj/item/stack/ore/bananium = 1
+ /obj/item/stack/sheet/mineral/hidden/hellstone = 1
)
result = /obj/item/reagent_containers/food/snacks/soup/clownstears
subcategory = CAT_SOUP
diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm
index e95bdb2063a8..d5b0c0ff6638 100644
--- a/code/modules/holiday/halloween.dm
+++ b/code/modules/holiday/halloween.dm
@@ -243,17 +243,6 @@
if(prob(5))
playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, TRUE)
-/mob/living/simple_animal/hostile/clown_insane/attackby(obj/item/O, mob/user)
- if(istype(O, /obj/item/nullrod))
- if(prob(5))
- visible_message("[src] finally found the peace it deserves. You hear honks echoing off into the distance.")
- playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, TRUE)
- qdel(src)
- else
- visible_message("[src] seems to be resisting the effect!")
- return
- return ..()
-
/mob/living/simple_animal/hostile/clown_insane/handle_temperature_damage()
return
diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm
index 9e89336ae08e..d56fd4f9c32c 100644
--- a/code/modules/holodeck/items.dm
+++ b/code/modules/holodeck/items.dm
@@ -14,7 +14,7 @@
name = "holographic energy sword"
desc = "May the force be with you. Sorta."
icon = 'icons/obj/transforming_energy.dmi'
- icon_state = "sword0"
+ icon_state = "sword"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
force = 3.0
@@ -152,8 +152,8 @@
var/eventstarted = FALSE
use_power = IDLE_POWER_USE
- idle_power_usage = 2
- active_power_usage = 6
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
power_channel = AREA_USAGE_ENVIRON
/obj/machinery/readybutton/attack_ai(mob/user as mob)
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index e9e40fd167b8..c3bcc09940d0 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -5,7 +5,7 @@
icon_state = "biogen-empty"
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 40
+ idle_power_usage = IDLE_DRAW_LOW
circuit = /obj/item/circuitboard/machine/biogenerator
var/processing = FALSE
var/obj/item/reagent_containers/glass/beaker = null
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 7fa710323207..ed58e86e16dc 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -69,20 +69,19 @@
/obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params)
..()
if (istype(O, /obj/item/plant_analyzer))
- var/msg = "*---------*\n This is \a [src].\n"
+ var/msg = "This is \a [src].\n"
if(seed)
- msg += seed.get_analyzer_text()
+ msg += "[seed.get_analyzer_text()]\n"
var/reag_txt = ""
if(seed)
for(var/reagent_id in seed.reagents_add)
var/datum/reagent/R = GLOB.chemical_reagents_list[reagent_id]
var/amt = reagents.get_reagent_amount(reagent_id)
- reag_txt += "\n- [R.name]: [amt]"
+ reag_txt += "- [R.name]: [amt]\n"
if(reag_txt)
msg += reag_txt
- msg += " *---------*"
- to_chat(user, msg)
+ to_chat(user, examine_block(msg))
else
if(seed)
for(var/datum/plant_gene/trait/T in seed.genes)
diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm
index a8b9d5f8d034..a93d706a99b9 100644
--- a/code/modules/hydroponics/grown/kudzu.dm
+++ b/code/modules/hydroponics/grown/kudzu.dm
@@ -39,7 +39,7 @@
/obj/item/seeds/kudzu/attack_self(mob/user)
user.visible_message("[user] begins throwing seeds on the ground...")
- if(do_after(user, 50, needhand = TRUE, target = user.drop_location(), progress = TRUE))
+ if(do_after(user, 50, target = user.drop_location(), progress = TRUE))
plant(user)
to_chat(user, "You plant the kudzu. You monster.")
diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm
index 1378fb0253fc..1c6b19313ee4 100644
--- a/code/modules/hydroponics/grown/melon.dm
+++ b/code/modules/hydroponics/grown/melon.dm
@@ -52,19 +52,3 @@
dried_type = null
wine_power = 70 //Water to wine, baby.
wine_flavor = "divinity"
-
-/obj/item/reagent_containers/food/snacks/grown/holymelon/Initialize()
- . = ..()
- var/uses = 1
- if(seed)
- uses = round(seed.potency / 20)
- AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, ITEM_SLOT_HANDS, uses, TRUE, CALLBACK(src, PROC_REF(block_magic)), CALLBACK(src, PROC_REF(expire))) //deliver us from evil o melon god
-
-/obj/item/reagent_containers/food/snacks/grown/holymelon/proc/block_magic(mob/user, major)
- if(major)
- to_chat(user, "[src] hums slightly, and seems to decay a bit.")
-
-/obj/item/reagent_containers/food/snacks/grown/holymelon/proc/expire(mob/user)
- to_chat(user, "[src] rapidly turns into ash!")
- qdel(src)
- new /obj/effect/decal/cleanable/ash(drop_location())
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index 3ecb34762ae1..f97596c348f2 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -35,11 +35,10 @@
/obj/item/grown/attackby(obj/item/O, mob/user, params)
..()
if (istype(O, /obj/item/plant_analyzer))
- var/msg = "*---------*\n This is \a [src]\n"
+ var/msg = "This is \a [src]\n"
if(seed)
msg += seed.get_analyzer_text()
- msg += ""
- to_chat(usr, msg)
+ to_chat(usr, examine_block(msg))
return
/obj/item/grown/proc/add_juice()
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index a5e66f6df4ef..bbfeaeeb5b5a 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -1,3 +1,6 @@
+#define HYDRO_MAX_PEST 10
+#define HYDRO_MAX_WEED 10
+#define HYDRO_MAX_TOXIC 100
/obj/machinery/hydroponics
name = "hydroponics tray"
icon = 'icons/obj/hydroponics/equipment.dmi'
@@ -6,7 +9,9 @@
pixel_z = 1
obj_flags = CAN_BE_HIT | UNIQUE_RENAME
circuit = /obj/item/circuitboard/machine/hydroponics
- idle_power_usage = 0
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_LOW
+ active_power_usage = ACTIVE_DRAW_HIGH
var/waterlevel = 100 //The amount of water in the tray (max 100)
var/maxwater = 100 //The maximum amount of water in the tray
var/nutridrain = 1 // How many units of nutrient will be drained in the tray
@@ -114,7 +119,7 @@
if(!powered() && self_sustaining)
visible_message("[name]'s auto-grow functionality shuts off!")
- idle_power_usage = 0
+ set_idle_power()
self_sustaining = FALSE
update_appearance()
@@ -253,7 +258,7 @@
adjustWeeds(1 / rating)
// Weeeeeeeeeeeeeeedddssss
- if(weedlevel >= 10 && prob(50)) // At this point the plant is kind of fucked. Weeds can overtake the plant spot.
+ if(weedlevel >= HYDRO_MAX_WEED && prob(50)) // At this point the plant is kind of fucked. Weeds can overtake the plant spot.
if(myseed)
if(!myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy) && !myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) // If a normal plant
weedinvasion()
@@ -549,25 +554,26 @@
else if(istype(O, /obj/item/plant_analyzer))
var/obj/item/plant_analyzer/P_analyzer = O
+ var/msg = ""
if(myseed)
if(P_analyzer.scan_mode == PLANT_SCANMODE_STATS)
- to_chat(user, examine_block("[myseed.plantname]"))
- to_chat(user, examine_block("Plant Age: [age]"))
+ msg += "[myseed.plantname]\n"
+ msg += "- Plant Age: [span_notice("[age]\n")]"
var/list/text_string = myseed.get_analyzer_text()
if(text_string)
- to_chat(user, examine_block(text_string))
+ msg += "[text_string]\n"
if(myseed.reagents_add && P_analyzer.scan_mode == PLANT_SCANMODE_CHEMICALS)
- to_chat(user, examine_block("Plant Reagents"))
+ msg += "Plant Reagents\n"
for(var/datum/plant_gene/reagent/Gene in myseed.genes)
- to_chat(user, examine_block("- [Gene.get_name()] -"))
+ msg += "[span_notice("- [Gene.get_name()] -")]\n"
else
- to_chat(user, examine_block( "No plant found."))
- to_chat(user, examine_block("\nWeed level: [weedlevel] / 10"))
- to_chat(user, examine_block("\nPest level: [pestlevel] / 10"))
- to_chat(user, examine_block("\nToxicity level: [toxic] / 100"))
- to_chat(user, examine_block("\nWater level: [waterlevel] / [maxwater]"))
- to_chat(user, examine_block("\nNutrition level: [reagents.total_volume] / [maxnutri]"))
- to_chat(user, examine_block(" "))
+ msg += "No plant found.\n"
+ msg += "Weed level: [span_notice("[weedlevel] / [HYDRO_MAX_WEED]")]\n"
+ msg += "Pest level: [span_notice("[pestlevel] / [HYDRO_MAX_PEST]")]\n"
+ msg += "Toxicity level: [span_notice("[toxic] / [HYDRO_MAX_TOXIC]")]\n"
+ msg += "Water level: [span_notice("[waterlevel] / [maxwater]")]\n"
+ msg += "Nutrition level: [span_notice("[reagents.total_volume] / [maxnutri]")]\n"
+ to_chat(user, examine_block(msg))
return
else if(istype(O, /obj/item/cultivator))
@@ -671,7 +677,10 @@
if(!anchored)
return
self_sustaining = !self_sustaining
- idle_power_usage = self_sustaining ? 1250 : 0
+ if(self_sustaining)
+ set_active_power()
+ else
+ set_idle_power()
to_chat(user, "You [self_sustaining ? "activate" : "deactivated"] [src]'s autogrow function[self_sustaining ? ", maintaining the tray's health while using high amounts of power" : ""].")
update_appearance()
@@ -702,7 +711,7 @@
desc = initial(desc)
TRAY_NAME_UPDATE
if(self_sustaining) //No reason to pay for an empty tray.
- idle_power_usage = 0
+ set_idle_power()
self_sustaining = FALSE
update_appearance()
@@ -718,13 +727,13 @@
plant_health = clamp(plant_health + adjustamt, 0, myseed.endurance)
/obj/machinery/hydroponics/proc/adjustToxic(adjustamt)
- toxic = clamp(toxic + adjustamt, 0, 100)
+ toxic = clamp(toxic + adjustamt, 0, HYDRO_MAX_TOXIC)
/obj/machinery/hydroponics/proc/adjustPests(adjustamt)
- pestlevel = clamp(pestlevel + adjustamt, 0, 10)
+ pestlevel = clamp(pestlevel + adjustamt, 0, HYDRO_MAX_PEST)
/obj/machinery/hydroponics/proc/adjustWeeds(adjustamt)
- weedlevel = clamp(weedlevel + adjustamt, 0, 10)
+ weedlevel = clamp(weedlevel + adjustamt, 0, HYDRO_MAX_WEED)
/obj/machinery/hydroponics/proc/spawnplant() // why would you put strange reagent in a hydro tray you monster I bet you also feed them blood
var/list/livingplants = list(/mob/living/simple_animal/hostile/tree, /mob/living/simple_animal/hostile/killertomato)
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 008009a35765..ad24dccff43d 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -390,29 +390,29 @@
/obj/item/seeds/proc/get_analyzer_text() //in case seeds have something special to tell to the analyzer
var/text = ""
if(!get_gene(/datum/plant_gene/trait/plant_type/weed_hardy) && !get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism) && !get_gene(/datum/plant_gene/trait/plant_type/alien_properties))
- text += "- Plant type: Normal plant\n"
+ text += "- Plant type: [span_notice("Normal plant\n")]"
if(get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
- text += "- Plant type: Weed. Can grow in nutrient-poor soil.\n"
+ text += "- Plant type: [span_notice("Weed. Can grow in nutrient-poor soil.\n")]"
if(get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism))
- text += "- Plant type: Mushroom. Can grow in dry soil.\n"
+ text += "- Plant type: [span_notice("Mushroom. Can grow in dry soil.\n")]"
if(get_gene(/datum/plant_gene/trait/plant_type/crystal))
- text += "- Plant type: Crystal. Revitalizes soil.\n"
+ text += "- Plant type: [span_notice("Crystal. Revitalizes soil.\n")]"
if(get_gene(/datum/plant_gene/trait/plant_type/alien_properties))
- text += "- Plant type: UNKNOWN \n"
+ text += "- Plant type: [span_warning("UNKNOWN\n")]"
if(potency != UNHARVESTABLE)
- text += "- Potency: [potency]\n"
+ text += "- Potency: [span_notice("[potency]\n")]"
if(yield != UNHARVESTABLE)
- text += "- Yield: [yield]\n"
- text += "- Maturation speed: [maturation]\n"
+ text += "- Yield: [span_notice("[yield]\n")]"
+ text += "- Maturation speed: [span_notice("[maturation]\n")]"
if(yield != UNHARVESTABLE)
- text += "- Production speed: [production]\n"
- text += "- Endurance: [endurance]\n"
- text += "- Lifespan: [lifespan]\n"
- text += "- Instability: [instability]\n"
- text += "- Weed Growth Rate: [weed_rate]\n"
- text += "- Weed Vulnerability: [weed_chance]\n"
+ text += "- Production speed: [span_notice("[production]\n")]"
+ text += "- Endurance: [span_notice("[endurance]\n")]"
+ text += "- Lifespan: [span_notice("[lifespan]\n")]"
+ text += "- Instability: [span_notice("[instability]\n")]"
+ text += "- Weed Growth Rate: [span_notice("[weed_rate]\n")]"
+ text += "- Weed Vulnerability: [span_notice("[weed_chance]\n")]"
if(rarity)
- text += "- Species Discovery Value: [rarity]\n"
+ text += "- Species Discovery Value: [span_notice("[rarity]\n")]"
var/all_traits = ""
for(var/datum/plant_gene/trait/traits in genes)
if(istype(traits, /datum/plant_gene/trait/plant_type))
@@ -427,20 +427,20 @@
/obj/item/seeds/attackby(obj/item/O, mob/user, params)
if (istype(O, /obj/item/plant_analyzer))
- to_chat(user, "*---------*\n This is \a [src].")
+ var/msg = "This is \a [src]."
var/text
var/obj/item/plant_analyzer/P_analyzer = O
if(P_analyzer.scan_mode == PLANT_SCANMODE_STATS)
text = get_analyzer_text()
if(text)
- to_chat(user, "[text]")
+ msg += "\n[text]"
if(reagents_add && P_analyzer.scan_mode == PLANT_SCANMODE_CHEMICALS)
- to_chat(user, "- Plant Reagents -")
- to_chat(user, "*---------*")
+ msg += "\n- Plant Reagents -"
+ msg += "\n*---------*"
for(var/datum/plant_gene/reagent/Gene in genes)
- to_chat(user, "- [Gene.get_name()] -")
- to_chat(user, "*---------*")
-
+ msg += "\n- [Gene.get_name()] -"
+ msg += "\n*---------*"
+ to_chat(user, examine_block(msg))
return
diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm
index 149f78437fa4..022b3278e92b 100644
--- a/code/modules/instruments/items.dm
+++ b/code/modules/instruments/items.dm
@@ -75,7 +75,7 @@
lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
icon_state = "headphones"
- item_state = "headphones"
+ item_state = "earmuffs"
slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD
force = 0
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index 67d45dd8d058..20ad6e089730 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -25,7 +25,6 @@
var/display_order = JOB_DISPLAY_ORDER_DEFAULT
-
///Levels unlocked at roundstart in physiology
var/list/roundstart_experience
@@ -124,7 +123,7 @@
return FALSE
if(!visualsOnly)
var/datum/bank_account/bank_account = new(H.real_name, src)
- bank_account.adjust_money(officer ? 250 : 100) //just a little bit of money for you
+ bank_account.adjust_money(officer ? 250 : 100, "starting_money") //just a little bit of money for you
H.account_id = bank_account.account_id
//Equip the rest of the gear
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index 786f9e798e43..a5fed7b7fe91 100644
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -27,8 +27,7 @@
gloves = /obj/item/clothing/gloves/color/captain
ears = /obj/item/radio/headset/heads/captain
uniform = /obj/item/clothing/under/rank/command/captain
- alt_uniform = /obj/item/clothing/under/rank/command/captain/parade //WS Edit - Alt Uniforms
- dcoat = /obj/item/clothing/suit/hooded/wintercoat/captain //WS Edit - Alt Uniforms
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/captain
shoes = /obj/item/clothing/shoes/sneakers/brown
head = /obj/item/clothing/head/caphat
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1)
diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm
index 870697476794..ab4ceb6968c0 100644
--- a/code/modules/jobs/job_types/chaplain.dm
+++ b/code/modules/jobs/job_types/chaplain.dm
@@ -16,8 +16,6 @@
var/obj/item/storage/book/bible/booze/B = new
if(GLOB.religion)
- if(H.mind)
- H.mind.holy_role = HOLY_ROLE_PRIEST
B.deity_name = GLOB.deity
B.name = GLOB.bible_name
B.icon_state = GLOB.bible_icon_state
@@ -30,8 +28,6 @@
if(GLOB.religious_sect)
GLOB.religious_sect.on_conversion(H)
return
- if(H.mind)
- H.mind.holy_role = HOLY_ROLE_HIGHPRIEST
var/new_religion = DEFAULT_RELIGION
if(M.client && M.client.prefs.custom_names["religion"])
diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm
index 1c3d318eeffb..d67dbb12f572 100644
--- a/code/modules/jobs/job_types/cook.dm
+++ b/code/modules/jobs/job_types/cook.dm
@@ -18,7 +18,7 @@
belt = /obj/item/pda/cook
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/civilian/chef
- alt_uniform = /obj/item/clothing/under/rank/civilian/cookjorts //WS Edit - Alt Uniforms
+ alt_uniform = /obj/item/clothing/under/shorts/cookjorts //WS Edit - Alt Uniforms
suit = /obj/item/clothing/suit/toggle/chef
alt_suit = /obj/item/clothing/suit/apron/chef
head = /obj/item/clothing/head/chefhat
diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm
index c4263a771b0d..69155c9230d8 100644
--- a/code/modules/library/lib_codex_gigas.dm
+++ b/code/modules/library/lib_codex_gigas.dm
@@ -48,7 +48,7 @@
correctness = 100
correctness -= U.getOrganLoss(ORGAN_SLOT_BRAIN) * 0.5 //Brain damage makes researching hard.
speed += U.getOrganLoss(ORGAN_SLOT_BRAIN) * 3
- if(do_after(user, speed, 0, user))
+ if(do_after(user, speed, user, timed_action_flags = IGNORE_HELD_ITEM))
var/usedName = devilName
if(!prob(correctness))
usedName += "x"
@@ -59,7 +59,7 @@
inUse = FALSE
/obj/item/book/codex_gigas/proc/display_devil(datum/antagonist/devil/devil, mob/reader, devilName)
- reader << browse("Information on [devilName]
[GLOB.lawlorify[LORE][devil.ban]] [GLOB.lawlorify[LORE][devil.bane]] [GLOB.lawlorify[LORE][devil.obligation]] [GLOB.lawlorify[LORE][devil.banish]] [devil.ascendable?"This devil may ascend given enough souls.":""]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
+ reader << browse("Information on [devilName]
[GLOB.lawlorify[LORE][devil.ban]] [GLOB.lawlorify[LORE][devil.obligation]] [GLOB.lawlorify[LORE][devil.banish]] [devil.ascendable?"This devil may ascend given enough souls.":""]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
/obj/item/book/codex_gigas/proc/ask_name(mob/reader)
ui_interact(reader)
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index 140b87c1707f..d86cfebf1197 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -192,7 +192,7 @@
if(77 to 78)
new /obj/item/toy/plush/lizardplushie(src)
if(79 to 80)
- new /obj/item/stack/sheet/mineral/bananium(src, 10)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone(src, 10)
if(81 to 82)
new /obj/item/bikehorn/airhorn(src)
if(83 to 84)
@@ -222,16 +222,14 @@
if(96)
new /obj/item/banhammer(src)
for(var/i in 1 to 3)
- var/obj/effect/mine/sound/bwoink/mine = new (src)
- mine.set_anchored(FALSE)
- mine.move_resist = MOVE_RESIST_DEFAULT
+ new /obj/item/mine/pressure/sound(src)
if(97)
for(var/i in 1 to 4)
new /obj/item/clothing/mask/balaclava(src)
new /obj/item/gun/ballistic/shotgun/toy(src)
- new /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted(src)
- new /obj/item/gun/ballistic/automatic/toy/unrestricted(src)
- new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted(src)
+ new /obj/item/gun/ballistic/automatic/toy/pistol(src)
+ new /obj/item/gun/ballistic/automatic/toy(src)
+ new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy(src)
new /obj/item/ammo_box/foambox(src)
if(98)
for(var/i in 1 to 3)
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 8bac57a8b764..46c20dd02e1b 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -1,7 +1,7 @@
/****************Explorer's Suit and Mask****************/
/obj/item/clothing/suit/hooded/explorer
name = "explorer suit"
- desc = "A light, armor-plated softsuit, designed for exploration of dangerous planetary enviroments. An NT design by origin, later reappropriated by EXOCON for mass retail production."
+ desc = "A light, armor-plated softsuit, designed for exploration of dangerous planetary enviroments. An NT design by origin, later reappropriated by EXOCOM for mass retail production."
icon_state = "explorer"
item_state = "explorer"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
@@ -10,7 +10,7 @@
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|ARMS
hoodtype = /obj/item/clothing/head/hooded/explorer
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
+ armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
resistance_flags = FIRE_PROOF
supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
@@ -23,7 +23,7 @@
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
+ armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/hooded/explorer/Initialize()
@@ -36,7 +36,7 @@
/obj/item/clothing/mask/gas/explorer
name = "explorer gas mask"
- desc = "An advanced atmospheric scrubbing mask with a built-in pressure seal, manufactured by EXOCON. Can be connected to an air supply."
+ desc = "An advanced atmospheric scrubbing mask with a built-in pressure seal, manufactured by EXOCOM. Can be connected to an air supply."
icon_state = "gas_mining"
visor_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
visor_flags_inv = HIDEFACIALHAIR
@@ -166,7 +166,7 @@
max_heat_protection_temperature = (FIRE_SUIT_MAX_TEMP_PROTECT / 2)
heat_protection = CHEST|GROIN|LEGS|ARMS
hoodtype = /obj/item/clothing/head/hooded/survivor_hood
- armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 15, "bomb" = 20, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 30)
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 10, "bomb" = 20, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 30)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
resistance_flags = FIRE_PROOF
supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
@@ -174,13 +174,13 @@
/obj/item/clothing/head/hooded/survivor_hood
name = "survivor hood"
desc = "A loose-fitting hood, patched up with sealant and adhesive. Somewhat protects the head from the environment, but gets the job done."
- icon_state = "survivor_hood"
+ icon_state = "explorerold"
suit = /obj/item/clothing/suit/hooded/survivor
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
- armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 15, "bomb" = 20, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 30)
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 10, "bomb" = 20, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 30)
resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/hooded/survivor/Initialize()
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index debdb2e2ea02..030e592d80cd 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -6,7 +6,7 @@
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
name = "proto-magnetic crusher"
- desc = "A multipurpose disembarkation and self-defense tool designed by EXOCON using an incomplete Nanotrasen prototype. \
+ desc = "A multipurpose disembarkation and self-defense tool designed by EXOCOM using an incomplete Nanotrasen prototype. \
Found in the grime-stained hands of wannabee explorers across the frontier, it cuts rock and hews flora using magnetic osscilation and a heavy cleaving edge."
force = 0 //You can't hit stuff unless wielded
w_class = WEIGHT_CLASS_BULKY
@@ -24,7 +24,6 @@
light_range = 5
light_on = FALSE
custom_price = 800
- var/list/trophies = list()
var/charged = TRUE
var/charge_time = 15
var/detonation_damage = 20
@@ -41,10 +40,6 @@
AddComponent(/datum/component/butchering, 60, 110) //technically it's huge and bulky, but this provides an incentive to use it
AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=15)
-/obj/item/kinetic_crusher/Destroy()
- QDEL_LIST(trophies)
- return ..()
-
/// triggered on wield of two handed item
/obj/item/kinetic_crusher/proc/on_wield(obj/item/source, mob/user)
wielded = TRUE
@@ -57,30 +52,6 @@
. = ..()
. += "Induce magnetism in an enemy by striking them with a magnetospheric wave, then hit them in melee to force a waveform collapse for [force + detonation_damage] damage."
. += "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage]."
- for(var/t in trophies)
- var/obj/item/crusher_trophy/T = t
- . += "It has \a [T] attached, which causes [T.effect_desc()]."
-
-/obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user)
- if(I.tool_behaviour == TOOL_CROWBAR)
- if(LAZYLEN(trophies))
- var/list/choose_options = list()
- for(var/obj/item/crusher_trophy/T in trophies)
- choose_options += list(T.name = image(icon = T.icon, icon_state = T.icon_state))
- var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
- if(picked_option)
- to_chat(user, "You remove [picked_option].")
- I.play_tool_sound(src)
- for(var/obj/item/crusher_trophy/T in trophies)
- if(T.name == picked_option)
- T.remove_from(src, user)
- else
- to_chat(user, "There are no trophies on [src].")
- else if(istype(I, /obj/item/crusher_trophy))
- var/obj/item/crusher_trophy/T = I
- T.add_to(src, user)
- else
- return ..()
/obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
if(!wielded)
@@ -90,10 +61,6 @@
var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
var/target_health = target.health
..()
- for(var/t in trophies)
- if(!QDELETED(target))
- var/obj/item/crusher_trophy/T = t
- T.on_melee_hit(target, user)
if(!QDELETED(C) && !QDELETED(target))
C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did
@@ -106,9 +73,6 @@
if(!isturf(proj_turf))
return
var/obj/projectile/destabilizer/D = new /obj/projectile/destabilizer(proj_turf)
- for(var/t in trophies)
- var/obj/item/crusher_trophy/T = t
- T.on_projectile_fire(D, user)
D.preparePixelProjectile(target, user, clickparams)
D.firer = user
D.hammer_synced = src
@@ -125,9 +89,6 @@
return
var/datum/status_effect/crusher_damage/C = L.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
var/target_health = L.health
- for(var/t in trophies)
- var/obj/item/crusher_trophy/T = t
- T.on_mark_detonation(target, user)
if(!QDELETED(L))
if(!QDELETED(C))
C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did
@@ -186,12 +147,7 @@
/obj/projectile/destabilizer/on_hit(atom/target, blocked = FALSE)
if(isliving(target))
var/mob/living/L = target
- var/had_effect = (L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)) //used as a boolean
- var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK, hammer_synced)
- if(hammer_synced)
- for(var/t in hammer_synced.trophies)
- var/obj/item/crusher_trophy/T = t
- T.on_mark_application(target, CM, had_effect)
+ L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK, hammer_synced)
var/target_turf = get_turf(target)
if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf
@@ -199,535 +155,6 @@
M.gets_drilled(firer, TRUE)
..()
-//trophies
-/obj/item/crusher_trophy
- name = "tail spike"
- desc = "A strange spike with no usage."
- icon = 'icons/obj/lavaland/artefacts.dmi'
- icon_state = "tail_spike"
- var/bonus_value = 10 //if it has a bonus effect, this is how much that effect is
- var/denied_type = /obj/item/crusher_trophy
-
-/obj/item/crusher_trophy/examine(mob/living/user)
- . = ..()
- . += "Causes [effect_desc()] when attached to a kinetic crusher."
-
-/obj/item/crusher_trophy/proc/effect_desc()
- return "errors"
-
-/obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user)
- if(istype(A, /obj/item/kinetic_crusher))
- add_to(A, user)
- else
- ..()
-
-/obj/item/crusher_trophy/proc/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- for(var/t in H.trophies)
- var/obj/item/crusher_trophy/T = t
- if(istype(T, denied_type) || istype(src, T.denied_type))
- to_chat(user, "You can't seem to attach [src] to [H]. Maybe remove a few trophies?")
- return FALSE
- if(!user.transferItemToLoc(src, H))
- return
- H.trophies += src
- to_chat(user, "You attach [src] to [H].")
- return TRUE
-
-/obj/item/crusher_trophy/proc/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- forceMove(get_turf(H))
- H.trophies -= src
- return TRUE
-
-/obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user
-/obj/item/crusher_trophy/proc/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user
-/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before
-/obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user
-
-//goliath
-/obj/item/crusher_trophy/goliath_tentacle
- name = "goliath tentacle"
- desc = "A sliced-off goliath tentacle."
- icon_state = "goliath_tentacle"
- denied_type = /obj/item/crusher_trophy/goliath_tentacle
- bonus_value = 5
- var/missing_health_ratio = 0.1
- var/missing_health_desc = 10
-
-/obj/item/crusher_trophy/goliath_tentacle/effect_desc()
- return "waveform collapse to do [bonus_value] more damage for every [missing_health_desc] health you are missing"
-
-/obj/item/crusher_trophy/goliath_tentacle/on_mark_detonation(mob/living/target, mob/living/user)
- var/missing_health = user.maxHealth - user.health
- missing_health *= missing_health_ratio //bonus is active at all times, even if you're above 90 health
- missing_health *= bonus_value //multiply the remaining amount by bonus_value
- if(missing_health > 0)
- target.adjustBruteLoss(missing_health) //and do that much damage
-
-//ancient goliath
-/obj/item/crusher_trophy/elder_tentacle
- name = "elder tentacle"
- desc = "The barbed tip of a tentacle sliced from an incredibly ancient goliath."
- icon_state = "elder_tentacle"
- denied_type = /obj/item/crusher_trophy/elder_tentacle
- bonus_value = 3
- var/missing_health_ratio = 0.1
- var/missing_health_desc = 5
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
-
-/obj/item/crusher_trophy/elder_tentacle/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/elder_tentacle/effect_desc()
- return "waveform collapse to do [bonus_value] more damage for every [missing_health_desc] health you are missing"
-
-/obj/item/crusher_trophy/elder_tentacle/on_mark_detonation(mob/living/target, mob/living/user)
- var/missing_health = user.maxHealth - user.health
- missing_health *= missing_health_ratio //bonus is active at all times, even if you're above 90 health
- missing_health *= bonus_value //multiply the remaining amount by bonus_value
- if(missing_health > 0)
- target.adjustBruteLoss(missing_health) //and do that much damage
-
-//crystal goliath
-/obj/item/crusher_trophy/goliath_crystal
- name = "goliath crystal"
- desc = "A crystal ripped off from a goliath infected by the strange crystals. You can see the original skin of the goliath deeply embeded in it."
- icon_state = "goliath_crystal"
- denied_type = /obj/item/crusher_trophy/elder_tentacle
- bonus_value = 4
- var/missing_health_ratio = 0.1
- var/missing_health_desc = 5
-
-/obj/item/crusher_trophy/goliath_crystal/effect_desc()
- return "waveform collapse to stun creatures for [bonus_value*0.1] second\s"
-
-/obj/item/crusher_trophy/goliath_crystal/on_mark_detonation(mob/living/simple_animal/target, mob/living/user)
- if(!ishostile(target))
- return
- var/mob/living/simple_animal/hostile/hostile_target = target
- var/hostile_ai_status = hostile_target.AIStatus
- hostile_target.AIStatus = AI_OFF
- addtimer(VARSET_CALLBACK(hostile_target, AIStatus, hostile_ai_status), bonus_value*0.1 SECONDS)
-
-//watcher
-/obj/item/crusher_trophy/watcher_wing
- name = "watcher wing"
- desc = "A wing ripped from a watcher."
- icon_state = "watcher_wing"
- denied_type = /obj/item/crusher_trophy/watcher_wing
- bonus_value = 5
-
-/obj/item/crusher_trophy/watcher_wing/effect_desc()
- return "waveform collapse to prevent certain creatures from using certain attacks for [bonus_value*0.1] second\s"
-
-/obj/item/crusher_trophy/watcher_wing/on_mark_detonation(mob/living/target, mob/living/user)
- if(ishostile(target))
- var/mob/living/simple_animal/hostile/H = target
- if(H.ranged) //briefly delay ranged attacks
- if(H.ranged_cooldown >= world.time)
- H.ranged_cooldown += bonus_value
- else
- H.ranged_cooldown = bonus_value + world.time
-
-//magmawing watcher
-/obj/item/crusher_trophy/magma_wing
- name = "magmatic sinew"
- desc = "A fuming organ, dropped by beings hotter then lava."
- icon_state = "magma_wing"
- denied_type = /obj/item/crusher_trophy/magma_wing
- gender = NEUTER
- bonus_value = 5
- var/deadly_shot = FALSE
-
-/obj/item/crusher_trophy/magma_wing/effect_desc()
- return "waveform collapse to make the next magnetic pulse deal [bonus_value] damage"
-
-/obj/item/crusher_trophy/magma_wing/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/magma_wing/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
- if(deadly_shot)
- marker.name = "superheated [marker.name]"
- marker.icon_state = "lava"
- marker.damage = bonus_value
- marker.nodamage = FALSE
- marker.speed = 2
- deadly_shot = FALSE
-
-/obj/item/crusher_trophy/magma_wing/on_mark_detonation(mob/living/target, mob/living/user)
- deadly_shot = TRUE
- addtimer(CALLBACK(src, PROC_REF(reset_deadly_shot)), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
-
-/obj/item/crusher_trophy/magma_wing/proc/reset_deadly_shot()
- deadly_shot = FALSE
-
-//icewing watcher
-/obj/item/crusher_trophy/ice_wing
- name = "frigid sinew"
- desc = "A carefully-preserved freezing organ, dropped by chilling beings."
- icon_state = "ice_wing"
- bonus_value = 8
- denied_type = /obj/item/crusher_trophy/ice_wing
-
-/obj/item/crusher_trophy/ice_wing/effect_desc()
- return "waveform collapse to prevent certain creatures from using certain attacks for [bonus_value*0.1] second\s"
-
-/obj/item/crusher_trophy/ice_wing/on_mark_detonation(mob/living/target, mob/living/user)
- if(ishostile(target))
- var/mob/living/simple_animal/hostile/H = target
- if(H.ranged) //briefly delay ranged attacks
- if(H.ranged_cooldown >= world.time)
- H.ranged_cooldown += bonus_value
- else
- H.ranged_cooldown = bonus_value + world.time
-
-//forgotten watcher
-/obj/item/crusher_trophy/watcher_wing_forgotten
- name = "forgotten watcher wing"
- desc = "A wing with a terminal infection of the strange crystals."
- icon_state = "watcher_wing_crystal"
- denied_type = /obj/item/crusher_trophy/watcher_wing_forgotten
- gender = NEUTER
- bonus_value = 20
- var/deadly_shot = FALSE
-
-/obj/item/crusher_trophy/watcher_wing_forgotten/effect_desc()
- return "waveform collapse to make the next magnetic pulse deal [bonus_value] damage"
-
-/obj/item/crusher_trophy/watcher_wing_forgotten/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/watcher_wing_forgotten/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
- if(deadly_shot)
- marker.name = "crystal [marker.name]"
- marker.icon_state = "crystal_shard"
- marker.damage = bonus_value
- marker.nodamage = FALSE
- marker.speed = 2
- deadly_shot = FALSE
-
-/obj/item/crusher_trophy/watcher_wing_forgotten/on_mark_detonation(mob/living/target, mob/living/user)
- deadly_shot = TRUE
- addtimer(CALLBACK(src, PROC_REF(reset_deadly_shot)), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
-
-/obj/item/crusher_trophy/watcher_wing_forgotten/proc/reset_deadly_shot()
- deadly_shot = FALSE
-
-//legion
-/obj/item/crusher_trophy/legion_skull
- name = "legion skull"
- desc = "A dead and lifeless legion skull. Could be used in crafting."
- icon_state = "legion_skull"
- denied_type = /obj/item/crusher_trophy/legion_skull
- bonus_value = 3
-
-/obj/item/crusher_trophy/legion_skull/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/legion_skull/effect_desc()
- return "a kinetic crusher to recharge [bonus_value*0.1] second\s faster"
-
-/obj/item/crusher_trophy/legion_skull/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time -= bonus_value
-
-/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time += bonus_value
-
-//dwarf legion
-/obj/item/crusher_trophy/dwarf_skull
- name = "shrunken skull"
- desc = "Looks like someone hasn't been drinking their milk. Could be used in crafting."
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- icon_state = "shrunk_skull"
- denied_type = /obj/item/crusher_trophy/dwarf_skull
- bonus_value = 6
-
-/obj/item/crusher_trophy/dwarf_skull/effect_desc()
- return "a kinetic crusher to recharge [bonus_value*0.1] second\s faster"
-
-/obj/item/crusher_trophy/dwarf_skull/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time -= bonus_value
-
-/obj/item/crusher_trophy/dwarf_skull/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time += bonus_value
-
-
-//disfigured legion
-/obj/item/crusher_trophy/legion_skull_crystal
- name = "disfigured legion skull"
- desc = "A dead and lifeless legion skull. The crystals keep it alive, even in agony."
- icon_state = "legion_skull_crystal"
- denied_type = /obj/item/crusher_trophy/legion_skull_crystal
- bonus_value = 1
-
-/obj/item/crusher_trophy/legion_skull_crystal/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/legion_skull_crystal/effect_desc()
- return "waveform collapse to shoot 3 projectiles that only hits hostile fauna"
-
-/obj/item/crusher_trophy/legion_skull_crystal/on_mark_detonation(mob/living/target, mob/living/user)
- for(var/i in 0 to 5)
- var/obj/projectile/projectile_to_shoot = new /obj/projectile/crystalline_crusher(get_turf(src))
- projectile_to_shoot.preparePixelProjectile(get_step(src, pick(GLOB.alldirs)), get_turf(src))
- projectile_to_shoot.firer = user
- projectile_to_shoot.fire(i*(360/5))
- return ..()
-
-/obj/projectile/crystalline_crusher
- name = "Crystalline Shard"
- icon_state = "crystal_shard"
- damage = 25
- damage_type = BRUTE
- speed = 3
-
-/obj/projectile/crystalline_crusher/on_hit(atom/target, blocked)
- . = ..()
- var/turf/turf_hit = get_turf(target)
- new /obj/effect/temp_visual/goliath_tentacle/crystal/visual_only(turf_hit,firer)
-
-/obj/projectile/crystalline_crusher/can_hit_target(atom/target, list/passthrough, direct_target, ignore_loc)
- if(!(istype(target,/mob/living/simple_animal/hostile/asteroid)))
- if(isturf(target))
- return ..()
- return FALSE
- return ..()
-
-//blood-drunk hunter
-/obj/item/crusher_trophy/miner_eye
- name = "eye of a blood-drunk hunter"
- desc = "Its pupil is collapsed and turned to mush."
- icon_state = "hunter_eye"
- denied_type = /obj/item/crusher_trophy/miner_eye
-
-/obj/item/crusher_trophy/miner_eye/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/miner_eye/effect_desc()
- return "waveform collapse to grant stun immunity and 90% damage reduction for 1 second"
-
-/obj/item/crusher_trophy/miner_eye/on_mark_detonation(mob/living/target, mob/living/user)
- user.apply_status_effect(STATUS_EFFECT_BLOODDRUNK)
-
-//whelp
-/obj/item/crusher_trophy/tail_spike
- desc = "A spike taken from a young dragon's tail. Sharp enough to stab someone with."
- denied_type = /obj/item/crusher_trophy/tail_spike
- bonus_value = 5
- force = 10
- throwforce = 15
- throw_speed = 4
- sharpness = IS_SHARP
- attack_verb = list("cut", "sliced", "diced")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/crusher_trophy/tail_spike/effect_desc()
- return "waveform collapse to do [bonus_value] damage to nearby creatures and push them back"
-
-/obj/item/crusher_trophy/tail_spike/on_mark_detonation(mob/living/target, mob/living/user)
- for(var/mob/living/L in oview(2, user))
- if(L.stat == DEAD)
- continue
- playsound(L, 'sound/magic/fireball.ogg', 20, TRUE)
- new /obj/effect/temp_visual/fire(L.loc)
- addtimer(CALLBACK(src, PROC_REF(pushback), L, user), 1) //no free backstabs, we push AFTER module stuff is done
- L.adjustFireLoss(bonus_value, forced = TRUE)
-
-/obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user)
- if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed
- step(target, get_dir(user, target))
-
-//ash drake
-/obj/item/crusher_trophy/ash_spike
- desc = "A molten spike taken from an ash drake's tail. Hot to the touch and extremely sharp."
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- icon_state = "ash_spike"
- denied_type = /obj/item/crusher_trophy/ash_spike
- bonus_value = 15
- force = 15
- throwforce = 20
- throw_speed = 4
- sharpness = IS_SHARP
- attack_verb = list("cut", "braised", "singed")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/crusher_trophy/ash_spike/effect_desc()
- return "waveform collapse to do [bonus_value] damage to nearby creatures and push them back"
-
-/obj/item/crusher_trophy/ash_spike/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/ash_spike/on_mark_detonation(mob/living/target, mob/living/user)
- for(var/mob/living/L in oview(2, user))
- if(L.stat == DEAD)
- continue
- playsound(L, 'sound/magic/fireball.ogg', 20, TRUE)
- new /obj/effect/temp_visual/fire(L.loc)
- addtimer(CALLBACK(src, PROC_REF(pushback), L, user), 1) //no free backstabs, we push AFTER module stuff is done
- L.adjustFireLoss(bonus_value, forced = TRUE)
-
-/obj/item/crusher_trophy/ash_spike/proc/pushback(mob/living/target, mob/living/user)
- if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed
- step(target, get_dir(user, target))
-
-//bubblegum
-/obj/item/crusher_trophy/demon_claws
- name = "demon claws"
- desc = "A set of blood-drenched claws from a massive demon's hand."
- icon_state = "demon_claws"
- gender = PLURAL
- denied_type = /obj/item/crusher_trophy/demon_claws
- bonus_value = 10
- var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
-
-/obj/item/crusher_trophy/demon_claws/effect_desc()
- return "melee hits to do [bonus_value * 0.2] more damage and heal you for [bonus_value * 0.1], with 5X effect on waveform collapse"
-
-/obj/item/crusher_trophy/demon_claws/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.force += bonus_value * 0.2
- H.detonation_damage += bonus_value * 0.8
- AddComponent(/datum/component/two_handed, force_wielded=(20 + bonus_value * 0.2))
-
-/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.force -= bonus_value * 0.2
- H.detonation_damage -= bonus_value * 0.8
- AddComponent(/datum/component/two_handed, force_wielded=20)
-
-/obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user)
- user.heal_ordered_damage(bonus_value * 0.1, damage_heal_order)
-
-/obj/item/crusher_trophy/demon_claws/on_mark_detonation(mob/living/target, mob/living/user)
- user.heal_ordered_damage(bonus_value * 0.4, damage_heal_order)
-
-//colossus
-/obj/item/crusher_trophy/blaster_tubes
- name = "blaster tubes"
- desc = "The blaster tubes from a colossus's arm."
- icon_state = "blaster_tubes"
- gender = PLURAL
- denied_type = /obj/item/crusher_trophy/blaster_tubes
- bonus_value = 15
- var/deadly_shot = FALSE
-
-/obj/item/crusher_trophy/blaster_tubes/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/blaster_tubes/effect_desc()
- return "waveform collapse to make the next magnetic pulse deal [bonus_value] damage but move slower"
-
-/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
- if(deadly_shot)
- marker.name = "ominous [marker.name]"
- marker.icon_state = "chronobolt"
- marker.damage = bonus_value
- marker.nodamage = FALSE
- marker.speed = 2
- deadly_shot = FALSE
-
-/obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user)
- deadly_shot = TRUE
- addtimer(CALLBACK(src, PROC_REF(reset_deadly_shot)), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
-
-/obj/item/crusher_trophy/blaster_tubes/proc/reset_deadly_shot()
- deadly_shot = FALSE
-
-//hierophant
-/obj/item/crusher_trophy/vortex_talisman
- name = "vortex talisman"
- desc = "A glowing trinket that was originally the Hierophant's beacon."
- icon_state = "vortex_talisman"
- denied_type = /obj/item/crusher_trophy/vortex_talisman
-
-/obj/item/crusher_trophy/vortex_talisman/effect_desc()
- return "waveform collapse to create a barrier you can pass"
-
-/obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user)
- var/turf/current_location = get_turf(user)
- var/area/current_area = current_location.loc
- if(current_area.area_flags & NOTELEPORT)
- to_chat(user, "[src] fizzles uselessly.")
- return
- var/turf/T = get_turf(user)
- new /obj/effect/temp_visual/hierophant/wall/crusher(T, user) //a wall only you can pass!
- var/turf/otherT = get_step(T, turn(user.dir, 90))
- if(otherT)
- new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user)
- otherT = get_step(T, turn(user.dir, -90))
- if(otherT)
- new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user)
-
-/obj/effect/temp_visual/hierophant/wall/crusher
- duration = 75
-
-//I am afraid of this code. It also does not function(in terms of doing damage to enemies) as of my last test.
-/obj/item/crusher_trophy/king_goat
- name = "king goat hoof"
- desc = "A hoof from the king of all goats, it still glows with a fraction of its original power..."
- icon_state = "goat_hoof" //needs a better sprite but I cant sprite .
- denied_type = /obj/item/crusher_trophy/king_goat
-
-/obj/item/crusher_trophy/king_goat/examine(mob/user)
- . = ..()
- . += "Suitable as a trophy for a proto-kinetic crusher."
-
-/obj/item/crusher_trophy/king_goat/effect_desc()
- return "you also passively recharge pulses 5x as fast while this is equipped and do a decent amount of damage at the cost of dulling the blade"
-
-/obj/item/crusher_trophy/king_goat/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
- marker.damage = 10 //in my testing only does damage to simple mobs so should be fine to have it high //it does damage to nobody. Please fix -M
-
-/obj/item/crusher_trophy/king_goat/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time = 3
- H.AddComponent(/datum/component/two_handed, force_wielded=5)
-
-/obj/item/crusher_trophy/king_goat/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.charge_time = 15
- H.AddComponent(/datum/component/two_handed, force_wielded=20)
-
-/obj/item/crusher_trophy/shiny
- name = "shiny nugget"
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- desc = "A glimmering nugget of dull metal. As it turns out, the fools were right- pyrite is a far rarer substance than gold in the space age. You could probably sell this for a fair price."
- icon_state = "nugget"
- gender = PLURAL
- denied_type = /obj/item/crusher_trophy/shiny
-
-/obj/item/crusher_trophy/shiny/effect_desc()
- return "empowered butchering chances"
-
-/obj/item/crusher_trophy/shiny/add_to(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.AddComponent(/datum/component/butchering, 60, 210)
-
-/obj/item/crusher_trophy/shiny/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
- . = ..()
- if(.)
- H.AddComponent(/datum/component/butchering, 60, 110)
-
//outdated Nanotrasen prototype of the crusher. Incredibly heavy, but the blade was made at a premium. //to alter this I had to duplicate some code, big moment.
/obj/item/kinetic_crusher/old
icon_state = "crusherold"
@@ -820,16 +247,3 @@
. = ..()
if(wielded)
. += "[icon_state]_lit"
-
-/obj/item/crusher_trophy/lobster_claw
- name = "lobster claw"
- icon_state = "lobster_claw"
- desc = "A lobster claw."
- denied_type = /obj/item/crusher_trophy/lobster_claw
- bonus_value = 1
-
-/obj/item/crusher_trophy/lobster_claw/effect_desc()
- return "mark detonation to briefly stagger the target for [bonus_value] seconds"
-
-/obj/item/crusher_trophy/lobster_claw/on_mark_detonation(mob/living/target, mob/living/user)
- target.apply_status_effect(/datum/status_effect/stagger, bonus_value SECONDS)
diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm
index d334b0ce3de4..d38a3ce8b55b 100644
--- a/code/modules/mining/equipment/mining_tools.dm
+++ b/code/modules/mining/equipment/mining_tools.dm
@@ -53,6 +53,7 @@
force = 19
custom_price = 1500
custom_premium_price = 2000
+ custom_materials = list(/datum/material/diamond=2000)
/obj/item/pickaxe/drill
name = "mining drill"
@@ -79,8 +80,9 @@
icon_state = "diamonddrill"
item_state = "diamonddrill"
toolspeed = 0.2
- desc = "EXOCON's improvement on the NT autodrill design, featuring a premium diamond cutting head. Yours is the drill that will pierce the heavens!"
+ desc = "EXOCOM's improvement on the NT autodrill design, featuring a premium diamond cutting head. Yours is the drill that will pierce the heavens!"
force = 20
+ custom_materials = list(/datum/material/diamond=2000)
/obj/item/pickaxe/drill/cyborg/diamond //This is the BORG version!
name = "diamond-tipped integrated mining drill" //To inherit the NODROP_1 flag, and easier to change borg specific drill mechanics.
@@ -94,7 +96,7 @@
toolspeed = 0.1 //the epitome of powertools. extremely fast mining
usesound = 'sound/weapons/sonic_jackhammer.ogg'
hitsound = 'sound/weapons/sonic_jackhammer.ogg'
- desc = "The epitome of conventional rock-smashing technology, invented by NT and cost-optimized by EXOCON. Smashes rocks, objects, and unfortunate wildlife with sonic blasts."
+ desc = "The epitome of conventional rock-smashing technology, invented by NT and cost-optimized by EXOCOM. Smashes rocks, objects, and unfortunate wildlife with sonic blasts."
force = 25
attack_verb = list("blasted", "smashed", "slammed", "hammered")
diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm
index 87736c3438e4..4bd6824327f3 100644
--- a/code/modules/mining/equipment/regenerative_core.dm
+++ b/code/modules/mining/equipment/regenerative_core.dm
@@ -1,7 +1,7 @@
/*********************Hivelord stabilizer****************/
/obj/item/hivelordstabilizer
name = "stabilizing serum"
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/medicine.dmi'
icon_state = "bottle19"
desc = "Inject certain types of monster organs with this stabilizer to preserve their healing powers indefinitely."
w_class = WEIGHT_CLASS_TINY
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index c4b75883eb67..7ba30d327444 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -281,16 +281,16 @@
//Signs
/obj/structure/sign/mining
- name = "\improper Nanotrasen mining corps sign"
- desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims."
- icon = 'icons/turf/walls/survival_pod_walls.dmi'
- icon_state = "ntpod"
+ name = "\improper N+S mining corps sign"
+ desc = "A sign of relief for weary miners, and a warning for would-be competitors to N+S's mining claims."
+ icon = 'icons/obj/nanotrasen_logos.dmi'
+ icon_state = "ns"
/obj/structure/sign/mining/survival
name = "shelter sign"
desc = "A high visibility sign designating a safe shelter."
- icon = 'icons/turf/walls/survival_pod_walls.dmi'
- icon_state = "survival"
+ icon = 'icons/obj/structures/signs/sign.dmi'
+ icon_state = "secureareaold"
//Fluff
/obj/structure/tubes
@@ -315,10 +315,6 @@
/obj/item/hierophant_club,
/obj/item/gun/energy/minigun,
/obj/item/gun/ballistic/automatic/hmg/l6_saw,
- /obj/item/gun/magic/staff/chaos,
- /obj/item/gun/magic/staff/spellblade,
- /obj/item/gun/magic/wand/death,
- /obj/item/gun/magic/wand/fireball,
/obj/item/stack/telecrystal/twenty,
/obj/item/nuke_core,
/obj/item/phylactery,
diff --git a/code/modules/mining/equipment/trophies.dm b/code/modules/mining/equipment/trophies.dm
new file mode 100644
index 000000000000..a9631c7ffc15
--- /dev/null
+++ b/code/modules/mining/equipment/trophies.dm
@@ -0,0 +1,184 @@
+//trophies
+/obj/item/mob_trophy
+ name = "tail spike"
+ desc = "A strange spike with no usage."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "tail_spike"
+
+//legion
+/obj/item/mob_trophy/legion_skull
+ name = "legion skull"
+ desc = "A dead and lifeless legion skull. Could be used in crafting."
+ icon_state = "legion_skull"
+
+/obj/item/mob_trophy/wolf_ear
+ name = "wolf ear"
+ desc = "The battered remains of a wolf's ear. You could attach it to a crusher, or use the fur to craft a trophy."
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ icon_state = "torn_ear"
+
+/obj/item/mob_trophy/fang
+ name = "battle-stained fang"
+ desc = "A wolf fang, displaying the wear and tear associated with a long and colorful life. Could be attached to a kinetic crusher or used to make a trophy."
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ icon_state = "fang"
+
+/*
+//goliath
+/obj/item/mob_trophy/goliath_tentacle
+ name = "goliath tentacle"
+ desc = "A sliced-off goliath tentacle."
+ icon_state = "goliath_tentacle"
+
+//ancient goliath0
+/obj/item/mob_trophy/elder_tentacle
+ name = "elder tentacle"
+ desc = "The barbed tip of a tentacle sliced from an incredibly ancient goliath."
+ icon_state = "elder_tentacle"
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+
+//crystal goliath
+/obj/item/mob_trophy/goliath_crystal
+ name = "goliath crystal"
+ desc = "A crystal ripped off from a goliath infected by the strange crystals. You can see the original skin of the goliath deeply embeded in it."
+ icon_state = "goliath_crystal"
+
+//watcher
+/obj/item/mob_trophy/watcher_wing
+ name = "watcher wing"
+ desc = "A wing ripped from a watcher."
+ icon_state = "watcher_wing"
+
+//magmawing watcher
+/obj/item/mob_trophy/magma_wing
+ name = "magmatic sinew"
+ desc = "A fuming organ, dropped by beings hotter then lava."
+ icon_state = "magma_wing"
+ gender = NEUTER
+
+//icewing watcher
+/obj/item/mob_trophy/ice_wing
+ name = "frigid sinew"
+ desc = "A carefully-preserved freezing organ, dropped by chilling beings."
+ icon_state = "ice_wing"
+
+//forgotten watcher
+/obj/item/mob_trophy/watcher_wing_forgotten
+ name = "forgotten watcher wing"
+ desc = "A wing with a terminal infection of the strange crystals."
+ icon_state = "watcher_wing_crystal"
+ gender = NEUTER
+
+//dwarf legion
+/obj/item/mob_trophy/dwarf_skull
+ name = "shrunken skull"
+ desc = "Looks like someone hasn't been drinking their milk. Could be used in crafting."
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ icon_state = "shrunk_skull"
+
+//disfigured legion
+/obj/item/mob_trophy/legion_skull_crystal
+ name = "disfigured legion skull"
+ desc = "A dead and lifeless legion skull. The crystals keep it alive, even in agony."
+ icon_state = "legion_skull_crystal"
+
+//blood-drunk hunter
+/obj/item/mob_trophy/miner_eye
+ name = "eye of a blood-drunk hunter"
+ desc = "Its pupil is collapsed and turned to mush."
+ icon_state = "hunter_eye"
+
+//whelp
+/obj/item/mob_trophy/tail_spike
+ desc = "A spike taken from a young dragon's tail. Sharp enough to stab someone with."
+ force = 10
+ throwforce = 15
+ throw_speed = 4
+ sharpness = IS_SHARP
+ attack_verb = list("cut", "sliced", "diced")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
+//ash drake
+/obj/item/mob_trophy/ash_spike
+ desc = "A molten spike taken from an ash drake's tail. Hot to the touch and extremely sharp."
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ icon_state = "ash_spike"
+ force = 15
+ throwforce = 20
+ throw_speed = 4
+ sharpness = IS_SHARP
+ attack_verb = list("cut", "braised", "singed")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
+//bubblegum
+/obj/item/mob_trophy/demon_claws
+ name = "demon claws"
+ desc = "A set of blood-drenched claws from a massive demon's hand."
+ icon_state = "demon_claws"
+ gender = PLURAL
+
+//colossus
+/obj/item/mob_trophy/blaster_tubes
+ name = "blaster tubes"
+ desc = "The blaster tubes from a colossus's arm."
+ icon_state = "blaster_tubes"
+ gender = PLURAL
+
+//hierophant
+/obj/item/mob_trophy/vortex_talisman
+ name = "vortex talisman"
+ desc = "A glowing trinket that was originally the Hierophant's beacon."
+ icon_state = "vortex_talisman"
+
+// Broodmother's loot: Broodmother Tongue
+/obj/item/mob_trophy/broodmother_tongue
+ name = "broodmother tongue"
+ desc = "The tongue of a broodmother. If attached a certain way, makes for a suitable crusher trophy."
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ icon_state = "broodmother_tongue"
+
+/obj/item/mob_trophy/shiny
+ name = "shiny nugget"
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ desc = "A glimmering nugget of dull metal. As it turns out, the fools were right- pyrite is a far rarer substance than gold in the space age. You could probably sell this for a fair price."
+ icon_state = "nugget"
+ gender = PLURAL
+
+/obj/item/mob_trophy/lobster_claw
+ name = "lobster claw"
+ icon_state = "lobster_claw"
+ desc = "A lobster claw."
+
+/obj/item/mob_trophy/ice_block_talisman
+ name = "ice block talisman"
+ desc = "A glowing trinket that a demonic miner had on him, it seems he couldn't utilize it for whatever reason."
+ icon_state = "freeze_cube"
+
+/obj/item/mob_trophy/brimdemon_fang
+ name = "brimdemon's fang"
+ icon_state = "brimdemon_fang"
+ desc = "A fang from a brimdemon's corpse."
+
+/obj/item/mob_trophy/ice_crystal
+ name = "frost gem"
+ icon = 'icons/obj/lavaland/elite_trophies.dmi'
+ desc = "The glowing remnant of an ancient ice demon- so cold that it hurts to touch."
+ icon_state = "ice_crystal"
+
+/obj/item/mob_trophy/lobster_claw
+ name = "lobster claw"
+ icon_state = "lobster_claw"
+ desc = "A lobster claw."
+
+/obj/item/mob_trophy/bear_paw
+ name = "polar bear paw"
+ desc = "It's a polar bear paw."
+ icon_state = "bear_paw"
+ icon ='icons/obj/lavaland/elite_trophies.dmi'
+
+/obj/item/mob_trophy/war_paw
+ name = "Armored bear paw"
+ desc = "It's a paw from a true warrior. Still remembers the basics of CQB."
+ icon_state = "armor_paw"
+ icon ='icons/obj/lavaland/elite_trophies.dmi'
+*/
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index 0bade04d3fe8..f9563cc078eb 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -432,14 +432,6 @@
user.put_in_hands(result)
to_chat(user, "You finish breaking [src]")
-//CRAFTING
-
-/datum/crafting_recipe/mushroom_bowl
- name = "Mushroom Bowl"
- result = /obj/item/reagent_containers/glass/bowl/mushroom_bowl
- reqs = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings = 5)
- time = 30
- category = CAT_PRIMAL
/obj/item/reagent_containers/food/snacks/customizable/salad/ashsalad
desc = "Very ashy."
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 96954cd59b4d..268413ef203c 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -66,8 +66,6 @@
new /obj/item/wisp_lantern(src)
if(20)
new /obj/item/immortality_talisman(src)
- if(21)
- new /obj/item/gun/magic/hook(src)
if(22)
new /obj/item/voodoo(src)
if(23)
@@ -143,8 +141,6 @@
new /obj/item/wisp_lantern(src)
if(20)
new /obj/item/immortality_talisman(src)
- if(21)
- new /obj/item/gun/magic/hook(src)
if(22)
new /obj/item/voodoo(src)
if(23)
@@ -281,30 +277,31 @@
activated = TRUE
//Memento Mori
-/obj/item/clothing/neck/necklace/memento_mori
+/obj/item/clothing/neck/memento_mori
name = "Memento Mori"
desc = "A mysterious pendant. An inscription on it says: \"Certain death tomorrow means certain life today.\""
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "memento_mori"
+ mob_overlay_state = "crystal_talisman"
actions_types = list(/datum/action/item_action/hands_free/memento_mori)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/mob/living/carbon/human/active_owner
-/obj/item/clothing/neck/necklace/memento_mori/item_action_slot_check(slot)
+/obj/item/clothing/neck/memento_mori/item_action_slot_check(slot)
return slot == ITEM_SLOT_NECK
-/obj/item/clothing/neck/necklace/memento_mori/dropped(mob/user)
+/obj/item/clothing/neck/memento_mori/dropped(mob/user)
..()
if(active_owner)
mori()
//Just in case
-/obj/item/clothing/neck/necklace/memento_mori/Destroy()
+/obj/item/clothing/neck/memento_mori/Destroy()
if(active_owner)
mori()
return ..()
-/obj/item/clothing/neck/necklace/memento_mori/proc/memento(mob/living/carbon/human/user)
+/obj/item/clothing/neck/memento_mori/proc/memento(mob/living/carbon/human/user)
to_chat(user, "You feel your life being drained by the pendant...")
if(do_after(user, 40, target = user))
to_chat(user, "Your lifeforce is now linked to the pendant! You feel like removing it would kill you, and yet you instinctively know that until then, you won't die.")
@@ -314,7 +311,7 @@
icon_state = "memento_mori_active"
active_owner = user
-/obj/item/clothing/neck/necklace/memento_mori/proc/mori()
+/obj/item/clothing/neck/memento_mori/proc/mori()
icon_state = "memento_mori"
if(!active_owner)
return
@@ -329,7 +326,7 @@
desc = "Bind your life to the pendant."
/datum/action/item_action/hands_free/memento_mori/Trigger()
- var/obj/item/clothing/neck/necklace/memento_mori/MM = target
+ var/obj/item/clothing/neck/memento_mori/MM = target
if(!MM.active_owner)
if(ishuman(owner))
MM.memento(owner)
@@ -480,91 +477,6 @@
/obj/effect/warp_cube/ex_act(severity, target)
return
-//Meat Hook
-/obj/item/gun/magic/hook
- name = "meat hook"
- desc = "A light hooked blade, attached by the handle to a long chain. Can be used to make quick strikes in hand, or thrown at enemies, magically dragging them to the user. Get over here!"
- ammo_type = /obj/item/ammo_casing/magic/hook
- icon_state = "hook"
- item_state = "hook"
- lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- fire_sound = 'sound/weapons/batonextend.ogg'
- max_charges = 1
- item_flags = NEEDS_PERMIT
- force = 15
- sharpness = IS_SHARP
- block_chance = 5//A pittance, but might be worth something in a scuffle
- hitsound = 'sound/weapons/chainhit.ogg'
-
-/obj/item/gun/magic/hook/melee_attack_chain(mob/user, atom/target, params)
- ..()
- user.changeNext_move(CLICK_CD_MELEE * 0.5)//quick to swing. 15 force can be quite something with this attack frequency.
-
-/obj/item/gun/magic/hook/Initialize()
- . = ..()
- AddComponent(/datum/component/butchering, 15, 130, 0, hitsound)
-
-/obj/item/ammo_casing/magic/hook
- name = "hook"
- desc = "A hook."
- projectile_type = /obj/projectile/hook
- caliber = "hook"
- icon_state = "hook"
-
-/obj/projectile/hook
- name = "hook"
- icon_state = "hook"
- icon = 'icons/obj/lavaland/artefacts.dmi'
- pass_flags = PASSTABLE
- damage = 20
- stamina = 20
- armour_penetration = 60
- damage_type = BRUTE
- hitsound = 'sound/effects/splat.ogg'
- var/chain
- var/knockdown_time = (0.5 SECONDS)
-
-/obj/projectile/hook/fire(setAngle)
- if(firer)
- chain = firer.Beam(src, icon_state = "chain", emissive = FALSE)
- ..()
- //TODO: root the firer until the chain returns
-
-/obj/projectile/hook/on_hit(atom/target)
- . = ..()
- if(ismovable(target))
- var/atom/movable/A = target
- if(A.anchored)
- return
- A.visible_message("[A] is snagged by [firer]'s hook!")
- new /datum/forced_movement(A, get_turf(firer), 5, TRUE)
- if (isliving(target))
- var/mob/living/fresh_meat = target
- fresh_meat.Knockdown(knockdown_time)
- return
- //TODO: keep the chain beamed to A
- //TODO: needs a callback to delete the chain
-
-/obj/projectile/hook/Destroy()
- qdel(chain)
- return ..()
-
-//just a nerfed version of the real thing for the bounty hunters.
-/obj/item/gun/magic/hook/bounty
- name = "hook"
- ammo_type = /obj/item/ammo_casing/magic/hook/bounty
-
-/obj/item/gun/magic/hook/bounty/shoot_with_empty_chamber(mob/living/user)
- to_chat(user, "The [src] isn't ready to fire yet!")
-
-/obj/item/ammo_casing/magic/hook/bounty
- projectile_type = /obj/projectile/hook/bounty
-
-/obj/projectile/hook/bounty
- damage = 0
- stamina = 40
-
//Immortality Talisman: Now with state-of-the-art panic button technology
/obj/item/immortality_talisman
name = "\improper Immortality Talisman"
@@ -589,10 +501,6 @@
if(input)
src.warcry = input
-/obj/item/immortality_talisman/Initialize()
- . = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE)
-
/datum/action/item_action/hands_free/immortality
name = "Immortality"
@@ -667,7 +575,6 @@
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "paradox_bag"
mob_overlay_icon = 'icons/mob/clothing/belt.dmi'
- mob_overlay_state = "paradoxbag"
slot_flags = ITEM_SLOT_BELT
resistance_flags = INDESTRUCTIBLE
@@ -882,14 +789,45 @@
walk(hit_mob, 0) //stops them mid pathing even if they're stunimmune
hit_mob.apply_status_effect(/datum/status_effect/ice_block_talisman, 5 SECONDS)
+/datum/status_effect/ice_block_talisman
+ id = "ice_block_talisman"
+ duration = 40
+ status_type = STATUS_EFFECT_REFRESH
+ alert_type = /atom/movable/screen/alert/status_effect/ice_block_talisman
+ /// Stored icon overlay for the hit mob, removed when effect is removed
+ var/icon/cube
+
+/atom/movable/screen/alert/status_effect/ice_block_talisman
+ name = "Frozen Solid"
+ desc = "You're frozen inside an ice cube, and cannot move!"
+ icon_state = "frozen"
+
+/datum/status_effect/ice_block_talisman/on_apply()
+ RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(owner_moved))
+ if(!owner.stat)
+ to_chat(owner, "You become frozen in a cube!")
+ cube = icon('icons/effects/freeze.dmi', "ice_cube")
+ var/icon/size_check = icon(owner.icon, owner.icon_state)
+ cube.Scale(size_check.Width(), size_check.Height())
+ owner.add_overlay(cube)
+ return ..()
+
+/// Blocks movement from the status effect owner
+/datum/status_effect/ice_block_talisman/proc/owner_moved()
+ return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
+
+/datum/status_effect/ice_block_talisman/on_remove()
+ if(!owner.stat)
+ to_chat(owner, "The cube melts!")
+ owner.cut_overlay(cube)
+ UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
+
//earthquake gauntlets
/obj/item/clothing/gloves/gauntlets
name = "concussive gauntlets"
desc = "Buried deep beneath the earth, these ancient gauntlets absorbed the tectonic power of earthquakes. "
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "concussive_gauntlets"
- mob_overlay_icon = 'icons/mob/clothing/hands.dmi'
- mob_overlay_state = "concussive_gauntlets"
toolspeed = 0.1
strip_delay = 40
equip_delay_other = 20
@@ -926,6 +864,7 @@
return COMPONENT_NO_ATTACK_OBJ
//A version of the Cave Story refrence that a deranged scientist got their hands on. Better? Not really. Different? Definitely.
+//TODO: replace with a proper polar star and spur, not to mention a proper sprite
/obj/item/gun/energy/spur
name = "Slowpoke"
desc = "The work of a truly genius gunsmith, altered and \"improved\" by a truly deranged Nanotrasen scientist, using components from a kinetic accelerator and beam rifle. Draw, partner!"
@@ -934,11 +873,10 @@
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
icon_state = "spur"
item_state = "spur"
- fire_delay = 0.5 //BRATATAT! This is a cowboy's six-shooter after all.
selfcharge = 1
charge_delay = 1
slot_flags = ITEM_SLOT_BELT
- fire_delay = 1
+ fire_delay = 0.1 SECONDS
recoil = 1
cell_type = /obj/item/stock_parts/cell/gun
ammo_type = list(/obj/item/ammo_casing/energy/spur)
@@ -1272,17 +1210,9 @@
new /obj/item/lava_staff(src)
if(3)
new /obj/item/book/granter/spell/sacredflame(src)
- new /obj/item/gun/magic/wand/fireball(src)
if(4)
new /obj/item/dragons_blood(src)
-/obj/structure/closet/crate/necropolis/dragon/crusher
- name = "firey dragon chest"
-
-/obj/structure/closet/crate/necropolis/dragon/crusher/PopulateContents()
- ..()
- new /obj/item/crusher_trophy/ash_spike(src)
-
/obj/item/melee/ghost_sword
name = "\improper spectral blade"
desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly."
@@ -1495,21 +1425,12 @@
/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents()
new /obj/item/clothing/suit/space/hostile_environment(src)
new /obj/item/clothing/head/helmet/space/hostile_environment(src)
- var/loot = rand(1,3)
+ var/loot = rand(1,2)
switch(loot)
if(1)
new /obj/item/mayhem(src)
if(2)
new /obj/item/blood_contract(src)
- if(3)
- new /obj/item/gun/magic/staff/spellblade(src)
-
-/obj/structure/closet/crate/necropolis/bubblegum/crusher
- name = "bloody bubblegum chest"
-
-/obj/structure/closet/crate/necropolis/bubblegum/crusher/PopulateContents()
- ..()
- new /obj/item/crusher_trophy/demon_claws(src)
/obj/item/mayhem
name = "mayhem in a bottle"
@@ -1519,8 +1440,8 @@
/obj/item/mayhem/attack_self(mob/user)
for(var/mob/living/carbon/human/H in range(7,user))
- var/obj/effect/mine/pickup/bloodbath/B = new(H)
- INVOKE_ASYNC(B, TYPE_PROC_REF(/obj/effect/mine/pickup/bloodbath, mineEffect), H)
+ var/obj/item/mine/pressure/pickup/bloodbath/B = new(H)
+ INVOKE_ASYNC(B, TYPE_PROC_REF(/obj/item/mine/pressure/pickup/bloodbath, mine_effect), H)
to_chat(user, "You shatter the bottle!")
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, TRUE)
message_admins("[ADMIN_LOOKUPFLW(user)] has activated a bottle of mayhem!")
@@ -1586,13 +1507,6 @@
new random_crystal(src)
new /obj/item/organ/vocal_cords/colossus(src)
-/obj/structure/closet/crate/necropolis/colossus/crusher
- name = "angelic colossus chest"
-
-/obj/structure/closet/crate/necropolis/colossus/crusher/PopulateContents()
- ..()
- new /obj/item/crusher_trophy/blaster_tubes(src)
-
//Hierophant
/obj/item/hierophant_club
name = "hierophant club"
diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm
index 8a73aff51a69..63b220828f81 100644
--- a/code/modules/mining/lavaland/ruins/gym.dm
+++ b/code/modules/mining/lavaland/ruins/gym.dm
@@ -7,6 +7,47 @@
layer = WALL_OBJ_LAYER
var/list/hit_sounds = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg',\
'sound/weapons/punch1.ogg', 'sound/weapons/punch2.ogg', 'sound/weapons/punch3.ogg', 'sound/weapons/punch4.ogg')
+ var/buildstacktype = /obj/item/stack/sheet/cotton/cloth
+ var/buildstackamount = 5
+
+/obj/structure/punching_bag/deconstruct(disassembled = TRUE)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ if(buildstacktype)
+ new buildstacktype(loc,buildstackamount)
+ return..()
+
+/obj/structure/punching_bag/wrench_act(mob/living/user, obj/item/W)
+ if(..())
+ return TRUE
+ add_fingerprint(user)
+ var/action = anchored ? "unbolts [src] from" : "bolts [src] to"
+ var/uraction = anchored ? "unbolt [src] from" : "bolt [src] to"
+ user.visible_message(span_warning("[user] [action] the floor."), span_notice("You start to [uraction] the floor..."), span_hear("You hear rustling noises."))
+ if(W.use_tool(src, user, 50, volume=100, extra_checks = CALLBACK(src, PROC_REF(check_anchored_state), anchored)))
+ set_anchored(!anchored)
+ to_chat(user, span_notice("You [anchored ? "bolt" : "unbolt"] [src] from the floor."))
+ return TRUE
+
+/obj/structure/punching_bag/wirecutter_act(mob/living/user, obj/item/W)
+ . = ..()
+ if(!anchored)
+ user.visible_message(span_warning("[user] cuts apart [src]."), span_notice("You start to cut apart [src]."), span_hear("You hear cutting."))
+ if(W.use_tool(src, user, 50, volume=100))
+ if(anchored)
+ return TRUE
+ to_chat(user, span_notice("You cut apart [src]."))
+ deconstruct(TRUE)
+ return TRUE
+
+/obj/structure/punching_bag/proc/check_anchored_state(check_anchored)
+ return anchored == check_anchored
+
+/obj/structure/punching_bag/examine(mob/user)
+ . = ..()
+ if(anchored)
+ . += span_notice("[src] is bolted to the floor.")
+ else
+ . += span_notice("[src] is no longer bolted to the floor, and the seams can be cut apart.")
/obj/structure/punching_bag/attack_hand(mob/user as mob)
. = ..()
@@ -25,6 +66,8 @@
icon = 'icons/obj/gym_equipment.dmi'
density = TRUE
anchored = TRUE
+ var/buildstacktype = /obj/item/stack/sheet/metal
+ var/buildstackamount = 5
/obj/structure/weightmachine/proc/AnimateMachine(mob/living/user)
return
@@ -33,6 +76,45 @@
. = ..()
icon_state = (obj_flags & IN_USE) ? "[base_icon_state]-u" : base_icon_state
+/obj/structure/weightmachine/deconstruct(disassembled = TRUE)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ if(buildstacktype)
+ new buildstacktype(loc,buildstackamount)
+ return..()
+
+/obj/structure/weightmachine/wrench_act(mob/living/user, obj/item/W)
+ if(..())
+ return TRUE
+ add_fingerprint(user)
+ var/action = anchored ? "unbolts [src] from" : "bolts [src] to"
+ var/uraction = anchored ? "unbolt [src] from" : "bolt [src] to"
+ user.visible_message(span_warning("[user] [action] the floor."), span_notice("You start to [uraction] the floor..."), span_hear("You hear rustling noises."))
+ if(W.use_tool(src, user, 50, volume=100, extra_checks = CALLBACK(src, PROC_REF(check_anchored_state), anchored)))
+ set_anchored(!anchored)
+ to_chat(user, span_notice("You [anchored ? "bolt" : "unbolt"] [src] from the floor."))
+ return TRUE
+
+/obj/structure/weightmachine/screwdriver_act(mob/living/user, obj/item/W)
+ . = ..()
+ if(!anchored)
+ user.visible_message(span_warning("[user] screws apart [src]."), span_notice("You start to screw apart [src]."), span_hear("You hear screwing."))
+ if(W.use_tool(src, user, 50, volume=100))
+ if(anchored)
+ return TRUE
+ to_chat(user, span_notice("You screw apart [src]."))
+ deconstruct(TRUE)
+ return TRUE
+
+/obj/structure/weightmachine/proc/check_anchored_state(check_anchored)
+ return anchored == check_anchored
+
+/obj/structure/weightmachine/examine(mob/user)
+ . = ..()
+ if(anchored)
+ . += span_notice("[src] is bolted to the floor.")
+ else
+ . += span_notice("[src] is no longer bolted to the floor, and the screws are exposed.")
+
/obj/structure/weightmachine/update_overlays()
. = ..()
@@ -44,7 +126,7 @@
if(.)
return
if(obj_flags & IN_USE)
- to_chat(user, "It's already in use - wait a bit!")
+ to_chat(user, span_warning("It's already in use - wait a bit!"))
return
else
obj_flags |= IN_USE
@@ -100,3 +182,4 @@
sleep(3)
animate(user, pixel_y = 2, time = 3)
sleep(3)
+
diff --git a/code/modules/mining/machine_bluespaceminer.dm b/code/modules/mining/machine_bluespaceminer.dm
index feffb562a7e0..f44775d20c20 100644
--- a/code/modules/mining/machine_bluespaceminer.dm
+++ b/code/modules/mining/machine_bluespaceminer.dm
@@ -7,7 +7,7 @@
circuit = /obj/item/circuitboard/machine/bluespace_miner
layer = BELOW_OBJ_LAYER
use_power = NO_POWER_USE
- idle_power_usage = 50000
+ idle_power_usage = ACTIVE_DRAW_EXTREME * 10
var/powered = FALSE
var/active = FALSE
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index bbc84ec7ee68..0ae29ca8ee54 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -3,6 +3,7 @@
/**********************Mineral processing unit console**************************/
/obj/machinery/mineral
+ idle_power_usage = IDLE_DRAW_MINIMAL
processing_flags = START_PROCESSING_MANUALLY
subsystem_type = /datum/controller/subsystem/processing/fastprocess
/// The current direction of `input_turf`, in relation to the machine.
@@ -142,7 +143,7 @@
/obj/machinery/mineral/processing_unit/Initialize()
. = ..()
proximity_monitor = new(src, 1)
- AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace), INFINITY, TRUE, /obj/item/stack)
+ AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/hellstone, /datum/material/titanium, /datum/material/bluespace), INFINITY, TRUE, /obj/item/stack)
stored_research = new /datum/techweb/specialized/autounlocking/smelter
selected_material = SSmaterials.GetMaterialRef(/datum/material/iron)
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index fd36a4bb4ab1..d0704887b4ea 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -17,7 +17,7 @@
var/points = 0
var/ore_multiplier = 1
var/point_upgrade = 1
- var/list/ore_values = list(/datum/material/iron = 1, /datum/material/glass = 1, /datum/material/plasma = 15, /datum/material/silver = 16, /datum/material/gold = 18, /datum/material/titanium = 30, /datum/material/uranium = 30, /datum/material/diamond = 50, /datum/material/bluespace = 50, /datum/material/bananium = 60)
+ var/list/ore_values = list(/datum/material/iron = 1, /datum/material/glass = 1, /datum/material/plasma = 15, /datum/material/silver = 16, /datum/material/gold = 18, /datum/material/titanium = 30, /datum/material/uranium = 30, /datum/material/diamond = 50, /datum/material/bluespace = 50)
/// Variable that holds a timer which is used for callbacks to `send_console_message()`. Used for preventing multiple calls to this proc while the ORM is eating a stack of ores.
var/console_notify_timer
var/datum/techweb/stored_research
diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm
index 788d1c102f75..444e72992685 100644
--- a/code/modules/mining/machine_silo.dm
+++ b/code/modules/mining/machine_silo.dm
@@ -22,7 +22,6 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
/datum/material/diamond,
/datum/material/plasma,
/datum/material/uranium,
- /datum/material/bananium,
/datum/material/titanium,
/datum/material/bluespace,
/datum/material/plastic,
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 2af7db0f4b6c..15cde601689e 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -1,7 +1,7 @@
/* Mining Points Equipment Vendor */
/obj/machinery/vending/mining_equipment
name = "frontier equipment vendor"
- desc = "An equipment vendor for miners, prospectors, and all manner of far reach scroungers. Ore Redemption Points can be spent here to purchase rough-and-tumble goods. Sold by EXOCON."
+ desc = "An equipment vendor for miners, prospectors, and all manner of far reach scroungers. Ore Redemption Points can be spent here to purchase rough-and-tumble goods. Sold by EXOCOM."
icon_state = "mining"
icon_deny = "mining-deny"
max_integrity = 500 // A bit more durable than your average snack vendor
@@ -11,7 +11,6 @@
shoot_inventory_chance = 0
circuit = /obj/item/circuitboard/machine/vending/mining_equipment
refill_canister = /obj/item/vending_refill/mining_equipment
- payment_department = ACCOUNT_CAR
vend_ready = "Good luck, you're going to need it."
mining_point_vendor = TRUE
default_price = 100
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 707d68a871f7..cc2a9f176c70 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -33,7 +33,7 @@
wanted_objects = list(
/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver,
/obj/item/stack/ore/plasma, /obj/item/stack/ore/uranium, /obj/item/stack/ore/iron,
- /obj/item/stack/ore/bananium, /obj/item/stack/ore/titanium)
+ /obj/item/stack/ore/hellstone, /obj/item/stack/ore/titanium)
healable = 0
loot = list(/obj/effect/decal/cleanable/robot_debris)
del_on_death = TRUE
diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm
index 33117d99c518..79c2f0d52208 100644
--- a/code/modules/mining/mint.dm
+++ b/code/modules/mining/mint.dm
@@ -24,11 +24,8 @@
/datum/material/uranium,
/datum/material/titanium,
/datum/material/diamond,
- /datum/material/bananium,
- /datum/material/adamantine,
- /datum/material/mythril,
/datum/material/plastic,
- /datum/material/runite
+ /datum/material/hellstone,
), MINERAL_MATERIAL_AMOUNT * 75, FALSE, /obj/item/stack)
chosen = SSmaterials.GetMaterialRef(chosen)
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index 46011ae8ec7e..2c8ac19a353a 100644
--- a/code/modules/mining/money_bag.dm
+++ b/code/modules/mining/money_bag.dm
@@ -26,4 +26,4 @@
new /obj/item/coin/silver(src)
new /obj/item/coin/gold(src)
new /obj/item/coin/gold(src)
- new /obj/item/coin/adamantine(src)
+ new /obj/item/coin/hellstone(src)
diff --git a/code/modules/mining/ore_veins.dm b/code/modules/mining/ore_veins.dm
index 3e5e20053a77..0df6cd187d03 100644
--- a/code/modules/mining/ore_veins.dm
+++ b/code/modules/mining/ore_veins.dm
@@ -209,3 +209,36 @@ GLOBAL_LIST_EMPTY(ore_veins)
)
max_mobs = 6
spawn_time = 80
+
+// Asteroid veins are the same as the base planetary ones yield wise, but with the asteroid mobs.
+
+/obj/structure/vein/asteroid
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/goliath = 60,
+ /mob/living/simple_animal/hostile/asteroid/basilisk = 30,
+ /mob/living/simple_animal/hostile/asteroid/hivelord = 30,
+ /mob/living/simple_animal/hostile/asteroid/brimdemon = 20,
+ /mob/living/simple_animal/hostile/carp = 20,
+ )
+
+/obj/structure/vein/classtwo/asteroid
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/goliath = 60,
+ /mob/living/simple_animal/hostile/asteroid/basilisk = 30,
+ /mob/living/simple_animal/hostile/asteroid/hivelord = 30,
+ /mob/living/simple_animal/hostile/asteroid/brimdemon = 20,
+ /mob/living/simple_animal/hostile/carp = 20,
+ /mob/living/simple_animal/hostile/carp/megacarp = 15,
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient = 5
+ )
+
+/obj/structure/vein/classthree/asteroid
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/goliath = 60,
+ /mob/living/simple_animal/hostile/asteroid/basilisk = 30,
+ /mob/living/simple_animal/hostile/asteroid/hivelord = 30,
+ /mob/living/simple_animal/hostile/asteroid/brimdemon = 20,
+ /mob/living/simple_animal/hostile/carp/megacarp = 20,
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient = 10
+ )
+
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index ec971ed84bed..1dfe590cac0a 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -217,16 +217,6 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
mine_experience = 10
scan_state = "rock_Diamond"
-/obj/item/stack/ore/bananium
- name = "bananium ore"
- icon_state = "Bananium ore"
- item_state = "Bananium ore"
- singular_name = "bananium ore chunk"
- points = 60
- custom_materials = list(/datum/material/bananium=MINERAL_MATERIAL_AMOUNT)
- refined_type = /obj/item/stack/sheet/mineral/bananium
- mine_experience = 15
- scan_state = "rock_Bananium"
/obj/item/stack/ore/titanium
name = "titanium ore"
@@ -240,6 +230,16 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
scan_state = "rock_Titanium"
spreadChance = 5
+/obj/item/stack/ore/hellstone
+ name = "hellstone ore"
+ icon_state = "hellstone-ore"
+ item_state = "hellstone-ore"
+ singular_name = "hellstone ore chunk"
+ resistance_flags = LAVA_PROOF
+ points = 50
+ custom_materials = list(/datum/material/hellstone=MINERAL_MATERIAL_AMOUNT)
+ refined_type = /obj/item/stack/sheet/mineral/hidden/hellstone
+
/obj/item/stack/ore/slag
name = "slag"
desc = "Completely useless."
@@ -458,20 +458,11 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
/obj/item/coin/titanium
custom_materials = list(/datum/material/titanium = 400)
-/obj/item/coin/bananium
- custom_materials = list(/datum/material/bananium = 400)
-
-/obj/item/coin/adamantine
- custom_materials = list(/datum/material/adamantine = 400)
-
-/obj/item/coin/mythril
- custom_materials = list(/datum/material/mythril = 400)
-
/obj/item/coin/plastic
custom_materials = list(/datum/material/plastic = 400)
-/obj/item/coin/runite
- custom_materials = list(/datum/material/runite = 400)
+/obj/item/coin/hellstone
+ custom_materials = list(/datum/material/hellstone = 400)
/obj/item/coin/twoheaded
desc = "Hey, this coin's the same on both sides!"
diff --git a/code/modules/mob/dead/crew_manifest.dm b/code/modules/mob/dead/crew_manifest.dm
index c7ca52968f86..da742342218c 100644
--- a/code/modules/mob/dead/crew_manifest.dm
+++ b/code/modules/mob/dead/crew_manifest.dm
@@ -4,7 +4,7 @@
return GLOB.always_state
/datum/crew_manifest/ui_status(mob/user, datum/ui_state/state)
- return (isnewplayer(user) || isobserver(user) || isAI(user) || ispAI(user)) ? UI_INTERACTIVE : UI_CLOSE
+ return (ismob(user)) ? UI_INTERACTIVE : UI_CLOSE
/datum/crew_manifest/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm
index 5a1e5bbf3387..85c60a15b031 100644
--- a/code/modules/mob/dead/dead.dm
+++ b/code/modules/mob/dead/dead.dm
@@ -107,7 +107,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
. = ..()
if(!client)
return
- LAZYADDASSOC(SSmobs.dead_players_by_virtual_z, "[virtual_z()]", src)
+ LAZYADDASSOCLIST(SSmobs.dead_players_by_virtual_z, "[virtual_z()]", src)
/mob/dead/Logout()
. = ..()
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 9baa46f526b5..8fbf9c32a38e 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -249,8 +249,8 @@
observer.client.init_verbs()
observer.update_appearance()
observer.stop_sound_channel(CHANNEL_LOBBYMUSIC)
- deadchat_broadcast(" has observed.", "[observer.real_name]", follow_target = observer, turf_target = get_turf(observer), message_type = DEADCHAT_DEATHRATTLE)
QDEL_NULL(mind)
+ deadchat_broadcast(" has observed.", "[observer.real_name]", follow_target = observer, turf_target = get_turf(observer), message_type = DEADCHAT_DEATHRATTLE)
qdel(src)
return TRUE
@@ -319,7 +319,6 @@
spawn_point.join_player_here(character)
var/atom/movable/screen/splash/Spl = new(character.client, TRUE)
Spl.Fade(TRUE)
- character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25)
character.update_parallax_teleport()
@@ -329,14 +328,13 @@
var/mob/living/carbon/human/humanc = character
ship.manifest_inject(humanc, client, job)
GLOB.data_core.manifest_inject(humanc, client)
+ ship.add_mob_to_crew_guestbook(humanc)
AnnounceArrival(humanc, job.name, ship)
AddEmploymentContract(humanc)
SSblackbox.record_feedback("tally", "species_spawned", 1, humanc.dna.species.name)
if(GLOB.summon_guns_triggered)
give_guns(humanc)
- if(GLOB.summon_magic_triggered)
- give_magic(humanc)
if(GLOB.curse_of_madness_triggered)
give_madness(humanc, GLOB.curse_of_madness_triggered)
if(CONFIG_GET(flag/roundstart_traits))
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
index 8b0ec1d6f79d..c01a20a18f64 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
@@ -3,33 +3,62 @@
/datum/sprite_accessory/ears
icon = 'icons/mob/mutant_bodyparts.dmi'
-/datum/sprite_accessory/ears/none
+/datum/sprite_accessory/ears/human/none
name = "None"
icon_state = "none"
-/datum/sprite_accessory/ears/cat
- icon = 'icons/mob/species/misc/cat.dmi'
+/datum/sprite_accessory/ears/human/elf
+ icon = 'icons/mob/species/human/elf.dmi'
+ name = "Elf"
+ icon_state = "elf"
+ secondary_color = FALSE
+ color_src = SKINCOLORS
+
+/datum/sprite_accessory/ears/human/cat
+ icon = 'icons/mob/species/human/cat.dmi'
name = "Cat"
icon_state = "cat"
secondary_color = TRUE
color_src = HAIR
-/datum/sprite_accessory/ears/cat/slime
+/datum/sprite_accessory/ears/human/cat/slime
name = "Slimecat"
icon_state = "cat"
secondary_color = FALSE
color_src = HAIR
image_alpha = 150
-/datum/sprite_accessory/ears/fox
- icon = 'icons/mob/species/misc/fox.dmi'
+/datum/sprite_accessory/ears/human/dog
+ icon = 'icons/mob/species/human/dog.dmi'
+ name = "Dog"
+ icon_state = "dog"
+ secondary_color = FALSE
+ color_src = HAIR
+
+/datum/sprite_accessory/ears/human/fox
+ icon = 'icons/mob/species/human/fox.dmi'
name = "Fox"
icon_state = "fox"
secondary_color = TRUE
color_src = HAIR
-/datum/sprite_accessory/ears/elf
- name = "Elf"
- icon_state = "elf"
- secondary_color = FALSE
- color_src = SKINCOLORS
+/datum/sprite_accessory/ears/human/rabbit
+ icon = 'icons/mob/species/human/rabbit.dmi'
+ name = "Rabbit"
+ icon_state = "bunny"
+ secondary_color = TRUE
+ color_src = HAIR
+
+/datum/sprite_accessory/ears/human/rabbit/bent
+ icon = 'icons/mob/species/human/rabbit.dmi'
+ name = "Bent Rabbit"
+ icon_state = "bunny_bent"
+ secondary_color = TRUE
+ color_src = HAIR
+
+/datum/sprite_accessory/ears/human/rabbit/floppy
+ icon = 'icons/mob/species/human/rabbit.dmi'
+ name = "Floppy Rabbit"
+ icon_state = "bunny_floppy"
+ secondary_color = TRUE
+ color_src = HAIR
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc.dm
index b13b8f96a51e..16f7e269c760 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ipc.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc.dm
@@ -301,6 +301,7 @@
var/has_screen = TRUE //do we have a screen to toggle
var/has_overlay = FALSE //does this chasis have a overlay icon?
var/is_digi = FALSE //does this chasis use digitigrade
+ var/has_snout = FALSE
/datum/sprite_accessory/ipc_chassis/mcgreyscale
name = "Morpheus Cyberkinetics (Custom)"
@@ -354,6 +355,7 @@
color_src = MUTCOLORS
has_overlay = TRUE
use_eyes = TRUE
+ has_snout = TRUE
/datum/sprite_accessory/ipc_chassis/pgfmechanicsdigigrade
name = "PGF MECHANICS TYPE-D"
@@ -363,6 +365,7 @@
has_overlay = TRUE
use_eyes = TRUE
is_digi = TRUE
+ has_snout = TRUE
/datum/sprite_accessory/ipc_chassis/inteqsprinter
name = "Inteq Mothership 'Sprinter'"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm b/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm
index 4ed949c63ef8..9fd4579e46f8 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm
@@ -1,10 +1,9 @@
-//Kepori mutant parts
-
-//Start head feathers
+// "Hair" feathers
/datum/sprite_accessory/kepori_feathers
color_src = HAIR
- icon = 'icons/mob/kepori_parts.dmi'
+ body_zone = BODY_ZONE_HEAD
+ icon = 'icons/mob/species/kepori/kepori_parts.dmi'
/datum/sprite_accessory/kepori_feathers/none
name = "None"
@@ -37,10 +36,6 @@
name = "Spikey"
icon_state = "spikey"
-/datum/sprite_accessory/kepori_feathers/soap
- name = "Soap"
- icon_state = "soap"
-
/datum/sprite_accessory/kepori_feathers/crowned
name = "Crowned"
icon_state = "crowned"
@@ -57,40 +52,60 @@
name = "Bun"
icon_state = "bun"
-//Start body feathers
+// Head/Face feathers
+
+/datum/sprite_accessory/kepori_head_feathers
+ color_src = MUTCOLORS_SECONDARY
+ body_zone = BODY_ZONE_HEAD
+ icon = 'icons/mob/species/kepori/kepori_parts.dmi'
+
+/datum/sprite_accessory/kepori_head_feathers/none
+ name = "None"
+
+/datum/sprite_accessory/kepori_head_feathers/full
+ name = "Full"
+ icon_state = "full"
+
+/datum/sprite_accessory/kepori_head_feathers/half
+ name = "Half"
+ icon_state = "half"
+
+// Body feathers
/datum/sprite_accessory/kepori_body_feathers
color_src = MUTCOLORS_SECONDARY
- icon = 'icons/mob/kepori_parts.dmi'
+ body_zone = BODY_ZONE_CHEST
+ icon = 'icons/mob/species/kepori/kepori_parts.dmi'
/datum/sprite_accessory/kepori_body_feathers/none
name = "None"
-/datum/sprite_accessory/kepori_body_feathers/aftik
- name = "Aftik"
- icon_state = "aftik"
-
/datum/sprite_accessory/kepori_body_feathers/belly
name = "Belly"
icon_state = "belly"
-/datum/sprite_accessory/kepori_body_feathers/shirt
- name = "Shirt"
- icon_state = "shirt"
+/datum/sprite_accessory/kepori_body_feathers/belly_wings
+ name = "Belly + Wings"
+ icon_state = "bwings"
/datum/sprite_accessory/kepori_body_feathers/soap
name = "Soap"
icon_state = "soap"
+/datum/sprite_accessory/kepori_body_feathers/soap_wings
+ name = "Soap + Wings"
+ icon_state = "swings"
+
/datum/sprite_accessory/kepori_body_feathers/wings
name = "Wings"
icon_state = "wings"
-//Start tail feathers
+// Tail feathers
/datum/sprite_accessory/kepori_tail_feathers
color_src = MUTCOLORS_SECONDARY
- icon = 'icons/mob/kepori_parts.dmi'
+ body_zone = BODY_ZONE_CHEST
+ icon = 'icons/mob/species/kepori/kepori_parts.dmi'
/datum/sprite_accessory/kepori_tail_feathers/none
name = "None"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
index 5a3d2eb3d62b..9a0da947d3b7 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -9,13 +9,13 @@
icon_state = "none"
/datum/sprite_accessory/tails/human/cat
- icon = 'icons/mob/species/misc/cat.dmi'
+ icon = 'icons/mob/species/human/cat.dmi'
name = "Cat"
icon_state = "cat"
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/cat
- icon = 'icons/mob/species/misc/cat.dmi'
+ icon = 'icons/mob/species/human/cat.dmi'
name = "Cat"
icon_state = "cat"
color_src = HAIR
@@ -32,26 +32,44 @@
color_src = HAIR
image_alpha = 150
+/datum/sprite_accessory/tails/human/dog
+ icon = 'icons/mob/species/human/dog.dmi'
+ name = "Dog"
+ icon_state = "dog"
+ color_src = HAIR
+
+/datum/sprite_accessory/tails_animated/human/dog
+ icon = 'icons/mob/species/human/dog.dmi'
+ name = "Dog"
+ icon_state = "dog"
+ color_src = HAIR
+
/datum/sprite_accessory/tails/human/fox
- icon = 'icons/mob/species/misc/fox.dmi'
+ icon = 'icons/mob/species/human/fox.dmi'
name = "Fox"
icon_state = "fox"
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/fox
- icon = 'icons/mob/species/misc/fox.dmi'
+ icon = 'icons/mob/species/human/fox.dmi'
name = "Fox"
icon_state = "fox"
color_src = HAIR
/datum/sprite_accessory/tails/human/fox/alt
- icon = 'icons/mob/species/misc/fox.dmi'
+ icon = 'icons/mob/species/human/fox.dmi'
name = "Fox 2"
icon_state = "fox2"
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/fox/alt
- icon = 'icons/mob/species/misc/fox.dmi'
+ icon = 'icons/mob/species/human/fox.dmi'
name = "Fox 2"
icon_state = "fox2"
color_src = HAIR
+
+/datum/sprite_accessory/tails/human/rabbit
+ icon = 'icons/mob/species/human/rabbit.dmi'
+ name = "Rabbit"
+ icon_state = "bunny"
+ color_src = HAIR
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index de07b3d4f0fd..0d9dab7a035f 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -275,7 +275,7 @@
*/
/mob/proc/dropItemToGround(obj/item/I, force = FALSE, silent = FALSE)
. = doUnEquip(I, force, drop_location(), FALSE, silent = silent)
- if(. && I) //ensure the item exists and that it was dropped properly.
+ if(. && I && !(I.item_flags & NO_PIXEL_RANDOM_DROP)) //ensure the item exists and that it was dropped properly.
I.pixel_x = rand(-6,6)
I.pixel_y = rand(-6,6)
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index aec75960989d..1910347e4fdd 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -4,19 +4,6 @@
BLOOD SYSTEM
****************************************************/
-/mob/living/carbon/human/proc/suppress_bloodloss(amount)
- if(bleedsuppress)
- return
- else
- bleedsuppress = TRUE
- addtimer(CALLBACK(src, PROC_REF(resume_bleeding)), amount)
-
-/mob/living/carbon/human/proc/resume_bleeding()
- bleedsuppress = 0
- if(stat != DEAD && bleed_rate)
- to_chat(src, "The blood soaks through your bandage.")
-
-
/mob/living/carbon/monkey/handle_blood()
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
//Blood regeneration if there is some space
@@ -29,7 +16,6 @@
/mob/living/carbon/human/handle_blood()
if(NOBLOOD in dna.species.species_traits)
- bleed_rate = 0
return
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
@@ -83,24 +69,20 @@
if(!HAS_TRAIT(src, TRAIT_NODEATH))
death()
- var/temp_bleed = 0
//Bleeding out
+ var/limb_bleed = 0
for(var/obj/item/bodypart/BP as anything in bodyparts)
- var/brutedamage = BP.brute_dam
-
+ if(BP.GetComponent(/datum/component/bandage))
+ continue
//We want an accurate reading of .len
listclearnulls(BP.embedded_objects)
for(var/obj/item/embeddies in BP.embedded_objects)
if(!embeddies.isEmbedHarmless())
- temp_bleed += 0.5
-
- if(brutedamage >= 20)
- temp_bleed += (brutedamage * 0.013)
-
- bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
+ BP.adjust_bleeding(0.1, BLOOD_LOSS_DAMAGE_MAXIMUM)
+ limb_bleed += BP.bleeding
- if(bleed_rate && !bleedsuppress && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
- bleed(bleed_rate)
+ if(limb_bleed && !bleedsuppress && !HAS_TRAIT(src, TRAIT_FAKEDEATH))
+ bleed(limb_bleed)
//Makes a blood drop, leaking amt units of blood from the mob
/mob/living/carbon/proc/bleed(amt)
@@ -125,7 +107,8 @@
/mob/living/carbon/human/restore_blood()
blood_volume = BLOOD_VOLUME_NORMAL
- bleed_rate = 0
+ for(var/obj/item/bodypart/BP as anything in get_bleeding_parts())
+ BP.bleeding = 0
/****************************************************
BLOOD TRANSFERS
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index a70520462f39..8629d01650d4 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -113,7 +113,7 @@
return
user.visible_message("[user] starts to pour the contents of [O] onto [src].", "You start to slowly pour the contents of [O] onto [src].")
- if(!do_after(user, 60, TRUE, src))
+ if(!do_after(user, 60, src))
to_chat(user, "You failed to pour [O] onto [src]!")
return
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 23e937acf102..11eeef8b4a8e 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -180,3 +180,7 @@
/mob/living/carbon/alien/on_standing_up()
. = ..()
update_icons()
+
+/mob/living/carbon/alien/examine(mob/user)
+ . = ..()
+ . += "It's a strange creature."
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index ec4105fde0ce..ccd6540ffca1 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -291,7 +291,7 @@ Doesn't work on other aliens/AI.*/
/obj/effect/proc_holder/alien/sneak/fire(mob/living/carbon/alien/humanoid/user)
if(!active)
- user.alpha = 25
+ user.alpha = 150
user.sneaking = TRUE
active = TRUE
to_chat(user, "You blend into the shadows...")
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 5163821a9573..57835578cf84 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -100,8 +100,7 @@
return
else //Maybe uses plasma in the future, although that wouldn't make any sense...
- leaping = 1
- weather_immunities += "lava"
+ leaping = TRUE
update_icons()
throw_at(leap_target, MAX_ALIEN_LEAP_DIST, 2, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(leap_end)))
@@ -115,7 +114,6 @@
* the icons of the hunter.
*/
/mob/living/carbon/alien/humanoid/hunter/proc/leap_end()
- leaping = 0
- LAZYREMOVE(weather_immunities, "lava")
+ leaping = FALSE
update_icons()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 651ea4c6d0ee..dcb44af19cca 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -63,7 +63,7 @@
if(href_list["pouches"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY))
visible_message("[usr] tries to empty [src]'s pouches.", \
"[usr] tries to empty your pouches.")
- if(do_mob(usr, src, POCKET_STRIP_DELAY * 0.5))
+ if(do_after(usr, POCKET_STRIP_DELAY * 0.5, src))
dropItemToGround(r_store)
dropItemToGround(l_store)
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index cb7c7adafc4b..bfa71f3b335e 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -1,5 +1,5 @@
/obj/item/organ/alien
- icon_state = "xgibmid2"
+ icon_state = "liver-x"
food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10)
var/list/alien_powers = list()
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index 49ff1e88937b..4e797ede06c0 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -104,7 +104,8 @@
if(gib_on_success)
new_xeno.visible_message("[new_xeno] bursts out of [owner] in a shower of gore!", "You exit [owner], your previous host.", "You hear organic matter ripping and tearing!")
- owner.gib()
+ owner.adjustBruteLoss(200)
+ owner.cut_overlay(overlay)
else
new_xeno.visible_message("[new_xeno] wriggles out of [owner]!", "You exit [owner], your previous host.")
owner.adjustBruteLoss(40)
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index a9caeba37208..c9cdcaf8199c 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -47,7 +47,7 @@
/// Whether or not this facehugger can actually impregnate targets
var/sterile = FALSE
/// How long it takes for a facehugger to impregnate a target once attached
- var/pregnation_time = 10 SECONDS
+ var/pregnation_time = 5 SECONDS
/// How long it takes between coupling attempts
var/couple_retry_time = 15 SECONDS
/// The mob's internal mask version, stored within the mob when the facehugger isn't being used as an item.
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 5b316dad9cb6..dd5b29059085 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -202,7 +202,7 @@
visible_message("[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].", \
"[usr] tries to [internal ? "close" : "open"] the valve on your [ITEM.name].", null, null, usr)
to_chat(usr, "You try to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name]...")
- if(do_mob(usr, src, POCKET_STRIP_DELAY))
+ if(do_after(usr, POCKET_STRIP_DELAY, src))
if(internal)
internal = null
update_internals_hud_icon(0)
@@ -255,7 +255,7 @@
buckle_cd = O.breakouttime
visible_message("[src] attempts to unbuckle [p_them()]self!", \
"You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)")
- if(do_after(src, buckle_cd, 0, target = src))
+ if(do_after(src, buckle_cd, target = src, timed_action_flags = IGNORE_HELD_ITEM))
if(!buckled)
return
buckled.user_unbuckle_mob(src,src)
@@ -306,7 +306,7 @@
if(!cuff_break)
visible_message("[src] attempts to remove [I]!")
to_chat(src, "You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)")
- if(do_after(src, breakouttime, 0, target = src))
+ if(do_after(src, breakouttime, target = src, timed_action_flags = IGNORE_HELD_ITEM))
. = clear_cuffs(I, cuff_break)
else
to_chat(src, "You fail to remove [I]!")
@@ -315,7 +315,7 @@
breakouttime = 50
visible_message("[src] is trying to break [I]!")
to_chat(src, "You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)")
- if(do_after(src, breakouttime, 0, target = src))
+ if(do_after(src, breakouttime, target = src, timed_action_flags = IGNORE_HELD_ITEM))
. = clear_cuffs(I, cuff_break)
else
to_chat(src, "You fail to break [I]!")
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 9b50d1827724..916095ed266e 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -1,3 +1,25 @@
+/mob/living/carbon/attackby(obj/item/W, mob/user, params)
+ var/obj/item/bodypart/BP = get_bodypart(check_zone(user.zone_selected))
+ var/has_painkillers = user.reagents.has_reagent(/datum/reagent/medicine/morphine, needs_metabolizing = TRUE)
+ if(W.tool_behaviour == TOOL_WELDER && IS_ROBOTIC_LIMB(BP) && BP.brute_dam > 5) //prioritize healing if we're synthetic
+ return ..()
+ if(user.a_intent != INTENT_HELP || !W.get_temperature() || !BP.can_bandage()) //this will also catch low damage synthetic welding
+ return ..()
+ . = TRUE
+ var/heal_time = 2 SECONDS
+ playsound(user, 'sound/surgery/cautery1.ogg', 20)
+ balloon_alert(user, "cauterizing...")
+ if(src == user && !has_painkillers)
+ heal_time *= 2 //oof ouch owie
+ user.visible_message(span_nicegreen("[user] holds [W] up to [user == src ? "their" : "[src]'s"] [parse_zone(BP.body_zone)], trying to slow [p_their()] bleeding..."), span_nicegreen("You hold [W] up to [user == src ? "your" : "[src]'s"] [parse_zone(BP.body_zone)], trying to slow [user == src ? "your" : p_their()] bleeding..."))
+ if(do_after(user, heal_time, target = src))
+ playsound(user, 'sound/surgery/cautery2.ogg', 20)
+ BP.apply_bandage(0.005, W.get_temperature()/BLOOD_CAUTERIZATION_RATIO, "cauterization") //not particularly fast, this is the "I really would prefer not to be bleeding right now" option
+ BP.receive_damage(burn = W.get_temperature()/BLOOD_CAUTERIZATION_DAMAGE_RATIO) //my body is a MACHINE that turns BLEEDING into BURN DAMAGE
+ user.visible_message(span_nicegreen("[user] cauterizes the bleeding on [user == src ? "their" : "[src]'s"] [parse_zone(BP.body_zone)]!"), span_nicegreen("You cauterize the bleeding on [user == src ? "your" : "[src]'s"] [parse_zone(BP.body_zone)]!"))
+ else
+ to_chat(user, span_warning("You were interrupted!"))
+
/mob/living/carbon/get_eye_protection()
. = ..()
var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES)
@@ -554,14 +576,10 @@
else
to_chat(src, "Your eyes are really starting to hurt. This can't be good for you!")
- if(has_bane(BANE_LIGHT))
- mind.disrupt_spells(-500)
return 1
else if(damage == 0) // just enough protection
if(prob(20))
to_chat(src, "Something bright flashes in the corner of your vision!")
- if(has_bane(BANE_LIGHT))
- mind.disrupt_spells(0)
/mob/living/carbon/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15)
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 2045bfe4aa18..8c023299baed 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -1,6 +1,6 @@
-/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1)
+/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1, sharpness = FALSE)
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
var/hit_percent = (100-blocked)/100
if(!damage || (!forced && hit_percent <= 0))
@@ -21,7 +21,7 @@
switch(damagetype)
if(BRUTE)
if(BP)
- if(BP.receive_damage(damage_amount, 0, break_modifier))
+ if(BP.receive_damage(damage_amount, 0, break_modifier, sharpness = sharpness))
update_damage_overlays()
else //no bodypart, we deal damage with a more general method.
adjustBruteLoss(damage_amount, forced = forced)
@@ -29,7 +29,7 @@
shake_animation(damage_amount)
if(BURN)
if(BP)
- if(BP.receive_damage(0, damage_amount, break_modifier))
+ if(BP.receive_damage(0, damage_amount, break_modifier, sharpness = sharpness))
update_damage_overlays()
else
adjustFireLoss(damage_amount, forced = forced)
@@ -267,3 +267,68 @@
if(update)
update_damage_overlays()
update_stamina()
+
+/// Gets a list of bleeding bodyparts, argument ignore_staunched = are we actively bleeding (no treatment)
+/mob/living/carbon/proc/get_bleeding_parts(ignore_staunched = FALSE)
+ var/list/obj/item/bodypart/parts = list()
+ for(var/obj/item/bodypart/BP as anything in bodyparts)
+ if(BP.bleeding && (!ignore_staunched || !BP.GetComponent(/datum/component/bandage)))
+ parts += BP
+ return parts
+
+/// Gets a list of bandaged parts
+/mob/living/carbon/proc/get_bandaged_parts()
+ var/list/obj/item/bodypart/parts = list()
+ for(var/obj/item/bodypart/BP as anything in bodyparts)
+ if(BP.GetComponent(/datum/component/bandage))
+ parts += BP
+ return parts
+
+/// Apply bleeding to one random bodypart.
+/mob/living/carbon/proc/cause_bleeding(amt)
+ if(amt <= 0)
+ return
+ var/list/obj/item/bodypart/parts = bodyparts.Copy()
+ if(!length(parts))
+ return
+ var/obj/item/bodypart/part_in_question = pick(parts)
+ part_in_question.adjust_bleeding(amt)
+
+/// Heal bleeding from one random bodypart
+/mob/living/carbon/proc/heal_bleeding(amt)
+ if(amt <= 0)
+ return
+ var/list/obj/item/bodypart/parts = get_bleeding_parts()
+ if(!length(parts))
+ return
+ var/obj/item/bodypart/part_in_question = pick(parts)
+ part_in_question.adjust_bleeding(-amt)
+ var/bleed_calc = part_in_question.bleeding
+ return min(bleed_calc - part_in_question.bleeding, 0)
+
+/// Apply bleeding to all bodyparts
+/mob/living/carbon/proc/cause_overall_bleeding(amt)
+ if(amt <= 0)
+ return
+ var/list/obj/item/bodypart/parts = bodyparts.Copy()
+ while(length(parts))
+ var/obj/item/bodypart/part_in_question = pick(parts)
+ if(part_in_question.is_pseudopart)
+ parts -= part_in_question
+ continue
+ var/amount_to_take = min(part_in_question.bleeding, amt / length(parts))
+ part_in_question.adjust_bleeding(amount_to_take)
+ amt -= amount_to_take
+ parts -= part_in_question
+
+/// Heal bleeding from all bodyparts
+/mob/living/carbon/proc/heal_overall_bleeding(amt)
+ if(amt <= 0)
+ return
+ var/list/obj/item/bodypart/parts = get_bleeding_parts()
+ while(length(parts))
+ var/obj/item/bodypart/part_in_question = pick(parts)
+ var/amount_to_take = min(part_in_question.bleeding, amt / length(parts))
+ part_in_question.adjust_bleeding(-amount_to_take)
+ amt -= amount_to_take
+ parts -= part_in_question
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index 55b01d4200e2..f0d27e801cd2 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -455,7 +455,7 @@
* This fake hit only happens if we can deal damage and if we hit a living thing. Otherwise, we just do normal on hit effects.
*/
/obj/projectile/kiss/proc/harmless_on_hit(mob/living/living_target)
- playsound(get_turf(living_target), hitsound, 100, TRUE)
+ playsound(get_turf(living_target), hitsound, 50, TRUE, -12, ignore_walls = FALSE)
if(!suppressed) // direct
living_target.visible_message(span_danger("[living_target] is hit by \a [src]."), span_userdanger("You're hit by \a [src]!"), vision_distance=COMBAT_MESSAGE_RANGE)
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 7afe5068e276..931c62d37920 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -6,7 +6,7 @@
var/t_has = p_have()
var/t_is = p_are()
- . = list("This is [icon2html(src, user)] \a [src]!>")
+ . = list("This is [icon2html(src, user)] \a [src]!")
var/list/obscured = check_obscured_slots()
if (handcuffed)
diff --git a/code/modules/mob/living/carbon/human/consistent_human.dm b/code/modules/mob/living/carbon/human/consistent_human.dm
index e63adffeee48..86e6e08c4367 100644
--- a/code/modules/mob/living/carbon/human/consistent_human.dm
+++ b/code/modules/mob/living/carbon/human/consistent_human.dm
@@ -31,6 +31,7 @@
dna.features["spider_spinneret"] = GLOB.spider_spinneret_list[hex2num(copytext(seed, 11, 12)) % length(GLOB.spider_spinneret_list) + 1]
dna.features["kepori_feathers"] = GLOB.kepori_feathers_list[hex2num(copytext(seed, 12, 13)) % length(GLOB.kepori_feathers_list) + 1]
dna.features["kepori_body_feathers"] = GLOB.kepori_body_feathers_list[hex2num(copytext(seed, 13, 14)) % length(GLOB.kepori_body_feathers_list) + 1]
+ dna.features["kepori_head_feathers"] = GLOB.kepori_head_feathers_list[hex2num(copytext(seed, 13, 14)) % length(GLOB.kepori_head_feathers_list) + 1]
dna.features["vox_head_quills"] = GLOB.vox_head_quills_list[hex2num(copytext(seed, 14, 15)) % length(GLOB.vox_head_quills_list) + 1]
dna.features["vox_neck_quills"] = GLOB.vox_neck_quills_list[hex2num(copytext(seed, 15, 16)) % length(GLOB.vox_neck_quills_list) + 1]
dna.features["elzu_horns"] = GLOB.elzu_horns_list[hex2num(copytext(seed, 16, 17)) % length(GLOB.elzu_horns_list) + 1]
diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm
index 4883446b7cb1..d7f6834030b3 100644
--- a/code/modules/mob/living/carbon/human/damage_procs.dm
+++ b/code/modules/mob/living/carbon/human/damage_procs.dm
@@ -1,7 +1,7 @@
/// depending on the species, it will run the corresponding apply_damage code there
-/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1) //WS Edit - Breakable Bones
- return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage)
+/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1, sharpness = FALSE) //WS Edit - Breakable Bones
+ return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage, sharpness = sharpness)
/mob/living/carbon/human/revive(full_heal = 0, admin_revive = 0)
if(..())
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 4e8168fc60d6..ae867d518eb5 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -96,7 +96,7 @@
if(islizard(user))
return 'sound/voice/lizard/squeal.ogg' //This is from Bay
-/datum/emote/living/carbon/human/tailthump //lizard
+/datum/emote/living/carbon/human/tailthump //lizard + vox
key = "thump"
key_third_person = "thumps their tail"
message = "thumps their tail!"
@@ -106,7 +106,7 @@
/datum/emote/living/carbon/human/tailthump/get_sound(mob/living/user)
if(!ishuman(user))
return
- if(islizard(user))
+ if(islizard(user) || (isvox(user)))
return 'sound/voice/lizard/tailthump.ogg' //https://freesound.org/people/TylerAM/sounds/389665/
/datum/emote/living/carbon/human/weh //lizard
@@ -239,7 +239,8 @@
message_param = "beeps at %t."
/datum/emote/living/carbon/human/robot_tongue/beep/run_emote(mob/user, params)
- if(..())
+ . = ..()
+ if(.)
playsound(user.loc, 'sound/machines/twobeep.ogg', 50)
/datum/emote/living/carbon/human/robot_tongue/buzz
@@ -249,7 +250,8 @@
message_param = "buzzes at %t."
/datum/emote/living/carbon/human/robot_tongue/buzz/run_emote(mob/user, params)
- if(..())
+ . = ..()
+ if(.)
playsound(user.loc, 'sound/machines/buzz-sigh.ogg', 50)
/datum/emote/living/carbon/human/robot_tongue/buzz2
@@ -257,7 +259,8 @@
message = "buzzes twice."
/datum/emote/living/carbon/human/robot_tongue/buzz2/run_emote(mob/user, params)
- if(..())
+ . = ..()
+ if(.)
playsound(user.loc, 'sound/machines/buzz-two.ogg', 50)
/datum/emote/living/carbon/human/robot_tongue/chime
@@ -266,7 +269,8 @@
message = "chimes."
/datum/emote/living/carbon/human/robot_tongue/chime/run_emote(mob/user, params)
- if(..())
+ . = ..()
+ if(.)
playsound(user.loc, 'sound/machines/chime.ogg', 50)
/datum/emote/living/carbon/human/robot_tongue/no
@@ -275,7 +279,8 @@
message = "emits an negative blip."
/datum/emote/living/carbon/human/robot_tongue/no/run_emote(mob/user, params)
- if(..())
+ . = ..()
+ if(.)
playsound(user.loc, 'sound/machines/synth_no.ogg', 50)
/datum/emote/living/carbon/human/robot_tongue/ping
@@ -285,7 +290,8 @@
message_param = "pings at %t."
/datum/emote/living/carbon/human/robot_tongue/ping/run_emote(mob/user, params)
- if(..())
+ . = ..()
+ if(.)
playsound(user.loc, 'sound/machines/ping.ogg', 50)
/datum/emote/living/carbon/human/robot_tongue/warn
@@ -294,7 +300,8 @@
message = "blares an alarm!"
/datum/emote/living/carbon/human/robot_tongue/warn/run_emote(mob/user, params)
- if(..())
+ . = ..()
+ if(.)
playsound(user.loc, 'sound/machines/warning-buzzer.ogg', 50)
/datum/emote/living/carbon/human/robot_tongue/yes
@@ -303,7 +310,8 @@
message = "emits an affirmative blip."
/datum/emote/living/carbon/human/robot_tongue/yes/run_emote(mob/user, params)
- if(..())
+ . = ..()
+ if(.)
playsound(user.loc, 'sound/machines/synth_yes.ogg', 50)
// the following emote were originally clown-locked and synthetic exclusive
@@ -315,5 +323,37 @@
message = "plays a sad trombone..."
/datum/emote/living/carbon/human/robot_tongue/sad/run_emote(mob/user, params)
- if(..())
+ . = ..()
+ if(.)
playsound(user.loc, 'sound/misc/sadtrombone.ogg', 50)
+
+//kepi (plus one vox i guess)
+
+/datum/emote/living/carbon/human/kepiclick
+ key = "click"
+ key_third_person = "clicks"
+ message = "clicks."
+ emote_type = EMOTE_AUDIBLE
+
+/datum/emote/living/carbon/human/kepiclick/get_sound(mob/living/user)
+ if(!ishuman(user))
+ return
+ if(iskepori(user) || (isvox(user)))
+ return 'sound/voice/kepori/kepiclick.ogg' //https://freesound.org/people/Ambiabstract/sounds/584212/
+
+/datum/emote/living/carbon/human/kepiwhistle
+ key = "whistle"
+ key_third_person = "whistles"
+ message = "whistles!"
+ emote_type = EMOTE_AUDIBLE
+
+/datum/emote/living/carbon/human/kepiwhistle/get_sound(mob/living/user)
+ if(!ishuman(user))
+ return
+ if(iskepori(user))
+ return 'sound/voice/kepori/kepiwhistle.ogg' //https://freesound.org/people/Andreas.Mustola/sounds/338277/
+
+/datum/emote/living/carbon/human/kepiwoop // i have yet to find a woop sound that doesnt suck i will do it later
+ key = "woop"
+ key_third_person = "woops"
+ message = "woops!"
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index ceda44284f46..f92e8d762f2d 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -8,7 +8,6 @@
var/t_has = p_have()
var/t_is = p_are()
var/obscure_name
-
var/list/obscured = check_obscured_slots()
var/skipface = ((wear_mask?.flags_inv & HIDEFACE) || (head?.flags_inv & HIDEFACE))
@@ -16,10 +15,25 @@
var/mob/living/L = user
if(HAS_TRAIT(L, TRAIT_PROSOPAGNOSIA))
obscure_name = TRUE
- var/apparent_species
- if(dna?.species && !skipface)
- apparent_species = ", \an [dna.species.name]"
- . = list("This is [!obscure_name ? name : "Unknown"][apparent_species]!")
+
+ . = list(span_info("This is [name]!"))
+
+ if(user != src)
+ if(!obscure_name && !skipface)
+ var/face_name = get_face_name("")
+ if(face_name)
+ //if we have no guestbook, we just KNOW okay?
+ var/known_name = user.mind?.guestbook ? user.mind.guestbook.get_known_name(user, src, face_name) : face_name
+ if(known_name)
+ . += "You know them as [known_name]."
+ else
+ . += "You don't recognize [t_him]. You can Ctrl-Shift click [t_him] to memorize their face."
+ else
+ . += "You can't see [t_his] face very well."
+ else
+ . += "You can't see [t_his] face very well."
+ else
+ . += "It's you, [real_name]."
//uniform
if(w_uniform && !(ITEM_SLOT_ICLOTHING in obscured))
@@ -243,9 +257,12 @@
if(blood_volume < BLOOD_VOLUME_SAFE || skin_tone == "albino")
msg += "[t_He] [t_has] pale skin.\n"
- if(bleedsuppress)
- msg += "[t_He] [t_is] bandaged with something.\n"
- else if(bleed_rate)
+
+ if(LAZYLEN(get_bandaged_parts()))
+ msg += "[t_He] [t_has] some dressed bleeding.\n"
+
+ var/list/obj/item/bodypart/bleed_check = get_bleeding_parts(TRUE)
+ if(LAZYLEN(bleed_check))
if(reagents.has_reagent(/datum/reagent/toxin/heparin, needs_metabolizing = TRUE))
msg += "[t_He] [t_is] bleeding uncontrollably!\n"
else
@@ -297,10 +314,6 @@
msg += ""
- if(HAS_TRAIT(user, TRAIT_SPIRITUAL) && mind?.holy_role)
- msg += "[t_He] [t_has] a holy aura about [t_him].\n"
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "religious_comfort", /datum/mood_event/religiously_comforted)
-
switch(stat)
if(UNCONSCIOUS, HARD_CRIT)
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n"
@@ -367,7 +380,6 @@
. += "Criminal status:\[[criminal]\]"
. += jointext(list("Security record:\[View\]",
- "\[Add citation\]",
"\[Add crime\]",
"\[View comment log\]",
"\[Add comment\]"), "")
@@ -401,20 +413,23 @@
/mob/living/carbon/human/examine_more(mob/user)
. = ..()
+ for(var/obj/item/bodypart/BP as anything in get_bandaged_parts())
+ var/datum/component/bandage/B = BP.GetComponent(/datum/component/bandage)
+ . += span_notice("[p_their(TRUE)] [parse_zone(BP.body_zone)] is dressed with [B.bandage_name]")
+ for(var/obj/item/bodypart/BP as anything in get_bleeding_parts(TRUE))
+ var/bleed_text
+ switch(BP.bleeding)
+ if(0 to 0.5)
+ bleed_text = "lightly."
+ if(0.5 to 1)
+ bleed_text = "moderately."
+ if(1 to 1.5)
+ bleed_text = "heavily!"
+ else
+ bleed_text = "significantly!!"
+ . += span_warning("[p_their(TRUE)] [parse_zone(BP.body_zone)] is bleeding [bleed_text]")
+
if ((wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)))
return
- var/age_text
- switch(age)
- if(-INFINITY to 25)
- age_text = "very young"
- if(26 to 35)
- age_text = "of adult age"
- if(36 to 55)
- age_text = "middle-aged"
- if(56 to 75)
- age_text = "rather old"
- if(76 to 100)
- age_text = "very old"
- if(101 to INFINITY)
- age_text = "withering away"
- . += list(span_notice("[p_they(TRUE)] appear[p_s()] to be [age_text]."))
+ if(get_age())
+ . += list(span_notice("[p_they(TRUE)] appear[p_s()] to be [get_age()]."))
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 93276a6710a6..27fa569de7cd 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -52,8 +52,6 @@
sec_hud_set_ID()
sec_hud_set_implants()
sec_hud_set_security_status()
- //...fan gear
- fan_hud_set_fandom()
//...and display them.
add_to_all_human_data_huds()
@@ -247,7 +245,7 @@
else
return
- if(do_mob(usr, src, POCKET_STRIP_DELAY/delay_denominator)) //placing an item into the pocket is 4 times faster
+ if(do_after(usr, POCKET_STRIP_DELAY/delay_denominator, src, hidden = TRUE)) //placing an item into the pocket is 4 times faster
if(pocket_item)
if(pocket_item == (pocket_id == ITEM_SLOT_RPOCKET ? r_store : l_store)) //item still in the pocket we search
dropItemToGround(pocket_item)
@@ -265,7 +263,7 @@
if(href_list["toggle_uniform"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY))
var/obj/item/clothing/under/U = get_item_by_slot(ITEM_SLOT_ICLOTHING)
to_chat(src, "[usr.name] is trying to adjust your [U].")
- if(do_mob(usr, src, U.strip_delay/2))
+ if(do_after(usr, U.strip_delay/2, src))
to_chat(src, "[usr.name] successfully adjusted your [U].")
U.toggle_jumpsuit_adjust()
update_inv_w_uniform()
@@ -432,38 +430,6 @@
to_chat(usr, "Notes: [R.fields["notes"]]")
return
- if(href_list["add_citation"])
- var/maxFine = CONFIG_GET(number/maxfine)
- var/t1 = stripped_input("Please input citation crime:", "Security HUD", "", null)
- var/fine = FLOOR(input("Please input citation fine, up to [maxFine]:", "Security HUD", 50) as num|null, 1)
- if(!R || !t1 || !fine || !allowed_access)
- return
- if(!H.canUseHUD())
- return
- if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD))
- return
- if(fine < 0)
- to_chat(usr, "You're pretty sure that's not how money works.")
- return
- fine = min(fine, maxFine)
-
- var/crime = GLOB.data_core.createCrimeEntry(t1, "", allowed_access, station_time_timestamp(), fine)
- for (var/obj/item/pda/P in GLOB.PDAs)
- if(P.owner == R.fields["name"])
- var/message = "You have been fined [fine] credits for '[t1]'. Fines may be paid at security."
- var/datum/signal/subspace/messaging/pda/signal = new(src, list(
- "name" = "Security Citation",
- "job" = "Citation Server",
- "message" = message,
- "targets" = list("[P.owner] ([P.ownjob])"),
- "automated" = 1
- ))
- signal.send_to_receivers()
- usr.log_message("(PDA: Citation Server) sent \"[message]\" to [signal.format_target()]", LOG_PDA)
- GLOB.data_core.addCitation(R.fields["id"], crime)
- investigate_log("New Citation: [t1] Fine: [fine] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS)
- return
-
if(href_list["add_crime"])
var/t1 = stripped_input("Please input crime name:", "Security HUD", "", null)
if(!R || !t1 || !allowed_access)
@@ -646,10 +612,13 @@
/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/target)
var/panicking = FALSE
+ if(target == src) //Sanity check, in case spacetime crumbles and allows us to perform cpr on ourselves
+ return
+
do
CHECK_DNA_AND_SPECIES(target)
- if (INTERACTING_WITH(src, target))
+ if (DOING_INTERACTION_WITH_TARGET(src,target))
return FALSE
if (target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH))
@@ -675,7 +644,7 @@
visible_message("[src] is trying to perform CPR on [target.name]!", \
"You try to perform CPR on [target.name]... Hold still!")
- if (!do_mob(src, target, time = panicking ? CPR_PANIC_SPEED : (3 SECONDS)))
+ if (!do_after(src, delay = panicking ? CPR_PANIC_SPEED : (3 SECONDS), target = target))
to_chat(src, "You fail to perform CPR on [target]!")
return FALSE
@@ -930,11 +899,6 @@
dna.remove_mutation(HM.name)
..()
-/mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker)
- . = ..()
- if (dna && dna.species)
- . += dna.species.check_species_weakness(weapon, attacker)
-
/mob/living/carbon/human/is_literate()
return TRUE
@@ -1089,6 +1053,12 @@
else if(can_be_firemanned(target))
fireman_carry(target)
+/mob/living/carbon/human/limb_attack_self()
+ var/obj/item/bodypart/arm = hand_bodyparts[active_hand_index]
+ if(arm)
+ arm.attack_self(src)
+ return ..()
+
/mob/living/carbon/human/MouseDrop(mob/over)
. = ..()
if(ishuman(over))
@@ -1096,7 +1066,7 @@
if(!src.is_busy && (src.zone_selected == BODY_ZONE_HEAD || src.zone_selected == BODY_ZONE_PRECISE_GROIN) && get_turf(src) == get_turf(T) && !(T.mobility_flags & MOBILITY_STAND) && src.a_intent != INTENT_HELP) //all the stars align, time to curbstomp
src.is_busy = TRUE
- if (!do_mob(src,T,25) || get_turf(src) != get_turf(T) || (T.mobility_flags & MOBILITY_STAND) || src.a_intent == INTENT_HELP || src == T) //wait 30ds and make sure the stars still align (Body zone check removed after PR #958)
+ if (!do_after(src, 2.5 SECONDS, T) || get_turf(src) != get_turf(T) || (T.mobility_flags & MOBILITY_STAND) || src.a_intent == INTENT_HELP || src == T) //wait 30ds and make sure the stars still align (Body zone check removed after PR #958)
src.is_busy = FALSE
return
@@ -1184,7 +1154,7 @@
//Joe Medic starts quickly/expertly lifting Grey Tider onto their back..
"[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]")
//(Using your gloves' nanochips, you/You) (/quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...)
- if(do_after(src, carrydelay, TRUE, target))
+ if(do_after(src, carrydelay, target))
//Second check to make sure they're still valid to be carried
if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE) && !target.buckled)
buckle_mob(target, TRUE, TRUE, 90, 1, 0)
@@ -1207,7 +1177,7 @@
//Joe Medic starts quickly/expertly scooping Grey Tider into their arms..
"[carrydelay < 11 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to scoop [target] into your arms[carrydelay == 15 ? ", while assisted by the nanochips in your gloves.." : "..."]")
//(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to scoop Grey Tider into your arms(, while assisted by the nanochips in your gloves../...)
- if(do_after(src, carrydelay, TRUE, target))
+ if(do_after(src, carrydelay, target))
//Second check to make sure they're still valid to be carried
if(!incapacitated(FALSE, TRUE) && !target.buckled)
buckle_mob(target, TRUE, TRUE, 90, 1, 0)
@@ -1290,6 +1260,23 @@
return FALSE
return ..()
+/mob/living/carbon/human/CtrlShiftClick(mob/user)
+ . = ..()
+ if(isobserver(user) || !user.mind?.guestbook)
+ return
+ INVOKE_ASYNC(user.mind.guestbook, TYPE_PROC_REF(/datum/guestbook, try_add_guest), user, src, FALSE)
+
+/mob/living/carbon/human/get_screentip_name(client/hovering_client)
+ . = ..()
+ var/mob/hovering_mob = hovering_client?.mob
+ if(!hovering_mob?.mind?.guestbook)
+ return .
+ var/face_name = get_face_name("")
+ var/known_name = hovering_mob.mind.guestbook.get_known_name(hovering_mob, src, face_name)
+ if(known_name)
+ return known_name
+ return .
+
/mob/living/carbon/human/species
var/race = null
@@ -1307,7 +1294,7 @@
race = /datum/species/dullahan
/mob/living/carbon/human/species/ethereal
- race = /datum/species/ethereal
+ race = /datum/species/elzuose
/mob/living/carbon/human/species/fly
race = /datum/species/fly
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 123ecf6d4fba..1cb061ff9fd9 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -284,30 +284,30 @@
return TRUE
apply_damage(damage, BRUTE, affecting, armor_block)
- if(M.a_intent == INTENT_DISARM) //Always drop item in hand on first go. If no item exists, try to shove them back. If you share the tile with the target, slam them directly into the ground to stun them and slightly damage them.
- var/obj/item/I = get_active_held_item()
- if(I && dropItemToGround(I))
- playsound(loc, 'sound/weapons/slash.ogg', 25, TRUE, -1)
- visible_message("[M] disarms [src]!", \
- "[M] disarms you!", "You hear aggressive shuffling!", null, M)
- to_chat(M, "You disarm [src]!")
- else if(get_dist(src, M) != 0)
- playsound(loc, 'sound/weapons/pierce.ogg', 25, TRUE, -1)
- var/shovetarget = get_edge_target_turf(M, get_dir(M, get_step_away(src, M)))
- Knockdown(0.3 SECONDS)
- throw_at(shovetarget, 4, 2, M, force = MOVE_FORCE_OVERPOWERING)
- log_combat(M, src, "shoved")
- visible_message("[M] tackles [src] down!", \
- "[M] shoves you with great force!", "You hear aggressive shuffling followed by a loud thud!", null, M)
- to_chat(M, "You shove [src] with great force!")
- else
- Paralyze(3 SECONDS)
- adjustBruteLoss(5)
- playsound(loc, 'sound/weapons/punch3.ogg', 25, TRUE, -1)
- visible_message("[M] slams [src] into the floor!", \
- "[M] slams you into the ground!", "You hear something slam loudly onto the floor!", null, M)
- to_chat(M, "You slam [src] into the floor beneath you!")
- log_combat(M, src, "slammed into the ground")
+ if(M.a_intent == INTENT_DISARM) //Always drop item in hand on first go. If no item exists, try to shove them back. If you share the tile with the target, slam them directly into the ground to stun them and slightly damage them.
+ var/obj/item/I = get_active_held_item()
+ if(I && dropItemToGround(I) && prob(50))
+ playsound(loc, 'sound/weapons/slash.ogg', 25, TRUE, -1)
+ visible_message("[M] disarms [src]!", \
+ "[M] disarms you!", "You hear aggressive shuffling!", null, M)
+ to_chat(M, "You disarm [src]!")
+ else if(get_dist(src, M) != 0)
+ playsound(loc, 'sound/weapons/pierce.ogg', 25, TRUE, -1)
+ var/shovetarget = get_edge_target_turf(M, get_dir(M, get_step_away(src, M)))
+ Knockdown(0.3 SECONDS)
+ throw_at(shovetarget, 4, 2, M, force = MOVE_FORCE_OVERPOWERING)
+ log_combat(M, src, "shoved")
+ visible_message("[M] tackles [src] down!", \
+ "[M] shoves you with great force!", "You hear aggressive shuffling followed by a loud thud!", null, M)
+ to_chat(M, "You shove [src] with great force!")
+ else
+ Paralyze(1 SECONDS)
+ adjustBruteLoss(5)
+ playsound(loc, 'sound/weapons/punch3.ogg', 25, TRUE, -1)
+ visible_message("[M] slams [src] into the floor!", \
+ "[M] slams you into the ground!", "You hear something slam loudly onto the floor!", null, M)
+ to_chat(M, "You slam [src] into the floor beneath you!")
+ log_combat(M, src, "slammed into the ground")
/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L)
@@ -485,6 +485,9 @@
///Calculates the siemens coeff based on clothing and species, can also restart hearts.
/mob/living/carbon/human/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
+ //If it doesnt have physiology its prob still initializing.
+ if(!physiology)
+ return
//Calculates the siemens coeff based on clothing. Completely ignores the arguments
if(flags & SHOCK_TESLA) //I hate this entire block. This gets the siemens_coeff for tesla shocks
if(gloves && gloves.siemens_coefficient <= 0)
@@ -776,10 +779,10 @@
combined_msg += "\t There is \a [I] embedded in your [LB.name]!"
for(var/t in missing)
- combined_msg += "Your [parse_zone(t)] is missing!"
+ combined_msg += span_boldannounce("Your [parse_zone(t)] is missing!")
- if(bleed_rate)
- combined_msg += "You are bleeding!"
+ for(var/obj/item/bodypart/BP in get_bleeding_parts(TRUE))
+ combined_msg += span_danger("Your [parse_zone(BP.body_zone)] is bleeding!")
if(getStaminaLoss())
if(getStaminaLoss() > 30)
combined_msg += "You're completely exhausted."
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 5b638d330690..6556335c2bdb 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -61,8 +61,9 @@
var/special_voice = "" // For changing our voice. Used by a symptom.
- var/bleed_rate = 0 //how much are we bleeding
- var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding
+ /// Adjective used in get_generic_name(), if any
+ var/generic_adjective
+ var/bleedsuppress = 0 //for stopping bloodloss body-wide
var/name_override //For temporary visible name changes
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 2f9814112711..5d8264c14ac3 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -31,28 +31,19 @@
return pda.owner
return if_no_id
-//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a separate proc as it'll be useful elsewhere
/mob/living/carbon/human/get_visible_name()
- var/face_name = get_face_name("")
- var/id_name = get_id_name("")
if(name_override)
return name_override
- if(face_name)
- if(id_name && (id_name != face_name))
- return "[face_name] (as [id_name])"
- return face_name
- if(id_name)
- return id_name
- return "Unknown"
+ return get_generic_name(TRUE, lowercase = TRUE)
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when Fluacided or when updating a human's name variable
-/mob/living/carbon/human/proc/get_face_name(if_no_face="Unknown")
- if(wear_mask && (wear_mask.flags_inv&HIDEFACE)) //Wearing a mask which hides our face, use id-name if possible
+/mob/living/carbon/human/proc/get_face_name(if_no_face = get_generic_name(lowercase = TRUE))
+ if(wear_mask && (wear_mask.flags_inv & HIDEFACE)) //Wearing a mask which hides our face, use id-name if possible
return if_no_face
- if(head && (head.flags_inv&HIDEFACE))
- return if_no_face //Likewise for hats
+ if(head && (head.flags_inv & HIDEFACE))
+ return if_no_face //Likewise for hats
var/obj/item/bodypart/O = get_bodypart(BODY_ZONE_HEAD)
- if(!O || (HAS_TRAIT(src, TRAIT_DISFIGURED)) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name) //disfigured. use id-name if possible
+ if(!O || (HAS_TRAIT(src, TRAIT_DISFIGURED)) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name) //disfigured. use id-name if possible
return if_no_face
return real_name
@@ -181,3 +172,61 @@
destination.socks = socks
destination.socks_color = socks_color
destination.jumpsuit_style = jumpsuit_style
+
+/mob/living/carbon/human/proc/get_age()
+ var/obscured = check_obscured_slots()
+ var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
+ if((obscured & ITEM_SLOT_ICLOTHING) && skipface || isipc(src))
+ return FALSE
+ switch(age)
+ if(70 to INFINITY)
+ return "Geriatric"
+ if(60 to 70)
+ return "Elderly"
+ if(50 to 60)
+ return "Old"
+ if(40 to 50)
+ return "Middle-Aged"
+ if(24 to 40)
+ return FALSE //not necessary because this is basically the most common age range
+ if(18 to 24)
+ return "Young"
+ else
+ return "Puzzling"
+
+/mob/living/carbon/human/proc/get_generic_name(prefixed = FALSE, lowercase = FALSE)
+ var/final_string = ""
+ var/obscured = check_obscured_slots()
+ var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
+ var/hide_features = (obscured & ITEM_SLOT_ICLOTHING) && skipface
+
+ if(generic_adjective && !hide_features)
+ final_string += "[generic_adjective] "
+
+ var/visible_age = get_age()
+ if(visible_age)
+ final_string += "[visible_age] "
+
+ final_string += "[dna.species.name] "
+
+ final_string += get_gender()
+
+ if(prefixed)
+ final_string = "\A [final_string]"
+
+ if(lowercase)
+ final_string = lowertext(final_string)
+ return final_string
+
+/mob/living/carbon/human/proc/get_gender()
+ var/visible_gender = p_they()
+ switch(visible_gender)
+ if("he")
+ visible_gender = "Man"
+ if("she")
+ visible_gender = "Woman"
+ if("they")
+ visible_gender = "Person"
+ else
+ visible_gender = "Thing"
+ return visible_gender
diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm
index 039141bb5fd5..6b0c1ff1c768 100644
--- a/code/modules/mob/living/carbon/human/human_say.dm
+++ b/code/modules/mob/living/carbon/human/human_say.dm
@@ -7,16 +7,14 @@
else
. = ..()
-/mob/living/carbon/human/GetVoice()
+/mob/living/carbon/human/GetVoice(if_no_voice = get_generic_name())
if(istype(wear_mask, /obj/item/clothing/mask/chameleon))
- var/obj/item/clothing/mask/chameleon/V = wear_mask
- if(V.voice_change && wear_id)
+ var/obj/item/clothing/mask/chameleon/chameleon_mask = wear_mask
+ if(chameleon_mask.voice_change && wear_id)
var/obj/item/card/id/idcard = wear_id.GetID()
if(istype(idcard))
return idcard.registered_name
- else
- return real_name
- if(istype(wear_mask, /obj/item/clothing/mask/gas/syndicate/voicechanger))
+ else if(istype(wear_mask, /obj/item/clothing/mask/gas/syndicate/voicechanger))
var/obj/item/clothing/mask/gas/syndicate/voicechanger/V = wear_mask
if(V.voice_change && wear_id)
var/obj/item/card/id/idcard = wear_id.GetID()
@@ -26,18 +24,17 @@
return real_name
else
return real_name
- if(istype(wear_mask, /obj/item/clothing/mask/infiltrator))
- var/obj/item/clothing/mask/infiltrator/V = wear_mask
- if(V.voice_unknown)
- return ("Unknown")
- else
- return real_name
+ else if(istype(wear_mask, /obj/item/clothing/mask/infiltrator))
+ var/obj/item/clothing/mask/infiltrator/infiltrator_mask = wear_mask
+ if(infiltrator_mask.voice_unknown)
+ return if_no_voice
if(mind)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling && changeling.mimicing)
return changeling.mimicing
- if(GetSpecialVoice())
- return GetSpecialVoice()
+ var/special_voice = GetSpecialVoice()
+ if(special_voice)
+ return special_voice
return real_name
/mob/living/carbon/human/IsVocal()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index eda9c8c3db64..e061cd5c9793 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -688,16 +688,27 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
var/mutable_appearance/eye_overlay
var/mutable_appearance/sclera_overlay
+
if(eyes)
if(!HAS_TRAIT(H, TRAIT_EYESCLOSED) && !(H.stat == DEAD))
- eye_overlay = mutable_appearance(species_eye_path || 'icons/mob/human_face.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER)
- sclera_overlay = mutable_appearance('icons/mob/human_face.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER)
+
+ if(iskepori(H)) // Kepori need sclera but don't fit the normal silhouette, so this needs changing. Make better later.
+ eye_overlay = mutable_appearance('icons/mob/species/kepori/kepori_eyes.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER)
+ sclera_overlay = mutable_appearance('icons/mob/species/kepori/kepori_eyes.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER)
+
+ else
+ eye_overlay = mutable_appearance(species_eye_path || 'icons/mob/human_face.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER)
+ sclera_overlay = mutable_appearance('icons/mob/human_face.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER)
+
if((EYECOLOR in species_traits) && eyes)
eye_overlay.color = "#" + H.eye_color
+
if((SCLERA in species_traits) && eyes)
sclera_overlay.color = "#" + H.sclera_color
standing += sclera_overlay
+
standing += eye_overlay
+
if(EMOTE_OVERLAY in species_traits)
// blush
if (HAS_TRAIT(H, TRAIT_BLUSHING)) // Caused by either the *blush emote or the "drunk" mood event
@@ -859,9 +870,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.dna.species.bodytype & BODYTYPE_DIGITIGRADE)
var/uniform_compatible = FALSE
var/suit_compatible = FALSE
- if(!(H.w_uniform) || (H.w_uniform.supports_variations & DIGITIGRADE_VARIATION) || (H.w_uniform.supports_variations & DIGITIGRADE_VARIATION_NO_NEW_ICON)) //Checks uniform compatibility
+ if(!(H.w_uniform) || (H.w_uniform.supports_variations & DIGITIGRADE_VARIATION) || (H.w_uniform.supports_variations & DIGITIGRADE_VARIATION_NO_NEW_ICON) || (H.w_uniform.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE)) //Checks uniform compatibility
uniform_compatible = TRUE
- if((!H.wear_suit) || (H.wear_suit.supports_variations & DIGITIGRADE_VARIATION) || !(H.wear_suit.body_parts_covered & LEGS) || (H.wear_suit.supports_variations & DIGITIGRADE_VARIATION_NO_NEW_ICON)) //Checks suit compatability
+ if((!H.wear_suit) || (H.wear_suit.supports_variations & DIGITIGRADE_VARIATION) || !(H.wear_suit.body_parts_covered & LEGS) || (H.wear_suit.supports_variations & DIGITIGRADE_VARIATION_NO_NEW_ICON) || (H.wear_suit.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE)) //Checks suit compatability
suit_compatible = TRUE
var/show_digitigrade = suit_compatible && (uniform_compatible || H.wear_suit?.flags_inv & HIDEJUMPSUIT) //If the uniform is hidden, it doesnt matter if its compatible
@@ -939,6 +950,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
S = GLOB.spider_spinneret_list[H.dna.features["spider_spinneret"]]
if("kepori_body_feathers")
S = GLOB.kepori_body_feathers_list[H.dna.features["kepori_body_feathers"]]
+ if("kepori_head_feathers")
+ S = GLOB.kepori_head_feathers_list[H.dna.features["kepori_head_feathers"]]
if("kepori_tail_feathers")
S = GLOB.kepori_tail_feathers_list[H.dna.features["kepori_tail_feathers"]]
if("kepori_feathers")
@@ -1289,9 +1302,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
/datum/species/proc/get_spans()
return list()
-/datum/species/proc/check_species_weakness(obj/item, mob/living/attacker)
- return 0 //This is not a boolean, it's the multiplier for the damage that the user takes from the item.It is added onto the check_weakness value of the mob, and then the force of the item is multiplied by this value
-
/**
* Equip the outfit required for life. Replaces items currently worn.
*/
@@ -1359,9 +1369,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80
if(hungry >= 70)
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 50))
- else if(isethereal(H))
- var/datum/species/ethereal/E = H.dna.species
- if(E.get_charge(H) <= ETHEREAL_CHARGE_NORMAL)
+ else if(iselzuose(H))
+ var/datum/species/elzuose/E = H.dna.species
+ if(E.get_charge(H) <= ELZUOSE_CHARGE_NORMAL)
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (1.5 * (1 - E.get_charge(H) / 100)))
else
H.remove_movespeed_modifier(/datum/movespeed_modifier/hunger)
@@ -1448,7 +1458,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
user.visible_message("[user] starts stealing [target]'s [I.name]!",
"You start stealing [target]'s [I.name]...", null, null, target)
to_chat(target, "[user] starts stealing your [I.name]!")
- if(do_after(user, I.strip_delay, TRUE, target, TRUE))
+ if(do_after(user, I.strip_delay, target))
target.dropItemToGround(I, TRUE)
user.put_in_hands(I)
user.visible_message("[user] stole [target]'s [I.name]!",
@@ -1608,8 +1618,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/armor_block = H.run_armor_check(affecting, "melee", I.armour_penetration, FALSE, "Your armor has protected your [hit_area]!", "Your armor has softened a hit to your [hit_area]!")
armor_block = min(90,armor_block) //cap damage reduction at 90%
- var/weakness = H.check_weakness(I, user)
- apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H)
+ apply_damage(I.force, I.damtype, def_zone, armor_block, H, sharpness = I.get_sharpness())
H.send_item_attack_message(I, user, hit_area)
@@ -1678,7 +1687,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return TRUE
-/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, break_modifier = 1)
+/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, break_modifier = 1, sharpness = FALSE)
SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
var/hit_percent = (100-(blocked+armor))/100
hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100
@@ -1701,7 +1710,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.damageoverlaytemp = 20
var/damage_amount = forced ? damage : damage * hit_percent * brutemod * H.physiology.brute_mod
if(BP)
- if(BP.receive_damage(damage_amount, 0, break_modifier = break_modifier))
+ if(BP.receive_damage(damage_amount, 0, break_modifier = break_modifier, sharpness = sharpness))
H.update_damage_overlays()
else//no bodypart, we deal damage with a more general method.
H.adjustBruteLoss(damage_amount)
@@ -1711,7 +1720,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.damageoverlaytemp = 20
var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod
if(BP)
- if(BP.receive_damage(0, damage_amount, break_modifier = break_modifier))
+ if(BP.receive_damage(0, damage_amount, break_modifier = break_modifier, sharpness = sharpness))
H.update_damage_overlays()
else
H.adjustFireLoss(damage_amount)
diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm
index 381708757fd1..9410111c9e4f 100644
--- a/code/modules/mob/living/carbon/human/species_types/IPC.dm
+++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm
@@ -1,5 +1,5 @@
/datum/species/ipc // im fucking lazy mk2 and cant get sprites to normally work
- name = "\improper Integrated Positronic Chassis" //inherited from the real species, for health scanners and things
+ name = "\improper Positronic" //inherited from the real species, for health scanners and things
id = SPECIES_IPC
sexes = FALSE
species_age_min = 0
@@ -133,7 +133,7 @@
icon_state = "wire1"
/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
- if((!istype(target, /obj/machinery/power/apc) && !isethereal(target)) || !ishuman(user) || !proximity_flag)
+ if((!istype(target, /obj/machinery/power/apc) && !iselzuose(target)) || !ishuman(user) || !proximity_flag)
return ..()
user.changeNext_move(CLICK_CD_MELEE)
var/mob/living/carbon/human/H = user
@@ -155,7 +155,7 @@
to_chat(user, "There is not enough charge to draw from that APC.")
return
- if(isethereal(target))
+ if(iselzuose(target))
var/mob/living/carbon/human/target_ethereal = target
var/obj/item/organ/stomach/ethereal/eth_stomach = target_ethereal.getorganslot(ORGAN_SLOT_STOMACH)
if(target_ethereal.nutrition > 0 && eth_stomach)
@@ -207,7 +207,7 @@
if(A.crystal_charge == 0)
to_chat(H, "[A] is completely drained!")
break
- siphon_amt = A.crystal_charge <= (2 * ETHEREAL_CHARGE_SCALING_MULTIPLIER) ? A.crystal_charge : (2 * ETHEREAL_CHARGE_SCALING_MULTIPLIER)
+ siphon_amt = A.crystal_charge <= (2 * ELZUOSE_CHARGE_SCALING_MULTIPLIER) ? A.crystal_charge : (2 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
A.adjust_charge(-1 * siphon_amt)
H.nutrition += (siphon_amt)
if(H.nutrition > NUTRITION_LEVEL_WELL_FED)
@@ -273,7 +273,11 @@
if(chassis_of_choice.is_digi)
if(istype(BP,/obj/item/bodypart/leg))
- BP.bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_DIGITIGRADE //i hate this so much
+ BP.bodytype |= BODYTYPE_DIGITIGRADE //i hate this so much
+
+ if(chassis_of_choice.has_snout)
+ if(istype(BP,/obj/item/bodypart/head))
+ BP.bodytype |= BODYTYPE_SNOUT //hate. hate. (tik tok tts)
if(BP.uses_mutcolor)
BP.should_draw_greyscale = TRUE
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index a2ff92508d61..4ad5297b73d9 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -1,8 +1,12 @@
-#define ETHEREAL_EMAG_COLORS list("#00ffff", "#ffc0cb", "#9400D3", "#4B0082", "#0000FF", "#00FF00", "#FFFF00", "#FF7F00", "#FF0000")
+#define ELZUOSE_EMAG_COLORS list("#00ffff", "#ffc0cb", "#9400D3", "#4B0082", "#0000FF", "#00FF00", "#FFFF00", "#FF7F00", "#FF0000")
+#define GOOD_SOIL list(/turf/open/floor/plating/grass, /turf/open/floor/plating/dirt, /turf/open/floor/ship/dirt, /turf/open/floor/grass/ship, /turf/open/floor/plating/asteroid/whitesands/grass, /turf/open/floor/grass/fairy/beach)
+#define DIG_TIME (7.5 SECONDS)
+#define ROOT_TIME (3 SECONDS)
+#define ROOT_CHARGE_GAIN (5 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
-/datum/species/ethereal
+/datum/species/elzuose
name = "\improper Elzuose"
- id = SPECIES_ETHEREAL
+ id = SPECIES_ELZUOSE
attack_verb = "burn"
attack_sound = 'sound/weapons/etherealhit.ogg'
miss_sound = 'sound/weapons/etherealmiss.ogg'
@@ -14,6 +18,7 @@
attack_type = BURN //burn bish
exotic_bloodtype = "E"
damage_overlay_type = "" //We are too cool for regular damage overlays
+ species_age_max = 300
species_traits = list(DYNCOLORS, EYECOLOR, HAIR, FACEHAIR)
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
species_language_holder = /datum/language_holder/ethereal
@@ -41,41 +46,121 @@
var/current_color
var/EMPeffect = FALSE
- var/emag_effect = FALSE
var/static/unhealthy_color = rgb(237, 164, 149)
loreblurb = "Elzuosa are an uncommon and unusual species best described as crystalline, electrically-powered plantpeople. They hail from the warm planet Kalixcis, where they evolved alongside the Sarathi. Kalixcian culture places no importance on blood-bonds, and those from it tend to consider their family anyone they are sufficiently close to, and choose their own names."
var/drain_time = 0 //used to keep ethereals from spam draining power sources
var/obj/effect/dummy/lighting_obj/ethereal_light
+ var/datum/action/innate/root/rooting
-/datum/species/ethereal/Destroy(force)
+/datum/species/elzuose/Destroy(force)
if(ethereal_light)
QDEL_NULL(ethereal_light)
return ..()
-/datum/species/ethereal/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
+/datum/species/elzuose/on_species_gain(mob/living/carbon/_carbon, datum/species/old_species, pref_load)
. = ..()
- if(!ishuman(C))
+ if(!ishuman(_carbon))
return
- var/mob/living/carbon/human/ethereal = C
+ var/mob/living/carbon/human/ethereal = _carbon
default_color = "#[ethereal.dna.features["ethcolor"]]"
- RegisterSignal(ethereal, COMSIG_ATOM_EMAG_ACT, PROC_REF(on_emag_act))
RegisterSignal(ethereal, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act))
ethereal_light = ethereal.mob_light()
spec_updatehealth(ethereal)
+ rooting = new
+ rooting.Grant(_carbon)
+ RegisterSignal(ethereal, COMSIG_DIGOUT, PROC_REF(digout))
+ RegisterSignal(ethereal, COMSIG_MOVABLE_MOVED, PROC_REF(uproot))
//The following code is literally only to make admin-spawned ethereals not be black.
- C.dna.features["mcolor"] = C.dna.features["ethcolor"] //Ethcolor and Mut color are both dogshit and will be replaced
- for(var/obj/item/bodypart/BP as anything in C.bodyparts)
- if(BP.limb_id == SPECIES_ETHEREAL)
+ _carbon.dna.features["mcolor"] = _carbon.dna.features["ethcolor"] //Ethcolor and Mut color are both dogshit and will be replaced
+ for(var/obj/item/bodypart/BP as anything in _carbon.bodyparts)
+ if(BP.limb_id == SPECIES_ELZUOSE)
BP.update_limb(is_creating = TRUE)
-/datum/species/ethereal/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load)
- UnregisterSignal(C, COMSIG_ATOM_EMAG_ACT)
- UnregisterSignal(C, COMSIG_ATOM_EMP_ACT)
+/datum/species/elzuose/on_species_loss(mob/living/carbon/human/_carbon, datum/species/new_species, pref_load)
+ UnregisterSignal(_carbon, COMSIG_ATOM_EMP_ACT)
+ UnregisterSignal(_carbon, COMSIG_DIGOUT)
+ UnregisterSignal(_carbon, COMSIG_MOVABLE_MOVED)
QDEL_NULL(ethereal_light)
+ if(rooting)
+ rooting.Remove(_carbon)
return ..()
-/datum/species/ethereal/random_name(gender,unique,lastname)
+/datum/action/innate/root
+ name = "Root"
+ desc = "Root into good soil to gain charge."
+ check_flags = AB_CHECK_CONSCIOUS
+ button_icon_state = "plant-22"
+ icon_icon = 'icons/obj/flora/plants.dmi'
+ background_icon_state = "bg_alien"
+
+/datum/action/innate/root/Activate()
+ var/mob/living/carbon/human/_human = owner
+ var/datum/species/elzuose/_elzu = _human.dna.species
+ // this is healthy for elzu, they shouldnt be able to overcharge and get heart attacks from this
+ var/obj/item/organ/stomach/ethereal/stomach = _human.getorganslot(ORGAN_SLOT_STOMACH)
+
+ if(_human.wear_suit && istype(_human.wear_suit, /obj/item/clothing))
+ var/obj/item/clothing/CS = _human.wear_suit
+ if (CS.clothing_flags & THICKMATERIAL)
+ to_chat(_human, span_warning("Your [CS.name] is too thick to root in!"))
+ return
+
+ if(stomach.crystal_charge > ELZUOSE_CHARGE_FULL)
+ to_chat(_human,span_warning("Your charge is full!"))
+ return
+ _elzu.drain_time = world.time + ROOT_TIME
+ _human.visible_message(span_notice("[_human] is digging into the ground"),span_warning("You start to dig yourself into the ground to root. You won't won't be able to move once you start the process."),span_notice("You hear digging."))
+ if(!do_after(_human,DIG_TIME, target = _human))
+ to_chat(_human,span_warning("You were interupted!"))
+ return
+ _human.apply_status_effect(/datum/status_effect/rooted)
+ to_chat(_human, span_notice("You root into the ground and begin to feed."))
+
+ while(do_after(_human, ROOT_TIME, target = _human))
+ if(istype(stomach))
+ to_chat(_human, span_notice("You receive some charge from rooting."))
+ stomach.adjust_charge(ROOT_CHARGE_GAIN)
+ _human.adjustBruteLoss(-3)
+ _human.adjustFireLoss(-3)
+
+ if(stomach.crystal_charge > ELZUOSE_CHARGE_FULL)
+ stomach.crystal_charge = ELZUOSE_CHARGE_FULL
+ to_chat(_human, span_notice("You're full on charge!"))
+ break
+
+ else
+ to_chat(_human,span_warning("You're missing your biological battery and can't recieve charge from rooting!"))
+ break
+
+/datum/species/elzuose/proc/digout(mob/living/carbon/human/_human)
+ if(do_after(_human, DIG_TIME,target = _human))
+ to_chat(_human,span_notice("You finish digging yourself out."))
+ _human.remove_status_effect(/datum/status_effect/rooted)
+ return
+
+/datum/species/elzuose/proc/uproot(mob/living/carbon/human/_human)
+ //You got moved and uprooted, time to suffer the consequences.
+ if(_human.has_status_effect(/datum/status_effect/rooted))
+ _human.visible_message(span_warning("[_human] is forcefully uprooted. That looked like it hurt."),span_warning("You're forcefully unrooted! Ouch!"),span_warning("You hear someone scream in pain."))
+ _human.apply_damage(8,BRUTE,BODY_ZONE_CHEST)
+ _human.apply_damage(8,BRUTE,BODY_ZONE_L_LEG)
+ _human.apply_damage(8,BRUTE,BODY_ZONE_R_LEG)
+ _human.emote("scream")
+ _human.remove_status_effect(/datum/status_effect/rooted)
+ return
+
+/datum/action/innate/root/IsAvailable()
+ if(..())
+ var/mob/living/carbon/human/_human = owner
+ var/turf/terrain = get_turf(_human)
+ if(_human.has_status_effect(/datum/status_effect/rooted))
+ return FALSE
+ if(is_type_in_list(terrain,GOOD_SOIL))
+ return TRUE
+ return FALSE
+
+/datum/species/elzuose/random_name(gender,unique,lastname)
if(unique)
return random_unique_lizard_name(gender)
@@ -86,30 +171,29 @@
return randname
-/datum/species/ethereal/spec_updatehealth(mob/living/carbon/human/H)
+/datum/species/elzuose/spec_updatehealth(mob/living/carbon/human/_human)
. = ..()
if(!ethereal_light)
return
- if(H.stat != DEAD && !EMPeffect)
- if(!emag_effect)
- current_color = health_adjusted_color(H, default_color)
- set_ethereal_light(H, current_color)
+ if(_human.stat != DEAD && !EMPeffect)
+ current_color = health_adjusted_color(_human, default_color)
+ set_ethereal_light(_human, current_color)
ethereal_light.set_light_on(TRUE)
fixed_mut_color = copytext_char(current_color, 2)
else
ethereal_light.set_light_on(FALSE)
fixed_mut_color = rgb(128,128,128)
- for(var/obj/item/bodypart/parts_to_update as anything in H.bodyparts)
+ for(var/obj/item/bodypart/parts_to_update as anything in _human.bodyparts)
parts_to_update.species_color = fixed_mut_color
parts_to_update.update_limb()
- H.update_body()
- H.update_hair()
+ _human.update_body()
+ _human.update_hair()
-/datum/species/ethereal/proc/health_adjusted_color(mob/living/carbon/human/H, default_color)
- var/health_percent = max(H.health, 0) / 100
+/datum/species/elzuose/proc/health_adjusted_color(mob/living/carbon/human/_human, default_color)
+ var/health_percent = max(_human.health, 0) / 100
var/static/unhealthy_color_red_part = GETREDPART(unhealthy_color)
var/static/unhealthy_color_green_part = GETGREENPART(unhealthy_color)
@@ -126,141 +210,87 @@
)
return result
-/datum/species/ethereal/proc/set_ethereal_light(mob/living/carbon/human/H, current_color)
+/datum/species/elzuose/proc/set_ethereal_light(mob/living/carbon/human/_human, current_color)
if(!ethereal_light)
return
- var/health_percent = max(H.health, 0) / 100
+ var/health_percent = max(_human.health, 0) / 100
var/light_range = 1 + (1 * health_percent)
var/light_power = 1 + round(0.5 * health_percent)
ethereal_light.set_light_range_power_color(light_range, light_power, current_color)
-/datum/species/ethereal/proc/on_emp_act(mob/living/carbon/human/H, severity)
+/datum/species/elzuose/proc/on_emp_act(mob/living/carbon/human/_human, severity)
EMPeffect = TRUE
- spec_updatehealth(H)
- to_chat(H, "You feel the light of your body leave you.")
+ spec_updatehealth(_human)
+ to_chat(_human, span_notice("You feel the light of your body leave you."))
switch(severity)
if(EMP_LIGHT)
- addtimer(CALLBACK(src, PROC_REF(stop_emp), H), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 10 seconds
+ addtimer(CALLBACK(src, PROC_REF(stop_emp), _human), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 10 seconds
if(EMP_HEAVY)
- addtimer(CALLBACK(src, PROC_REF(stop_emp), H), 20 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 20 seconds
+ addtimer(CALLBACK(src, PROC_REF(stop_emp), _human), 20 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 20 seconds
-/datum/species/ethereal/proc/on_emag_act(mob/living/carbon/human/H, mob/user)
- if(emag_effect)
- return
- emag_effect = TRUE
- if(user)
- to_chat(user, "You tap [H] on the back with your card.")
- H.visible_message("[H] starts flickering in an array of colors!")
- handle_emag(H)
- addtimer(CALLBACK(src, PROC_REF(stop_emag), H), 30 SECONDS) //Disco mode for 30 seconds! This doesn't affect the ethereal at all besides either annoying some players, or making someone look badass.
-
-/datum/species/ethereal/spec_life(mob/living/carbon/human/H)
+/datum/species/elzuose/spec_life(mob/living/carbon/human/_human)
.=..()
- handle_charge(H)
+ handle_charge(_human)
-/datum/species/ethereal/proc/stop_emp(mob/living/carbon/human/H)
+/datum/species/elzuose/proc/stop_emp(mob/living/carbon/human/_human)
EMPeffect = FALSE
- spec_updatehealth(H)
- to_chat(H, "You feel more energized as your shine comes back.")
-
-/datum/species/ethereal/proc/handle_emag(mob/living/carbon/human/H)
- if(!emag_effect)
- return
- current_color = pick(ETHEREAL_EMAG_COLORS)
- spec_updatehealth(H)
- addtimer(CALLBACK(src, PROC_REF(handle_emag), H), 5) //Call ourselves every 0.5 seconds to change color
-
-/datum/species/ethereal/proc/stop_emag(mob/living/carbon/human/H)
- emag_effect = FALSE
- spec_updatehealth(H)
- H.visible_message("[H] stops flickering and goes back to their normal state!")
+ spec_updatehealth(_human)
+ to_chat(_human, span_notice("You feel more energized as your shine comes back."))
-/datum/species/ethereal/proc/handle_charge(mob/living/carbon/human/H)
+/datum/species/elzuose/proc/handle_charge(mob/living/carbon/human/_human)
brutemod = 1.25
- switch(get_charge(H))
- if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER)
- if(get_charge(H) == ETHEREAL_CHARGE_NONE)
- H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 3)
+ switch(get_charge(_human))
+ if(ELZUOSE_CHARGE_NONE to ELZUOSE_CHARGE_LOWPOWER)
+ if(get_charge(_human) == ELZUOSE_CHARGE_NONE)
+ _human.throw_alert("ELZUOSE_CHARGE", /atom/movable/screen/alert/etherealcharge, 3)
else
- H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 2)
- if(H.health > 10.5)
- apply_damage(0.2, TOX, null, null, H)
+ _human.throw_alert("ELZUOSE_CHARGE", /atom/movable/screen/alert/etherealcharge, 2)
+ if(_human.health > 10.5)
+ apply_damage(0.2, TOX, null, null, _human)
brutemod = 1.75
- if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL)
- H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 1)
+ if(ELZUOSE_CHARGE_LOWPOWER to ELZUOSE_CHARGE_NORMAL)
+ _human.throw_alert("ELZUOSE_CHARGE", /atom/movable/screen/alert/etherealcharge, 1)
brutemod = 1.5
- if(ETHEREAL_CHARGE_FULL to ETHEREAL_CHARGE_OVERLOAD)
- H.throw_alert("ethereal_overcharge", /atom/movable/screen/alert/ethereal_overcharge, 1)
+ if(ELZUOSE_CHARGE_FULL to ELZUOSE_CHARGE_OVERLOAD)
+ _human.throw_alert("ethereal_overcharge", /atom/movable/screen/alert/ethereal_overcharge, 1)
brutemod = 1.5
- if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS)
- H.throw_alert("ethereal_overcharge", /atom/movable/screen/alert/ethereal_overcharge, 2)
+ if(ELZUOSE_CHARGE_OVERLOAD to ELZUOSE_CHARGE_DANGEROUS)
+ _human.throw_alert("ethereal_overcharge", /atom/movable/screen/alert/ethereal_overcharge, 2)
brutemod = 1.75
if(prob(10)) //10% each tick for ethereals to explosively release excess energy if it reaches dangerous levels
- discharge_process(H)
+ discharge_process(_human)
else
- H.clear_alert("ethereal_charge")
- H.clear_alert("ethereal_overcharge")
+ _human.clear_alert("ELZUOSE_CHARGE")
+ _human.clear_alert("ethereal_overcharge")
-/datum/species/ethereal/proc/discharge_process(mob/living/carbon/human/H)
- to_chat(H, "You begin to lose control over your charge!")
- H.visible_message("[H] begins to spark violently!")
+/datum/species/elzuose/proc/discharge_process(mob/living/carbon/human/_human)
+ _human.visible_message(span_danger("[_human] begins to spark violently!"),_human,span_warning("You begin to lose control over your charge!"))
var/static/mutable_appearance/overcharge //shameless copycode from lightning spell
overcharge = overcharge || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER)
- H.add_overlay(overcharge)
- if(do_mob(H, H, 50, 1))
- H.flash_lighting_fx(5, 7, current_color)
- var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH)
- playsound(H, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
- H.cut_overlay(overcharge)
- tesla_zap(H, 2, (stomach.crystal_charge / ETHEREAL_CHARGE_SCALING_MULTIPLIER) * 50, ZAP_OBJ_DAMAGE | ZAP_ALLOW_DUPLICATES)
+ _human.add_overlay(overcharge)
+ if(do_after(_human, 50, _human, 1))
+ _human.flash_lighting_fx(5, 7, current_color)
+ var/obj/item/organ/stomach/ethereal/stomach = _human.getorganslot(ORGAN_SLOT_STOMACH)
+ playsound(_human, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
+ _human.cut_overlay(overcharge)
+ tesla_zap(_human, 2, (stomach.crystal_charge / ELZUOSE_CHARGE_SCALING_MULTIPLIER) * 50, ZAP_OBJ_DAMAGE | ZAP_ALLOW_DUPLICATES)
if(istype(stomach))
- stomach.adjust_charge(ETHEREAL_CHARGE_FULL - stomach.crystal_charge)
- to_chat(H, "You violently discharge energy!")
- H.visible_message("[H] violently discharges energy!")
+ stomach.adjust_charge(ELZUOSE_CHARGE_FULL - stomach.crystal_charge)
+ to_chat(_human,span_warning("You violently discharge energy!"))
+ _human.visible_message(span_danger("[_human] violently discharges energy!"))
if(prob(10)) //chance of developing heart disease to dissuade overcharging oneself
var/datum/disease/D = new /datum/disease/heart_failure
- H.ForceContractDisease(D)
- to_chat(H, "You're pretty sure you just felt your heart stop for a second there..")
- H.playsound_local(H, 'sound/effects/singlebeat.ogg', 100, 0)
- H.Paralyze(100)
+ _human.ForceContractDisease(D)
+ to_chat(_human, span_userdanger("You're pretty sure you just felt your heart stop for a second there."))
+ _human.playsound_local(_human, 'sound/effects/singlebeat.ogg', 100, 0)
+ _human.Paralyze(100)
return
-/datum/species/ethereal/proc/get_charge(mob/living/carbon/H) //this feels like it should be somewhere else. Eh?
- var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH)
+/datum/species/elzuose/proc/get_charge(mob/living/carbon/_human) //this feels like it should be somewhere else. Eh?
+ var/obj/item/organ/stomach/ethereal/stomach = _human.getorganslot(ORGAN_SLOT_STOMACH)
if(istype(stomach))
return stomach.crystal_charge
- return ETHEREAL_CHARGE_NONE
-
-/datum/species/ethereal/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
- if(istype(I, /obj/item/multitool))
- if(user.a_intent == INTENT_HARM)
- . = ..() // multitool beatdown
- return
-
- if (emag_effect == TRUE)
- to_chat(user, "The multitool can't get a lock on [H]'s EM frequency")
- return
-
- if(user != H)
- // random color change
- default_color = "#" + GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)]
- current_color = health_adjusted_color(H, default_color)
- spec_updatehealth(H)
- H.visible_message("[H]'s EM frequency is scrambled to a random color.")
- else
- // select new color
- var/new_etherealcolor = input(user, "Choose your Elzuose color:", "Character Preference",default_color) as color|null
- if(new_etherealcolor)
- var/temp_hsv = RGBtoHSV(new_etherealcolor)
- if(ReadHSV(temp_hsv)[3] >= ReadHSV("#505050")[3]) // elzu colors should be bright ok??
- default_color = sanitize_hexcolor(new_etherealcolor, 6, TRUE)
- current_color = health_adjusted_color(H, default_color)
- spec_updatehealth(H)
- H.visible_message("[H] modulates \his EM frequency to [new_etherealcolor].")
- else
- to_chat(user, "Invalid color. Your color is not bright enough.")
- else
- . = ..()
+ return ELZUOSE_CHARGE_NONE
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index af19f1316ce2..f5de9f873b3b 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -35,7 +35,3 @@
"You throw up on the floor!")
return ..()
-/datum/species/fly/check_species_weakness(obj/item/weapon, mob/living/attacker)
- if(istype(weapon, /obj/item/melee/flyswatter))
- return 29 //Flyswatters deal 30x damage to flypeople.
- return 0
diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm
index 885be6f5886a..882fffc9ff41 100644
--- a/code/modules/mob/living/carbon/human/species_types/humans.dm
+++ b/code/modules/mob/living/carbon/human/species_types/humans.dm
@@ -13,16 +13,33 @@
loreblurb = "Mostly hairless mammalians. Their home system, Sol, lies in a sort of \"bluespace dead-zone\" that blocks anything from entering or exiting Sol's dead-zone through bluespace without a relay. While it leaves Sol extremely well-defended, it meant that they went unnoticed and uncontacted until they were themselves able to breach it."
/datum/species/human/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
- if(C.dna.features["ears"] == "Cat")
- mutantears = /obj/item/organ/ears/cat
- if(C.dna.features["ears"] == "Fox")
- mutantears = /obj/item/organ/ears/fox
- if(C.dna.features["tail_human"] == "Cat")
- mutant_organs |= /obj/item/organ/tail/cat
- if(C.dna.features["tail_human"] == "Fox")
- mutant_organs |= /obj/item/organ/tail/fox
- if(C.dna.features["ears"] == "Elf")
- mutantears = /obj/item/organ/ears/elf
+ switch(C.dna.features["ears"])
+ if("Elf")
+ mutantears = /obj/item/organ/ears/elf
+ if("Cat")
+ mutantears = /obj/item/organ/ears/cat
+ if("Dog")
+ mutantears = /obj/item/organ/ears/dog
+ if("Fox")
+ mutantears = /obj/item/organ/ears/fox
+ if("Rabbit")
+ mutantears = /obj/item/organ/ears/rabbit
+ if("Bent Rabbit")
+ mutantears = /obj/item/organ/ears/rabbit/bent
+ if("Floppy Rabbit")
+ mutantears = /obj/item/organ/ears/rabbit/floppy
+ switch(C.dna.features["tail_human"])
+ if("Cat")
+ mutant_organs |= /obj/item/organ/tail/cat
+ if("Dog")
+ mutant_organs |= /obj/item/organ/tail/dog
+ if("Fox")
+ mutant_organs |= /obj/item/organ/tail/fox
+ if("Fox 2")
+ mutant_organs |= /obj/item/organ/tail/fox/alt
+ if("Rabbit")
+ mutant_organs |= /obj/item/organ/tail/rabbit
+
return ..()
/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index eb78ef131644..30f3d5f74b58 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -313,7 +313,7 @@
H.notransform = TRUE
- if(do_after(owner, delay=60, needhand=FALSE, target=owner, progress=TRUE))
+ if(do_after(owner, delay=60, target=owner, progress=TRUE, timed_action_flags = IGNORE_HELD_ITEM))
if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
make_dupe()
else
diff --git a/code/modules/mob/living/carbon/human/species_types/kepori.dm b/code/modules/mob/living/carbon/human/species_types/kepori.dm
index 5693c646cf3f..3278d3d77c1e 100644
--- a/code/modules/mob/living/carbon/human/species_types/kepori.dm
+++ b/code/modules/mob/living/carbon/human/species_types/kepori.dm
@@ -2,10 +2,10 @@
name = "\improper Kepori"
id = SPECIES_KEPORI
default_color = "6060FF"
- species_traits = list(MUTCOLORS, EYECOLOR, MUTCOLORS_SECONDARY)
+ species_traits = list(SCLERA, MUTCOLORS, EYECOLOR, MUTCOLORS_SECONDARY)
inherent_traits = list(TRAIT_SCOOPABLE)
- mutant_bodyparts = list("kepori_body_feathers", "kepori_tail_feathers", "kepori_feathers")
- default_features = list("mcolor" = "0F0", "wings" = "None", "kepori_feathers" = "Plain", "kepori_body_feathers" = "Plain", "kepori_tail_feathers" = "Fan", "body_size" = "Normal")
+ mutant_bodyparts = list("kepori_body_feathers", "kepori_head_feathers", "kepori_tail_feathers", "kepori_feathers")
+ default_features = list("mcolor" = "0F0", "wings" = "None", "kepori_feathers" = "None", "kepori_head_feathers" = "None", "kepori_body_feathers" = "None", "kepori_tail_feathers" = "None")
meat = /obj/item/reagent_containers/food/snacks/meat/slab/chicken
disliked_food = FRIED | GROSS | CLOTH
liked_food = MEAT | GORE
@@ -15,7 +15,7 @@
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
species_clothing_path = 'icons/mob/clothing/species/kepori.dmi'
- species_eye_path = 'icons/mob/kepori_parts.dmi'
+ species_eye_path = 'icons/mob/species/kepori/kepori_eyes.dmi'
heatmod = 0.67
coldmod = 1.5
brutemod = 1.5
@@ -57,17 +57,64 @@
species_robotic_l_leg = /obj/item/bodypart/leg/left/robot/surplus/kepori
species_robotic_r_leg = /obj/item/bodypart/leg/right/robot/surplus/kepori
+ robotic_eyes = /obj/item/organ/eyes/robotic/kepori
+
/datum/species/kepori/New()
. = ..()
// This is in new because "[HEAD_LAYER]" etc. is NOT a constant compile-time value. For some reason.
// Why not just use HEAD_LAYER? Well, because HEAD_LAYER is a number, and if you try to use numbers as indexes,
// BYOND will try to make it an ordered list. So, we have to use a string. This is annoying, but it's the only way to do it smoothly.
offset_clothing = list(
- "[HEAD_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -4), "[EAST]" = list("x" = 4, "y" = -4), "[SOUTH]" = list("x" = 0, "y" = -4), "[WEST]" = list("x" = -4, "y" = -4)),
- "[GLASSES_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -4), "[EAST]" = list("x" = 4, "y" = -4), "[SOUTH]" = list("x" = 0, "y" = -4), "[WEST]" = list("x" = -4, "y" = -4)),
- "[FACEMASK_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -5), "[EAST]" = list("x" = 4, "y" = -5), "[SOUTH]" = list("x" = 0, "y" = -5), "[WEST]" = list("x" = -4, "y" = -5)),
+ "[HEAD_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -3),
+ "[EAST]" = list("x" = 19, "y" = -3), //ISSUE: The head sprites seem to be cut off when given an offset this large, combined with kepori offset
+ "[SOUTH]" = list("x" = 8, "y" = -3),
+ "[WEST]" = list("x" = -3, "y" = -3)
+ ),
+ "[GLASSES_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -3),
+ "[EAST]" = list("x" = 19, "y" = -3),
+ "[SOUTH]" = list("x" = 8, "y" = -3),
+ "[WEST]" = list("x" = -3, "y" = -3)
+ ),
+ "[FACEMASK_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -3),
+ "[EAST]" = list("x" = 19, "y" = -3),
+ "[SOUTH]" = list("x" = 8, "y" = -3),
+ "[WEST]" = list("x" = -3, "y" = -3)
+ ),
+ "[BELT_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -1),
+ "[EAST]" = list("x" = 8, "y" = -1),
+ "[SOUTH]" = list("x" = 8, "y" = -1),
+ "[WEST]" = list("x" = 9, "y" = -1)
+ ),
+ "[EARS_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -3),
+ "[EAST]" = list("x" = 19, "y" = -3),
+ "[SOUTH]" = list("x" = 8, "y" = -3),
+ "[WEST]" = list("x" = -3, "y" = -3)
+ ),
+ "[SUIT_STORE_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = -1),
+ "[EAST]" = list("x" = 8, "y" = -1),
+ "[SOUTH]" = list("x" = 8, "y" = -1),
+ "[WEST]" = list("x" = -8, "y" = -1)
+ ),
)
+// First list is left hand, second list is right hand. This is used for inhand offsets.
+/datum/species/kepori/get_item_offsets_for_dir(dir, hand)
+ //LEFT/RIGHT
+ if(dir & NORTH)
+ return list(list("x" = 9, "y" = -1), list("x" = 7, "y" = -1))
+ if(dir & SOUTH)
+ return list(list("x" = 7, "y" = -1), list("x" = 9, "y" = -1))
+ if(dir & EAST)
+ return list(list("x" = 18, "y" = -2), list("x" = 21, "y" = -2)) //("x" = 18, "y" = 2), list("x" = 21, "y" = -1))
+ if(dir & WEST)
+ return list(list("x" = -4, "y" = -2), list("x" = -1, "y" = -2)) //("x" = -5, "y" = -1), list("x" = -1, "y" = 2))
+
/datum/species/kepori/random_name(gender,unique,lastname)
if(unique)
return random_unique_kepori_name()
@@ -86,17 +133,27 @@
return equip_delay_self_check(I, H, bypass_equip_delay_self)
/datum/species/kepori/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
- ..()
+ . = ..()
+
+ C.base_pixel_x -= 8
+ C.pixel_x = C.base_pixel_x
+ C.update_hands_on_rotate()
+
if(ishuman(C))
keptackle = new
keptackle.Grant(C)
/datum/species/kepori/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load)
+ . = ..()
+
+ C.base_pixel_x += 8
+ C.pixel_x = C.base_pixel_x
+ C.stop_updating_hands()
+
if(keptackle)
keptackle.Remove(C)
- qdel(C.GetComponent(/datum/component/tackler))
- ..()
+ qdel(C.GetComponent(/datum/component/tackler))
/datum/action/innate/keptackle
name = "Pounce"
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 141efed98e12..c34a70b3afde 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -1,8 +1,9 @@
/datum/species/lizard
// Reptilian humanoids with scaled skin and tails.
name = "\improper Sarathi"
- id = SPECIES_LIZARD
+ id = SPECIES_SARATHI
default_color = "00FF00"
+ species_age_max = 175
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,SCLERA,EMOTE_OVERLAY,MUTCOLORS_SECONDARY)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE
mutant_bodyparts = list("tail_lizard", "face_markings", "frills", "horns", "spines", "body_markings", "legs")
@@ -20,7 +21,6 @@
exotic_bloodtype = "L"
disliked_food = GRAIN | DAIRY | CLOTH | GROSS
liked_food = GORE | MEAT
- inert_mutation = FIREBREATH
deathsound = 'sound/voice/lizard/deathsound.ogg'
wings_icons = list("Dragon")
species_language_holder = /datum/language_holder/lizard
@@ -110,7 +110,7 @@ Lizard subspecies: ASHWALKERS
/datum/species/lizard/ashwalker
name = "Ash Walker"
id = SPECIES_ASHWALKER
- examine_limb_id = SPECIES_LIZARD
+ examine_limb_id = SPECIES_SARATHI
species_traits = list(MUTCOLORS,EYECOLOR,LIPS, NO_UNDERWEAR)
inherent_traits = list(TRAIT_CHUNKYFINGERS,TRAIT_NOBREATH)
species_language_holder = /datum/language_holder/lizard/ash
@@ -121,7 +121,7 @@ Lizard subspecies: ASHWALKERS
/datum/species/lizard/ashwalker/kobold
name = "Kobold"
id = SPECIES_KOBOLD
- examine_limb_id = SPECIES_LIZARD
+ examine_limb_id = SPECIES_SARATHI
species_traits = list(MUTCOLORS,EYECOLOR,LIPS, NO_UNDERWEAR)
inherent_traits = list(TRAIT_CHUNKYFINGERS,TRAIT_NOBREATH)
species_language_holder = /datum/language_holder/lizard/ash
diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
index 02ddf79f6bc4..91169299afba 100644
--- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
@@ -1,5 +1,5 @@
/datum/species/moth
- name = "\improper Mothman"
+ name = "\improper Mothperson"
id = SPECIES_MOTH
default_color = "00FF00"
species_traits = list(LIPS, NOEYESPRITES, TRAIT_ANTENNAE, HAIR, EMOTE_OVERLAY)
@@ -36,17 +36,6 @@
var/mob/living/carbon/human/H = C
handle_mutant_bodyparts(H)
-/datum/species/moth/random_name(gender,unique,lastname)
- if(unique)
- return random_unique_moth_name()
-
- var/randname = moth_name()
-
- if(lastname)
- randname += " [lastname]"
-
- return randname
-
/datum/species/handle_fire(mob/living/carbon/human/H, no_protection = FALSE)
. = ..()
if(.) //if the mob is immune to fire, don't burn wings off.
@@ -84,11 +73,6 @@
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
return ..()
-/datum/species/moth/check_species_weakness(obj/item/weapon, mob/living/attacker)
- if(istype(weapon, /obj/item/melee/flyswatter))
- return 9 //flyswatters deal 10x damage to moths
- return 0
-
/datum/species/space_move(mob/living/carbon/human/H)
. = ..()
if(H.loc && !isspaceturf(H.loc) && H.getorganslot(ORGAN_SLOT_WINGS) && !flying_species) //"flying_species" is exclusive to the potion of flight, which has its flying mechanics. If they want to fly they can use that instead
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index ec9afd777f2c..d3c900c56786 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -1,5 +1,5 @@
/datum/species/plasmaman
- name = "\improper Plasmaman"
+ name = "\improper Phorid"
id = SPECIES_PLASMAMAN
sexes = 0
meat = /obj/item/stack/sheet/mineral/plasma
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 6e4ae1cdb9a3..b613b8a0094e 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -190,7 +190,7 @@
return
if(isliving(AM))
var/mob/living/L = AM
- if(isethereal(AM))
+ if(iselzuose(AM))
AM.emp_act(EMP_LIGHT)
else if(iscyborg(AM))
diff --git a/code/modules/mob/living/carbon/human/species_types/spider.dm b/code/modules/mob/living/carbon/human/species_types/spider.dm
index 847d6ad74f3f..9c0f58dc8312 100644
--- a/code/modules/mob/living/carbon/human/species_types/spider.dm
+++ b/code/modules/mob/living/carbon/human/species_types/spider.dm
@@ -97,11 +97,6 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt"))
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
return ..()
-/datum/species/spider/check_species_weakness(obj/item/weapon, mob/living/attacker)
- if(istype(weapon, /obj/item/melee/flyswatter))
- return 9 //flyswatters deal 10x damage to spiders
- return 0
-
/mob/living/carbon/human/species/spider
race = /datum/species/spider
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index 070894a92bee..5caf871a7f23 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -53,11 +53,6 @@
C.adjust_fire_stacks(6)
C.IgniteMob()
-/datum/species/vampire/check_species_weakness(obj/item/weapon, mob/living/attacker)
- if(istype(weapon, /obj/item/nullrod/whip))
- return 1 //Whips deal 2x damage to vampires. Vampire killer.
- return 0
-
/obj/item/organ/tongue/vampire
name = "vampire tongue"
actions_types = list(/datum/action/item_action/organ_action/vampire)
diff --git a/code/modules/mob/living/carbon/human/species_types/vox.dm b/code/modules/mob/living/carbon/human/species_types/vox.dm
index fd03e184b9ba..b9cc8306762e 100644
--- a/code/modules/mob/living/carbon/human/species_types/vox.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vox.dm
@@ -67,14 +67,29 @@
/datum/species/vox/New()
. = ..()
+ // This is in new because "[HEAD_LAYER]" etc. is NOT a constant compile-time value. For some reason.
+ // Why not just use HEAD_LAYER? Well, because HEAD_LAYER is a number, and if you try to use numbers as indexes,
+ // BYOND will try to make it an ordered list. So, we have to use a string. This is annoying, but it's the only way to do it smoothly.
+ offset_clothing = list(
+ "[SUIT_STORE_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = 0),
+ "[EAST]" = list("x" = 8, "y" = 0),
+ "[SOUTH]" = list("x" = 8, "y" = 0),
+ "[WEST]" = list("x" = -8, "y" = 0)
+ ),
+ "[EARS_LAYER]" = list(
+ "[NORTH]" = list("x" = 8, "y" = 0),
+ "[EAST]" = list("x" = 8, "y" = 0),
+ "[SOUTH]" = list("x" = 8, "y" = 0),
+ "[WEST]" = list("x" = -8, "y" = 0)
+ ),
+ )
/datum/species/vox/random_name(gender,unique,lastname)
if(unique)
return random_unique_vox_name()
return vox_name()
-
-
/datum/species/vox/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
. = ..()
C.base_pixel_x -= 9
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 702adfb224a2..c90cbd0dbc8f 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -46,7 +46,7 @@
/datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount)
. = min(20, amount)
-/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE)
+/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, sharpness = FALSE)
. = ..()
if(.)
regen_cooldown = world.time + REGENERATION_DELAY
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 09445cef4c4e..beecda12b083 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1,5 +1,4 @@
#define RESOLVE_ICON_STATE(I) (I.mob_overlay_state || I.icon_state)
-#define CHECK_USE_AUTOGEN (handled_by_bodytype ? null : dna.species) //Is this gross overuse of macros? Yes. Fuck you.
///////////////////////
//UPDATE_ICONS SYSTEM//
@@ -111,9 +110,6 @@ There are several things that need to be remembered:
if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT))
return
- var/target_overlay = U.icon_state
- if(U.adjusted == ALT_STYLE)
- target_overlay = "[target_overlay]_d"
var/t_color = U.item_color
@@ -122,27 +118,50 @@ There are several things that need to be remembered:
if(U.adjusted == ALT_STYLE)
t_color = "[t_color]_d"
+ ///The final thing we overlay. Set on build_worn_icon.
var/mutable_appearance/uniform_overlay
- var/icon_file
- var/handled_by_bodytype = TRUE
+ ///icon file of the clothing
+ var/icon_file = U.mob_overlay_icon
+ ///The icon state to overlay
+ var/target_overlay = U.icon_state
+ if(U.adjusted == ALT_STYLE)
+ target_overlay = "[target_overlay]_d"
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
if(!uniform_overlay)
//Kapu's autistic attempt at digitigrade handling
//Hi Kapu
- if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && (U.supports_variations & DIGITIGRADE_VARIATION))
+ if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && ((U.supports_variations & DIGITIGRADE_VARIATION) || (U.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE)))
icon_file = DIGITIGRADE_PATH
+ if((U.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE))
+ icon_file = U.mob_overlay_icon
+ target_overlay = "[target_overlay]_digi"
+
+ else if(dna.species.bodytype & BODYTYPE_VOX)
+ if(U.supports_variations & VOX_VARIATION)
+ icon_file = VOX_UNIFORM_PATH
+ if(U.vox_override_icon)
+ icon_file = U.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(U.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_UNIFORM_PATH
+ if(U.kepoi_override_icon)
+ icon_file = U.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
- else if((dna.species.bodytype & BODYTYPE_VOX) && (U.supports_variations & VOX_VARIATION))
- icon_file = VOX_UNIFORM_PATH
-
- else if((dna.species.bodytype & BODYTYPE_KEPORI) && (U.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_UNIFORM_PATH
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(U))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = U.mob_overlay_icon || DEFAULT_UNIFORM_PATH
- uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = icon_file, isinhands = FALSE, override_file = icon_file, override_state = target_overlay, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, override_state = target_overlay, mob_species = use_autogen)
if(!uniform_overlay)
return
@@ -169,7 +188,8 @@ There are several things that need to be remembered:
var/handled_by_bodytype
//TODO: add an icon file for ID slot stuff, so it's less snowflakey
- id_overlay = I.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ id_overlay = I.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', mob_species = use_autogen)
if(!id_overlay)
return
@@ -199,25 +219,41 @@ There are several things that need to be remembered:
//Bloody hands end
- var/mutable_appearance/gloves_overlay
+
if(gloves)
var/obj/item/I = gloves
update_hud_gloves(I)
- var/handled_by_bodytype = TRUE
- var/icon_file
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/gloves_overlay
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_GLOVES_PATH
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
- if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_GLOVES_PATH
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_GLOVES_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_GLOVES_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_GLOVES_PATH
- gloves_overlay = I.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ gloves_overlay = I.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen)
if(!gloves_overlay)
return
@@ -239,18 +275,37 @@ There are several things that need to be remembered:
var/obj/item/I = glasses
update_hud_glasses(I)
if(!(head?.flags_inv & HIDEEYES) && !(wear_mask?.flags_inv & HIDEEYES))
+ ///The final thing we overlay. Set on build_worn_icon.
var/mutable_appearance/glasses_overlay
- var/handled_by_bodytype = TRUE
- var/icon_file
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_GLASSES_PATH
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
+
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_GLASSES_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_GLASSES_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_GLASSES_PATH
- glasses_overlay = I.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ glasses_overlay = I.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen)
if(!glasses_overlay)
return
@@ -270,20 +325,38 @@ There are several things that need to be remembered:
if(ears)
var/obj/item/I = ears
- var/mutable_appearance/ears_overlay
update_hud_ears(I)
- var/handled_by_bodytype = TRUE
- var/icon_file
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/ears_overlay
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_EARS_PATH
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_EARS_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_EARS_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_EARS_PATH
- ears_overlay = I.build_worn_icon(default_layer = EARS_LAYER, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ ears_overlay = I.build_worn_icon(default_layer = EARS_LAYER, override_file = icon_file, mob_species = use_autogen)
if(!ears_overlay)
return
@@ -303,27 +376,48 @@ There are several things that need to be remembered:
if(shoes)
var/obj/item/I = shoes
- var/mutable_appearance/shoes_overlay
- var/icon_file
update_hud_shoes(I)
- var/handled_by_bodytype = TRUE
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/shoes_overlay
+
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
+ ///The icon state to overlay
+ var/target_overlay = I.icon_state
+
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
- if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && (I.supports_variations & DIGITIGRADE_VARIATION))
+ if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && ((I.supports_variations & DIGITIGRADE_VARIATION) || (I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE)))
var/obj/item/bodypart/leg = src.get_bodypart(BODY_ZONE_L_LEG)
if(leg.bodytype & BODYTYPE_DIGITIGRADE && !leg.plantigrade_forced)
icon_file = DIGITIGRADE_SHOES_PATH
+ if((I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE))
+ icon_file = I.mob_overlay_icon
+ target_overlay = "[target_overlay]_digi"
+
+ else if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_SHOES_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
- if((I.supports_variations & VOX_VARIATION) && (dna.species.bodytype & BODYTYPE_VOX))
- icon_file = VOX_SHOES_PATH
-
- if((I.supports_variations & KEPORI_VARIATION) && (dna.species.bodytype & BODYTYPE_KEPORI))
- icon_file = KEPORI_SHOES_PATH
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_SHOES_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_SHOES_PATH
- shoes_overlay = I.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = icon_file, isinhands = FALSE, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ shoes_overlay = I.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay)
if(!shoes_overlay)
return
@@ -346,8 +440,7 @@ There are several things that need to be remembered:
var/t_state = I.item_state
if(!t_state)
t_state = I.icon_state
-
- s_store_overlay = mutable_appearance('icons/mob/clothing/belt_mirror.dmi', t_state, -SUIT_STORE_LAYER)
+ s_store_overlay = I.build_worn_icon(default_layer = -SUIT_STORE_LAYER, default_icon_file = 'icons/mob/clothing/belt_mirror.dmi', override_state = t_state)
if(!s_store_overlay)
return
@@ -360,25 +453,46 @@ There are several things that need to be remembered:
if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BACK) + 1])
var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1]
inv.update_appearance()
-
if(head)
var/obj/item/I = head
- var/mutable_appearance/head_overlay
update_hud_head(I)
- var/handled_by_bodytype = TRUE
- var/icon_file
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/head_overlay
+
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
+ ///The icon state to overlay
+ var/target_overlay = I.icon_state
- if((I.supports_variations & VOX_VARIATION) && (dna.species.bodytype & BODYTYPE_VOX))
- icon_file = VOX_HEAD_PATH
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
- if((I.supports_variations & KEPORI_VARIATION) && (dna.species.bodytype & BODYTYPE_KEPORI))
- icon_file = KEPORI_HEAD_PATH
+ var/obj/item/bodypart/head_bodypart = src.get_bodypart(BODY_ZONE_HEAD)
+ if((head_bodypart.bodytype & BODYTYPE_SNOUT) && (I.supports_variations & SNOUTED_VARIATION))
+ target_overlay = "[target_overlay]_snouted"
+
+ else if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_HEAD_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_HEAD_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_HEAD_PATH
- head_overlay = I.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = icon_file, isinhands = FALSE, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ head_overlay = I.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay)
if(!head_overlay)
return
@@ -396,22 +510,39 @@ There are several things that need to be remembered:
if(belt)
var/obj/item/I = belt
- var/mutable_appearance/belt_overlay
update_hud_belt(I)
- var/handled_by_bodytype
- var/icon_file
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/belt_overlay
+
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
- if((I.supports_variations & VOX_VARIATION) && (dna.species.bodytype & BODYTYPE_VOX))
- icon_file = VOX_BELT_PATH
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
- //if((I.supports_variations & KEPORI_VARIATION) && (dna.species.bodytype & BODYTYPE_KEPORI))
- //icon_file = KEPORI_BELT_PATH
+
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_BELT_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_BELT_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_BELT_PATH
- belt_overlay = I.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ belt_overlay = I.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen)
if(!belt_overlay)
return
@@ -430,26 +561,46 @@ There are several things that need to be remembered:
if(wear_suit)
var/obj/item/I = wear_suit
- var/mutable_appearance/suit_overlay
update_hud_wear_suit(I)
- var/icon_file
-
- var/handled_by_bodytype = TRUE
- if(dna.species.bodytype & BODYTYPE_DIGITIGRADE)
- if(I.supports_variations & DIGITIGRADE_VARIATION)
- icon_file = DIGITIGRADE_SUIT_PATH
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/suit_overlay
- else if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_SUIT_PATH
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
+ ///The icon state to overlay
+ var/target_overlay = I.icon_state
+
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
+ if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && ((I.supports_variations & DIGITIGRADE_VARIATION) || (I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE)))
+ icon_file = DIGITIGRADE_SUIT_PATH
+ if((I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE))
+ icon_file = I.mob_overlay_icon
+ target_overlay = "[target_overlay]_digi"
+
+ else if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_SUIT_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
- else if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_SUIT_PATH
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_SUIT_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = I.mob_overlay_icon
- suit_overlay = wear_suit.build_worn_icon(default_layer = SUIT_LAYER, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ suit_overlay = wear_suit.build_worn_icon(default_layer = SUIT_LAYER, override_file = icon_file, mob_species = use_autogen, override_state = target_overlay)
if(!suit_overlay)
return
@@ -495,22 +646,44 @@ There are several things that need to be remembered:
if(wear_mask)
var/obj/item/I = wear_mask
update_hud_wear_mask(I)
+ ///The final thing we overlay. Set on build_worn_icon.
var/mutable_appearance/mask_overlay
- var/icon_file
- var/handled_by_bodytype = TRUE
- if(!(ITEM_SLOT_MASK in check_obscured_slots()))
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_MASK_PATH
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
+ ///The icon state to overlay
+ var/target_overlay = I.icon_state
- if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION))
- icon_file = KEPORI_MASK_PATH
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
+ if(!(ITEM_SLOT_MASK in check_obscured_slots()))
+ var/obj/item/bodypart/head_bodypart = src.get_bodypart(BODY_ZONE_HEAD)
+ if((head_bodypart.bodytype & BODYTYPE_SNOUT) && (I.supports_variations & SNOUTED_VARIATION))
+ target_overlay = "[target_overlay]_snouted"
+
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_MASK_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_MASK_PATH
+ if(I.kepoi_override_icon)
+ icon_file = I.kepoi_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
icon_file = DEFAULT_MASK_PATH
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
- mask_overlay = I.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ mask_overlay = I.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen, override_state = target_overlay)
if(!mask_overlay)
return
@@ -528,17 +701,48 @@ There are several things that need to be remembered:
if(wear_neck)
var/obj/item/I = wear_neck
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/neck_overlay
+
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
+ ///The icon state to overlay
+ var/target_overlay = I.icon_state
+
+ /// Does this clothing need to be generated via greyscale?
+ var/handled_by_bodytype = FALSE
+
+
update_hud_neck(I)
if(!(ITEM_SLOT_NECK in check_obscured_slots()))
- var/icon_file
- var/handled_by_bodytype = TRUE
+
+ if(dna.species.bodytype & BODYTYPE_VOX) // there is neither a vox or kepori neck path, we just tell it to greyscale no matter what
+// if(I.supports_variations & VOX_VARIATION)
+// icon_file = VOX_NECK_PATH
+// if(I.vox_override_icon)
+// icon_file = I.vox_override_icon
+// else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+// if(I.supports_variations & KEPORI_VARIATION)
+// icon_file = KEPORI_NECK_PATH
+// if(I.kepoi_override_icon)
+// icon_file = I.kepoi_override_icon
+// else
+ handled_by_bodytype = TRUE
if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I))))
- handled_by_bodytype = FALSE
+ handled_by_bodytype = TRUE
icon_file = DEFAULT_NECK_PATH
- overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ neck_overlay = I.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay)
+
+ if(!neck_overlay)
+ return
+ overlays_standing[NECK_LAYER] = neck_overlay
apply_overlay(NECK_LAYER)
@@ -551,23 +755,42 @@ There are several things that need to be remembered:
if(back)
var/obj/item/I = back
- var/mutable_appearance/back_overlay
update_hud_back(I)
- var/icon_file
- var/handled_by_bodytype = TRUE
- if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION))
- icon_file = VOX_BACK_PATH
+ ///The final thing we overlay. Set on build_worn_icon.
+ var/mutable_appearance/back_overlay
- if(!icon_exists(icon_file, RESOLVE_ICON_STATE(I)))
- icon_file = DEFAULT_BACK_PATH
- handled_by_bodytype = FALSE
+ ///icon file of the clothing
+ var/icon_file = I.mob_overlay_icon
- back_overlay = I.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, isinhands = FALSE, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN)
+ /// Does this clothing need to be generated via greyscale
+ var/handled_by_bodytype = FALSE
if(!back_overlay)
- return
- overlays_standing[BACK_LAYER] = back_overlay
- apply_overlay(BACK_LAYER)
+ if(dna.species.bodytype & BODYTYPE_VOX)
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_BACK_PATH
+ else
+ handled_by_bodytype = TRUE
+
+ else if(dna.species.bodytype & BODYTYPE_KEPORI)
+// if(I.supports_variations & KEPORI_VARIATION)
+// icon_file = KEPORI_BACK_PATH
+// else
+ handled_by_bodytype = TRUE
+
+ if(!icon_exists(icon_file, RESOLVE_ICON_STATE(I)))
+ icon_file = DEFAULT_BACK_PATH
+ handled_by_bodytype = TRUE
+
+ var/use_autogen = handled_by_bodytype ? dna.species : null
+ back_overlay = I.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, mob_species = use_autogen)
+
+ if(!back_overlay)
+ return
+ overlays_standing[BACK_LAYER] = back_overlay
+
+ if(back_overlay) //This is faster fuck you
+ apply_overlay(BACK_LAYER)
/mob/living/carbon/human/update_inv_legcuffed()
remove_overlay(LEGCUFF_LAYER)
@@ -708,6 +931,7 @@ in this situation default_icon_file is expected to match either the lefthand_ or
^this female part sucks and will be fully ripped out ideally
*/
+// Note: if handled_by_bodytype is TRUE before calling this, it makes species use greyscale
/obj/item/proc/build_worn_icon(default_layer = 0, default_icon_file = null, isinhands = FALSE, override_state = null, override_file = null, datum/species/mob_species = null, direction = null)
// WS Edit Start - Worn Icon State
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index 1f730de799d0..8fd4e89566c7 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -296,7 +296,7 @@
return IsStandingStill()
/mob/living/carbon/monkey/proc/pickpocket(mob/M)
- if(do_mob(src, M, MONKEY_ITEM_SNATCH_DELAY) && pickupTarget)
+ if(do_after(src, MONKEY_ITEM_SNATCH_DELAY, M) && pickupTarget)
for(var/obj/item/I in M.held_items)
if(I == pickupTarget)
M.visible_message("[src] snatches [pickupTarget] from [M].", "[src] snatched [pickupTarget]!")
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 76daa5ba21d4..430d02f7f1ea 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -11,10 +11,12 @@
* * blocked - armor value applied
* * forced - bypass hit percentage
* * spread_damage - used in overrides
+ * * break_modifier - increases bone breaking chance
+ * * sharpness - used for bleeding
*
* Returns TRUE if damage applied
*/
-/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1)//WS Edit - Breakable Bones
+/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1, sharpness = FALSE)//WS Edit - Breakable Bones
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
var/hit_percent = (100-blocked)/100
if(!damage || (!forced && hit_percent <= 0) || !(flags_1 & INITIALIZED_1))
diff --git a/code/modules/mob/living/inhand_holder.dm b/code/modules/mob/living/inhand_holder.dm
index e16dcf9e3326..f593a269cbd6 100644
--- a/code/modules/mob/living/inhand_holder.dm
+++ b/code/modules/mob/living/inhand_holder.dm
@@ -7,7 +7,8 @@
icon_state = ""
slot_flags = NONE
moth_edible = FALSE
- w_class = 20 // so that only one can fit in a duffel bag
+ w_class = WEIGHT_CLASS_BULKY
+ w_volume = ITEM_VOLUME_MOB// so that only one can fit in a duffel bag
var/mob/living/held_mob
/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/M, worn_state, head_icon, lh_icon, rh_icon, worn_slot_flags = NONE)
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 47fc5bd82ecb..a25025294497 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -38,6 +38,8 @@
if (QDELETED(src)) // diseases can qdel the mob via transformations
return
+ SEND_SIGNAL(src, COMSIG_MOB_LIFE)
+
if(stat != DEAD)
//Random events (vomiting etc)
handle_random_events()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index b240836b55e7..5c499fe21029 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -507,7 +507,7 @@
/mob/living/proc/get_up(instant = FALSE)
set waitfor = FALSE
- if(!instant && !do_mob(src, src, 2 SECONDS, uninterruptible = TRUE, extra_checks = CALLBACK(src, TYPE_PROC_REF(/mob/living, rest_checks_callback))))
+ if(!instant && !do_after(src, 1 SECONDS, src, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM), extra_checks = CALLBACK(src, TYPE_PROC_REF(/mob/living, rest_checks_callback)), interaction_key = DOAFTER_SOURCE_GETTING_UP))
return
if(resting || body_position == STANDING_UP || HAS_TRAIT(src, TRAIT_FLOORED))
return
@@ -820,7 +820,7 @@
TH.transfer_mob_blood_dna(src)
/mob/living/carbon/human/makeTrail(turf/T)
- if((NOBLOOD in dna.species.species_traits) || !bleed_rate || bleedsuppress)
+ if((NOBLOOD in dna.species.species_traits) || bleedsuppress || !LAZYLEN(get_bleeding_parts(TRUE)))
return
..()
@@ -977,7 +977,7 @@
"[src] tries to remove your [what.name].", null, null, src)
to_chat(src, "You try to remove [who]'s [what.name]...")
what.add_fingerprint(src)
- if(do_mob(src, who, what.strip_delay))
+ if(do_after(src, what.strip_delay, who, interaction_key = what))
if(what && Adjacent(who))
if(islist(where))
var/list/L = where
@@ -1024,7 +1024,7 @@
who.visible_message("[src] tries to put [what] on [who].", \
"[src] tries to put [what] on you.", null, null, src)
to_chat(src, "You try to put [what] on [who]...")
- if(do_mob(src, who, what.equip_delay_other))
+ if(do_after(src, what.equip_delay_other, who))
if(what && Adjacent(who) && what.mob_can_equip(who, src, final_where, TRUE, TRUE))
if(temporarilyRemoveItemFromInventory(what))
if(where_list)
@@ -1144,15 +1144,6 @@
devilInfo.remove_soul(mind)
mind.soulOwner = mind
-/mob/living/proc/has_bane(banetype)
- var/datum/antagonist/devil/devilInfo = is_devil(src)
- return devilInfo && banetype == devilInfo.bane
-
-/mob/living/proc/check_weakness(obj/item/weapon, mob/living/attacker)
- if(mind && mind.has_antag_datum(/datum/antagonist/devil))
- return check_devil_bane_multiplier(weapon, attacker)
- return 1 //This is not a boolean, it's the multiplier for the damage the weapon does.
-
/mob/living/proc/check_acedia()
if(mind && mind.has_objective(/datum/objective/sintouched/acedia))
return TRUE
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 86c85d27360a..2ed00efe2e4b 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -54,7 +54,7 @@
var/armor = run_armor_check(def_zone, P.flag, P.armour_penetration, silent = TRUE)
var/on_hit_state = P.on_hit(src, armor, piercing_hit)
if(!P.nodamage && on_hit_state != BULLET_ACT_BLOCK && !QDELETED(src)) //QDELETED literally just for the instagib rifle. Yeah.
- apply_damage(P.damage, P.damage_type, def_zone, armor)
+ apply_damage(P.damage, P.damage_type, def_zone, armor, sharpness = TRUE)
recoil_camera(src, clamp((P.damage-armor)/4,0.5,10), clamp((P.damage-armor)/4,0.5,10), P.damage/8, P.Angle)
apply_effects(P.stun, P.knockdown, P.unconscious, P.irradiate, P.slur, P.stutter, P.eyeblur, P.drowsy, armor, P.stamina, P.jitter, P.paralyze, P.immobilize)
if(P.dismemberment)
@@ -101,6 +101,9 @@
return 1
else
playsound(loc, 'sound/weapons/genhit.ogg', 50, TRUE, -1) //Item sounds are handled in the item itself
+
+ if(body_position == LYING_DOWN) // physics says it's significantly harder to push someone by constantly chucking random furniture at them if they are down on the floor.
+ hitpush = FALSE
..()
@@ -179,7 +182,7 @@
log_combat(user, src, "attempted to neck grab", addition="neck grab")
if(GRAB_NECK)
log_combat(user, src, "attempted to strangle", addition="kill grab")
- if(!do_mob(user, src, grab_upgrade_time))
+ if(!do_after(user, grab_upgrade_time, src))
return 0
if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state)
return 0
@@ -404,15 +407,13 @@
if(client)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, src, cultoverride = TRUE)
else
- switch(rand(1, 4))
+ switch(rand(1, 3))
if(1)
new /mob/living/simple_animal/hostile/construct/juggernaut/hostile(get_turf(src))
if(2)
new /mob/living/simple_animal/hostile/construct/wraith/hostile(get_turf(src))
if(3)
new /mob/living/simple_animal/hostile/construct/artificer/hostile(get_turf(src))
- if(4)
- new /mob/living/simple_animal/hostile/construct/proteon/hostile(get_turf(src))
spawn_dust()
gib()
return TRUE
diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm
index eeb3948e627c..1e40ddf76704 100644
--- a/code/modules/mob/living/living_say.dm
+++ b/code/modules/mob/living/living_say.dm
@@ -16,6 +16,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
RADIO_KEY_SOLGOV = RADIO_CHANNEL_SOLGOV, //WS Edit - SolGov Rep
RADIO_KEY_NANOTRASEN = RADIO_CHANNEL_NANOTRASEN,
RADIO_KEY_MINUTEMEN = RADIO_CHANNEL_MINUTEMEN,
+ RADIO_KEY_PGF = RADIO_CHANNEL_PGF,
RADIO_KEY_INTEQ = RADIO_CHANNEL_INTEQ,
RADIO_KEY_PIRATE = RADIO_CHANNEL_PIRATE,
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index d59e3f77781e..62098a940937 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -18,7 +18,7 @@
var/virtual_z = virtual_z()
- LAZYADDASSOC(SSmobs.players_by_virtual_z, "[virtual_z]", src)
+ LAZYADDASSOCLIST(SSmobs.players_by_virtual_z, "[virtual_z]", src)
SSidlenpcpool.try_wakeup_virtual_z(virtual_z)
//Vents
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index daa987904737..cfd7d9153c8d 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -1063,3 +1063,4 @@
ghostize(1)
QDEL_NULL(src)
+
diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm
index a6d86d1507ba..80c643e0ceef 100644
--- a/code/modules/mob/living/silicon/damage_procs.dm
+++ b/code/modules/mob/living/silicon/damage_procs.dm
@@ -1,5 +1,5 @@
-/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, break_modifier = 1)
+/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, break_modifier = 1, sharpness = FALSE)
var/hit_percent = (100-blocked)/100
if((!damage || (!forced && hit_percent <= 0)))
return 0
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 1f574f08a450..9f3b85fd4a92 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -74,7 +74,7 @@
var/emitterregen = 0.25
var/emittercd = 50
var/emitteroverloadcd = 100
- var/emittersemicd = FALSE
+ var/emittercurrent_cooldown = FALSE
var/overload_ventcrawl = 0
var/overload_bulletblock = 0 //Why is this a good idea?
@@ -125,7 +125,7 @@
. = ..()
- emittersemicd = TRUE
+ emittercurrent_cooldown = TRUE
addtimer(CALLBACK(src, PROC_REF(emittercool)), 600)
if(!holoform)
diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm
index 31a807b319b2..8d50f4a389f4 100644
--- a/code/modules/mob/living/silicon/pai/pai_shell.dm
+++ b/code/modules/mob/living/silicon/pai/pai_shell.dm
@@ -12,11 +12,11 @@
. = fold_in(force)
return
- if(emittersemicd)
+ if(emittercurrent_cooldown)
to_chat(src, "Error: Holochassis emitters recycling. Please try again later.")
return FALSE
- emittersemicd = TRUE
+ emittercurrent_cooldown = TRUE
addtimer(CALLBACK(src, PROC_REF(emittercool)), emittercd)
REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, PAI_FOLDED)
REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, PAI_FOLDED)
@@ -42,10 +42,10 @@
holoform = TRUE
/mob/living/silicon/pai/proc/emittercool()
- emittersemicd = FALSE
+ emittercurrent_cooldown = FALSE
/mob/living/silicon/pai/proc/fold_in(force = FALSE)
- emittersemicd = TRUE
+ emittercurrent_cooldown = TRUE
if(!force)
addtimer(CALLBACK(src, PROC_REF(emittercool)), emittercd)
else
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index d15c20f1aa1d..980f12897e70 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -280,7 +280,7 @@
/mob/living/simple_animal/bot/floorbot/proc/is_hull_breach(turf/t) //Ignore space tiles not considered part of a structure, also ignores shuttle docking areas.
var/area/t_area = get_area(t)
- if(istype(t_area, /area/space) || istype(t_area, /area/solar) || istype(t_area, /area/asteroid))
+ if(istype(t_area, /area/space) || istype(t_area, /area/asteroid))
return FALSE
else
return TRUE
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 3a07ffc4cb8d..22d68c8a6190 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -488,6 +488,9 @@
return TRUE
/mob/living/simple_animal/bot/medbot/attack_hand(mob/living/carbon/human/H)
+ if(DOING_INTERACTION_WITH_TARGET(H, src))
+ to_chat(H, "You're already interacting with [src].")
+ return
if(H.a_intent == INTENT_DISARM && mode != BOT_TIPPED)
H.visible_message("[H] begins tipping over [src].", "You begin tipping over [src]...")
@@ -574,7 +577,7 @@
C.visible_message("[src] is trying to tend the wounds of [patient]!", \
"[src] is trying to tend your wounds!")
- if(do_mob(src, patient, 20)) //Slightly faster than default tend wounds, but does less HPS
+ if(do_after(src, 2 SECONDS, patient)) //Slightly faster than default tend wounds, but does less HPS
if((get_dist(src, patient) <= 1) && (on) && assess_patient(patient))
var/healies = heal_amount
var/obj/item/storage/firstaid/FA = firstaid
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index af33ef493167..df2508c5f4a0 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -40,7 +40,6 @@
var/fair_market_price_arrest = 25 // On arrest, charges the violator this much. If they don't have that much in their account, the securitron will beat them instead
var/fair_market_price_detain = 5 // Charged each time the violator is stunned on detain
var/weapon_force = 20 // Only used for NAP violation beatdowns on non-grievous securitrons
- var/market_verb = "Suspect"
var/payment_department = ACCOUNT_SEC
/mob/living/simple_animal/bot/secbot/beepsky
@@ -237,10 +236,7 @@ Auto Patrol: []"},
if(iscarbon(A))
var/mob/living/carbon/C = A
if(!C.IsParalyzed() || arrest_type)
- if(!check_nap_violations())
- stun_attack(A, TRUE)
- else
- stun_attack(A)
+ stun_attack(A)
else if(C.canBeHandcuffed() && !C.handcuffed)
cuff(A)
else
@@ -320,10 +316,7 @@ Auto Patrol: []"},
if(target) // make sure target exists
if(Adjacent(target) && isturf(target.loc)) // if right next to perp
- if(!check_nap_violations())
- stun_attack(target, TRUE)
- else
- stun_attack(target)
+ stun_attack(target)
mode = BOT_PREP_ARREST
set_anchored(TRUE)
@@ -367,9 +360,6 @@ Auto Patrol: []"},
return
if(target.handcuffed) //no target or target cuffed? back to idle.
- if(!check_nap_violations())
- stun_attack(target, TRUE)
- return
back_to_idle()
return
@@ -497,38 +487,3 @@ Auto Patrol: []"},
/obj/machinery/bot_core/secbot
req_access = list(ACCESS_SECURITY)
-
-/// Returns false if the current target is unable to pay the fair_market_price for being arrested/detained
-/mob/living/simple_animal/bot/secbot/proc/check_nap_violations()
- if(!SSeconomy.full_ancap)
- return TRUE
-
- if(target)
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- var/obj/item/card/id/I = H.get_idcard(TRUE)
- if(I)
- var/datum/bank_account/insurance = I.registered_account
- if(!insurance)
- say("[market_verb] NAP Violation: No bank account found.")
- nap_violation(target)
- return FALSE
- else
- var/fair_market_price = (arrest_type ? fair_market_price_detain : fair_market_price_arrest)
- if(!insurance.adjust_money(-fair_market_price))
- say("[market_verb] NAP Violation: Unable to pay.")
- nap_violation(target)
- return FALSE
- var/datum/bank_account/D = SSeconomy.get_dep_account(payment_department)
- say("Thank you for your compliance. Your account been charged [fair_market_price] credits.")
- if(D)
- D.adjust_money(fair_market_price)
- else
- say("[market_verb] NAP Violation: No ID card found.")
- nap_violation(target)
- return FALSE
- return TRUE
-
-/// Does nothing
-/mob/living/simple_animal/bot/secbot/proc/nap_violation(mob/violator)
- return
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index aa49c6e52b59..1b8004cbd5b5 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -47,14 +47,14 @@
id = /obj/item/card/id/syndicate
/obj/effect/mob_spawn/human/corpse/syndicateramzi
- name = "Ramzi's Clique Commando"
+ name = "Ramzi Clique Commando"
id_job = "Cutthroat"
hairstyle = "Bald"
facial_hairstyle = "Shaved"
outfit = /datum/outfit/syndicateramzicorpse
/datum/outfit/syndicateramzicorpse
- name = "Ramzi's Clique Commando Corpse"
+ name = "Ramzi Clique Commando Corpse"
uniform = /obj/item/clothing/under/syndicate/gorlex
suit = /obj/item/clothing/suit/space/hardsuit/syndi/ramzi
shoes = /obj/item/clothing/shoes/combat
@@ -125,7 +125,7 @@
/datum/outfit/frontier
name = "Frontiersman Corpse"
- uniform = /obj/item/clothing/under/rank/security/officer/frontier
+ uniform = /obj/item/clothing/under/frontiersmen
shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/beret/sec/frontier
gloves = /obj/item/clothing/gloves/color/black
@@ -151,11 +151,11 @@
/datum/outfit/frontier/officer
name = "Frontiersman Officer Corpse"
- uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
+ uniform = /obj/item/clothing/under/frontiersmen/officer
suit = /obj/item/clothing/suit/armor/frontier
shoes = /obj/item/clothing/shoes/combat
ears = /obj/item/radio/headset
- head = /obj/item/clothing/head/caphat/frontier
+ head = /obj/item/clothing/head/frontier/peaked
/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy
outfit = /datum/outfit/frontier/trooper/heavy
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
index 8aeb3b64a8cd..104d4363bc3b 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
@@ -79,7 +79,7 @@
to_chat(user, "You can't seem to find the [pick(faux_gadgets)]! Without it, [src] [pick(faux_problems)].")
return
user.visible_message("[user] begins to reactivate [src].", "You begin to reactivate [src]...")
- if(do_after(user, 30, 1, target = src))
+ if(do_after(user, 30, target = src))
revive(full_heal = TRUE, admin_revive = FALSE)
user.visible_message("[user] reactivates [src]!", "You reactivate [src].")
alert_drones(DRONE_NET_CONNECT)
diff --git a/code/modules/mob/living/simple_animal/friendly/mothroach.dm b/code/modules/mob/living/simple_animal/friendly/mothroach.dm
index 2002ef3b5d8d..881e64d2a70f 100644
--- a/code/modules/mob/living/simple_animal/friendly/mothroach.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mothroach.dm
@@ -64,8 +64,3 @@
qdel(I) // this sucks
else
return ..()
-
-/mob/living/simple_animal/pet/mothroach/check_weakness(obj/item/weapon, mob/living/attacker)
- if(istype(weapon, /obj/item/melee/flyswatter))
- return 9 // flyswatters deal 10x damage to mothroaches
- return 0
diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm
index 00344f48da59..57f1b1892f9d 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/support.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm
@@ -93,7 +93,7 @@
name = "bluespace receiving pad"
icon = 'icons/turf/floors.dmi'
desc = "A receiving zone for bluespace teleportations."
- icon_state = "light_on-w"
+ icon_state = "light_on_flicker-1"
light_range = MINIMUM_USEFUL_LIGHT_RANGE
density = FALSE
anchored = TRUE
@@ -134,7 +134,7 @@
"You start to faintly glow, and you feel strangely weightless!")
do_attack_animation(A)
- if(!do_mob(src, A, 60)) //now start the channel
+ if(!do_after(src, 6 SECONDS, A)) //now start the channel
to_chat(src, "You need to hold still!")
return
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
deleted file mode 100644
index 57d6f2fc325f..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
+++ /dev/null
@@ -1,171 +0,0 @@
-//Paper Wizard Boss
-/mob/living/simple_animal/hostile/boss/paper_wizard
- name = "Mjor the Creative"
- desc = "A wizard with a taste for the arts."
- mob_biotypes = MOB_HUMANOID
- boss_abilities = list(/datum/action/boss/wizard_summon_minions, /datum/action/boss/wizard_mimic)
- faction = list("hostile","stickman")
- del_on_death = TRUE
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "paperwizard"
- ranged = 1
- environment_smash = ENVIRONMENT_SMASH_NONE
- minimum_distance = 3
- retreat_distance = 3
- obj_damage = 0
- melee_damage_lower = 10
- melee_damage_upper = 20
- health = 1000
- maxHealth = 1000
- loot = list(/obj/effect/temp_visual/paperwiz_dying)
- projectiletype = /obj/projectile/temp
- projectilesound = 'sound/weapons/emitter.ogg'
- attack_sound = 'sound/hallucinations/growl1.ogg'
- var/list/copies = list()
-
- footstep_type = FOOTSTEP_MOB_SHOE
-
-
-//Summon Ability
-//Lets the wizard summon his art to fight for him
-/datum/action/boss/wizard_summon_minions
- name = "Summon Minions"
- icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "art_summon"
- usage_probability = 40
- boss_cost = 30
- boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard
- needs_target = FALSE
- say_when_triggered = "Rise, my creations! Jump off your pages and into this realm!"
- var/static/summoned_minions = 0
-
-/datum/action/boss/wizard_summon_minions/Trigger()
- if(summoned_minions <= 6 && ..())
- var/list/minions = list(
- /mob/living/simple_animal/hostile/stickman,
- /mob/living/simple_animal/hostile/stickman/ranged,
- /mob/living/simple_animal/hostile/stickman/dog)
- var/list/directions = GLOB.cardinals.Copy()
- for(var/i in 1 to 3)
- var/minions_chosen = pick_n_take(minions)
- new minions_chosen (get_step(boss,pick_n_take(directions)), 1)
- summoned_minions += 3;
-
-
-//Mimic Ability
-//Summons mimics of himself with magical papercraft
-//Hitting a decoy hurts nearby people excluding the wizard himself
-//Hitting the wizard himself destroys all decoys
-/datum/action/boss/wizard_mimic
- name = "Craft Mimicry"
- icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "mimic_summon"
- usage_probability = 30
- boss_cost = 40
- boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard
- say_when_triggered = ""
-
-/datum/action/boss/wizard_mimic/Trigger()
- if(..())
- var/mob/living/target
- if(!boss.client) //AI's target
- target = boss.target
- else //random mob
- var/list/threats = boss.PossibleThreats()
- if(threats.len)
- target = pick(threats)
- if(target)
- var/mob/living/simple_animal/hostile/boss/paper_wizard/wiz = boss
- var/directions = GLOB.cardinals.Copy()
- for(var/i in 1 to 3)
- var/mob/living/simple_animal/hostile/boss/paper_wizard/copy/C = new (get_step(target,pick_n_take(directions)))
- wiz.copies += C
- C.original = wiz
- C.say("My craft defines me, you could even say it IS me!")
- wiz.say("My craft defines me, you could even say it IS me!")
- wiz.forceMove(get_step(target,pick_n_take(directions)))
- wiz.minimum_distance = 1 //so he doesn't run away and ruin everything
- wiz.retreat_distance = 0
- else
- boss.atb.refund(boss_cost)
-
-/mob/living/simple_animal/hostile/boss/paper_wizard/copy
- desc = "'Tis a ruse!"
- health = 1
- maxHealth = 1
- alpha = 200
- boss_abilities = list()
- melee_damage_lower = 1
- melee_damage_upper = 5
- minimum_distance = 0
- retreat_distance = 0
- ranged = 0
- loot = list()
- var/mob/living/simple_animal/hostile/boss/paper_wizard/original
-
-//Hit a fake? eat pain!
-/mob/living/simple_animal/hostile/boss/paper_wizard/copy/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- if(amount > 0) //damage
- if(original)
- original.minimum_distance = 3
- original.retreat_distance = 3
- original.copies -= src
- for(var/c in original.copies)
- qdel(c)
- for(var/mob/living/L in range(5,src))
- if(L == original || istype(L, type))
- continue
- L.adjustBruteLoss(50)
- qdel(src)
- else
- . = ..()
-
-//Hit the real guy? copies go bai-bai
-/mob/living/simple_animal/hostile/boss/paper_wizard/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = ..()
- if(. > 0)//damage
- minimum_distance = 3
- retreat_distance = 3
- for(var/copy in copies)
- qdel(copy)
-
-/mob/living/simple_animal/hostile/boss/paper_wizard/copy/examine(mob/user)
- . = ..()
- qdel(src) //I see through your ruse!
-
-//fancy effects
-/obj/effect/temp_visual/paper_scatter
- name = "scattering paper"
- desc = "Pieces of paper scattering to the wind."
- layer = ABOVE_OPEN_TURF_LAYER
- icon = 'icons/effects/effects.dmi'
- icon_state = "paper_scatter"
- anchored = TRUE
- duration = 5
- randomdir = FALSE
-
-/obj/effect/temp_visual/paperwiz_dying
- name = "craft portal"
- desc = "A wormhole sucking the wizard into the void. Neat."
- layer = ABOVE_OPEN_TURF_LAYER
- icon = 'icons/effects/effects.dmi'
- icon_state = "paperwiz_poof"
- anchored = TRUE
- duration = 18
- randomdir = FALSE
-
-/obj/effect/temp_visual/paperwiz_dying/Initialize()
- . = ..()
- visible_message("The wizard cries out in pain as a gate appears behind him, sucking him in!")
- playsound(get_turf(src),'sound/magic/mandswap.ogg', 50, TRUE, TRUE)
- playsound(get_turf(src),'sound/hallucinations/wail.ogg', 50, TRUE, TRUE)
-
-/obj/effect/temp_visual/paperwiz_dying/Destroy()
- for(var/mob/M in range(7,src))
- shake_camera(M, 7, 1)
- var/turf/T = get_turf(src)
- playsound(T,'sound/magic/summon_magic.ogg', 50, TRUE, TRUE)
- new /obj/effect/temp_visual/paper_scatter(T)
- new /obj/item/clothing/suit/wizrobe/paper(T)
- new /obj/item/clothing/head/collectable/paper(T)
- return ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm
deleted file mode 100644
index 5c3e60c8377b..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm
+++ /dev/null
@@ -1,41 +0,0 @@
-/mob/living/simple_animal/hostile/dark_wizard
- name = "Dark Wizard"
- desc = "Killing amateurs since the dawn of times."
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "dark_wizard"
- icon_living = "dark_wizard"
- move_to_delay = 10
- projectiletype = /obj/projectile/temp/earth_bolt
- projectilesound = 'sound/magic/ethereal_enter.ogg'
- ranged = TRUE
- ranged_message = "earth bolts"
- ranged_cooldown_time = 20
- maxHealth = 50
- health = 50
- harm_intent_damage = 5
- obj_damage = 20
- melee_damage_lower = 5
- melee_damage_upper = 5
- attack_verb_continuous = "staves"
- a_intent = INTENT_HARM
- speak_emote = list("chants")
- attack_sound = 'sound/weapons/bladeslice.ogg'
- aggro_vision_range = 9
- turns_per_move = 5
- gold_core_spawnable = HOSTILE_SPAWN
- faction = list(ROLE_WIZARD)
- footstep_type = FOOTSTEP_MOB_SHOE
- weather_immunities = list("lava","ash")
- minbodytemp = 0
- maxbodytemp = INFINITY
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- loot = list(/obj/effect/decal/remains/human)
- del_on_death = TRUE
-
-/obj/projectile/temp/earth_bolt
- name = "earth bolt"
- icon_state = "declone"
- damage = 4
- damage_type = BURN
- flag = "energy"
- temperature = -100 // closer to the old temp loss
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 526763e875b7..70ce3f665bab 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -30,7 +30,7 @@
var/ranged_cooldown = 0 //What the current cooldown on ranged attacks is, generally world.time + ranged_cooldown_time
var/ranged_cooldown_time = 30 //How long, in deciseconds, the cooldown of ranged attacks is
var/ranged_ignores_vision = FALSE //if it'll fire ranged attacks even if it lacks vision on its target, only works with environment smash
- var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting
+ var/check_friendly_fire = FALSE // Should the ranged mob check for friendlies when shooting
var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat.
var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance
diff --git a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm
similarity index 86%
rename from code/modules/mob/living/simple_animal/hostile/cat_butcher.dm
rename to code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm
index 8da384aaca4b..0f14f615e5b6 100644
--- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm
@@ -1,41 +1,27 @@
-/mob/living/simple_animal/hostile/cat_butcherer
+/mob/living/simple_animal/hostile/human/cat_butcherer
name = "Cat Surgeon"
desc = "Feline genemod physiological modification surgery is outlawed in Nanotrasen-controlled sectors. This doctor doesn't seem to care, and thus, is wanted for several warcrimes."
- icon = 'icons/mob/simple_human.dmi'
icon_state = "cat_butcher"
icon_living = "cat_butcher"
- icon_dead = "syndicate_dead"
- icon_gib = "syndicate_gib"
projectiletype = /obj/projectile/bullet/dart/tranq
projectilesound = 'sound/items/syringeproj.ogg'
- ranged = 1
+ ranged = TRUE
ranged_message = "fires the syringe gun at"
ranged_cooldown_time = 30
speak_chance = 0
- turns_per_move = 5
- speed = 0
stat_attack = HARD_CRIT
- robust_searching = 1
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 15
attack_verb_continuous = "slashes at"
attack_verb_simple = "slash at"
attack_sound = 'sound/weapons/circsawhit.ogg'
- a_intent = INTENT_HARM
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
loot = list(/obj/effect/mob_spawn/human/corpse/cat_butcher, /obj/item/circular_saw, /obj/item/gun/syringe)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
faction = list("hostile")
- check_friendly_fire = 1
- status_flags = CANPUSH
- del_on_death = 1
+ check_friendly_fire = TRUE
var/impatience = 0
-/mob/living/simple_animal/hostile/cat_butcherer/CanAttack(atom/the_target)
+/mob/living/simple_animal/hostile/human/cat_butcherer/CanAttack(atom/the_target)
if(iscarbon(target))
var/mob/living/carbon/human/C = target
if(C.getorgan(/obj/item/organ/ears/cat) && C.getorgan(/obj/item/organ/tail/cat) && C.has_trauma_type(/datum/brain_trauma/severe/pacifism))//he wont attack his creations
@@ -45,7 +31,7 @@
return FALSE
return ..()
-/mob/living/simple_animal/hostile/cat_butcherer/AttackingTarget()
+/mob/living/simple_animal/hostile/human/cat_butcherer/AttackingTarget()
if(iscarbon(target))
var/mob/living/carbon/human/L = target
if(!L.getorgan(/obj/item/organ/ears/cat) && L.stat >= UNCONSCIOUS) //target doesnt have cat ears
@@ -82,11 +68,11 @@
L.adjustOxyLoss(-50)// do CPR first
if(L.blood_volume <= 500) //bandage them up and give em some blood if they're bleeding
L.blood_volume += 30
- L.suppress_bloodloss(1800)
+ L.heal_bleeding(10)
if(L.getBruteLoss() >= 50)// first, did we beat them into crit? if so, heal that
var/healing = min(L.getBruteLoss(), 120)
L.adjustBruteLoss(-healing)
- L.suppress_bloodloss(1800)//bandage their ass
+ L.heal_bleeding(10)
return
else if(L.getFireLoss() >= 50) // are they still down from other damage? fix it, but not as fast as the burns
var/healing = min(L.getFireLoss(), 50)
diff --git a/code/modules/mob/living/simple_animal/hostile/frontiersman.dm b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
similarity index 70%
rename from code/modules/mob/living/simple_animal/hostile/frontiersman.dm
rename to code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
index 213cd8c2b822..040b6b26ae2a 100644
--- a/code/modules/mob/living/simple_animal/hostile/frontiersman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
@@ -1,36 +1,18 @@
-/mob/living/simple_animal/hostile/frontier
+/mob/living/simple_animal/hostile/human/frontier
name = "Frontiersman"
desc = "A frontiersman! A terrorist that would probably kill everyone without mercy."
- icon = 'icons/mob/simple_human.dmi'
icon_state = "frontiersmanmelee"
icon_living = "frontiersmanmelee"
icon_dead = "frontiersmanmelee_dead"
- icon_gib = "syndicate_gib"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
- turns_per_move = 5
- speed = 0
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 15
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
loot = list(/obj/effect/mob_spawn/human/corpse/frontier,
/obj/item/kitchen/knife)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
faction = list(FACTION_ANTAG_FRONTIERSMEN)
- status_flags = CANPUSH
- del_on_death = 1
- footstep_type = FOOTSTEP_MOB_SHOE
-
-
-/mob/living/simple_animal/hostile/frontier/ranged
+/mob/living/simple_animal/hostile/human/frontier/ranged
icon_state = "frontiersmanranged"
icon_living = "frontiersmanranged"
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
@@ -41,10 +23,10 @@
projectilesound = 'sound/weapons/gun/revolver/shot.ogg'
casingtype = /obj/item/ammo_casing/a357
-/mob/living/simple_animal/hostile/frontier/ranged/neutered
+/mob/living/simple_animal/hostile/human/frontier/ranged/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged)
-/mob/living/simple_animal/hostile/frontier/ranged/mosin
+/mob/living/simple_animal/hostile/human/frontier/ranged/mosin
icon_state = "frontiersmanrangedrifle"
icon_living = "frontiersmanrangedrifle"
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
@@ -52,10 +34,10 @@
casingtype = /obj/item/ammo_casing/a8_50r
projectilesound = 'sound/weapons/gun/rifle/mosin.ogg'
-/mob/living/simple_animal/hostile/frontier/ranged/mosin/neutered
+/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper
icon_state = "frontiersmanrangedelite"
icon_living = "frontiersmanrangedelite"
maxHealth = 170
@@ -65,10 +47,10 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
/obj/item/gun/ballistic/shotgun/brimstone)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/neutered
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/skm
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm
icon_state = "frontiersmanrangedak47"
icon_living = "frontiersmanrangedak47"
projectilesound = 'sound/weapons/gun/rifle/skm.ogg'
@@ -78,10 +60,10 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
/obj/item/gun/ballistic/automatic/assault/skm)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/skm/neutured
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm/neutured
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/rifle
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle
icon_state = "frontiersmanrangedmosin"
icon_living = "frontiersmanrangedmosin"
@@ -90,10 +72,10 @@
casingtype = /obj/item/ammo_casing/a8_50r
projectilesound = 'sound/weapons/gun/rifle/mosin.ogg'
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/rifle/neutered
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/heavy
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy
icon_state = "frontiersmanrangedminigun"
icon_living = "frontiersmanrangedminigun"
projectilesound = 'sound/weapons/laser4.ogg'
@@ -105,10 +87,10 @@
projectiletype = /obj/projectile/beam/weak/penetrator
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy)
-/mob/living/simple_animal/hostile/frontier/ranged/trooper/heavy/neutered
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless)
-/mob/living/simple_animal/hostile/frontier/ranged/officer
+/mob/living/simple_animal/hostile/human/frontier/ranged/officer
name = "Frontiersman Officer"
icon_state = "frontiersmanofficer"
icon_living = "frontiersmanofficer"
@@ -119,10 +101,10 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer,
/obj/item/gun/ballistic/automatic/pistol/APS)
-/mob/living/simple_animal/hostile/frontier/ranged/officer/neutured
+/mob/living/simple_animal/hostile/human/frontier/ranged/officer/neutured
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer)
-/mob/living/simple_animal/hostile/frontier/ranged/officer/Aggro()
+/mob/living/simple_animal/hostile/human/frontier/ranged/officer/Aggro()
..()
summon_backup(15)
say(pick("Help!!", "They're right here!!", "Don't let me die!!"))
diff --git a/code/modules/mob/living/simple_animal/hostile/human/human.dm b/code/modules/mob/living/simple_animal/hostile/human/human.dm
new file mode 100644
index 000000000000..633bd40090e8
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/human/human.dm
@@ -0,0 +1,41 @@
+/mob/living/simple_animal/hostile/human
+ name = "crazed human"
+ desc = "A crazed human, they cannot be reasoned with"
+ icon = 'icons/mob/simple_human.dmi'
+ icon_state = "survivor_base"
+ icon_living = "survivor_base"
+ icon_dead = null
+ icon_gib = "syndicate_gib"
+ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
+
+ speak_chance = 20
+ speak_emote = list("groans")
+
+ turns_per_move = 5
+ speed = 0
+ maxHealth = 100
+ health = 100
+
+ robust_searching = TRUE
+ harm_intent_damage = 5
+ melee_damage_lower = 10
+ melee_damage_upper = 10
+ attack_verb_continuous = "punches"
+ attack_verb_simple = "punch"
+ attack_sound = 'sound/weapons/punch1.ogg'
+ a_intent = INTENT_HARM
+ response_help_continuous = "pushes"
+ response_help_simple = "push"
+
+ loot = list(/obj/effect/mob_spawn/human/corpse/damaged)
+ del_on_death = TRUE
+
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
+ unsuitable_atmos_damage = 15
+ minbodytemp = 180
+ status_flags = CANPUSH
+ del_on_death = TRUE
+
+ footstep_type = FOOTSTEP_MOB_SHOE
+
+ faction = list("hermit")
diff --git a/code/modules/mob/living/simple_animal/hostile/human/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/human/nanotrasen.dm
new file mode 100644
index 000000000000..6c1676d202ab
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/human/nanotrasen.dm
@@ -0,0 +1,80 @@
+/mob/living/simple_animal/hostile/human/nanotrasen
+ name = "\improper Nanotrasen Private Security Officer"
+ desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you."
+ icon_state = "nanotrasen"
+ icon_living = "nanotrasen"
+ speak_chance = 0
+ stat_attack = HARD_CRIT
+ melee_damage_upper = 15
+ loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasensoldier)
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
+ faction = list(ROLE_DEATHSQUAD)
+ check_friendly_fire = TRUE
+ dodging = TRUE
+
+/mob/living/simple_animal/hostile/human/nanotrasen/screaming
+ icon_state = "nanotrasen"
+ icon_living = "nanotrasen"
+
+/mob/living/simple_animal/hostile/human/nanotrasen/screaming/Aggro()
+ ..()
+ summon_backup(15)
+ say("411 in progress, requesting backup!")
+
+
+/mob/living/simple_animal/hostile/human/nanotrasen/ranged
+ icon_state = "nanotrasenranged"
+ icon_living = "nanotrasenranged"
+ ranged = 1
+ retreat_distance = 3
+ minimum_distance = 5
+ casingtype = /obj/item/ammo_casing/c45
+ projectilesound = 'sound/weapons/gun/pistol/shot_alt.ogg'
+
+
+/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg
+ icon_state = "nanotrasenrangedsmg"
+ icon_living = "nanotrasenrangedsmg"
+ rapid = 3
+ casingtype = /obj/item/ammo_casing/c46x30mm
+ projectilesound = 'sound/weapons/gun/smg/shot.ogg'
+
+/mob/living/simple_animal/hostile/human/nanotrasen/ranged/assault
+ name = "Nanotrasen Assault Officer"
+ desc = "A Nanotrasen Assault Officer. Prepare to die, if you've been found near Syndicate property."
+ icon_state = "nanotrasenrangedassault"
+ icon_living = "nanotrasenrangedassault"
+ icon_dead = null
+ icon_gib = "syndicate_gib"
+ ranged = TRUE
+ rapid = 4
+ rapid_fire_delay = 1
+ rapid_melee = 1
+ retreat_distance = 2
+ minimum_distance = 4
+ casingtype = /obj/item/ammo_casing/c46x30mm
+ projectilesound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
+ loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasenassaultsoldier)
+
+/mob/living/simple_animal/hostile/human/nanotrasen/elite
+ name = "Nanotrasen Elite Assault Officer"
+ desc = "Pray for your life, syndicate. Run while you can."
+ icon = 'icons/mob/simple_human.dmi'
+ icon_state = "nanotrasen_ert"
+ icon_living = "nanotrasen_ert"
+ maxHealth = 150
+ health = 150
+ melee_damage_lower = 13
+ melee_damage_upper = 18
+ ranged = TRUE
+ rapid = 3
+ rapid_fire_delay = 5
+ rapid_melee = 3
+ retreat_distance = 0
+ minimum_distance = 1
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ projectiletype = /obj/projectile/beam/laser
+ projectilesound = 'sound/weapons/laser.ogg'
+ loot = list(/obj/effect/gibspawner/human)
+ faction = list(ROLE_DEATHSQUAD)
diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/human/pirate.dm
similarity index 67%
rename from code/modules/mob/living/simple_animal/hostile/pirate.dm
rename to code/modules/mob/living/simple_animal/hostile/human/pirate.dm
index b0bc7941fd69..df10cfa6a2b4 100644
--- a/code/modules/mob/living/simple_animal/hostile/pirate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/pirate.dm
@@ -1,35 +1,17 @@
-/mob/living/simple_animal/hostile/pirate
+/mob/living/simple_animal/hostile/human/pirate
name = "Pirate"
desc = "Does what he wants cause a pirate is free."
- icon = 'icons/mob/simple_human.dmi'
icon_state = "piratemelee"
icon_living = "piratemelee"
icon_dead = "pirate_dead"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
- turns_per_move = 5
- response_help_continuous = "pushes"
- response_help_simple = "push"
- speed = 0
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- melee_damage_lower = 10
- melee_damage_upper = 10
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
speak_emote = list("yarrs")
loot = list(/obj/effect/mob_spawn/human/corpse/pirate,
/obj/item/melee/transforming/energy/sword/saber/pirate)
- del_on_death = 1
faction = list("pirate")
-
-/mob/living/simple_animal/hostile/pirate/melee
+/mob/living/simple_animal/hostile/human/pirate/melee
name = "Pirate Swashbuckler"
icon_state = "piratemelee"
icon_living = "piratemelee"
@@ -44,7 +26,7 @@
footstep_type = FOOTSTEP_MOB_SHOE
-/mob/living/simple_animal/hostile/pirate/melee/space
+/mob/living/simple_animal/hostile/human/pirate/melee/space
name = "Space Pirate Swashbuckler"
icon_state = "piratespace"
icon_living = "piratespace"
@@ -53,23 +35,23 @@
minbodytemp = 0
speed = 1
-/mob/living/simple_animal/hostile/pirate/melee/space/Initialize()
+/mob/living/simple_animal/hostile/human/pirate/melee/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
-/mob/living/simple_animal/hostile/pirate/melee/Initialize()
+/mob/living/simple_animal/hostile/human/pirate/melee/Initialize()
. = ..()
sord = new(src)
-/mob/living/simple_animal/hostile/pirate/melee/Destroy()
+/mob/living/simple_animal/hostile/human/pirate/melee/Destroy()
QDEL_NULL(sord)
return ..()
-/mob/living/simple_animal/hostile/pirate/melee/Initialize()
+/mob/living/simple_animal/hostile/human/pirate/melee/Initialize()
. = ..()
set_light(2)
-/mob/living/simple_animal/hostile/pirate/ranged
+/mob/living/simple_animal/hostile/human/pirate/ranged
name = "Pirate Gunner"
icon_state = "pirateranged"
icon_living = "pirateranged"
@@ -84,7 +66,7 @@
loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged,
/obj/item/gun/energy/laser)
-/mob/living/simple_animal/hostile/pirate/ranged/space
+/mob/living/simple_animal/hostile/human/pirate/ranged/space
name = "Space Pirate Gunner"
icon_state = "piratespaceranged"
icon_living = "piratespaceranged"
@@ -93,6 +75,6 @@
minbodytemp = 0
speed = 1
-/mob/living/simple_animal/hostile/pirate/ranged/space/Initialize()
+/mob/living/simple_animal/hostile/human/pirate/ranged/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
similarity index 74%
rename from code/modules/mob/living/simple_animal/hostile/skeleton.dm
rename to code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
index 477233566f35..b251dda91e48 100644
--- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
@@ -1,20 +1,16 @@
-/mob/living/simple_animal/hostile/skeleton
+/mob/living/simple_animal/hostile/human/skeleton
name = "reanimated skeleton"
desc = "A real bonefied skeleton, doesn't seem like it wants to socialize."
- icon = 'icons/mob/simple_human.dmi'
icon_state = "skeleton"
icon_living = "skeleton"
icon_dead = "skeleton"
gender = NEUTER
mob_biotypes = MOB_UNDEAD|MOB_HUMANOID
- turns_per_move = 5
speak_emote = list("rattles")
emote_see = list("rattles")
- a_intent = INTENT_HARM
maxHealth = 40
health = 40
speed = 1
- harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 15
minbodytemp = 0
@@ -25,36 +21,15 @@
attack_sound = 'sound/hallucinations/growl1.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 10
- robust_searching = 1
stat_attack = HARD_CRIT
faction = list("skeleton")
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
deathmessage = "collapses into a pile of bones!"
- del_on_death = 1
loot = list(/obj/effect/decal/remains/human)
-
footstep_type = FOOTSTEP_MOB_SHOE
-/mob/living/simple_animal/hostile/skeleton/eskimo
- name = "undead eskimo"
- desc = "The reanimated remains of some poor traveler."
- icon_state = "eskimo"
- icon_living = "eskimo"
- icon_dead = "eskimo_dead"
- maxHealth = 55
- health = 55
- weather_immunities = list("snow")
- melee_damage_lower = 17
- melee_damage_upper = 20
- deathmessage = "collapses into a pile of bones, its gear falling to the floor!"
- loot = list(/obj/effect/decal/remains/human,
- /obj/item/spear,
- /obj/item/clothing/shoes/winterboots,
- /obj/item/clothing/suit/hooded/wintercoat)
-
-
-/mob/living/simple_animal/hostile/skeleton/templar
+/mob/living/simple_animal/hostile/human/skeleton/templar
name = "undead templar"
desc = "The reanimated remains of a holy templar knight."
icon_state = "templar"
@@ -72,11 +47,11 @@
melee_damage_upper = 30
deathmessage = "collapses into a pile of bones, its gear clanging as it hits the ground!"
loot = list(/obj/effect/decal/remains/human,
- /obj/item/clothing/suit/armor/riot/chaplain,
- /obj/item/clothing/head/helmet/chaplain,
+ /obj/item/clothing/suit/armor/witchhunter,
+ /obj/item/clothing/head/witchunter,
/obj/item/claymore/weak{name = "holy sword"})
-/mob/living/simple_animal/hostile/skeleton/ice
+/mob/living/simple_animal/hostile/human/skeleton/ice
name = "ice skeleton"
desc = "A reanimated skeleton protected by a thick sheet of natural ice armor. Looks slow, though."
speed = 5
@@ -86,7 +61,7 @@
color = rgb(114,228,250)
loot = list(/obj/effect/decal/remains/human{color = rgb(114,228,250)})
-/mob/living/simple_animal/hostile/skeleton/plasmaminer
+/mob/living/simple_animal/hostile/human/skeleton/plasmaminer
name = "shambling miner"
desc = "A plasma-soaked miner, their exposed limbs turned into a grossly incandescent bone seemingly made of plasma."
icon_state = "plasma_miner"
@@ -104,7 +79,7 @@
deathmessage = "collapses into a pile of bones, their suit dissolving among the plasma!"
loot = list(/obj/effect/decal/remains/plasma)
-/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer
+/mob/living/simple_animal/hostile/human/skeleton/plasmaminer/jackhammer
desc = "A plasma-soaked miner, their exposed limbs turned into a grossly incandescent bone seemingly made of plasma. They seem to still have their mining tool in their hand, gripping tightly."
icon_state = "plasma_miner_tool"
icon_living = "plasma_miner_tool"
@@ -119,6 +94,6 @@
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
loot = list(/obj/effect/decal/remains/plasma, /obj/item/pickaxe/drill/jackhammer)
-/mob/living/simple_animal/hostile/skeleton/plasmaminer/Initialize()
+/mob/living/simple_animal/hostile/human/skeleton/plasmaminer/Initialize()
. = ..()
set_light(2)
diff --git a/code/modules/mob/living/simple_animal/hostile/survivors.dm b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm
similarity index 52%
rename from code/modules/mob/living/simple_animal/hostile/survivors.dm
rename to code/modules/mob/living/simple_animal/hostile/human/survivors.dm
index bc7573552bc5..f7abea96b222 100644
--- a/code/modules/mob/living/simple_animal/hostile/survivors.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm
@@ -1,59 +1,41 @@
-/mob/living/simple_animal/hostile/asteroid/whitesands
+/mob/living/simple_animal/hostile/human/hermit
name = "Whitesands Inhabitant"
desc = "If you can read this, yell at a coder!"
- icon = 'icons/mob/simple_human.dmi'
icon_state = "survivor_base"
icon_living = "survivor_base"
- icon_dead = null
- icon_gib = "syndicate_gib"
- mob_biotypes = MOB_ORGANIC
- minbodytemp = 180
- unsuitable_atmos_damage = 15
atmos_requirements = list("min_oxy" = 1, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 999, "min_n2" = 0, "max_n2" = 0)
- speak_chance = 20
- turns_per_move = 5
- response_help_continuous = "pushes"
- response_help_simple = "push"
- speed = 0
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- melee_damage_lower = 10
- melee_damage_upper = 10
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
- unsuitable_atmos_damage = 15
- speak_emote = list("groans")
loot = list(
/obj/effect/mob_spawn/human/corpse/damaged/whitesands
)
- del_on_death = 1
- faction = list("hermit")
-/mob/living/simple_animal/hostile/asteroid/whitesands/survivor/death(gibbed)
+/mob/living/simple_animal/hostile/human/hermit/survivor/death(gibbed)
move_force = MOVE_FORCE_DEFAULT
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
+ ..()
+ /*
if(prob(15))
- new /obj/item/crusher_trophy/shiny(loc)
+ new /obj/item/mob_trophy/shiny(loc)
visible_message("You notice a glimmering nugget of shiny metal.")
- ..()
+ */
-/mob/living/simple_animal/hostile/asteroid/whitesands/survivor
+/mob/living/simple_animal/hostile/human/hermit/survivor
name = "Hermit Wanderer"
desc =" A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body, twisted by the heavy metals and high background radiation of the sandworlds."
+ loot = list(
+ /obj/effect/mob_spawn/human/corpse/damaged/whitesands/survivor
+ )
-/mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random/Initialize()
+/mob/living/simple_animal/hostile/human/hermit/survivor/random/Initialize()
. = ..()
if(prob(35))
- new /mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter(loc)
+ new /mob/living/simple_animal/hostile/human/hermit/ranged/hunter(loc)
+ return INITIALIZE_HINT_QDEL
if(prob(10))
- new /mob/living/simple_animal/hostile/asteroid/whitesands/ranged/gunslinger(loc)
+ new /mob/living/simple_animal/hostile/human/hermit/ranged/gunslinger(loc)
return INITIALIZE_HINT_QDEL
-/mob/living/simple_animal/hostile/asteroid/whitesands/ranged
+/mob/living/simple_animal/hostile/human/hermit/ranged
icon_state = "survivor_hunter"
icon_living = "survivor_hunter"
projectiletype = null
@@ -64,14 +46,14 @@
retreat_distance = 5
minimum_distance = 5
-/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter
+/mob/living/simple_animal/hostile/human/hermit/ranged/hunter
name = "Hermit Hunter"
desc ="A wild-eyed figure. Watch out- he has a gun, and he remembers just enough of his old life to use it!"
loot = list(
/obj/effect/mob_spawn/human/corpse/damaged/whitesands/hunter,
)
-/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/gunslinger
+/mob/living/simple_animal/hostile/human/hermit/ranged/gunslinger
name = "Hermit Soldier"
desc = "The miner's rebellion, though mostly underground, recieved a few good weapon shipments from an off-sector source. You should probably start running."
icon_state = "survivor_gunslinger"
@@ -88,102 +70,25 @@
//survivor corpses
/obj/effect/mob_spawn/human/corpse/damaged/whitesands
+ uniform = /obj/item/clothing/under/color/random
+ belt = /obj/item/storage/belt/fannypack
+ shoes = /obj/item/clothing/shoes/workboots/mining
+ suit = /obj/item/clothing/suit/hooded/survivor
+ l_pocket = /obj/item/radio
+ r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
var/survivor_type //room for alternatives inside the fuckoff grade init.
/obj/effect/mob_spawn/human/corpse/damaged/whitesands/Initialize() //everything here should equal out to 100 for the sake of my sanity.
-
mob_species = pickweight(list(
/datum/species/human = 50,
- /datum/species/lizard = 25,
- /datum/species/ethereal = 10,
- /datum/species/moth = 10,
- /datum/species/spider = 3,
- /datum/species/fly = 2
- )
+ /datum/species/lizard = 20,
+ /datum/species/ipc = 10,
+ /datum/species/elzuose = 10,
+ /datum/species/moth = 5,
+ /datum/species/spider = 5
)
+ )
//to-do: learn how to make mobsprites for other survivors
- //uniforms are random to show varied backgrounds, but similar goal
- if(survivor_type == "survivor")
- uniform = pickweight(list(
- /obj/item/clothing/under/color/random = 65,
- /obj/item/clothing/under/rank/cargo/miner/lavaland = 10,
- /obj/item/clothing/under/rank/prisoner = 10,
- /obj/item/clothing/under/rank/cargo/miner/lavaland/old = 5,
- /obj/item/clothing/under/color/khaki/buster = 5,
- /obj/item/clothing/under/rank/cargo/miner = 5
- )
- )
- else if (survivor_type == "hunter")
- uniform = pickweight(list(
- /obj/item/clothing/under/color/random = 50,
- /obj/item/clothing/under/rank/cargo/miner/lavaland = 25,
- /obj/item/clothing/under/rank/cargo/miner/lavaland/old = 15,
- /obj/item/clothing/under/rank/security/officer/camo = 5,
- /obj/item/clothing/under/utility = 5
- )
- )
- else if (survivor_type == "gunslinger")
- uniform = pickweight(list(
- /obj/item/clothing/under/rank/cargo/miner/lavaland = 35,
- /obj/item/clothing/under/color/random = 25,
- /obj/item/clothing/under/rank/cargo/miner/lavaland/old = 15,
- /obj/item/clothing/under/rank/security/officer/camo = 10,
- /obj/item/clothing/under/syndicate/camo = 10,
- /obj/item/clothing/under/syndicate/combat = 5
- )
- )
- else
- uniform = /obj/item/clothing/under/color/random
-
- //storage is semi-randomized, giving some variety
- if(survivor_type == "survivor")
- belt = pickweight(list(
- /obj/item/storage/belt/fannypack = 40,
- /obj/item/storage/belt/mining = 20,
- /obj/item/storage/belt/mining/alt = 15,
- /obj/item/storage/belt/utility = 10,
- /obj/item/storage/belt/bandolier = 9,
- /obj/item/storage/belt/utility/full = 5,
- /obj/item/storage/belt/chameleon= 1,
- )
- )
- else if(survivor_type == "hunter")
- belt = pickweight(list(
- /obj/item/storage/belt/mining = 30,
- /obj/item/storage/belt/fannypack = 20,
- /obj/item/storage/belt/mining/alt = 15,
- /obj/item/storage/belt/mining/primitive = 15,
- /obj/item/storage/belt/bandolier = 10,
- /obj/item/storage/belt/military = 7,
- /obj/item/storage/belt/mining/vendor = 3,
- )
- )
- else if(survivor_type == "gunslinger")
- belt = pickweight(list(
- /obj/item/storage/belt/mining = 30,
- /obj/item/storage/belt/bandolier = 30,
- /obj/item/storage/belt/military = 20,
- /obj/item/storage/belt/fannypack = 15,
- /obj/item/storage/belt/mining/alt = 5,
- /obj/item/storage/belt/mining/primitive = 5
- )
- )
- else
- belt = /obj/item/storage/belt/fannypack
-
- //everyone wears the same suit
- suit = /obj/item/clothing/suit/hooded/survivor
-
- if (survivor_type == "gunslinger")
- if(prob(30))
- shoes = /obj/item/clothing/shoes/combat //but sometimes there are nicer shoes
- else
- shoes = /obj/item/clothing/shoes/workboots/mining
- else
- shoes = /obj/item/clothing/shoes/workboots/mining
-
-
-
//gloves are a tossup
gloves = pickweight(list(
@@ -260,35 +165,6 @@
if(prob(30)) //some pens maybe?
backpack_contents += /obj/item/reagent_containers/hypospray/medipen/survival
- //pockets
- if(survivor_type == "survivor") //could also use fleshing out
- if(prob(30))
- l_pocket = /obj/item/reagent_containers/food/snacks/meat/steak/goliath
- else
- l_pocket = /obj/item/tank/internals/emergency_oxygen/engi
- if (prob(20))
- r_pocket = /obj/item/spacecash/bundle/mediumrand
- else
- r_pocket = null
-
- if(survivor_type == "hunter")
- l_pocket = /obj/item/tank/internals/emergency_oxygen/engi
- if (prob(20))
- r_pocket = /obj/item/reagent_containers/food/snacks/meat/steak/goliath
- else if (prob(60))
- r_pocket = /obj/item/ammo_box/aac_300blk_stripper
- else
- r_pocket = null
-
- if(survivor_type == "gunslinger")
- if(prob(50))
- l_pocket = /obj/item/ammo_box/magazine/skm_545_39
- r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
-
- else
- r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
- l_pocket = /obj/item/radio
-
//masks
mask = pickweight(list(
/obj/item/clothing/mask/gas = 40,
@@ -298,7 +174,7 @@
)
)
- //the eyes are the window into the soul. I don't think these things have souls but whatever.
+ //the eyes are the window into the soul.
if(prob(70))
glasses = pickweight(list(
/obj/item/clothing/glasses/heat = 20,
@@ -307,8 +183,6 @@
/obj/item/clothing/glasses = 20
)
)
- else
- glasses = null
//and of course, ears.
if(prob(1)) //oh my god they can't hear the sandstorm coming they've got airpods in
@@ -319,21 +193,91 @@
/obj/item/radio/headset/alt = 50
)
)
+ //now for the fun stuff
+ switch(survivor_type)
+ if("survivor")
+ //uniforms are random to show varied backgrounds, but similar goal
+ uniform = pickweight(list(
+ /obj/item/clothing/under/color/random = 65,
+ /obj/item/clothing/under/rank/cargo/miner/lavaland = 10,
+ /obj/item/clothing/under/rank/prisoner = 10,
+ /obj/item/clothing/under/rank/cargo/miner/lavaland/old = 5,
+ /obj/item/clothing/under/color/khaki/buster = 5,
+ /obj/item/clothing/under/rank/cargo/miner = 5
+ )
+ )
+ //storage is semi-randomized, giving some variety
+ belt = pickweight(list(
+ /obj/item/storage/belt/fannypack = 40,
+ /obj/item/storage/belt/mining = 20,
+ /obj/item/storage/belt/mining/alt = 15,
+ /obj/item/storage/belt/utility = 10,
+ /obj/item/storage/belt/bandolier = 9,
+ /obj/item/storage/belt/utility/full = 5,
+ /obj/item/storage/belt/chameleon= 1,
+ )
+ )
+ if(prob(30))
+ l_pocket = /obj/item/reagent_containers/food/snacks/meat/steak/goliath
+ if(prob(20))
+ r_pocket = /obj/item/spacecash/bundle/smallrand
+
+ if("hunter")
+ uniform = pickweight(list(
+ /obj/item/clothing/under/color/random = 50,
+ /obj/item/clothing/under/rank/cargo/miner/lavaland = 25,
+ /obj/item/clothing/under/rank/cargo/miner/lavaland/old = 15,
+ /obj/item/clothing/under/rank/security/officer/camo = 5,
+ /obj/item/clothing/under/utility = 5
+ )
+ )
+ belt = pickweight(list(
+ /obj/item/storage/belt/mining = 30,
+ /obj/item/storage/belt/fannypack = 20,
+ /obj/item/storage/belt/mining/alt = 15,
+ /obj/item/storage/belt/mining/primitive = 15,
+ /obj/item/storage/belt/bandolier = 10,
+ /obj/item/storage/belt/military = 7,
+ /obj/item/storage/belt/mining/vendor = 3,
+ )
+ )
+ if(prob(20))
+ l_pocket = /obj/item/reagent_containers/food/snacks/meat/steak/goliath
+ else if(prob(60))
+ l_pocket = /obj/item/ammo_box/aac_300blk_stripper
+ if(prob(20))
+ new /obj/item/gun/ballistic/rifle/polymer(loc)
+ else
+ visible_message(span_warning("The hunter's weapon shatters as they impact the ground!"))
+
+ if("gunslinger")
+ uniform = pickweight(list(
+ /obj/item/clothing/under/rank/cargo/miner/lavaland = 35,
+ /obj/item/clothing/under/color/random = 25,
+ /obj/item/clothing/under/rank/cargo/miner/lavaland/old = 15,
+ /obj/item/clothing/under/rank/security/officer/camo = 10,
+ /obj/item/clothing/under/syndicate/camo = 10,
+ /obj/item/clothing/under/syndicate/combat = 5
+ )
+ )
+ belt = pickweight(list(
+ /obj/item/storage/belt/mining = 30,
+ /obj/item/storage/belt/bandolier = 30,
+ /obj/item/storage/belt/military = 20,
+ /obj/item/storage/belt/fannypack = 15,
+ /obj/item/storage/belt/mining/alt = 5,
+ /obj/item/storage/belt/mining/primitive = 5
+ )
+ )
+ if(prob(30))
+ shoes = /obj/item/clothing/shoes/combat //sometimes there are nicer shoes
+ if(prob(50))
+ l_pocket = /obj/item/ammo_box/magazine/skm_545_39
+ if(prob(20))
+ new /obj/item/gun/ballistic/automatic/smg/skm_carbine(loc)
+ else
+ visible_message(span_warning("The gunslinger's weapon shatters as they impact the ground!"))
- //exosuit bits
- suit_store = null
- if (survivor_type == "hunter")
- if(prob(20))
- new /obj/item/gun/ballistic/rifle/polymer(loc)
- else
- visible_message("The hunter's weapon shatters as they impact the ground!")
- suit_store = null
- if(survivor_type == "gunslinger")
- if(prob(20))
- new /obj/item/gun/ballistic/automatic/smg/skm_carbine(loc)
- else
- visible_message("The gunslinger's weapon shatters as they impact the ground!")
- suit_store = null
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
similarity index 61%
rename from code/modules/mob/living/simple_animal/hostile/syndicate.dm
rename to code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
index b98d14128e12..a88a79610b60 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
@@ -1,12 +1,3 @@
-/*
- CONTENTS
- LINE 10 - BASE MOB
- LINE 52 - SWORD AND SHIELD
- LINE 164 - GUNS
- LINE 267 - MISC
-*/
-
-
///////////////Base mob////////////
/obj/effect/light_emitter/red_energy_sword //used so there's a combination of both their head light and light coming off the energy sword
set_luminosity = 2
@@ -14,65 +5,48 @@
light_color = COLOR_SOFT_RED
-/mob/living/simple_animal/hostile/syndicate
- name = "Syndicate Operative"
- desc = "Death to Nanotrasen."
- icon = 'icons/mob/simple_human.dmi'
+/mob/living/simple_animal/hostile/human/syndicate
+ name = "Ramzi Clique Operative"
+ desc = "An ex-Syndicate pirate of the Ramzi Clique."
icon_state = "syndicate"
icon_living = "syndicate"
- icon_dead = "syndicate_dead"
- icon_gib = "syndicate_gib"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
- turns_per_move = 5
- speed = 0
stat_attack = HARD_CRIT
- robust_searching = 1
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- melee_damage_lower = 10
- melee_damage_upper = 10
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
+ maxbodytemp = 400
unsuitable_atmos_damage = 15
faction = list(FACTION_ANTAG_SYNDICATE)
- check_friendly_fire = 1
- status_flags = CANPUSH
- del_on_death = 1
+ check_friendly_fire = TRUE
dodging = TRUE
rapid_melee = 2
- footstep_type = FOOTSTEP_MOB_SHOE
///////////////Melee////////////
-/mob/living/simple_animal/hostile/syndicate/space
+/mob/living/simple_animal/hostile/human/syndicate/space
icon_state = "syndicate_space"
icon_living = "syndicate_space"
- name = "Syndicate Commando"
+ name = "Ramzi Clique Commando"
maxHealth = 170
health = 170
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
+ maxbodytemp = 1000
speed = 1
-/mob/living/simple_animal/hostile/syndicate/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/space/stormtrooper
icon_state = "syndicate_stormtrooper"
icon_living = "syndicate_stormtrooper"
- name = "Syndicate Stormtrooper"
+ name = "Ramzi Clique Assault Trooper"
maxHealth = 250
health = 250
-/mob/living/simple_animal/hostile/syndicate/melee //dude with a knife and no shields
+/mob/living/simple_animal/hostile/human/syndicate/melee //dude with a knife and no shields
melee_damage_lower = 15
melee_damage_upper = 15
icon_state = "syndicate_knife"
@@ -84,31 +58,32 @@
status_flags = 0
var/projectile_deflect_chance = 0
-/mob/living/simple_animal/hostile/syndicate/melee/space
+/mob/living/simple_animal/hostile/human/syndicate/melee/space
icon_state = "syndicate_space_knife"
icon_living = "syndicate_space_knife"
- name = "Syndicate Commando"
+ name = "Ramzi Clique Commando"
maxHealth = 170
health = 170
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
+ maxbodytemp = 1000
speed = 1
projectile_deflect_chance = 50
-/mob/living/simple_animal/hostile/syndicate/melee/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/melee/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/melee/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/melee/space/stormtrooper
icon_state = "syndicate_stormtrooper_knife"
icon_living = "syndicate_stormtrooper_knife"
- name = "Syndicate Stormtrooper"
+ name = "Ramzi Clique Stormtrooper"
maxHealth = 250
health = 250
projectile_deflect_chance = 50
-/mob/living/simple_animal/hostile/syndicate/melee/sword
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword
melee_damage_lower = 30
melee_damage_upper = 30
icon_state = "syndicate_sword"
@@ -122,52 +97,53 @@
var/obj/effect/light_emitter/red_energy_sword/sord
projectile_deflect_chance = 50
-/mob/living/simple_animal/hostile/syndicate/melee/sword/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/Initialize()
. = ..()
set_light(2)
-/mob/living/simple_animal/hostile/syndicate/melee/sword/Destroy()
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/Destroy()
QDEL_NULL(sord)
return ..()
-/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/projectile/Proj)
+/mob/living/simple_animal/hostile/human/syndicate/melee/bullet_act(obj/projectile/Proj)
if(prob(projectile_deflect_chance))
visible_message("[src] blocks [Proj] with its shield!")
return BULLET_ACT_BLOCK
return ..()
-/mob/living/simple_animal/hostile/syndicate/melee/sword/space
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space
icon_state = "syndicate_space_sword"
icon_living = "syndicate_space_sword"
- name = "Syndicate Commando"
+ name = "Ramzi Clique Commando"
maxHealth = 170
health = 170
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
+ maxbodytemp = 1000
speed = 1
projectile_deflect_chance = 50
-/mob/living/simple_animal/hostile/syndicate/melee/sword/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
sord = new(src)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/melee/sword/space/Destroy()
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space/Destroy()
QDEL_NULL(sord)
return ..()
-/mob/living/simple_animal/hostile/syndicate/melee/sword/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space/stormtrooper
icon_state = "syndicate_stormtrooper_sword"
icon_living = "syndicate_stormtrooper_sword"
- name = "Syndicate Stormtrooper"
+ name = "Ramzi Clique Stormtrooper"
maxHealth = 250
health = 250
projectile_deflect_chance = 50
///////////////Guns////////////
-/mob/living/simple_animal/hostile/syndicate/ranged
+/mob/living/simple_animal/hostile/human/syndicate/ranged
ranged = 1
retreat_distance = 5
minimum_distance = 5
@@ -179,104 +155,103 @@
dodging = FALSE
rapid_melee = 1
-/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator //shuttle loan event
+/mob/living/simple_animal/hostile/human/syndicate/ranged/infiltrator //shuttle loan event
projectilesound = 'sound/weapons/gun/smg/shot_suppressed.ogg'
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier)
-/mob/living/simple_animal/hostile/syndicate/ranged/space
+/mob/living/simple_animal/hostile/human/syndicate/ranged/space
icon_state = "syndicate_space_pistol"
icon_living = "syndicate_space_pistol"
- name = "Syndicate Commando"
+ name = "Ramzi Clique Commando"
maxHealth = 170
health = 170
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
+ maxbodytemp = 1000
speed = 1
-/mob/living/simple_animal/hostile/syndicate/ranged/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/ranged/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/ranged/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/ranged/space/stormtrooper
icon_state = "syndicate_stormtrooper_pistol"
icon_living = "syndicate_stormtrooper_pistol"
- name = "Syndicate Stormtrooper"
+ name = "Ramzi Clique Stormtrooper"
maxHealth = 250
health = 250
-/mob/living/simple_animal/hostile/syndicate/ranged/smg
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg
rapid = 2
icon_state = "syndicate_smg"
icon_living = "syndicate_smg"
casingtype = /obj/item/ammo_casing/c45
projectilesound = 'sound/weapons/gun/smg/shot.ogg'
-/mob/living/simple_animal/hostile/syndicate/ranged/smg/pilot //caravan ambush ruin
- name = "Syndicate Salvage Pilot"
- loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier)
-
-/mob/living/simple_animal/hostile/syndicate/ranged/smg/space
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space
icon_state = "syndicate_space_smg"
icon_living = "syndicate_space_smg"
- name = "Syndicate Commando"
+ name = "Ramzi Clique Commando"
maxHealth = 170
health = 170
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
+ maxbodytemp = 1000
speed = 1
-/mob/living/simple_animal/hostile/syndicate/ranged/smg/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/ranged/smg/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space/stormtrooper
icon_state = "syndicate_stormtrooper_smg"
icon_living = "syndicate_stormtrooper_smg"
- name = "Syndicate Stormtrooper"
+ name = "Ramzi Clique Stormtrooper"
maxHealth = 250
health = 250
-/mob/living/simple_animal/hostile/syndicate/ranged/shotgun
+/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun
rapid = 2
rapid_fire_delay = 6
minimum_distance = 3
icon_state = "syndicate_shotgun"
icon_living = "syndicate_shotgun"
- casingtype = /obj/item/ammo_casing/shotgun/buckshot //buckshot (up to 72.5 brute) fired in a two-round burst
+ casingtype = /obj/item/ammo_casing/shotgun/buckshot //buckshot fired in a two-round burst. This will two-tap unarmored players.
-/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space
+/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space
icon_state = "syndicate_space_shotgun"
icon_living = "syndicate_space_shotgun"
- name = "Syndicate Commando"
+ name = "Ramzi Clique Commando"
maxHealth = 170
health = 170
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
+ maxbodytemp = 1000
speed = 1
-/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
set_light(4)
-/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/stormtrooper
+/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space/stormtrooper
icon_state = "syndicate_stormtrooper_shotgun"
icon_living = "syndicate_stormtrooper_shotgun"
- name = "Syndicate Stormtrooper"
+ name = "Ramzi Clique Stormtrooper"
maxHealth = 250
health = 250
///////////////Misc////////////
-/mob/living/simple_animal/hostile/syndicate/civilian
+/mob/living/simple_animal/hostile/human/syndicate/civilian
minimum_distance = 10
retreat_distance = 10
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
-/mob/living/simple_animal/hostile/syndicate/civilian/Aggro()
+/mob/living/simple_animal/hostile/human/syndicate/civilian/Aggro()
..()
summon_backup(15)
say("GUARDS!!")
@@ -302,6 +277,7 @@
faction = list(ROLE_SYNDICATE)
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
+ maxbodytemp = 1000
mob_size = MOB_SIZE_TINY
movement_type = FLYING
limb_destroyer = 1
@@ -314,32 +290,3 @@
/mob/living/simple_animal/hostile/viscerator/Initialize()
. = ..()
AddComponent(/datum/component/swarming)
-
-/mob/living/simple_animal/hostile/syndicate/melee/sword/space/oldcode
- melee_damage_lower = 20
- melee_damage_upper = 20
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "oldcode_syndicate_csaber"
- icon_living = "oldcode_syndicate_csaber"
- name = "Syndicate Spaceman"
- desc = "Death to IS-Nanotrasen."
- maxHealth = 170
- health = 170
- armour_penetration = 20
- light_color = LIGHT_COLOR_BLUE
- sord = /obj/effect/light_emitter/blue_energy_sword
- projectile_deflect_chance = 10
-
-/mob/living/simple_animal/hostile/syndicate/ranged/space/oldcode
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "oldcode_syndicate_gun"
- icon_living = "oldcode_syndicate_gun"
- name = "Syndicate Spaceman"
- desc = "Death to IS-Nanotrasen."
- maxHealth = 170
- health = 170
-
-/obj/effect/light_emitter/blue_energy_sword
- set_luminosity = 2
- set_cap = 2.5
- light_color = LIGHT_COLOR_BLUE
diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/human/zombie.dm
similarity index 83%
rename from code/modules/mob/living/simple_animal/hostile/zombie.dm
rename to code/modules/mob/living/simple_animal/hostile/human/zombie.dm
index 6f1db7aaf996..7a12465b98bb 100644
--- a/code/modules/mob/living/simple_animal/hostile/zombie.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/zombie.dm
@@ -1,4 +1,4 @@
-/mob/living/simple_animal/hostile/zombie
+/mob/living/simple_animal/hostile/human/zombie
name = "Shambling Corpse"
desc = "When there is no more room in hell, the dead will walk in outer space."
icon = 'icons/mob/simple_human.dmi'
@@ -19,16 +19,17 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
status_flags = CANPUSH
+ loot = list()
del_on_death = 1
var/zombiejob = "Medical Doctor"
var/infection_chance = 0
var/obj/effect/mob_spawn/human/corpse/delayed/corpse
-/mob/living/simple_animal/hostile/zombie/Initialize(mapload)
+/mob/living/simple_animal/hostile/human/zombie/Initialize(mapload)
. = ..()
INVOKE_ASYNC(src, PROC_REF(setup_visuals))
-/mob/living/simple_animal/hostile/zombie/proc/setup_visuals()
+/mob/living/simple_animal/hostile/human/zombie/proc/setup_visuals()
var/datum/preferences/dummy_prefs = new
dummy_prefs.pref_species = new /datum/species/zombie
dummy_prefs.randomise[RANDOM_BODY] = TRUE
@@ -48,17 +49,17 @@
corpse.mob_species = /datum/species/zombie
corpse.mob_name = name
-/mob/living/simple_animal/hostile/zombie/AttackingTarget()
+/mob/living/simple_animal/hostile/human/zombie/AttackingTarget()
. = ..()
if(. && ishuman(target) && prob(infection_chance))
try_to_zombie_infect(target)
-/mob/living/simple_animal/hostile/zombie/drop_loot()
+/mob/living/simple_animal/hostile/human/zombie/drop_loot()
. = ..()
corpse.forceMove(drop_location())
corpse.create()
-/mob/living/simple_animal/hostile/zombie/kudzu
+/mob/living/simple_animal/hostile/human/zombie/kudzu
name = "shambling bramble"
desc = "A shambling mass of vibrant vines and rotting flesh. "
melee_damage_lower = 15
diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
index cf8a32af157c..2a60b3c52fc2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
@@ -18,7 +18,7 @@ Featuring:
*/
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot
name = "Syndicate Mecha Pilot"
desc = "Death to Nanotrasen. This variant comes in MECHA DEATH flavour."
wanted_objects = list()
@@ -36,15 +36,15 @@ Featuring:
var/smoke_chance = 20 //Chance to deploy smoke for crowd control
var/retreat_chance = 40 //Chance to run away
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/no_mech
spawn_mecha_type = null
search_objects = 2
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/no_mech/Initialize()
. = ..()
wanted_objects = typecacheof(/obj/mecha/combat, TRUE)
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path.
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path.
name = "\improper Nanotrasen Mecha Pilot"
desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour."
icon_living = "nanotrasen"
@@ -52,7 +52,7 @@ Featuring:
faction = list("nanotrasen")
spawn_mecha_type = /obj/mecha/combat/marauder/loaded
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/no_mech/nanotrasen
name = "\improper Nanotrasen Mecha Pilot"
desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour."
icon_living = "nanotrasen"
@@ -60,7 +60,7 @@ Featuring:
faction = list("nanotrasen")
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/Initialize()
. = ..()
if(spawn_mecha_type)
var/obj/mecha/M = new spawn_mecha_type (get_turf(src))
@@ -68,7 +68,7 @@ Featuring:
INVOKE_ASYNC(src, PROC_REF(enter_mecha), M)
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/mecha/M)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/enter_mecha(obj/mecha/M)
if(!M)
return 0
LoseTarget() //Target was our mecha, so null it out
@@ -93,7 +93,7 @@ Featuring:
mecha.lights_action.Activate()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/mecha/M)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/exit_mecha(obj/mecha/M)
if(!M)
return 0
@@ -116,7 +116,7 @@ Featuring:
walk(M,0)//end any lingering movement loops, to prevent the haunted mecha bug
//Checks if a mecha is valid for theft
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/mecha/M)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/is_valid_mecha(obj/mecha/M)
if(!M)
return 0
if(M.occupant)
@@ -128,7 +128,7 @@ Featuring:
return 1
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_face_target(atom/A)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/mecha_face_target(atom/A)
if(mecha)
var/dirto = get_dir(mecha,A)
if(mecha.dir != dirto) //checking, because otherwise the mecha makes too many turn noises
@@ -136,7 +136,7 @@ Featuring:
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_reload()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/mecha_reload()
if(mecha)
for(var/equip in mecha.equipment)
var/obj/item/mecha_parts/mecha_equipment/ME = equip
@@ -144,7 +144,7 @@ Featuring:
ME.rearm()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED)
. = list()
if(mecha)
for(var/equip in mecha.equipment)
@@ -156,7 +156,7 @@ Featuring:
//Pick a ranged weapon/tool
//Fire it
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/OpenFire(atom/A)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/OpenFire(atom/A)
if(mecha)
mecha_reload()
mecha_face_target(A)
@@ -171,7 +171,7 @@ Featuring:
..()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/AttackingTarget()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/AttackingTarget()
if(mecha)
var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_MELEE)
if(possible_weapons.len)
@@ -198,7 +198,7 @@ Featuring:
return target.attack_animal(src)
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/handle_automated_action()
if(..())
if(!mecha)
for(var/obj/mecha/combat/C in range(src,vision_range))
@@ -245,12 +245,12 @@ Featuring:
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/death(gibbed)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/death(gibbed)
if(mecha)
mecha.aimob_exit_mech(src)
..()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/gib()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/gib()
if(mecha)
mecha.aimob_exit_mech(src)
..()
@@ -258,7 +258,7 @@ Featuring:
//Yes they actually try and pull this shit
//~simple animals~
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/CanAttack(atom/the_target)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/CanAttack(atom/the_target)
if(ismecha(the_target))
var/obj/mecha/M = the_target
if(mecha)
@@ -275,19 +275,19 @@ Featuring:
. = ..()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/EscapeConfinement()
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/EscapeConfinement()
if(mecha && loc == mecha)
return 0
..()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Move(NewLoc,Dir=0,step_x=0,step_y=0)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/Move(NewLoc,Dir=0,step_x=0,step_y=0)
if(mecha && loc == mecha)
return mecha.relaymove(src, Dir)
return ..()
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Goto(target, delay, minimum_distance)
+/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/Goto(target, delay, minimum_distance)
if(mecha)
walk_to(mecha, target, minimum_distance, mecha.step_in)
else
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
index 5bdc5c882214..63519d29c7cd 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -41,7 +41,7 @@ Difficulty: Medium
ranged_cooldown_time = 16
pixel_x = -16
base_pixel_x = -16
- crusher_loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator, /obj/item/crusher_trophy/miner_eye)
+ //mob_trophy = /obj/item/mob_trophy/miner_eye
loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator)
wander = FALSE
del_on_death = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index d62d695e1be7..1a0bbc10fac4 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -56,7 +56,7 @@ Difficulty: Hard
pixel_x = -32
base_pixel_x = -32
del_on_death = TRUE
- crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher)
+ //mob_trophy = /obj/item/mob_trophy/demon_claws
loot = list(/obj/structure/closet/crate/necropolis/bubblegum)
blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME
var/charging = FALSE
@@ -504,7 +504,7 @@ Difficulty: Hard
health = 1
maxHealth = 1
alpha = 127.5
- crusher_loot = null
+ mob_trophy = null
loot = null
achievement_type = null
crusher_achievement_type = null
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
index cca8a649353f..3a4506b62562 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
@@ -21,7 +21,6 @@
ranged = TRUE
speed = 4
move_to_delay = 4
- crusher_loot = list(/obj/item/card/id/ert/deathsquad, /obj/item/documents/nanotrasen)
loot = list(/obj/item/card/id/ert/deathsquad, /obj/item/documents/nanotrasen)
wander = FALSE
blood_volume = BLOOD_VOLUME_NORMAL
@@ -59,8 +58,8 @@
speed = 5
move_to_delay = 5
speak_emote = list("verbalizes")
- crusher_loot = list(/obj/effect/spawner/clawloot)
- loot = list(/obj/effect/spawner/clawloot/crusher)
+ mob_trophy = /obj/item/nullrod/armblade/tentacle
+ loot = list(/obj/effect/spawner/clawloot)
health = 2250
maxHealth = 2250
shouldnt_move = TRUE //we want to show the transforming animation
@@ -76,9 +75,6 @@
new /obj/item/gun/energy/pulse/pistol(get_turf(src))
qdel(src)
-/obj/effect/spawner/clawloot/crusher/spawn_loot()
- new /obj/item/nullrod/armblade/tentacle(get_turf(src)) //idk what to put here, memed is the loot person
- return ..()
///LOOT END
//PHASE ONE
@@ -319,3 +315,102 @@
empulse(src, 5, 8)
new /obj/effect/gibspawner/human(get_turf(src))
qdel(src)
+
+/obj/projectile/tentacle
+ name = "tentacle"
+ icon_state = "tentacle_end"
+ pass_flags = PASSTABLE
+ damage = 0
+ damage_type = BRUTE
+ range = 8
+ hitsound = 'sound/weapons/thudswoosh.ogg'
+ var/chain
+
+/obj/projectile/tentacle/fire(setAngle)
+ if(firer)
+ chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE)
+ ..()
+
+/obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H)
+ if(H.throw_mode)
+ H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item
+
+/obj/projectile/tentacle/proc/tentacle_grab(mob/living/carbon/human/H, mob/living/carbon/C)
+ if(H.Adjacent(C))
+ if(H.get_active_held_item() && !H.get_inactive_held_item())
+ H.swap_hand()
+ if(H.get_active_held_item())
+ return
+ C.grabbedby(H)
+ C.grippedby(H, instant = TRUE) //instant aggro grab
+
+/obj/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C)
+ if(H.Adjacent(C))
+ for(var/obj/item/I in H.held_items)
+ if(I.get_sharpness())
+ C.visible_message("[H] impales [C] with [H.p_their()] [I.name]!", "[H] impales you with [H.p_their()] [I.name]!")
+ C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST)
+ H.do_item_attack_animation(C, used_item = I)
+ H.add_mob_blood(C)
+ playsound(get_turf(H),I.hitsound,75,TRUE)
+ return
+
+/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE)
+ var/mob/living/carbon/human/H = firer
+ if(blocked >= 100)
+ return BULLET_ACT_BLOCK
+ if(isitem(target))
+ var/obj/item/I = target
+ if(!I.anchored)
+ to_chat(firer, "You pull [I] towards yourself.")
+ H.throw_mode_on()
+ I.throw_at(H, 10, 2)
+ . = BULLET_ACT_HIT
+
+ else if(isliving(target))
+ var/mob/living/L = target
+ if(!L.anchored && !L.throwing)//avoid double hits
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ var/firer_intent = INTENT_HARM
+ var/mob/M = firer
+ if(istype(M))
+ firer_intent = M.a_intent
+ switch(firer_intent)
+ if(INTENT_HELP)
+ C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!")
+ C.throw_at(get_step_towards(H,C), 8, 2)
+ return BULLET_ACT_HIT
+
+ if(INTENT_DISARM)
+ var/obj/item/I = C.get_active_held_item()
+ if(I)
+ if(C.dropItemToGround(I))
+ C.visible_message("[I] is yanked off [C]'s hand by [src]!","A tentacle pulls [I] away from you!")
+ on_hit(I) //grab the item as if you had hit it directly with the tentacle
+ return BULLET_ACT_HIT
+ else
+ to_chat(firer, "You can't seem to pry [I] off [C]'s hands!")
+ return BULLET_ACT_BLOCK
+ else
+ to_chat(firer, "[C] has nothing in hand to disarm!")
+ return BULLET_ACT_HIT
+
+ if(INTENT_GRAB)
+ C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!")
+ C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C))
+ return BULLET_ACT_HIT
+
+ if(INTENT_HARM)
+ C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!")
+ C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_stab), H, C))
+ return BULLET_ACT_HIT
+ else
+ L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!")
+ L.throw_at(get_step_towards(H,L), 8, 2)
+ . = BULLET_ACT_HIT
+
+/obj/projectile/tentacle/Destroy()
+ qdel(chain)
+ return ..()
+
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index bd09f06f3521..863abf56dad1 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -50,7 +50,7 @@ Difficulty: Very Hard
achievement_type = /datum/award/achievement/boss/colossus_kill
crusher_achievement_type = /datum/award/achievement/boss/colossus_crusher
score_achievement_type = /datum/award/score/colussus_score
- crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher)
+ //mob_trophy = /obj/item/mob_trophy/blaster_tubes
loot = list(/obj/structure/closet/crate/necropolis/colossus)
deathmessage = "disintegrates, leaving a glowing core in its wake."
deathsound = 'sound/magic/demon_dies.ogg'
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm
index 96fbc8b5c4ec..08ef1a7b21cb 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm
@@ -24,7 +24,7 @@
vision_range = 10
damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5)
loot = list(/obj/item/claymore/cursed, /obj/item/clothing/suit/space/hardsuit/cult/enchanted)
- crusher_loot = list(/obj/item/claymore/cursed, /obj/item/clothing/suit/space/hardsuit/cult/enchanted, /obj/item/upgradescroll)
+ mob_trophy = list(/obj/item/claymore/cursed, /obj/item/clothing/suit/space/hardsuit/cult/enchanted, /obj/item/upgradescroll)
wander = FALSE
del_on_death = TRUE
blood_volume = BLOOD_VOLUME_NORMAL
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
index 14849bb58014..00a32a8dc449 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
@@ -28,7 +28,7 @@ Difficulty: Extremely Hard
speed = 20
move_to_delay = 20
ranged = TRUE
- crusher_loot = list(/obj/effect/decal/remains/plasma, /obj/item/crusher_trophy/ice_block_talisman)
+ //mob_trophy = /obj/item/mob_trophy/ice_block_talisman
loot = list(/obj/effect/decal/remains/plasma)
wander = FALSE
del_on_death = TRUE
@@ -323,47 +323,3 @@ Difficulty: Extremely Hard
mineral_scan_pulse(T, world.view + 1)
. = ..()
-/obj/item/crusher_trophy/ice_block_talisman
- name = "ice block talisman"
- desc = "A glowing trinket that a demonic miner had on him, it seems he couldn't utilize it for whatever reason."
- icon_state = "ice_trap_talisman"
- denied_type = /obj/item/crusher_trophy/ice_block_talisman
-
-/obj/item/crusher_trophy/ice_block_talisman/effect_desc()
- return "waveform collapse to freeze a creature in a block of ice for a period, preventing them from moving"
-
-/obj/item/crusher_trophy/ice_block_talisman/on_mark_detonation(mob/living/target, mob/living/user)
- target.apply_status_effect(/datum/status_effect/ice_block_talisman)
-
-/datum/status_effect/ice_block_talisman
- id = "ice_block_talisman"
- duration = 40
- status_type = STATUS_EFFECT_REFRESH
- alert_type = /atom/movable/screen/alert/status_effect/ice_block_talisman
- /// Stored icon overlay for the hit mob, removed when effect is removed
- var/icon/cube
-
-/atom/movable/screen/alert/status_effect/ice_block_talisman
- name = "Frozen Solid"
- desc = "You're frozen inside an ice cube, and cannot move!"
- icon_state = "frozen"
-
-/datum/status_effect/ice_block_talisman/on_apply()
- RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(owner_moved))
- if(!owner.stat)
- to_chat(owner, "You become frozen in a cube!")
- cube = icon('icons/effects/freeze.dmi', "ice_cube")
- var/icon/size_check = icon(owner.icon, owner.icon_state)
- cube.Scale(size_check.Width(), size_check.Height())
- owner.add_overlay(cube)
- return ..()
-
-/// Blocks movement from the status effect owner
-/datum/status_effect/ice_block_talisman/proc/owner_moved()
- return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
-
-/datum/status_effect/ice_block_talisman/on_remove()
- if(!owner.stat)
- to_chat(owner, "The cube melts!")
- owner.cut_overlay(cube)
- UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 6fcf5ada7f4a..b7a2f0912653 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -54,10 +54,10 @@ Difficulty: Medium
ranged = TRUE
pixel_x = -32
base_pixel_x = -32
- crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher)
+ //mob_trophy = /obj/item/mob_trophy/ash_spike
loot = list(/obj/structure/closet/crate/necropolis/dragon)
butcher_results = list(/obj/item/gem/amber = 1, /obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
- guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/crusher_trophy/ash_spike = 1)
+ guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/ashdrake = 10)
var/swooping = NONE
var/player_cooldown = 0
var/dungeon = FALSE //if true, on death will spawn a ghost role at a lank mark and open blast doors with a certain id
@@ -583,7 +583,7 @@ Difficulty: Medium
mouse_opacity = MOUSE_OPACITY_ICON
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
loot = list()
- crusher_loot = list()
+ mob_trophy = list()
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
attack_action_types = list()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 4df97bac4a6f..ba112bbf5e72 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -59,7 +59,7 @@ Difficulty: Hard
ranged_cooldown_time = 40
aggro_vision_range = 21 //so it can see to one side of the arena to the other
loot = list(/obj/item/hierophant_club)
- crusher_loot = list(/obj/item/hierophant_club, /obj/item/crusher_trophy/vortex_talisman)
+ //mob_trophy = /obj/item/mob_trophy/vortex_talisman
wander = FALSE
gps_name = "Zealous Signal"
achievement_type = /datum/award/achievement/boss/hierophant_kill
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index 120b850cf428..37934c0367e5 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -28,7 +28,7 @@
layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway
flags_1 = PREVENT_CONTENTS_EXPLOSION_1
- var/list/crusher_loot
+ var/mob_trophy
var/achievement_type
var/crusher_achievement_type
var/score_achievement_type
@@ -71,10 +71,10 @@
if(health > 0)
return
else
- var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
+ spawn_mob_trophy()
+ var/datum/status_effect/crusher_damage/crusher = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
var/crusher_kill = FALSE
- if(C && crusher_loot && C.total_damage >= maxHealth * 0.6)
- spawn_crusher_loot()
+ if(crusher && mob_trophy && crusher.total_damage >= maxHealth * 0.6)
crusher_kill = TRUE
if(true_spawn && !(flags_1 & ADMIN_SPAWNED_1))
var/tab = "megafauna_kills"
@@ -85,8 +85,8 @@
SSblackbox.record_feedback("tally", tab, 1, "[initial(name)]")
..()
-/mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot()
- loot = crusher_loot
+/mob/living/simple_animal/hostile/megafauna/proc/spawn_mob_trophy()
+ loot += mob_trophy
/mob/living/simple_animal/hostile/megafauna/gib()
if(health > 0)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
index a2cceb5a3aaa..0c13b9d67f16 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
@@ -39,7 +39,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
for(var/t in swarmerTypes)
. += GLOB.AISwarmerCapsByType[t]
-
+//this should. not be a simple mob i think
/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon
name = "swarmer beacon"
desc = "That name is a bit of a mouthful, but stop paying attention to your mouth they're eating everything!"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
index 59a58bd48d16..095ad0f8fca2 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
@@ -32,7 +32,7 @@ Difficulty: Hard
loot = list()
butcher_results = list()
guaranteed_butcher_results = list(/obj/item/wendigo_blood = 1)
- crusher_loot = list(/obj/item/crusher_trophy/demon_claws)
+ //mob_trophy = /obj/item/mob_trophy/demon_claws
wander = FALSE
del_on_death = FALSE
blood_volume = BLOOD_VOLUME_NORMAL
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index ca595d4d682f..0568533c1e0c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -205,7 +205,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/ranged
var/obj/item/gun/TrueGun = null
- var/obj/item/gun/magic/Zapstick
var/obj/item/gun/ballistic/Pewgun
var/obj/item/gun/energy/Zapgun
@@ -223,10 +222,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
move_to_delay = 2 * G.w_class + 1
projectilesound = G.fire_sound
TrueGun = G
- if(istype(G, /obj/item/gun/magic))
- Zapstick = G
- var/obj/item/ammo_casing/magic/M = Zapstick.ammo_type
- projectiletype = initial(M.projectile_type)
if(istype(G, /obj/item/gun/ballistic))
Pewgun = G
var/obj/item/ammo_box/magazine/M = Pewgun.mag_type
@@ -245,11 +240,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
Zapgun.cell.use(shot.e_cost)
Zapgun.update_appearance()
..()
- else if(Zapstick)
- if(Zapstick.charges)
- Zapstick.charges--
- Zapstick.update_appearance()
- ..()
else if(Pewgun)
if(Pewgun.chambered)
if(Pewgun.chambered.BB)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
index eb8302536e50..d10b9b86fb9b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -230,7 +230,7 @@
movement_type = FLYING
robust_searching = 1
attack_same = TRUE // So we'll fight basilisks
- crusher_loot = /obj/item/crusher_trophy/watcher_wing
+ //mob_trophy = /obj/item/mob_trophy/watcher_wing
gold_core_spawnable = NO_SPAWN
loot = list()
butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
@@ -294,8 +294,8 @@
light_power = 2.5
light_color = LIGHT_COLOR_LAVA
projectiletype = /obj/projectile/temp/basilisk/magmawing
- crusher_loot = /obj/item/crusher_trophy/magma_wing
- crusher_drop_mod = 75
+ //mob_trophy = /obj/item/mob_trophy/magma_wing
+ trophy_drop_mod = 75
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing
name = "icewing watcher"
@@ -309,8 +309,8 @@
ranged_cooldown_time = 20
projectiletype = /obj/projectile/temp/basilisk/icewing
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) //No sinew; the wings are too fragile to be usable
- crusher_loot = /obj/item/crusher_trophy/ice_wing
- crusher_drop_mod = 75
+ //mob_trophy = /obj/item/mob_trophy/ice_wing
+ trophy_drop_mod = 75
/obj/projectile/temp/basilisk/magmawing
name = "scorching blast"
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
index 1d9f6e174660..815bfca00028 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
@@ -37,7 +37,7 @@
light_color = LIGHT_COLOR_BLOOD_MAGIC
light_power = 5
light_range = 1.4
- crusher_loot = /obj/item/crusher_trophy/brimdemon_fang
+ //mob_trophy = /obj/item/mob_trophy/brimdemon_fang
/// Are we charging/firing? If yes stops our movement.
var/firing = FALSE
/// A list of all the beam parts.
@@ -184,22 +184,6 @@
hit_mob.adjustFireLoss(5)
to_chat(hit_mob, span_danger("You're damaged by [src]!"))
-/obj/item/crusher_trophy/brimdemon_fang
- name = "brimdemon's fang"
- icon_state = "brimdemon_fang"
- desc = "A fang from a brimdemon's corpse."
- denied_type = /obj/item/crusher_trophy/brimdemon_fang
- var/static/list/comic_phrases = list("BOOM", "BANG", "KABLOW", "KAPOW", "OUCH", "BAM", "KAPOW", "WHAM", "POW", "KABOOM")
- var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
-
-/obj/item/crusher_trophy/brimdemon_fang/effect_desc()
- return "mark detonation creates audiosensory effects on the target and slightly heals the wielder"
-
-/obj/item/crusher_trophy/brimdemon_fang/on_mark_detonation(mob/living/target, mob/living/user)
- target.balloon_alert_to_viewers("[pick(comic_phrases)]!")
- playsound(target, 'sound/creatures/brimdemon_crush.ogg', 100)
- user.heal_ordered_damage(bonus_value * 0.4, damage_heal_order)
-
/obj/effect/decal/cleanable/brimdust
name = "brimdust"
desc = "Dust from a brimdemon. It is considered valuable for botanical and heating purposes."
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
index 7e2b1c3d990c..cb7eaad0e988 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
@@ -43,7 +43,7 @@
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
deathmessage = "explodes into gore!"
- loot_drop = /obj/item/crusher_trophy/broodmother_tongue
+ //loot_drop = /obj/item/mob_trophy/broodmother_tongue
attack_action_types = list(/datum/action/innate/elite_attack/tentacle_patch,
/datum/action/innate/elite_attack/spawn_children,
@@ -246,22 +246,6 @@
T = get_step(T, i)
new /obj/effect/temp_visual/goliath_tentacle/broodmother(T, spawner)
-// Broodmother's loot: Broodmother Tongue
-/obj/item/crusher_trophy/broodmother_tongue
- name = "broodmother tongue"
- desc = "The tongue of a broodmother. If attached a certain way, makes for a suitable crusher trophy."
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- icon_state = "broodmother_tongue"
- denied_type = /obj/item/crusher_trophy/broodmother_tongue
- bonus_value = 35
-
-/obj/item/crusher_trophy/broodmother_tongue/effect_desc()
- return "waveform collapse to have a [bonus_value]% chance to summon a patch of goliath tentacles at the target's location"
-
-/obj/item/crusher_trophy/broodmother_tongue/on_mark_detonation(mob/living/target, mob/living/user)
- if(rand(1, 100) <= bonus_value && target.stat != DEAD)
- new /obj/effect/temp_visual/goliath_tentacle/broodmother/patch(get_turf(target), user)
-
/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/rockplanet
name = "baby gruboid"
desc = "A young gruboid recently born. As a defense mechanism, they violently explode if killed."
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
index f0b6dc3e8d54..e6ea404aca09 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
@@ -38,7 +38,7 @@
mouse_opacity = MOUSE_OPACITY_ICON
deathsound = 'sound/magic/curse.ogg'
deathmessage = "'s arms reach out before it falls apart onto the floor, lifeless."
- loot_drop = /obj/item/crusher_trophy/legionnaire_spine
+ loot_drop = /obj/item/mob_trophy/legionnaire_spine
attack_action_types = list(/datum/action/innate/elite_attack/legionnaire_charge,
/datum/action/innate/elite_attack/head_detach,
@@ -278,23 +278,8 @@
transform *= 0.33
// Legionnaire's loot: Legionnaire Spine
-
-/obj/item/crusher_trophy/legionnaire_spine
+/obj/item/mob_trophy/legionnaire_spine
name = "legionnaire spine"
desc = "The spine of a legionnaire. It almost feels like it's moving..."
icon = 'icons/obj/lavaland/elite_trophies.dmi'
icon_state = "legionnaire_spine"
- denied_type = /obj/item/crusher_trophy/legionnaire_spine
- bonus_value = 50//These skulls are a joke, so this bonus value had to be put on steroidal emergency treatment
-
-/obj/item/crusher_trophy/legionnaire_spine/effect_desc()
- return "waveform collapse to have a [bonus_value]% chance to summon a loyal legion skull"
-
-/obj/item/crusher_trophy/legionnaire_spine/on_mark_detonation(mob/living/target, mob/living/user)
- if(!rand(1, 100) <= bonus_value || target.stat == DEAD)
- return
- var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(user.loc)
- A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1)
- A.GiveTarget(target)
- A.friends = user
- A.faction = user.faction.Copy()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index ce3850d22f01..d8aedc292ca0 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -147,7 +147,7 @@
icon_dead = "goliath_dead"
throw_message = "does nothing to the tough hide of the"
pre_attack_icon = "goliath_preattack"
- crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
+ //mob_trophy = /obj/item/mob_trophy/goliath_tentacle
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/bone = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/ore/silver = 10)
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 2)
loot = list()
@@ -249,11 +249,11 @@
maxHealth = 180
health = 180
speed = 4
- crusher_loot = /obj/item/crusher_trophy/elder_tentacle
+ //mob_trophy = /obj/item/mob_trophy/elder_tentacle
pre_attack_icon = "ancient_goliath_preattack"
throw_message = "does nothing to the rocky hide of the"
guaranteed_butcher_results = list()
- crusher_drop_mod = 75
+ trophy_drop_mod = 75
wander = FALSE
bonus_tame_chance = 10
var/list/cached_tentacle_turfs
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index b602e948af98..d637b19a2a08 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -50,8 +50,8 @@
OpenFire()
return TRUE
-/mob/living/simple_animal/hostile/asteroid/hivelord/spawn_crusher_loot()
- loot += crusher_loot //we don't butcher
+/mob/living/simple_animal/hostile/asteroid/hivelord/spawn_mob_trophy()
+ loot += mob_trophy //we don't butcher
/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed)
mouse_opacity = MOUSE_OPACITY_ICON
@@ -119,7 +119,7 @@
throw_message = "bounces harmlessly off of"
loot = list(/obj/item/organ/regenerative_core/legion)
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
- crusher_loot = /obj/item/crusher_trophy/legion_skull
+ mob_trophy = /obj/item/mob_trophy/legion_skull
del_on_death = 1
stat_attack = HARD_CRIT
robust_searching = 1
@@ -131,7 +131,7 @@
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
if(prob(15))
- new /obj/item/crusher_trophy/legion_skull(loc)
+ new /obj/item/mob_trophy/legion_skull(loc)
visible_message("One of the [src]'s skulls looks intact.")
..()
@@ -150,7 +150,7 @@
icon_living = "dwarf_legion"
icon_aggro = "dwarf_legion"
icon_dead = "dwarf_legion"
- crusher_loot = /obj/item/crusher_trophy/dwarf_skull
+ //mob_trophy = /obj/item/mob_trophy/dwarf_skull
maxHealth = 150
health = 150
move_to_delay = 2
@@ -182,9 +182,6 @@
move_force = MOVE_FORCE_DEFAULT
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
- if(prob(75))
- new /obj/item/crusher_trophy/dwarf_skull(loc)
- visible_message("One of the [src]'s skulls looks like it survived.")
..()
//Legion skull
@@ -316,14 +313,9 @@
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
visible_message("[src] falls over with a mighty crash, the remaining legions within it falling apart!")
- new /obj/item/crusher_trophy/legion_skull(loc)
- new /obj/item/crusher_trophy/legion_skull(loc)
- new /obj/item/crusher_trophy/legion_skull(loc)
new /mob/living/simple_animal/hostile/asteroid/hivelord/legion(loc)
new /mob/living/simple_animal/hostile/asteroid/hivelord/legion(loc)
new /mob/living/simple_animal/hostile/asteroid/hivelord/legion(loc)
- if(prob(45))
- new /obj/item/reagent_containers/glass/bottle/necropolis_seed(loc)
..(gibbed)
/mob/living/simple_animal/hostile/big_legion/Initialize()
@@ -339,7 +331,7 @@
icon_living = "snowlegion"
icon_aggro = "snowlegion_alive"
icon_dead = "snowlegion"
- crusher_loot = /obj/item/crusher_trophy/legion_skull
+ mob_trophy = /obj/item/mob_trophy/legion_skull
loot = list(/obj/item/organ/regenerative_core/legion)
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow
@@ -403,521 +395,38 @@
/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize() //in an ideal world, these would generate, the legion would overlay over the corpse, and we'd get cool sprites
mob_species = pickweight(list(
- /datum/species/human = 31,
- /datum/species/lizard = 26,
- /datum/species/ethereal = 24,
- /datum/species/spider = 7,
- /datum/species/ipc = 7,
- /datum/species/jelly = 4,
- /datum/species/fly = 1
+ /datum/species/human = 50,
+ /datum/species/lizard = 20,
+ /datum/species/ipc = 10,
+ /datum/species/elzuose = 10,
+ /datum/species/moth = 5,
+ /datum/species/spider = 5
)
)
var/type = pickweight(list(
- "Miner" = 44,
- "Waldo" = 3,
- "Ashwalker" = 7,
- "Soldier" = 5,
- "Oldminer" = 8,
- "Kobold" = 5,
- "SRM" = 6,
- "Operative" = 5,
- pick("Shadow", "YeOlde") = 4
+ "Miner" = 40,
+ "Assistant" = 10,
+ "Engineer" = 5,
+ "Doctor" = 5,
+ "Scientist" = 5,
+ "Cargo" = 5,
+ "Security" = 5
)
)
+
switch(type)
if("Miner")
- if(prob(2))
- mob_species = /datum/species/plasmaman
- uniform = /obj/item/clothing/under/plasmaman
- head = /obj/item/clothing/head/helmet/space/plasmaman
- belt = /obj/item/tank/internals/plasmaman/belt
- else
- uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland
- if (prob(4))
- belt = pickweight(list(
- /obj/item/storage/belt/mining = 2,
- /obj/item/storage/belt/mining/alt = 2
- )
- )
- else if(prob(10))
- belt = pickweight(list(
- /obj/item/pickaxe = 8,
- /obj/item/pickaxe/mini = 4,
- /obj/item/pickaxe/silver = 2,
- /obj/item/pickaxe/diamond = 1,
- /obj/item/gun/energy/kinetic_accelerator = 1
- )
- )
- else
- belt = /obj/item/tank/internals/emergency_oxygen/engi
- if(mob_species != /datum/species/lizard)
- shoes = /obj/item/clothing/shoes/workboots/mining
- gloves = /obj/item/clothing/gloves/color/black
- mask = /obj/item/clothing/mask/gas/explorer
- if(prob(45))
- glasses = /obj/item/clothing/glasses/meson
- if(prob(20))
- suit = pickweight(list(
- /obj/item/clothing/suit/hooded/explorer = 18,
- /obj/item/clothing/suit/hooded/cloak/goliath = 2
- )
- )
- if(prob(30))
- r_pocket = pickweight(list(
- /obj/item/stack/marker_beacon = 20,
- /obj/item/spacecash/bundle/mediumrand = 7,
- /obj/item/reagent_containers/hypospray/medipen/survival = 2,
- /obj/item/borg/upgrade/modkit/damage = 1
- )
- )
- if(prob(10))
- l_pocket = pickweight(list(
- /obj/item/spacecash/bundle/mediumrand = 7,
- /obj/item/reagent_containers/hypospray/medipen/survival = 2,
- /obj/item/borg/upgrade/modkit/cooldown = 1
- )
- )
- if(prob(95))
- back = /obj/item/storage/backpack/explorer
- backpack_contents = list(/obj/item/radio)
- if(prob(70))
- backpack_contents += pickweight(list(
- /obj/item/borg/upgrade/modkit/damage = 1,
- /obj/item/borg/upgrade/modkit/trigger_guard = 1,
- /obj/item/soap/nanotrasen = 1,
- /obj/item/wormhole_jaunter = 1,
- /obj/item/fulton_core = 1,
- /obj/item/extraction_pack = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 3,
- /obj/item/hivelordstabilizer = 2,
- /obj/item/stack/marker_beacon/ten = 2,
- /obj/item/mining_scanner = 2,
- /obj/item/extinguisher/mini = 2,
- /obj/item/kitchen/knife/combat/survival = 3,
- /obj/item/flashlight/seclite=3,
- /obj/item/stack/sheet/sinew = 3,
- /obj/item/stack/sheet/bone = 3
- )
- )
- if(prob(70))
- backpack_contents += pickweight(list(
- /obj/item/borg/upgrade/modkit/damage = 1,
- /obj/item/borg/upgrade/modkit/trigger_guard = 1,
- /obj/item/soap/nanotrasen = 1,
- /obj/item/wormhole_jaunter = 1,
- /obj/item/fulton_core = 1,
- /obj/item/extraction_pack = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 3,
- /obj/item/hivelordstabilizer = 2,
- /obj/item/stack/marker_beacon/ten = 2,
- /obj/item/mining_scanner = 2,
- /obj/item/extinguisher/mini = 2,
- /obj/item/kitchen/knife/combat/survival = 3,
- /obj/item/flashlight/seclite = 3,
- /obj/item/stack/sheet/sinew = 3,
- /obj/item/stack/sheet/bone = 3
- )
- )
- if(prob(70))
- backpack_contents += pickweight(list(
- /obj/item/borg/upgrade/modkit/damage = 1,
- /obj/item/borg/upgrade/modkit/trigger_guard = 1,
- /obj/item/soap/nanotrasen = 1,
- /obj/item/wormhole_jaunter = 1,
- /obj/item/fulton_core = 1,
- /obj/item/extraction_pack = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 3,
- /obj/item/hivelordstabilizer = 2,
- /obj/item/stack/marker_beacon/ten = 2,
- /obj/item/mining_scanner = 2,
- /obj/item/extinguisher/mini = 2,
- /obj/item/kitchen/knife/combat/survival = 3,
- /obj/item/flashlight/seclite = 3,
- /obj/item/stack/sheet/sinew = 3,
- /obj/item/stack/sheet/bone = 3
- )
- )
- if(prob(30))
- backpack_contents += list(
- /obj/item/reagent_containers/hypospray/medipen/survival = pickweight(list(
- 1 = 3,
- 2 = 2,
- 3 = 1
- )
- )
- )
- else
- back = /obj/item/kinetic_crusher
- if("Oldminer")
- suit = /obj/item/clothing/suit/hooded/explorer/old
- mask = /obj/item/clothing/mask/gas/explorer/old
- if(prob(95))
- glasses = /obj/item/clothing/glasses/meson
- else
- glasses = /obj/item/clothing/glasses/meson/night
- suit_store = /obj/item/tank/internals/oxygen
- gloves = /obj/item/clothing/gloves/explorer/old
- uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland/old
- if(prob(85))
- back = /obj/item/storage/backpack/explorer //someone could totally make these backpacks a subtype and just have them be there. It'd cut down this file size a bit.
- backpack_contents = list()
- if(prob(70))
- backpack_contents += pickweight(list(
- /obj/item/borg/upgrade/modkit/damage = 1,
- /obj/item/borg/upgrade/modkit/trigger_guard = 1,
- /obj/item/soap/nanotrasen = 1,
- /obj/item/wormhole_jaunter = 1,
- /obj/item/fulton_core = 1,
- /obj/item/extraction_pack = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 3,
- /obj/item/hivelordstabilizer = 2,
- /obj/item/stack/marker_beacon/ten = 2,
- /obj/item/mining_scanner = 2,
- /obj/item/extinguisher/mini = 2,
- /obj/item/kitchen/knife/combat/survival = 3,
- /obj/item/flashlight/seclite=3,
- /obj/item/stack/sheet/sinew = 3,
- /obj/item/stack/sheet/bone = 3
- )
- )
- if(prob(70))
- backpack_contents += pickweight(list(
- /obj/item/borg/upgrade/modkit/damage = 1,
- /obj/item/borg/upgrade/modkit/trigger_guard = 1,
- /obj/item/soap/nanotrasen = 1,
- /obj/item/wormhole_jaunter = 1,
- /obj/item/fulton_core = 1,
- /obj/item/extraction_pack = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 3,
- /obj/item/hivelordstabilizer = 2,
- /obj/item/stack/marker_beacon/ten = 2,
- /obj/item/mining_scanner = 2,
- /obj/item/extinguisher/mini = 2,
- /obj/item/kitchen/knife/combat/survival = 3,
- /obj/item/flashlight/seclite=3,
- /obj/item/stack/sheet/sinew = 3,
- /obj/item/stack/sheet/bone = 3
- )
- )
- if(prob(70))
- backpack_contents += pickweight(list(
- /obj/item/borg/upgrade/modkit/damage = 1,
- /obj/item/borg/upgrade/modkit/trigger_guard = 1,
- /obj/item/soap/nanotrasen = 1,
- /obj/item/wormhole_jaunter = 1,
- /obj/item/fulton_core = 1,
- /obj/item/extraction_pack = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 3,
- /obj/item/hivelordstabilizer = 2,
- /obj/item/stack/marker_beacon/ten = 2,
- /obj/item/mining_scanner = 2,
- /obj/item/extinguisher/mini = 2,
- /obj/item/kitchen/knife/combat/survival = 3,
- /obj/item/flashlight/seclite=3,
- /obj/item/stack/sheet/sinew = 3,
- /obj/item/stack/sheet/bone = 3
- )
- )
- if(prob(30))
- backpack_contents += list(
- /obj/item/reagent_containers/hypospray/medipen/survival = pickweight(list(
- 1 = 3,
- 2 = 2,
- 3 = 1
- )
- )
- )
- else
- back = /obj/item/kinetic_crusher/old
- if(prob(30))
- belt = /obj/item/gun/energy/kinetic_accelerator/old
- if(prob(30))
- r_pocket = pickweight(list(
- /obj/item/stack/marker_beacon = 20,
- /obj/item/spacecash/bundle/mediumrand = 7,
- /obj/item/reagent_containers/hypospray/medipen/survival = 2,
- /obj/item/borg/upgrade/modkit/damage = 1
- )
- )
- if(prob(30))
- l_pocket = pickweight(list(
- /obj/item/spacecash/bundle/mediumrand = 5,
- /obj/item/reagent_containers/hypospray/medipen/survival = 2,
- /obj/item/borg/upgrade/modkit/cooldown = 1
- )
- )
- if("Ashwalker")
- mob_species = /datum/species/lizard/ashwalker
- uniform = /obj/item/clothing/under/costume/gladiator/ash_walker
- if(prob(95))
- head = /obj/item/clothing/head/helmet/gladiator
- else
- head = /obj/item/clothing/head/helmet/skull
- suit = /obj/item/clothing/suit/armor/bone
- gloves = /obj/item/clothing/gloves/bracer
- if(prob(45))
- back = pickweight(list(
- /obj/item/spear/bonespear = 3,
- /obj/item/fireaxe/boneaxe = 2
- )
- )
- if(prob(10))
- belt = /obj/item/storage/belt/mining/primitive
- if(prob(30))
- r_pocket = /obj/item/restraints/legcuffs/bola/watcher
- if(prob(30))
- l_pocket = /obj/item/kitchen/knife/combat/bone
- if("Soldier")
- mob_species = /datum/species/human
- if(prob(90))
- uniform = /obj/item/clothing/under/solgov
- suit = /obj/item/clothing/suit/armor/vest/bulletproof/solgov
- shoes = /obj/item/clothing/shoes/jackboots
- gloves = /obj/item/clothing/gloves/color/black
- mask = /obj/item/clothing/mask/gas/sechailer
- head = /obj/item/clothing/head/solgov/sonnensoldner
- id = /obj/item/card/id/solgov
- else
- uniform = /obj/item/clothing/under/solgov
- suit = /obj/item/clothing/suit/space/hardsuit/solgov
- shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
- mask = /obj/item/clothing/mask/gas/sechailer/swat
- id = /obj/item/card/id/solgov
- if(prob(85))
- back = /obj/item/storage/backpack
- backpack_contents = list()
- if(prob(75))
- backpack_contents += pickweight(list(
- /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 1,
- /obj/item/storage/firstaid/tactical = 1,
- /obj/item/gun/ballistic/automatic/pistol/solgov = 1,
- /obj/item/gps = 1,
- /obj/item/stock_parts/cell/gun/upgraded = 2,
- /obj/item/ammo_box/magazine/pistol556mm = 3,
- /obj/item/desk_flag/solgov = 3,
- /obj/item/stack/marker_beacon/ten = 3,
- /obj/item/detective_scanner = 2,
- /obj/item/extinguisher/mini = 3,
- /obj/item/kitchen/knife/combat = 3,
- /obj/item/flashlight/seclite=3,
- /obj/item/ammo_casing/shotgun = 3,
- /obj/item/binoculars = 3,
- /obj/item/clipboard = 3
- )
- )
- if(prob(75))
- backpack_contents += pickweight(list(
- /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 1,
- /obj/item/storage/firstaid/tactical = 1,
- /obj/item/gun/ballistic/automatic/pistol/solgov = 1,
- /obj/item/gps = 1,
- /obj/item/stock_parts/cell/gun/upgraded = 2,
- /obj/item/ammo_box/magazine/pistol556mm = 3,
- /obj/item/desk_flag/solgov = 3,
- /obj/item/stack/marker_beacon/ten = 3,
- /obj/item/detective_scanner = 2,
- /obj/item/extinguisher/mini = 3,
- /obj/item/kitchen/knife/combat = 3,
- /obj/item/flashlight/seclite=3,
- /obj/item/ammo_casing/shotgun = 3,
- /obj/item/binoculars = 3,
- /obj/item/clipboard = 3
- )
- )
- if(prob(75))
- backpack_contents += pickweight(list(
- /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 1,
- /obj/item/storage/firstaid/tactical = 1,
- /obj/item/gun/ballistic/automatic/pistol/solgov = 1,
- /obj/item/gps = 1,
- /obj/item/stock_parts/cell/gun/upgraded = 2,
- /obj/item/ammo_box/magazine/pistol556mm = 3,
- /obj/item/desk_flag/solgov = 3,
- /obj/item/stack/marker_beacon/ten = 3,
- /obj/item/detective_scanner = 2,
- /obj/item/extinguisher/mini = 3,
- /obj/item/kitchen/knife/combat = 3,
- /obj/item/flashlight/seclite=3,
- /obj/item/ammo_casing/shotgun = 3,
- /obj/item/binoculars = 3,
- /obj/item/clipboard = 3
- )
- )
- else
- back = pickweight(list(
- /obj/item/energyhalberd = 5,
- /obj/item/gun/ballistic/rocketlauncher/unrestricted = 5
- )
- )
- if(prob(25))
- belt = /obj/item/storage/belt/military
- if(prob(50))
- r_pocket = pickweight(list(
- /obj/item/reagent_containers/hypospray/medipen/stimpack = 1,
- /obj/item/kitchen/knife/letter_opener = 3,
- /obj/item/radio/off = 3,
- /obj/item/grenade/syndieminibomb/concussion = 1,
- /obj/item/melee/transforming/energy/ctf/solgov = 1
- )
- )
- if(prob(50))
- l_pocket = pickweight(list(
- /obj/item/reagent_containers/hypospray/medipen/stimpack = 1,
- /obj/item/kitchen/knife/letter_opener = 3,
- /obj/item/radio/off = 3,
- /obj/item/grenade/syndieminibomb/concussion = 1,
- /obj/item/melee/transforming/energy/ctf/solgov = 1
- )
- )
- if(prob(70))
- glasses = pickweight(list(
- /obj/item/clothing/glasses/sunglasses = 3,
- /obj/item/clothing/glasses/hud/health = 3,
- /obj/item/clothing/glasses/hud/health/night = 1,
- /obj/item/clothing/glasses/night = 2
- )
- )
- if("Kobold")
- mob_species = /datum/species/lizard/ashwalker/kobold
- uniform = /obj/item/clothing/under/costume/gladiator/ash_walker
- if(prob(95))
- head = /obj/item/clothing/head/helmet/gladiator
- else
- head = /obj/item/clothing/head/helmet/skull
- suit = /obj/item/clothing/suit/armor/bone
- gloves = /obj/item/clothing/gloves/bracer
- if(prob(5))
- back = pickweight(list(
- /obj/item/spear/bonespear = 3,
- /obj/item/fireaxe/boneaxe = 2
- )
- )
- if(prob(10))
- belt = /obj/item/storage/belt/mining/primitive
- if(prob(30))
- r_pocket = /obj/item/kitchen/knife/combat/bone
- if(prob(30))
- l_pocket = /obj/item/kitchen/knife/combat/bone
- if("YeOlde")
- mob_gender = FEMALE
- uniform = /obj/item/clothing/under/costume/maid
- gloves = /obj/item/clothing/gloves/color/white
- shoes = /obj/item/clothing/shoes/laceup
- head = /obj/item/clothing/head/helmet/knight
- suit = /obj/item/clothing/suit/armor/riot/knight
- back = /obj/item/shield/riot/buckler
- belt = /obj/item/nullrod/claymore
- r_pocket = /obj/item/tank/internals/emergency_oxygen
- mask = /obj/item/clothing/mask/breath
- if("Operative")
- id_job = "Operative"
- if(prob(40))
- outfit = /datum/outfit/syndicatecommandocorpse
- else if(prob(5))
- outfit = /datum/outfit/syndicatestormtroopercorpse
- else
- outfit = /datum/outfit/syndicateramzicorpse
- if("Waldo")//WE FINALLY FOUND HIM
- name = "Waldo"
- uniform = /obj/item/clothing/under/pants/jeans
- suit = /obj/item/clothing/suit/striped_sweater
- head = /obj/item/clothing/head/beanie/waldo
- shoes = /obj/item/clothing/shoes/sneakers/brown
- ears = /obj/item/radio/headset
- glasses = /obj/item/clothing/glasses/regular/circle
- back = /obj/item/storage/backpack/satchel/leather
- backpack_contents = list()
- if(prob(50))
- backpack_contents += pickweight(list(
- /obj/item/book/granter/spell/knock = 1,
- /obj/item/book/granter/spell/blind = 1,
- /obj/item/shadowcloak = 1,
- /obj/item/book/granter/spell/smoke = 2,
- /obj/item/reagent_containers/syringe/mulligan = 2,
- /obj/item/dice/d20 = 3,
- /obj/item/dice/d20/fate/stealth/one_use = 1,
- /obj/item/clothing/head/chameleon/broken = 3,
- /obj/item/stack/marker_beacon/ten = 3,
- /obj/item/grenade/smokebomb = 3,
- /obj/item/grenade/flashbang = 3
- )
- )
- if(prob(50))
- backpack_contents += pickweight(list(
- /obj/item/book/granter/spell/knock = 1,
- /obj/item/book/granter/spell/blind = 1,
- /obj/item/shadowcloak = 1,
- /obj/item/book/granter/spell/smoke = 2,
- /obj/item/reagent_containers/syringe/mulligan = 2,
- /obj/item/dice/d20/fate/stealth/one_use = 1,
- /obj/item/dice/d20 = 3,
- /obj/item/clothing/head/chameleon/broken = 3,
- /obj/item/stack/marker_beacon/ten = 3,
- /obj/item/grenade/smokebomb = 3,
- /obj/item/grenade/flashbang = 3
- )
- )
- if(prob(50))
- backpack_contents += pickweight(list(
- /obj/item/book/granter/spell/knock = 1,
- /obj/item/book/granter/spell/blind = 1,
- /obj/item/shadowcloak = 1,
- /obj/item/book/granter/spell/smoke = 2,
- /obj/item/reagent_containers/syringe/mulligan = 2,
- /obj/item/dice/d20/fate/stealth/one_use = 1,
- /obj/item/clothing/head/chameleon/broken = 3,
- /obj/item/stack/marker_beacon/ten = 3,
- /obj/item/grenade/smokebomb = 3,
- /obj/item/grenade/flashbang = 3
- )
- )
- if(prob(25))
- r_pocket = pickweight(list(
- /obj/item/chameleon,
- /obj/item/dnainjector/chameleonmut = 1,
- /obj/item/flashlight/flashdark = 1
- )
- )
- if(prob(25))
- l_pocket = pickweight(list(
- /obj/item/chameleon,
- /obj/item/dnainjector/chameleonmut = 1,
- /obj/item/flashlight/flashdark = 1
- )
- )
- if("Shadow")
- mob_species = /datum/species/shadow
- neck = /obj/item/clothing/accessory/medal/plasma/nobel_science
- uniform = /obj/item/clothing/under/color/black
- shoes = /obj/item/clothing/shoes/sneakers/black
- suit = /obj/item/clothing/suit/toggle/labcoat
- glasses = /obj/item/clothing/glasses/blindfold
- back = /obj/item/tank/internals/oxygen
- mask = /obj/item/clothing/mask/breath
- if("SRM")
- uniform = /obj/item/clothing/under/suit/roumain
- shoes = /obj/item/clothing/shoes/workboots/mining
- if(prob(50))
- suit = /obj/item/clothing/suit/armor/roumain/shadow
- head = /obj/item/clothing/head/cowboy/sec/roumain/shadow
- else
- suit = /obj/item/clothing/suit/armor/roumain
- head = /obj/item/clothing/head/cowboy/sec/roumain
- if(prob(25))
- suit_store = /obj/item/gun/ballistic/shotgun/flamingarrow
- r_pocket = /obj/item/book/manual/trickwines_4_brewers
- belt = pick(list(/obj/item/kitchen/knife/hunting = 1, /obj/item/gun/ballistic/derringer = 1))
- back = /obj/item/storage/backpack/cultpack
- backpack_contents = list()
- if(prob(75))
- backpack_contents += list(/obj/item/ammo_box/c38_box = 1)
- if(prob(75))
- backpack_contents += list(pick(
- /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/ashwine,
- /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/icewine,
- /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/shockwine,
- /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/hearthwine,
- /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/forcewine,
- /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/prismwine,) = 2)
+ outfit = /datum/outfit/generic/miner
+ if("Assistant")
+ outfit = /datum/outfit/generic
+ if("Engineer")
+ outfit = /datum/outfit/generic/engineer
+ if("Doctor")
+ outfit = /datum/outfit/generic/doctor
+ if("Scientist")
+ outfit = /datum/outfit/generic/science
+ if("Cargo")
+ outfit = /datum/outfit/generic/cargo
+ if("Security")
+ outfit = /datum/outfit/generic/security
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
new file mode 100644
index 000000000000..0dca4c21dade
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
@@ -0,0 +1,479 @@
+/datum/outfit/generic/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ uniform = pickweight(list(
+ /obj/item/clothing/under/utility = 5,
+ /obj/item/clothing/under/utility/skirt = 5,
+ /obj/item/clothing/under/color/black = 1,
+ /obj/item/clothing/under/color/white = 1,
+ /obj/item/clothing/under/color/random = 1,
+ /obj/item/clothing/under/suit/white = 1,
+ /obj/item/clothing/under/suit/tan = 1,
+ /obj/item/clothing/under/suit/black_really = 1,
+ /obj/item/clothing/under/suit/navy = 1,
+ /obj/item/clothing/under/suit/burgundy = 1,
+ /obj/item/clothing/under/suit/charcoal = 1,
+ /obj/item/clothing/under/rank/civilian/lawyer/galaxy = 1,
+ /obj/item/clothing/under/suit/black/skirt = 1,
+ /obj/item/clothing/under/suit/black = 1,
+ /obj/item/clothing/under/dress/sailor = 1,
+ /obj/item/clothing/under/dress/striped = 1,
+ /obj/item/clothing/under/dress/skirt/blue = 1,
+ /obj/item/clothing/under/syndicate/tacticool = 1,
+ )
+ )
+ suit = pickweight(list(
+ /obj/item/clothing/suit/hooded/wintercoat = 1,
+ /obj/item/clothing/suit/jacket = 1,
+ /obj/item/clothing/suit/jacket/leather = 1,
+ /obj/item/clothing/suit/jacket/leather/overcoat = 1,
+ /obj/item/clothing/suit/jacket/leather/duster = 1,
+ /obj/item/clothing/suit/jacket/miljacket = 1,
+ /obj/item/clothing/suit/jacket/puffer = 1,
+ /obj/item/clothing/suit/gothcoat = 1,
+ /obj/item/clothing/suit/toggle/industrial = 1,
+ /obj/item/clothing/suit/toggle/hazard = 1,
+ )
+ )
+ back = pickweight(list(
+ /obj/item/storage/backpack = 1,
+ /obj/item/storage/backpack/satchel = 1,
+ /obj/item/storage/backpack/duffelbag = 1,
+ /obj/item/storage/backpack/messenger = 1,
+ /obj/item/storage/backpack/satchel/leather = 1
+ )
+ )
+ if (prob(10))
+ belt = pickweight(list(
+ /obj/item/gun/ballistic/automatic/pistol/candor = 2,
+ /obj/item/gun/ballistic/automatic/pistol/commander = 1,
+ /obj/item/gun/ballistic/automatic/pistol = 1,
+ /obj/item/gun/ballistic/revolver = 1,
+ /obj/item/gun/ballistic/revolver/firebrand = 1,
+ )
+ )
+ if(prob(50))
+ gloves = pickweight(list(
+ /obj/item/clothing/gloves/color/black = 1,
+ /obj/item/clothing/gloves/fingerless = 1,
+ /obj/item/clothing/gloves/color/white = 1,
+ )
+ )
+ shoes = pickweight(list(
+ /obj/item/clothing/shoes/laceup = 1,
+ /obj/item/clothing/shoes/sandal = 1,
+ /obj/item/clothing/shoes/winterboots = 1,
+ /obj/item/clothing/shoes/workboots/mining = 1,
+ /obj/item/clothing/shoes/workboots = 1,
+ /obj/item/clothing/shoes/sneakers/black = 1,
+ /obj/item/clothing/shoes/sneakers/brown = 1,
+ /obj/item/clothing/shoes/sneakers/white = 1
+ )
+ )
+ if(prob(50))
+ head = pickweight(list(
+ /obj/item/clothing/head/beret = 3,
+ /obj/item/clothing/head/beret/grey = 3,
+ /obj/item/clothing/head/flatcap = 3,
+ /obj/item/clothing/head/beanie = 3,
+ /obj/item/clothing/head/cowboy = 3,
+ /obj/item/clothing/head/trapper = 2,
+ /obj/item/clothing/head/hardhat = 2,
+ /obj/item/clothing/head/hardhat/orange = 2,
+ /obj/item/clothing/head/hardhat/dblue = 2,
+ /obj/item/clothing/head/pirate = 1,
+ /obj/item/clothing/head/foilhat = 1
+ )
+ )
+ if(prob(50))
+ mask = pickweight(list(
+ /obj/item/clothing/mask/balaclava = 1,
+ /obj/item/clothing/mask/bandana/red = 1,
+ /obj/item/clothing/mask/gas = 3,
+ /obj/item/clothing/mask/breath = 3,
+ )
+ )
+ if(prob(25))
+ neck = pickweight(list(
+ /obj/item/clothing/neck/scarf/red = 1,
+ /obj/item/clothing/neck/scarf/green = 1,
+ /obj/item/clothing/neck/scarf/darkblue = 1,
+ /obj/item/clothing/neck/shemagh = 1,
+ /obj/item/clothing/neck/stripedredscarf = 1,
+ /obj/item/clothing/neck/stripedgreenscarf = 1,
+ /obj/item/clothing/neck/stripedbluescarf = 1
+ )
+ )
+ ears = pick(/obj/item/radio/headset, /obj/item/radio/headset/alt)
+ if(prob(50))
+ glasses = pickweight(list(
+ /obj/item/clothing/glasses/regular = 1,
+ /obj/item/clothing/glasses/regular/circle = 1,
+ /obj/item/clothing/glasses/regular/jamjar = 1,
+ /obj/item/clothing/glasses/eyepatch = 1,
+ /obj/item/clothing/glasses/cheapsuns = 1,
+ /obj/item/clothing/glasses/regular/hipster = 1,
+ /obj/item/clothing/glasses/cold = 1,
+ /obj/item/clothing/glasses/heat = 1,
+ /obj/item/clothing/glasses/orange = 1,
+ )
+ )
+ if(prob(75))
+ r_pocket = /obj/item/tank/internals/emergency_oxygen
+ if(prob(75))
+ l_pocket = pick(/obj/item/radio, /obj/item/flashlight)
+ id = /obj/item/card/id
+ backpack_contents = list()
+ backpack_contents += pickweight(list(
+ /obj/item/dice/d20 = 1,
+ /obj/item/lipstick = 1,
+ /obj/item/clothing/mask/vape = 1,
+ /obj/item/clothing/mask/vape/cigar = 1,
+ /obj/item/reagent_containers/food/drinks/flask = 1,
+ /obj/item/lighter = 1,
+ /obj/item/toy/cards/deck = 1,
+ /obj/item/toy/eightball = 1,
+ /obj/item/storage/wallet = 1,
+ /obj/item/paicard = 1,
+ /obj/item/pen/fourcolor = 1,
+ /obj/item/paper_bin = 1,
+ /obj/item/cane = 1,
+ /obj/item/radio = 1,
+ /obj/item/dyespray = 1,
+ /obj/item/table_bell/brass = 1,
+ /obj/item/flashlight = 1,
+ /obj/item/crowbar/red = 1
+ )
+ )
+
+/datum/outfit/generic
+ name = "Generic (Legion)"
+ box = /obj/item/storage/box/survival
+ random = TRUE
+
+/datum/outfit/generic/miner/pre_equip(mob/living/carbon/human/H, visualsOnly)
+ . = ..()
+ if(prob(75))
+ uniform = pickweight(list(
+ /obj/item/clothing/under/rank/cargo/miner/lavaland = 5,
+ /obj/item/clothing/under/rank/cargo/miner = 4,
+ /obj/item/clothing/under/rank/cargo/miner/lavaland/old = 1,
+ )
+ )
+ if(prob(25))
+ suit = pickweight(list(
+ /obj/item/clothing/suit/hooded/explorer = 18,
+ /obj/item/clothing/suit/hooded/explorer/old = 1,
+ /obj/item/clothing/suit/hooded/cloak/goliath = 1
+ )
+ )
+ if(prob(75))
+ back = /obj/item/storage/backpack/explorer
+ if(prob(75))
+ belt = pickweight(list(
+ /obj/item/storage/belt/mining = 2,
+ /obj/item/storage/belt/mining/alt = 2
+ )
+ )
+ else if(prob(75))
+ belt = pickweight(list(
+ /obj/item/pickaxe = 16,
+ /obj/item/pickaxe/mini = 8,
+ /obj/item/pickaxe/silver = 4,
+ /obj/item/pickaxe/diamond = 2,
+ /obj/item/gun/energy/kinetic_accelerator = 2,
+ /obj/item/kinetic_crusher/old = 1
+ )
+ )
+ if(prob(75))
+ gloves = pickweight(list(
+ /obj/item/clothing/gloves/color/black = 9,
+ /obj/item/clothing/gloves/explorer/old = 1
+ )
+ )
+ if(prob(75))
+ shoes = /obj/item/clothing/shoes/workboots/mining
+ if(prob(75))
+ mask = pickweight(list(
+ /obj/item/clothing/mask/gas/explorer = 9,
+ /obj/item/clothing/mask/gas/explorer/old = 1
+ )
+ )
+ if(prob(50))
+ glasses = /obj/item/clothing/glasses/meson
+ if(prob(50))
+ r_pocket = pickweight(list(
+ /obj/item/stack/marker_beacon = 20,
+ /obj/item/spacecash/bundle/mediumrand = 7,
+ /obj/item/reagent_containers/hypospray/medipen/survival = 2,
+ /obj/item/borg/upgrade/modkit/damage = 1
+ )
+ )
+ if(prob(25))
+ l_pocket = pickweight(list(
+ /obj/item/spacecash/bundle/mediumrand = 5,
+ /obj/item/reagent_containers/hypospray/medipen/survival = 2,
+ /obj/item/borg/upgrade/modkit/cooldown = 1
+ )
+ )
+ if(prob(75))
+ for(var/count in 1 to 3)
+ if(prob(70))
+ backpack_contents += pickweight(list(
+ /obj/item/borg/upgrade/modkit/damage = 1,
+ /obj/item/borg/upgrade/modkit/trigger_guard = 1,
+ /obj/item/soap/nanotrasen = 1,
+ /obj/item/wormhole_jaunter = 1,
+ /obj/item/fulton_core = 1,
+ /obj/item/extraction_pack = 2,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 3,
+ /obj/item/hivelordstabilizer = 2,
+ /obj/item/stack/marker_beacon/ten = 2,
+ /obj/item/mining_scanner = 2,
+ /obj/item/extinguisher/mini = 2,
+ /obj/item/kitchen/knife/combat/survival = 3,
+ /obj/item/flashlight/seclite = 3,
+ /obj/item/stack/sheet/sinew = 3,
+ /obj/item/stack/sheet/bone = 3
+ )
+ )
+ if(prob(30))
+ backpack_contents += list(
+ /obj/item/reagent_containers/hypospray/medipen/survival = pickweight(list(
+ 1 = 3,
+ 2 = 2,
+ 3 = 1
+ )
+ )
+ )
+ else if (prob(75))
+ backpack_contents = list()
+ back = pickweight(list(
+ /obj/item/kinetic_crusher = 9,
+ /obj/item/kinetic_crusher/old = 1
+ )
+ )
+
+/datum/outfit/generic/miner
+ name = "Miner (Legion)"
+
+/datum/outfit/generic/engineer/pre_equip(mob/living/carbon/human/H, visualsOnly)
+ . = ..()
+ if(prob(75))
+ uniform = pick(/obj/item/clothing/under/rank/engineering/engineer, /obj/item/clothing/under/rank/engineering/engineer/hazard, /obj/item/clothing/under/rank/security/officer/military/eng)
+ if(prob(75))
+ suit = pick(/obj/item/clothing/suit/toggle/hazard, /obj/item/clothing/suit/hazardvest, /obj/item/clothing/suit/hooded/wintercoat/engineering)
+ if(prob(75))
+ gloves = pick(/obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/fyellow, /obj/item/clothing/gloves/color/fyellow/old)
+ if(prob(75))
+ belt = pick(/obj/item/storage/belt/utility/full, /obj/item/storage/belt/utility)
+ if(prob(50))
+ head = /obj/item/clothing/head/welding
+ if(prob(75))
+ ears = /obj/item/radio/headset/headset_eng
+ else if(prob(50))
+ glasses = /obj/item/clothing/glasses/welding
+ if(prob(75))
+ back = pick(/obj/item/storage/backpack/industrial, /obj/item/storage/backpack/satchel/eng, /obj/item/storage/backpack/duffelbag/engineering, /obj/item/storage/backpack/messenger/engi)
+ if(prob(10))
+ back = /obj/item/fireaxe
+ for(var/i = 1 to 3)
+ if(prob(75))
+ backpack_contents += pickweight(list(
+ /obj/item/stack/tape/industrial/electrical = 1,
+ /obj/item/electronics/apc = 1,
+ /obj/item/multitool = 1,
+ /obj/item/pipe_dispenser = 1,
+ /obj/item/tank/internals/emergency_oxygen/engi = 1,
+ /obj/item/holosign_creator/engineering = 1,
+ /obj/item/extinguisher/advanced = 1,
+ /obj/item/stack/sheet/metal/twenty = 1
+ )
+ )
+ if(prob(75))
+ accessory = /obj/item/clothing/accessory/armband/engine
+
+/datum/outfit/generic/engineer
+ name = "Mechanic (Legion)"
+ box = /obj/item/storage/box/survival/engineer
+
+/datum/outfit/generic/doctor/pre_equip(mob/living/carbon/human/H, visualsOnly)
+ . = ..()
+ if(prob(75))
+ uniform = pick(/obj/item/clothing/under/rank/medical/doctor, /obj/item/clothing/under/rank/medical/doctor/blue)
+ if(prob(75))
+ suit = pick(/obj/item/clothing/suit/toggle/labcoat, /obj/item/clothing/suit/apron/surgical ,/obj/item/clothing/suit/hooded/wintercoat/medical)
+ if(prob(75))
+ back = pick(/obj/item/storage/backpack/medic, /obj/item/storage/backpack/satchel/med, /obj/item/storage/backpack/duffelbag/med, /obj/item/storage/backpack/messenger/med)
+ else if (prob(75))
+ back = /obj/item/defibrillator/loaded
+ if(prob(75))
+ belt = pickweight(list(/obj/item/storage/belt/medical = 5, /obj/item/defibrillator/compact/loaded = 1))
+ if(prob(75))
+ gloves = pick(/obj/item/clothing/gloves/color/white, /obj/item/clothing/gloves/color/latex/nitrile)
+ if(prob(75))
+ mask = /obj/item/clothing/mask/surgical
+ if(prob(75))
+ shoes = /obj/item/clothing/shoes/sneakers/white
+ if(prob(75))
+ head = /obj/item/clothing/head/beret/med
+ if(prob(75))
+ ears = /obj/item/radio/headset/headset_med
+ if(prob(75))
+ glasses = pick(/obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health/prescription)
+ for(var/i = 1 to 3)
+ if(prob(75))
+ backpack_contents += pickweight(list(
+ /obj/item/reagent_containers/pill/patch/styptic = 5,
+ /obj/item/reagent_containers/pill/patch/silver_sulf = 5,
+ /obj/item/storage/firstaid/medical = 3,
+ /obj/item/reagent_containers/syringe = 3,
+ /obj/item/reagent_containers/glass/beaker = 2,
+ /obj/item/reagent_containers/dropper = 2,
+ /obj/item/reagent_containers/pill/charcoal = 2,
+ /obj/item/reagent_containers/medigel/styptic = 2,
+ /obj/item/reagent_containers/medigel/silver_sulf = 2,
+ /obj/item/reagent_containers/medigel/sterilizine = 1,
+ /obj/item/flashlight/pen = 1,
+ /obj/item/hypospray/mkii = 1,
+ /obj/item/healthanalyzer = 1,
+ )
+ )
+ if(prob(75))
+ accessory = /obj/item/clothing/accessory/armband/medblue
+
+/datum/outfit/generic/doctor
+ name = "Medical Doctor (Legion)"
+ box = /obj/item/storage/box/survival/medical
+
+/datum/outfit/generic/science/pre_equip(mob/living/carbon/human/H)
+ ..()
+ if(prob(75))
+ uniform = pick(/obj/item/clothing/under/rank/rnd/scientist, /obj/item/clothing/under/rank/rnd/roboticist)
+ if(prob(75))
+ suit = pick(/obj/item/clothing/suit/toggle/labcoat/science, /obj/item/clothing/suit/hooded/wintercoat/science)
+ if(prob(75))
+ back = pick(/obj/item/storage/backpack/science, /obj/item/storage/backpack/satchel/tox, /obj/item/storage/backpack/messenger/tox)
+ if(prob(75))
+ shoes = /obj/item/clothing/shoes/sneakers/white
+ if(prob(75))
+ gloves = /obj/item/clothing/gloves/color/white
+ if(prob(75))
+ head = /obj/item/clothing/head/beret/sci
+ if(prob(75))
+ ears = /obj/item/radio/headset/headset_sci
+ if(prob(75))
+ glasses = pick(/obj/item/clothing/glasses/hud/diagnostic, /obj/item/clothing/glasses/science)
+ if(prob(1))
+ neck = /obj/item/clothing/neck/tie/horrible
+ for(var/i = 1 to 3)
+ if(prob(75))
+ backpack_contents += pickweight(list(
+ /obj/item/research_notes/loot/tiny = 3,
+ /obj/item/research_notes/loot/small = 3,
+ /obj/item/reagent_scanner = 3,
+ /obj/item/assembly/flash/handheld = 3,
+ /obj/item/stock_parts/capacitor/adv = 2,
+ /obj/item/stock_parts/scanning_module/adv = 2,
+ /obj/item/stock_parts/manipulator/nano = 2,
+ /obj/item/stock_parts/micro_laser/high = 2,
+ /obj/item/stock_parts/matter_bin/adv = 2,
+ /obj/item/survey_handheld = 1,
+ /obj/item/weldingtool/experimental = 1,
+ /obj/item/mmi/posibrain = 1,
+ /obj/item/reagent_containers/glass/beaker/plastic = 1,
+ /obj/item/organ/eyes/robotic/shield = 1,
+ /obj/item/organ/eyes/robotic/glow = 1,
+ )
+ )
+ if(prob(75))
+ accessory = /obj/item/clothing/accessory/armband/science
+
+
+/datum/outfit/generic/science
+ name = "Scientist (Legion)"
+
+/datum/outfit/generic/cargo/pre_equip(mob/living/carbon/human/H, visualsOnly)
+ . = ..()
+ if(prob(75))
+ uniform = pick(/obj/item/clothing/under/rank/cargo/tech, /obj/item/clothing/under/shorts/grey)
+ if(prob(75))
+ suit = pick(/obj/item/clothing/suit/hazardvest, /obj/item/clothing/suit/hooded/wintercoat/cargo)
+ if(prob(25))
+ belt = /obj/item/gun/ballistic/automatic/zip_pistol
+ if(prob(75))
+ gloves = /obj/item/clothing/gloves/fingerless
+ if(prob(75))
+ shoes = /obj/item/clothing/shoes/sneakers/black
+ if(prob(75))
+ head = /obj/item/clothing/head/soft
+ if(prob(75))
+ ears = /obj/item/radio/headset/headset_cargo
+ for(var/i = 1 to 3)
+ if(prob(75))
+ backpack_contents += pickweight(list(
+ /obj/item/spacecash/bundle/mediumrand = 5,
+ /obj/item/ammo_box/magazine/illestren_a850r = 5,
+ /obj/item/ammo_box/magazine/zip_ammo_9mm = 5,
+ /obj/item/modular_computer/tablet/preset/cargo = 3,
+ /obj/item/stack/tape = 3,
+ /obj/item/stack/tape/industrial = 3,
+ /obj/item/stack/sheet/plastic/five = 3,
+ /obj/item/grenade/frag = 1
+ )
+ )
+ if(prob(75))
+ accessory = /obj/item/clothing/accessory/armband/cargo
+ if(prob(25))
+ suit = /obj/item/clothing/suit/armor/vest/scrap_armor
+ suit_store = /obj/item/gun/ballistic/rifle/illestren
+
+/datum/outfit/generic/cargo
+ name = "Cargo Technician (Legion)"
+
+/datum/outfit/generic/security/pre_equip(mob/living/carbon/human/H, visualsOnly)
+ . = ..()
+ if(prob(75))
+ uniform = /obj/item/clothing/under/rank/security/officer
+ if(prob(75))
+ suit = pick(/obj/item/clothing/suit/armor/vest, /obj/item/clothing/suit/armor/vest/security/officer, /obj/item/clothing/suit/armor/vest/bulletproof, /obj/item/clothing/suit/armor/vest/blueshirt)
+ if(prob(75))
+ back = pick(/obj/item/storage/backpack/security, /obj/item/storage/backpack/satchel/sec, /obj/item/storage/backpack/duffelbag/sec, /obj/item/storage/backpack/messenger/sec)
+ if(prob(75))
+ belt = pick(/obj/item/storage/belt/security, /obj/item/storage/belt/security/webbing)
+ if(prob(75))
+ gloves = pick(/obj/item/clothing/gloves/color/black, /obj/item/clothing/gloves/tackler)
+ if(prob(75))
+ shoes = /obj/item/clothing/shoes/jackboots
+ if(prob(75))
+ head = pick(/obj/item/clothing/head/helmet/sec, /obj/item/clothing/head/helmet/blueshirt, /obj/item/clothing/head/helmet/bulletproof)
+ if(prob(75))
+ mask = /obj/item/clothing/mask/gas/sechailer
+ if(prob(75))
+ ears = /obj/item/radio/headset/headset_sec
+ if(prob(75))
+ glasses = pick(/obj/item/clothing/glasses/hud/security, /obj/item/clothing/glasses/sunglasses)
+ if(prob(75))
+ r_pocket = pick(/obj/item/flashlight/seclite, /obj/item/assembly/flash/handheld, /obj/item/restraints/handcuffs)
+ if(prob(50))
+ suit_store = pick(/obj/item/gun/energy/e_gun, /obj/item/gun/energy/e_gun/smg, /obj/item/gun/energy/e_gun/iot)
+ for(var/i = 1 to 3)
+ if(prob(75))
+ backpack_contents += pickweight(list(
+ /obj/item/restraints/handcuffs = 8,
+ /obj/item/assembly/flash/handheld = 5,
+ /obj/item/storage/box/evidence = 6,
+ /obj/item/flashlight/seclite = 4,
+ /obj/item/ammo_box/c9mm/rubbershot = 3,
+ /obj/item/ammo_box/c9mm = 1,
+ /obj/item/stock_parts/cell/gun = 3,
+ /obj/item/coin/antagtoken = 1,
+ /obj/item/grenade/stingbang = 1
+ )
+ )
+ if(prob(75))
+ accessory = /obj/item/clothing/accessory/armband/deputy
+
+/datum/outfit/generic/security
+ name = "Security Officer (Legion)"
+ box = /obj/item/storage/box/survival/security
+
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
index 2315f6e61a4f..786cdaa80966 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
@@ -74,8 +74,6 @@
new /obj/item/assembly/signaler/anomaly/bluespace(loc)
if(prob(5))
new /obj/item/gem/fdiamond(loc)
- if(prob(10))
- new /obj/item/crusher_trophy/ice_wing(loc)
return ..()
/mob/living/simple_animal/hostile/asteroid/old_demon
@@ -122,7 +120,7 @@
footstep_type = FOOTSTEP_MOB_CLAW
/// Distance the demon will teleport from the target
var/teleport_distance = 3
- crusher_drop_mod = 75
+ trophy_drop_mod = 75
/obj/projectile/temp/basilisk/ice
name = "ice blast"
@@ -157,8 +155,6 @@
new /obj/item/assembly/signaler/anomaly/bluespace(loc)
if(prob(20))
new /obj/item/gem/fdiamond(loc)
- if(prob(50))
- new /obj/item/crusher_trophy/ice_crystal(loc)
return ..()
/mob/living/simple_animal/hostile/asteroid/ice_demon/random/Initialize()
@@ -166,49 +162,3 @@
if(prob(15))
new /mob/living/simple_animal/hostile/asteroid/old_demon(loc)
return INITIALIZE_HINT_QDEL
-
-/obj/item/crusher_trophy/ice_crystal
- name = "frost gem"
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- desc = "The glowing remnant of an ancient ice demon- so cold that it hurts to touch."
- icon_state = "ice_crystal"
- denied_type = /obj/item/crusher_trophy/ice_crystal
-
-/obj/item/crusher_trophy/ice_crystal/effect_desc()
- return "waveform collapse to freeze a creature in a block of ice for a period, preventing them from moving"
-
-/obj/item/crusher_trophy/ice_crystal/on_mark_detonation(mob/living/target, mob/living/user)
- target.apply_status_effect(/datum/status_effect/ice_crystal)
-
-/datum/status_effect/ice_crystal
- id = "ice_crystal"
- duration = 20
- status_type = STATUS_EFFECT_REFRESH
- alert_type = /atom/movable/screen/alert/status_effect/ice_crystal
- /// Stored icon overlay for the hit mob, removed when effect is removed
- var/icon/cube
-
-/atom/movable/screen/alert/status_effect/ice_crystal
- name = "Frozen Solid"
- desc = "You're frozen inside an ice cube, and cannot move!"
- icon_state = "frozen"
-
-/datum/status_effect/ice_crystal/on_apply()
- RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(owner_moved))
- if(!owner.stat)
- to_chat(owner, "You become frozen in a cube!")
- cube = icon('icons/effects/freeze.dmi', "ice_cube")
- var/icon/size_check = icon(owner.icon, owner.icon_state)
- cube.Scale(size_check.Width(), size_check.Height())
- owner.add_overlay(cube)
- return ..()
-
-/// Blocks movement from the status effect owner
-/datum/status_effect/ice_crystal/proc/owner_moved()
- return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
-
-/datum/status_effect/ice_crystal/on_remove()
- if(!owner.stat)
- to_chat(owner, "The cube melts!")
- owner.cut_overlay(cube)
- UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm
index ceef301b2349..7a4d8cb234c2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm
@@ -28,7 +28,7 @@
move_resist = MOVE_FORCE_VERY_STRONG
butcher_results = list(/obj/item/stack/ore/diamond = 3, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 10, /obj/item/stack/sheet/animalhide/ashdrake = 1)
loot = list()
- crusher_loot = /obj/item/crusher_trophy/tail_spike
+ //mob_trophy = /obj/item/mob_trophy/tail_spike
deathmessage = "collapses on its side."
deathsound = 'sound/magic/demon_dies.ogg'
stat_attack = HARD_CRIT
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm
index d95c21ec9bbb..074bda5cf91a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm
@@ -33,7 +33,7 @@
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/rawcrab = 2, /obj/item/stack/sheet/bone = 2)
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
- crusher_loot = /obj/item/crusher_trophy/lobster_claw
+ //mob_trophy = /obj/item/mob_trophy/lobster_claw
/mob/living/simple_animal/hostile/asteroid/lobstrosity/beach
name = "tropical lobstrosity"
@@ -42,15 +42,3 @@
icon_living = "lobstrosity"
icon_dead = "lobstrosity_dead"
-/obj/item/crusher_trophy/lobster_claw
- name = "lobster claw"
- icon_state = "lobster_claw"
- desc = "A lobster claw."
- denied_type = /obj/item/crusher_trophy/lobster_claw
- bonus_value = 1
-
-/obj/item/crusher_trophy/lobster_claw/effect_desc()
- return "mark detonation to briefly stagger the target for [bonus_value] seconds"
-
-/obj/item/crusher_trophy/lobster_claw/on_mark_detonation(mob/living/target, mob/living/user)
- target.apply_status_effect(/datum/status_effect/stagger, bonus_value SECONDS)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
index b66c71fd58b2..eaf546b3f627 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
@@ -12,7 +12,7 @@
response_harm_simple = "strike"
status_flags = 0
a_intent = INTENT_HARM
- var/crusher_loot
+ var/mob_trophy
var/throw_message = "bounces off of"
var/throw_deflection = 20 //WS edit - Whitesands
var/fromtendril = FALSE
@@ -20,7 +20,7 @@
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
mob_size = MOB_SIZE_LARGE
var/icon_aggro = null
- var/crusher_drop_mod = 25
+ var/trophy_drop_mod = 25
var/datum/armor/armor //WS edit - Whitesands
/mob/living/simple_animal/hostile/asteroid/Initialize(mapload)
@@ -70,13 +70,12 @@
/mob/living/simple_animal/hostile/asteroid/death(gibbed)
SSblackbox.record_feedback("tally", "mobs_killed_mining", 1, type)
- var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
- if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item
- spawn_crusher_loot()
+ if(prob(trophy_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item
+ spawn_mob_trophy()
..(gibbed)
-/mob/living/simple_animal/hostile/asteroid/proc/spawn_crusher_loot()
- butcher_results[crusher_loot] = 1
+/mob/living/simple_animal/hostile/asteroid/proc/spawn_mob_trophy()
+ butcher_results[mob_trophy] = 1
/mob/living/simple_animal/hostile/asteroid/handle_temperature_damage()
if(bodytemperature < minbodytemp)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
index f9d15892f75d..2bcb3fe06f9a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
@@ -27,7 +27,7 @@
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/bear = 3, /obj/item/stack/sheet/bone = 2)
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 1)
loot = list()
- crusher_loot = /obj/item/crusher_trophy/bear_paw
+ //mob_trophy = /obj/item/mob_trophy/bear_paw
stat_attack = HARD_CRIT
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
@@ -57,24 +57,6 @@
desc = "It seems sentient somehow."
faction = list("neutral")
-/obj/item/crusher_trophy/bear_paw
- name = "polar bear paw"
- desc = "It's a polar bear paw."
- icon_state = "bear_paw"
- icon ='icons/obj/lavaland/elite_trophies.dmi'
- denied_type = /obj/item/crusher_trophy/bear_paw
-
-/obj/item/crusher_trophy/bear_paw/effect_desc()
- return "doubled strikes when below 50% health"
-
-/obj/item/crusher_trophy/bear_paw/on_mark_detonation(mob/living/target, mob/living/user)
- if(user.health / user.maxHealth > 0.5)
- return
- var/obj/item/I = user.get_active_held_item()
- if(!I)
- return
- I.melee_attack_chain(user, target, null)
-
//elite bear
/mob/living/simple_animal/hostile/asteroid/polarbear/warrior
name = "polar warbear"
@@ -91,29 +73,11 @@
icon_state = "warbear"
icon_living = "warbear"
icon_dead = "warbear_dead"
- crusher_loot = /obj/item/crusher_trophy/war_paw
- crusher_drop_mod = 75
+ //mob_trophy = /obj/item/mob_trophy/war_paw
+ trophy_drop_mod = 75
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/bear = 3, /obj/item/stack/sheet/bone = 2, /obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 3)
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 3, /obj/item/bear_armor = 1)
-/obj/item/crusher_trophy/war_paw
- name = "Armored bear paw"
- desc = "It's a paw from a true warrior. Still remembers the basics of CQB."
- icon_state = "armor_paw"
- icon ='icons/obj/lavaland/elite_trophies.dmi'
- denied_type = /obj/item/crusher_trophy/war_paw
-
-/obj/item/crusher_trophy/war_paw/effect_desc()
- return "doubled strikes when below 70% health"
-
-/obj/item/crusher_trophy/war_paw/on_mark_detonation(mob/living/target, mob/living/user)
- if(user.health / user.maxHealth > 0.7)
- return
- var/obj/item/I = user.get_active_held_item()
- if(!I)
- return
- I.melee_attack_chain(user, target, null)
-
/mob/living/simple_animal/hostile/asteroid/polarbear/random/Initialize()
. = ..()
if(prob(15))
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
index 7df8c04f0cf4..336616dfe110 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
@@ -30,9 +30,9 @@
move_force = MOVE_FORCE_WEAK
move_resist = MOVE_FORCE_WEAK
pull_force = MOVE_FORCE_WEAK
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 2, /obj/item/stack/sheet/bone = 2, /obj/item/crusher_trophy/wolf_ear = 0.5)
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 2, /obj/item/stack/sheet/bone = 2, /obj/item/mob_trophy/wolf_ear = 0.5)
loot = list()
- crusher_loot = /obj/item/crusher_trophy/wolf_ear
+ mob_trophy = /obj/item/mob_trophy/wolf_ear
stat_attack = HARD_CRIT
knockdown_time = 1 SECONDS
robust_searching = TRUE
@@ -108,23 +108,10 @@
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
if(prob(15))
- new /obj/item/crusher_trophy/wolf_ear(loc)
+ new /obj/item/mob_trophy/wolf_ear(loc)
visible_message("You notice a damaged ear that might be salvagable.")
..()
-/obj/item/crusher_trophy/wolf_ear
- name = "wolf ear"
- desc = "The battered remains of a wolf's ear. You could attach it to a crusher, or use the fur to craft a trophy."
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- icon_state = "torn_ear"
- denied_type = /obj/item/crusher_trophy/wolf_ear
-
-/obj/item/crusher_trophy/wolf_ear/effect_desc()
- return "waveform collapse to give the user a slight speed boost"
-
-/obj/item/crusher_trophy/wolf_ear/on_mark_detonation(mob/living/target, mob/living/user)
- user.apply_status_effect(/datum/status_effect/speed_boost, 3 SECONDS)
-
//alpha wolf- smaller chance to spawn, practically a miniboss. Has the ability to do a short, untelegraphed lunge with a stun. Be careful!
/mob/living/simple_animal/hostile/asteroid/wolf/alpha
name = "alpha wolf"
@@ -149,35 +136,12 @@
charge_frequency = 20 SECONDS
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 4, /obj/item/stack/sheet/sinew/wolf = 4, /obj/item/stack/sheet/bone = 5)
loot = list()
- crusher_loot = /obj/item/crusher_trophy/fang
+ mob_trophy = /obj/item/mob_trophy/fang
/mob/living/simple_animal/hostile/asteroid/wolf/alpha/gib()
move_force = MOVE_FORCE_DEFAULT
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
- if(prob(75))
- new /obj/item/crusher_trophy/fang(loc)
- visible_message("You find an intact fang that looks salvagable.")
- ..()
-
-/obj/item/crusher_trophy/fang
- name = "battle-stained fang"
- desc = "A wolf fang, displaying the wear and tear associated with a long and colorful life. Could be attached to a kinetic crusher or used to make a trophy."
- icon = 'icons/obj/lavaland/elite_trophies.dmi'
- icon_state = "fang"
- denied_type = /obj/item/crusher_trophy/fang
- var/bleed_stacks_per_hit = 5
-
-/obj/item/crusher_trophy/fang/effect_desc()
- return "waveform collapse to build up a small stack of bleeding, causing a burst of damage if applied repeatedly."
-
-/obj/item/crusher_trophy/fang/on_mark_detonation(mob/living/M, mob/living/user)
- if(istype(M) && (M.mob_biotypes & MOB_ORGANIC))
- var/datum/status_effect/stacking/saw_bleed/bloodletting/B = M.has_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting)
- if(!B)
- M.apply_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting, bleed_stacks_per_hit)
- else
- B.add_stacks(bleed_stacks_per_hit)
/mob/living/simple_animal/hostile/asteroid/wolf/random/Initialize()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm
deleted file mode 100644
index 4417e68e2ec1..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm
+++ /dev/null
@@ -1,59 +0,0 @@
-/mob/living/simple_animal/hostile/nanotrasen
- name = "\improper Nanotrasen Private Security Officer"
- desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you."
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "nanotrasen"
- icon_living = "nanotrasen"
- icon_dead = null
- icon_gib = "syndicate_gib"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
- speak_chance = 0
- turns_per_move = 5
- speed = 0
- stat_attack = HARD_CRIT
- robust_searching = 1
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- melee_damage_lower = 10
- melee_damage_upper = 15
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
- loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasensoldier)
- atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
- faction = list(ROLE_DEATHSQUAD)
- check_friendly_fire = TRUE
- status_flags = CANPUSH
- del_on_death = TRUE
- dodging = TRUE
- footstep_type = FOOTSTEP_MOB_SHOE
-
-/mob/living/simple_animal/hostile/nanotrasen/screaming
- icon_state = "nanotrasen"
- icon_living = "nanotrasen"
-
-/mob/living/simple_animal/hostile/nanotrasen/screaming/Aggro()
- ..()
- summon_backup(15)
- say("411 in progress, requesting backup!")
-
-
-/mob/living/simple_animal/hostile/nanotrasen/ranged
- icon_state = "nanotrasenranged"
- icon_living = "nanotrasenranged"
- ranged = 1
- retreat_distance = 3
- minimum_distance = 5
- casingtype = /obj/item/ammo_casing/c45
- projectilesound = 'sound/weapons/gun/pistol/shot_alt.ogg'
-
-
-/mob/living/simple_animal/hostile/nanotrasen/ranged/smg
- icon_state = "nanotrasenrangedsmg"
- icon_living = "nanotrasenrangedsmg"
- rapid = 3
- casingtype = /obj/item/ammo_casing/c46x30mm
- projectilesound = 'sound/weapons/gun/smg/shot.ogg'
diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
index f6d5aa779ad4..55d873cf036a 100644
--- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm
+++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
@@ -175,7 +175,6 @@
max_integrity = 50
spawn_time = 600 //1 minute
max_mobs = 15
- icon = 'icons/mob/nest.dmi'
spawn_text = "crawls through"
mob_types = list(/mob/living/simple_animal/hostile/netherworld/migo, /mob/living/simple_animal/hostile/netherworld, /mob/living/simple_animal/hostile/netherworld/blankbody)
faction = list("nether")
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
deleted file mode 100644
index 1eb03b07650c..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ /dev/null
@@ -1,61 +0,0 @@
-/mob/living/simple_animal/hostile/stickman
- name = "Angry Stick Man"
- desc = "A being from a realm with only 2 dimensions. At least it's trying to stay faced towards you."
- icon_state = "stickman"
- icon_living = "stickman"
- icon_dead = "stickman_dead"
- icon_gib = "syndicate_gib"
- mob_biotypes = MOB_HUMANOID
- gender = MALE
- speak_chance = 0
- turns_per_move = 5
- speed = 0
- stat_attack = HARD_CRIT
- robust_searching = 1
- environment_smash = ENVIRONMENT_SMASH_NONE
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- obj_damage = 0
- melee_damage_lower = 10
- melee_damage_upper = 10
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
- atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
- faction = list("hostile","stickman")
- check_friendly_fire = 1
- status_flags = CANPUSH
- var/datum/action/boss/wizard_summon_minions/changesummons = /datum/action/boss/wizard_summon_minions
- var/summoned_by_wizard = 0
-
-/mob/living/simple_animal/hostile/stickman/ranged
- ranged = 1
- retreat_distance = 5
- minimum_distance = 5
- icon_state = "stickmanranged"
- icon_living = "stickmanranged"
- casingtype = /obj/item/ammo_casing/c45
- projectilesound = 'sound/misc/bang.ogg'
- loot = list(/obj/item/gun/ballistic/automatic/pistol/stickman)
-
-
-/mob/living/simple_animal/hostile/stickman/dog
- name = "Angry Stick Dog"
- desc = "Stickman's best friend, if he could see him at least."
- icon_state = "stickdog"
- icon_living = "stickdog"
- icon_dead = "stickdog_dead"
- mob_biotypes = MOB_BEAST
-
-/mob/living/simple_animal/hostile/stickman/Initialize(mapload, wizard_summoned)
- . = ..()
- new /obj/effect/temp_visual/paper_scatter(src)
- summoned_by_wizard = wizard_summoned
-
-/mob/living/simple_animal/hostile/stickman/death()
- ..()
- if(summoned_by_wizard == 1)
- changesummons.summoned_minions --
diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm
deleted file mode 100644
index 0d97a1f18869..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/wizard.dm
+++ /dev/null
@@ -1,82 +0,0 @@
-/mob/living/simple_animal/hostile/wizard
- name = "Space Wizard"
- desc = "EI NATH?"
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "wizard"
- icon_living = "wizard"
- icon_dead = "wizard_dead"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
- speak_chance = 0
- turns_per_move = 3
- speed = 0
- maxHealth = 100
- health = 100
- harm_intent_damage = 5
- melee_damage_lower = 5
- melee_damage_upper = 5
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = INTENT_HARM
- atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
- faction = list(ROLE_WIZARD)
- status_flags = CANPUSH
-
- retreat_distance = 3 //out of fireball range
- minimum_distance = 3
- del_on_death = 1
- loot = list(/obj/effect/mob_spawn/human/corpse/wizard,
- /obj/item/staff)
-
- var/obj/effect/proc_holder/spell/aimed/fireball/fireball = null
- var/obj/effect/proc_holder/spell/targeted/turf_teleport/blink/blink = null
- var/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/mm = null
-
- var/next_cast = 0
-
- footstep_type = FOOTSTEP_MOB_SHOE
-
-/mob/living/simple_animal/hostile/wizard/Initialize()
- . = ..()
- fireball = new /obj/effect/proc_holder/spell/aimed/fireball
- fireball.clothes_req = 0
- fireball.human_req = 0
- fireball.player_lock = 0
- AddSpell(fireball)
- implants += new /obj/item/implant/exile(src)
-
- mm = new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile
- mm.clothes_req = 0
- mm.human_req = 0
- mm.player_lock = 0
- AddSpell(mm)
-
- blink = new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink
- blink.clothes_req = 0
- blink.human_req = 0
- blink.player_lock = 0
- blink.outer_tele_radius = 3
- AddSpell(blink)
-
-/mob/living/simple_animal/hostile/wizard/handle_automated_action()
- . = ..()
- if(target && next_cast < world.time)
- if((get_dir(src,target) in list(SOUTH,EAST,WEST,NORTH)) && fireball.cast_check(0,src)) //Lined up for fireball
- src.setDir(get_dir(src,target))
- fireball.perform(list(target), user = src)
- next_cast = world.time + 10 //One spell per second
- return .
- if(mm.cast_check(0,src))
- mm.choose_targets(src)
- next_cast = world.time + 10
- return .
- if(blink.cast_check(0,src)) //Spam Blink when you can
- blink.choose_targets(src)
- next_cast = world.time + 10
- return .
-
-/mob/living/simple_animal/hostile/wizard/planet
- weather_immunities = list("lava","ash")
- minbodytemp = 0
- maxbodytemp = INFINITY
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index e4ead25880f9..3670e14a6405 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -636,7 +636,7 @@
switch(togglestatus)
if(AI_Z_OFF)
- LAZYADDASSOC(SSidlenpcpool.idle_mobs_by_virtual_level, virt_z, src)
+ LAZYADDASSOCLIST(SSidlenpcpool.idle_mobs_by_virtual_level, virt_z, src)
else
LAZYREMOVEASSOC(SSidlenpcpool.idle_mobs_by_virtual_level, virt_z, src)
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 8eb5bc620722..d60755693489 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -478,11 +478,11 @@
for(var/listed_type in slowdown_type)
if(ispath(listed_type))
listed_type = "[listed_type]" //Path2String
- LAZYADDASSOC(movespeed_mod_immunities, listed_type, source)
+ LAZYADDASSOCLIST(movespeed_mod_immunities, listed_type, source)
else
if(ispath(slowdown_type))
slowdown_type = "[slowdown_type]" //Path2String
- LAZYADDASSOC(movespeed_mod_immunities, slowdown_type, source)
+ LAZYADDASSOCLIST(movespeed_mod_immunities, slowdown_type, source)
if(update)
update_movespeed()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index d475891fc28f..c7070a66bcdf 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -204,27 +204,34 @@
if(self_message)
hearers -= src
- var/raw_msg = message
- if(visible_message_flags & EMOTE_MESSAGE)
- message = "[src][separation][message]"
-
for(var/mob/M in hearers)
if(!M.client)
continue
- //This entire if/else chain could be in two lines but isn't for readibilties sake.
var/msg = message
+
+ //This entire if/else chain could be in two lines but isn't for readibilties sake.
if(M.see_invisible < invisibility)//if src is invisible to M
msg = blind_message
else if(T != loc && T != src) //if src is inside something and not a turf.
msg = blind_message
else if(T.lighting_object && T.lighting_object.invisibility <= M.see_invisible && T.is_softly_lit()) //if it is too dark.
msg = blind_message
+ else if(visible_message_flags & EMOTE_MESSAGE)
+ var/shown_name = name
+ if(M.mind?.guestbook && ishuman(src))
+ var/mob/living/carbon/human/human_source = src
+ var/known_name = M.mind.guestbook.get_known_name(M, src, human_source.get_face_name())
+ if(known_name)
+ shown_name = known_name
+
+ msg = "[shown_name][separation][message]"
+
if(!msg)
continue
if(visible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, visible_message_flags))
- M.create_chat_message(src, raw_message = raw_msg, runechat_flags = visible_message_flags)
+ M.create_chat_message(src, raw_message = message, runechat_flags = visible_message_flags)
M.show_message(msg, MSG_VISUAL, blind_message, MSG_AUDIBLE)
@@ -250,12 +257,24 @@
if(self_message)
hearers -= src
var/raw_msg = message
- if(audible_message_flags & EMOTE_MESSAGE)
- message = "[src][separation][message]"
for(var/mob/M in hearers)
- if(audible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, audible_message_flags))
- M.create_chat_message(src, raw_message = raw_msg, runechat_flags = audible_message_flags)
- M.show_message(message, MSG_AUDIBLE, deaf_message, MSG_VISUAL)
+ var/msg = raw_msg
+
+ //emote handling
+ if(audible_message_flags & EMOTE_MESSAGE)
+ var/shown_name = name
+ if(M.mind?.guestbook && ishuman(src))
+ var/mob/living/carbon/human/human_source = src
+ var/known_name = M.mind.guestbook.get_known_name(M, src, human_source.GetVoice())
+ if(known_name)
+ shown_name = known_name
+
+ msg = "[shown_name][separation][message]"
+
+ if(runechat_prefs_check(M, audible_message_flags) && M.can_hear())
+ M.create_chat_message(src, raw_message = raw_msg, runechat_flags = audible_message_flags)
+
+ M.show_message(msg, MSG_AUDIBLE, deaf_message, MSG_VISUAL)
/**
* Show a message to all mobs in earshot of this one
@@ -503,7 +522,7 @@
to_chat(src, "You don't have a free hand to examine this!")
return FALSE
//can only queue up one examine on something at a time
- if(examined_thing in do_afters)
+ if(DOING_INTERACTION_WITH_TARGET(src, examined_thing))
return FALSE
to_chat(src, "You start feeling around for something...")
@@ -565,6 +584,15 @@
var/msg = "[src] makes eye contact with you."
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), examined_mob, msg), 3)
+/**
+ * Called by using Activate Held Object with an empty hand/limb
+ *
+ * Does nothing by default. The intended use is to allow limbs to call their
+ * own attack_self procs. It is up to the individual mob to override this
+ * parent and actually use it.
+ */
+/mob/proc/limb_attack_self()
+ return
///Can this mob resist (default FALSE)
/mob/proc/can_resist()
@@ -622,6 +650,8 @@
if(I)
I.attack_self(src)
update_inv_hands()
+ return
+ limb_attack_self()
/mob/verb/do_unique_action()
set name = "Do Unique Action"
@@ -670,6 +700,24 @@
else
to_chat(src, "You don't have a mind datum for some reason, so you can't add a note to it.")
+///Shows guestbook tgui window
+/mob/verb/guestbook()
+ set name = "Guestbook"
+ set category = "IC"
+ set desc = "View your character's Guestbook."
+ // the reason why there are two observer checks in here is because the mind datum sometimes carries over to ghosts.
+ // this is something i should probably fix instead of adding a fallback check, but...
+ if(isobserver(src))
+ to_chat(src, span_warning("You have to be in the current round to do that!"))
+ return
+ if(!mind)
+ var/fail_message = "You have no mind!"
+ if(isobserver(src))
+ fail_message += " You have to be in the current round at some point to have one."
+ to_chat(src, span_warning(fail_message))
+ return
+ mind.guestbook.ui_interact(usr)
+
/**
* Allows you to respawn, abandoning your current mob
*
@@ -773,8 +821,10 @@
src << browse(null, t1)
if(href_list["flavor_more"])
- usr << browse(text("[][]", name, replacetext(flavor_text, "\n", " ")), text("window=[];size=500x200", name))
- onclose(usr, "[name]")
+ var/datum/browser/popup = new(usr, "[name]'s flavor text", "[name]'s Flavor Text (expanded)", 500, 200)
+ popup.set_content(text("[][]", "[name]'s flavor text (expanded)", replacetext(flavor_text, "\n", " ")))
+ popup.open()
+ return
if(user != src)
if(href_list["item"] && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY))
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 6873ee602dac..def2bde930e0 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -191,7 +191,7 @@
///List of progress bars this mob is currently seeing for actions
var/list/progressbars = null //for stacking do_after bars
- ///For storing what do_after's someone has, in case we want to restrict them to only one of a certain do_after at a time
+ ///For storing what do_after's someone has, key = string, value = amount of interactions of that type happening.
var/list/do_afters
///Allows a datum to intercept all click calls this mob is the source of
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index d2e6a4f0dda2..01e3a4d33b1a 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -11,7 +11,7 @@
if(usr != src)
to_chat(usr, span_warning("You can't set someone else's flavour text!"))
- var/msg = sanitize(input(usr,"Set the flavor text in your 'examine' verb. Can also be used for OOC notes about your character.","Flavor Text",html_decode(flavor_text)) as message|null)
+ var/msg = input(usr, "A snippet of text shown when others examine you, describing what you may look like. This can also be used for OOC notes.", "Flavor Text", html_decode("flavor_text")) as message|null
if(msg)
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
@@ -22,10 +22,10 @@
/mob/proc/print_flavor_text()
if(flavor_text && flavor_text != "")
var/msg = replacetext(flavor_text, "\n", " ")
- if(length(msg) <= 100)
+ if(length(msg) <= MAX_SHORTFLAVOR_LEN)
return "[msg]"
else
- return "[copytext(msg, 1, 97)]... More..."
+ return "[copytext(msg, 1, MAX_SHORTFLAVOR_LEN)]... More..."
/mob/proc/get_top_level_mob()
if(istype(src.loc,/mob)&&src.loc!=src)
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index f78c7e36ac6d..9697cce45df3 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -5,7 +5,7 @@
name = "modular microcomputer"
desc = "A small portable microcomputer."
icon = 'icons/obj/machines/computer.dmi'
- icon_state = "laptop-open"
+ icon_state = "laptop"
light_on = FALSE
integrity_failure = 0.5
max_integrity = 100
diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm
index 6213cba441a6..a1af42ca3169 100644
--- a/code/modules/modular_computers/computers/machinery/modular_console.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_console.dm
@@ -9,8 +9,8 @@
screen_icon_state_menu = "menu"
hardware_flag = PROGRAM_CONSOLE
density = TRUE
- base_idle_power_usage = 100
- base_active_power_usage = 500
+ base_idle_power_usage = IDLE_DRAW_MINIMAL
+ base_active_power_usage = ACTIVE_DRAW_LOW
max_hardware_size = 4
steel_sheet_cost = 10
light_strength = 2
diff --git a/code/modules/modular_computers/file_system/programs/arcade.dm b/code/modules/modular_computers/file_system/programs/arcade.dm
index c220881365ec..6e6d235c1b7b 100644
--- a/code/modules/modular_computers/file_system/programs/arcade.dm
+++ b/code/modules/modular_computers/file_system/programs/arcade.dm
@@ -28,7 +28,7 @@
usr?.mind?.adjust_experience(/datum/skill/gaming, 1)
if(boss_hp <= 0)
heads_up = "You have crushed [boss_name]! Rejoice!"
- playsound(computer.loc, 'sound/arcade/win.ogg', 50)
+ playsound(computer.loc, 'sound/arcade/win.ogg', 25)
game_active = FALSE
program_icon_state = "arcade_off"
if(istype(computer))
@@ -38,7 +38,7 @@
sleep(10)
else if(player_hp <= 0 || player_mp <= 0)
heads_up = "You have been defeated... how will the station survive?"
- playsound(computer.loc, 'sound/arcade/lose.ogg', 50)
+ playsound(computer.loc, 'sound/arcade/lose.ogg', 25)
game_active = FALSE
program_icon_state = "arcade_off"
if(istype(computer))
@@ -58,17 +58,17 @@
return
if (boss_mp <= 5)
heads_up = "[boss_mpamt] magic power has been stolen from you!"
- playsound(computer.loc, 'sound/arcade/steal.ogg', 50, TRUE)
+ playsound(computer.loc, 'sound/arcade/steal.ogg', 25, TRUE)
player_mp -= boss_mpamt
boss_mp += boss_mpamt
else if(boss_mp > 5 && boss_hp <12)
heads_up = "[boss_name] heals for [bossheal] health!"
- playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE)
+ playsound(computer.loc, 'sound/arcade/heal.ogg', 25, TRUE)
boss_hp += bossheal
boss_mp -= boss_mpamt
else
heads_up = "[boss_name] attacks you for [boss_attackamt] damage!"
- playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE)
+ playsound(computer.loc, 'sound/arcade/hit.ogg', 25, TRUE)
player_hp -= boss_attackamt
pause_state = FALSE
@@ -109,7 +109,7 @@
attackamt = rand(2,6) + rand(0, gamerSkill)
pause_state = TRUE
heads_up = "You attack for [attackamt] damage."
- playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE)
+ playsound(computer.loc, 'sound/arcade/hit.ogg', 25, TRUE)
boss_hp -= attackamt
sleep(10)
game_check()
@@ -126,7 +126,7 @@
healcost = rand(1, maxPointCost)
pause_state = TRUE
heads_up = "You heal for [healamt] damage."
- playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE)
+ playsound(computer.loc, 'sound/arcade/heal.ogg', 25, TRUE)
player_hp += healamt
player_mp -= healcost
sleep(10)
@@ -139,7 +139,7 @@
rechargeamt = rand(4,7) + rand(0, gamerSkill)
pause_state = TRUE
heads_up = "You regain [rechargeamt] magic power."
- playsound(computer.loc, 'sound/arcade/mana.ogg', 50, TRUE)
+ playsound(computer.loc, 'sound/arcade/mana.ogg', 25, TRUE)
player_mp += rechargeamt
sleep(10)
game_check()
diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm
index 7d518c0b2f6d..eb363de15792 100644
--- a/code/modules/modular_computers/laptop_vendor.dm
+++ b/code/modules/modular_computers/laptop_vendor.dm
@@ -254,7 +254,7 @@
var/obj/item/card/id/ID = I
var/datum/bank_account/account = ID.registered_account
var/target_credits = total_price - credits
- if(!account.adjust_money(-target_credits))
+ if(!account.adjust_money(-target_credits, "laptop_vendor"))
say("Insufficient credits on card to purchase!")
return
credits += target_credits
diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm
index b10e25c84e7a..c858582af6a3 100644
--- a/code/modules/movespeed/modifiers/items.dm
+++ b/code/modules/movespeed/modifiers/items.dm
@@ -17,3 +17,4 @@
/datum/movespeed_modifier/berserk
multiplicative_slowdown = -0.2
+
diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm
index 2e3dac4fddbe..4939686ee9fd 100644
--- a/code/modules/ninja/suit/ninjaDrainAct.dm
+++ b/code/modules/ninja/suit/ninjaDrainAct.dm
@@ -41,7 +41,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1//Reached maximum battery capacity.
- if (do_after(H,10, target = src))
+ if (do_after(H,10, target = src, hidden = TRUE))
spark_system.start()
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
cell.use(drain)
@@ -85,7 +85,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
- if (do_after(H,10, target = src))
+ if (do_after(H,10, target = src, hidden = TRUE))
spark_system.start()
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
charge -= drain
@@ -104,7 +104,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
. = 0
if(charge)
- if(G.candrain && do_after(H,30, target = src))
+ if(G.candrain && do_after(H,30, target = src, hidden = TRUE))
. = charge
if(S.cell.charge + charge > S.cell.maxcharge)
S.cell.charge = S.cell.maxcharge
@@ -131,7 +131,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
if(stored_research)
to_chat(H, "Copying files...")
- if(do_after(H, S.s_delay, target = src) && G.candrain && src)
+ if(do_after(H, S.s_delay, target = src, hidden = TRUE) && G.candrain && src)
stored_research.copy_research_to(S.stored_research)
to_chat(H, "Data analyzed. Process finished.")
@@ -148,7 +148,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
if(stored_research)
to_chat(H, "Copying files...")
- if(do_after(H, S.s_delay, target = src) && G.candrain && src)
+ if(do_after(H, S.s_delay, target = src, hidden = TRUE) && G.candrain && src)
stored_research.copy_research_to(S.stored_research)
to_chat(H, "Data analyzed. Process finished.")
@@ -167,7 +167,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
while(G.candrain && !maxcapacity && src)
drain = (round((rand(G.mindrain, G.maxdrain))/2))
var/drained = 0
- if(PN && do_after(H,10, target = src))
+ if(PN && do_after(H,10, target = src, hidden = TRUE))
drained = min(drain, delayed_surplus())
add_delayedload(drained)
if(drained < drain)//if no power on net, drain apcs
@@ -207,7 +207,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
if(S.cell.charge + drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
- if (do_after(H,10, target = src))
+ if (do_after(H,10, target = src, hidden = TRUE))
spark_system.start()
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
cell.use(drain)
@@ -235,7 +235,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
if(S.cell.charge+drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
- if (do_after(H,10))
+ if (do_after(H,10, hidden = TRUE))
spark_system.start()
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
cell.use(drain)
diff --git a/code/modules/overmap/helm.dm b/code/modules/overmap/helm.dm
index 59fdee827907..5b1f27fa2cb9 100644
--- a/code/modules/overmap/helm.dm
+++ b/code/modules/overmap/helm.dm
@@ -388,11 +388,11 @@
return
to_chat(user, "You begin to manually override the local database...")
- if(!do_after_mob(user, list(src), 2 SECONDS))
+ if(!do_after(user, 2 SECONDS, list(src)))
return COMPONENT_BLOCK_TOOL_ATTACK
priority_announce("Illegal access to local ship database detected.", sender_override="[src.name]", zlevel=virtual_z())
- if(!do_after_mob(user, list(src), 10 SECONDS))
+ if(!do_after(user, 10 SECONDS, list(src)))
return COMPONENT_BLOCK_TOOL_ATTACK
say("Warning, database corruption present, resetting local database state.")
diff --git a/code/modules/overmap/missions.dm b/code/modules/overmap/missions.dm
index 41ac27dce3a1..0bc2c2f34722 100644
--- a/code/modules/overmap/missions.dm
+++ b/code/modules/overmap/missions.dm
@@ -63,7 +63,7 @@
return ..()
/datum/mission/proc/turn_in()
- servant.ship_account.adjust_money(value)
+ servant.ship_account.adjust_money(value, "mission")
qdel(src)
/datum/mission/proc/give_up()
diff --git a/code/modules/overmap/missions/research_mission.dm b/code/modules/overmap/missions/research_mission.dm
index a84b07b6529a..9481556d33be 100644
--- a/code/modules/overmap/missions/research_mission.dm
+++ b/code/modules/overmap/missions/research_mission.dm
@@ -106,7 +106,7 @@
density = FALSE
anchored = FALSE
use_power = NO_POWER_USE
- idle_power_usage = 400
+ idle_power_usage = IDLE_DRAW_MEDIUM
processing_flags = START_PROCESSING_MANUALLY
/obj/machinery/mission_scanner/wrench_act(mob/living/user, obj/item/I)
@@ -122,7 +122,7 @@
if(anchorvalue)
set_is_operational(TRUE)
START_PROCESSING(SSmachines, src)
- use_power = IDLE_POWER_USE
+ set_idle_power()
else
set_is_operational(FALSE)
STOP_PROCESSING(SSmachines, src)
diff --git a/code/modules/overmap/objects/dynamic_datum.dm b/code/modules/overmap/objects/dynamic_datum.dm
index 69591c71dc8e..dcc62aad7424 100644
--- a/code/modules/overmap/objects/dynamic_datum.dm
+++ b/code/modules/overmap/objects/dynamic_datum.dm
@@ -35,6 +35,9 @@
/// The turf used as the backup baseturf for any reservations created by this datum. Should not be null.
var/turf/default_baseturf = /turf/open/space
+ ///The default gravity the virtual z will have
+ var/gravity = 0
+
///The weather the virtual z will have. If null, the planet will have no weather.
var/datum/weather_controller/weather_controller_type
@@ -139,6 +142,7 @@
token.color = planet.color
ruin_type = planet.ruin_type
default_baseturf = planet.default_baseturf
+ gravity = planet.gravity
mapgen = planet.mapgen
weather_controller_type = planet.weather_controller_type
landing_sound = planet.landing_sound
diff --git a/code/modules/overmap/objects/outpost/outpost.dm b/code/modules/overmap/objects/outpost/outpost.dm
index 774057b68a08..01a100022cbf 100644
--- a/code/modules/overmap/objects/outpost/outpost.dm
+++ b/code/modules/overmap/objects/outpost/outpost.dm
@@ -24,10 +24,12 @@
// NOTE: "planetary" outposts should use baseturf specification and possibly different ztrait sun type, for both hangars and main level.
var/list/main_level_ztraits = list(
ZTRAIT_STATION = TRUE,
- ZTRAIT_SUN_TYPE = AZIMUTH
+ ZTRAIT_SUN_TYPE = AZIMUTH,
+ ZTRAIT_GRAVITY = STANDARD_GRAVITY
)
var/list/hangar_ztraits = list(
- ZTRAIT_SUN_TYPE = STATIC_EXPOSED
+ ZTRAIT_SUN_TYPE = STATIC_EXPOSED,
+ ZTRAIT_GRAVITY = STANDARD_GRAVITY
)
/// The mapzone used by the outpost level and hangars. Using a single mapzone means networked radio messages.
@@ -119,16 +121,14 @@
// fun fact: "Hutton" is in last_names
person_name = pick(GLOB.last_names)
else
- switch(rand(1, 5))
+ switch(rand(1, 4))
if(1)
- person_name = pick(GLOB.moth_last)
- if(2)
person_name = pick(prob(50) ? GLOB.lizard_names_male : GLOB.lizard_names_female)
- if(3)
+ if(2)
person_name = pick(GLOB.spider_last)
- if(4)
+ if(3)
person_name = kepori_name()
- if(5)
+ if(4)
person_name = vox_name()
return "[person_name] [pick(GLOB.station_suffixes)]"
diff --git a/code/modules/overmap/planets/planet_types.dm b/code/modules/overmap/planets/planet_types.dm
index 2152d4efe5ef..74ea0165b357 100644
--- a/code/modules/overmap/planets/planet_types.dm
+++ b/code/modules/overmap/planets/planet_types.dm
@@ -5,6 +5,7 @@
var/ruin_type = null
var/mapgen = null
var/default_baseturf = null
+ var/gravity = 0
var/weather_controller_type = null
var/icon_state = "globe"
var/color = "#ffffff"
@@ -20,6 +21,7 @@
color = COLOR_ORANGE
mapgen = /datum/map_generator/planet_generator/lava
default_baseturf = /turf/open/floor/plating/asteroid/basalt/lava
+ gravity = STANDARD_GRAVITY
weather_controller_type = /datum/weather_controller/lavaland
ruin_type = RUINTYPE_LAVA
landing_sound = 'sound/effects/planet_landing_2.ogg'
@@ -33,6 +35,7 @@
color = COLOR_BLUE_LIGHT
mapgen = /datum/map_generator/planet_generator/snow
default_baseturf = /turf/open/floor/plating/asteroid/snow/icemoon
+ gravity = STANDARD_GRAVITY
weather_controller_type = /datum/weather_controller/snow_planet
ruin_type = RUINTYPE_ICE
landing_sound = 'sound/effects/planet_landing_2.ogg'
@@ -45,6 +48,7 @@
color = COLOR_LIME
mapgen = /datum/map_generator/planet_generator/jungle
default_baseturf = /turf/open/floor/plating/dirt/jungle
+ gravity = STANDARD_GRAVITY
weather_controller_type = /datum/weather_controller/lush
ruin_type = RUINTYPE_JUNGLE
landing_sound = 'sound/effects/planet_landing_1.ogg'
@@ -57,6 +61,7 @@
color = "#bd1313"
mapgen = /datum/map_generator/planet_generator/rock
default_baseturf = /turf/open/floor/plating/asteroid
+ gravity = STANDARD_GRAVITY
weather_controller_type = /datum/weather_controller/rockplanet
ruin_type = RUINTYPE_ROCK
landing_sound = 'sound/effects/planet_landing_2.ogg'
@@ -69,6 +74,7 @@
color = COLOR_GRAY
mapgen = /datum/map_generator/planet_generator/sand
default_baseturf = /turf/open/floor/plating/asteroid/whitesands
+ gravity = STANDARD_GRAVITY
weather_controller_type = /datum/weather_controller/desert
ruin_type = RUINTYPE_SAND
landing_sound = 'sound/effects/planet_landing_2.ogg'
@@ -81,6 +87,7 @@
color = "#c6b597"
mapgen = /datum/map_generator/planet_generator/beach
default_baseturf = /turf/open/floor/plating/asteroid/sand/lit
+ gravity = STANDARD_GRAVITY
weather_controller_type = /datum/weather_controller/lush
ruin_type = RUINTYPE_BEACH
landing_sound = 'sound/effects/planet_landing_1.ogg'
@@ -92,6 +99,7 @@
icon_state = "wormhole"
color = COLOR_YELLOW
mapgen = /datum/map_generator/single_biome/reebe
+ gravity = STANDARD_GRAVITY
default_baseturf = /turf/open/chasm/reebe_void
weather_controller_type = null
weight = 0
@@ -131,6 +139,7 @@
color = "#a9883e"
mapgen = /datum/map_generator/planet_generator/waste
default_baseturf = /turf/open/floor/plating/asteroid/wasteplanet
+ gravity = STANDARD_GRAVITY
weather_controller_type = /datum/weather_controller/chlorine
ruin_type = RUINTYPE_WASTE
landing_sound = 'sound/effects/planet_landing_2.ogg'
@@ -142,6 +151,7 @@
icon_state = "globe"
color = COLOR_DARK_MODERATE_ORANGE
mapgen = /datum/map_generator/single_biome/gas_giant
+ gravity = GAS_GIANT_GRAVITY
default_baseturf = /turf/open/chasm/gas_giant
weather_controller_type = null
ruin_type = null //it's a Gas Giant. Not Cloud fuckin City
@@ -155,6 +165,7 @@
planet = DYNAMIC_WORLD_PLASMA_GIANT
color = COLOR_PURPLE
mapgen = /datum/map_generator/single_biome/plasma_giant
+ gravity = GAS_GIANT_GRAVITY
default_baseturf = /turf/open/chasm/gas_giant/plasma
weight = 0
icon_state = "globe"
diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm
index 9c9024126b0a..ec4b78629027 100644
--- a/code/modules/overmap/ships/controlled_ship_datum.dm
+++ b/code/modules/overmap/ships/controlled_ship_datum.dm
@@ -307,6 +307,25 @@
job_holder_refs[human_job] = list()
job_holder_refs[human_job] += WEAKREF(H)
+/**
+ * adds a mob's real name to a crew's guestbooks
+ *
+ * * H - human mob to add to the crew's guestbooks
+ */
+/datum/overmap/ship/controlled/proc/add_mob_to_crew_guestbook(mob/living/carbon/human/H)
+ // iterate over the human list to find crewmembers
+ for(var/mob/living/carbon/human/crewmember as anything in GLOB.human_list)
+ if(crewmember == H)
+ continue
+ if(!(crewmember.real_name in manifest))
+ continue
+ if(!crewmember.mind?.guestbook)
+ continue
+
+ // add the mob to the crewmember's guestbook and viceversa
+ crewmember.mind.guestbook.add_guest(crewmember, H, H.real_name, H.real_name, TRUE)
+ H.mind.guestbook.add_guest(H, crewmember, crewmember.real_name, crewmember.real_name, TRUE)
+
/datum/overmap/ship/controlled/proc/set_owner_mob(mob/new_owner)
if(owner_mob)
// we (hopefully) don't have to hook qdeletion,
@@ -417,10 +436,13 @@
SStgui.close_uis(helm)
helm.say(helm_locked ? "Helm console is now locked." : "Helm console has been unlocked.")
+/datum/overmap/ship/controlled/proc/get_faction()
+ return source_template.faction_name
+
/obj/item/key/ship
name = "ship key"
desc = "A key for locking and unlocking the helm of a ship, comes with a ball chain so it can be worn around the neck. Comes with a cute little shuttle-shaped keychain."
- icon_state = "keyship"
+ icon_state = "shipkey"
var/datum/overmap/ship/controlled/master_ship
var/static/list/key_colors = list(
"blue" = "#4646fc",
diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm
index cb5a025da475..bce7a3f322c5 100644
--- a/code/modules/paperwork/fax.dm
+++ b/code/modules/paperwork/fax.dm
@@ -308,27 +308,34 @@
update_icon()
return TRUE
if("send_special")
- var/obj/item/paper/fax_paper = loaded_item_ref?.resolve()
- if(!fax_paper)
+ var/obj/item/loaded = loaded_item_ref?.resolve()
+ var/obj/thing_to_send
+ if(!loaded)
return
- if(!istype(fax_paper))
+ if(istype(loaded, /obj/item/paper))
+ var/obj/item/paper/fax_paper = loaded
+ fax_paper.request_state = TRUE
+ thing_to_send = fax_paper
+ else if(istype(loaded, /obj/item/photo))
+ thing_to_send = loaded
+ else
to_chat(usr, icon2html(src.icon, usr) + "ERROR: Failed to send fax.")
return
- fax_paper.request_state = TRUE
- fax_paper.loc = null
-
- INVOKE_ASYNC(src, PROC_REF(animate_object_travel), fax_paper, "fax_receive", find_overlay_state(fax_paper, "send"))
+ if(!thing_to_send)
+ return
+ thing_to_send.loc = null
+ INVOKE_ASYNC(src, PROC_REF(animate_object_travel), thing_to_send, "fax_receive", find_overlay_state(thing_to_send, "send"))
history_add("Send", params["name"])
- GLOB.requests.fax_request(usr.client, "sent a fax message from [fax_name]/[fax_id] to [params["name"]]", fax_paper)
- to_chat(GLOB.admins, "[icon2html(src.icon, GLOB.admins)]FAX REQUEST: [ADMIN_FULLMONTY(usr)]:sent a fax message from [fax_name]/[fax_id][ADMIN_FLW(src)] to [html_encode(params["name"])] [ADMIN_SHOW_PAPER(fax_paper)]")
- log_fax(fax_paper, params["id"], params["name"])
+ GLOB.requests.fax_request(usr.client, "sent a fax message from [fax_name]/[fax_id] to [params["name"]]", thing_to_send)
+ to_chat(GLOB.admins, "[icon2html(src.icon, GLOB.admins)]FAX REQUEST: [ADMIN_FULLMONTY(usr)]:sent a fax message from [fax_name]/[fax_id][ADMIN_FLW(src)] to [html_encode(params["name"])] [istype(thing_to_send, /obj/item/paper) ? ADMIN_SHOW_PAPER(thing_to_send) : ADMIN_SHOW_PHOTO(thing_to_send)]")
+ log_fax(thing_to_send, params["id"], params["name"])
loaded_item_ref = null
for(var/obj/machinery/fax/fax as anything in GLOB.fax_machines)
if(fax.admin_fax_id == params["id"])
- fax.receive(fax_paper, fax_name)
+ fax.receive(thing_to_send, fax_name)
break
update_appearance()
@@ -360,7 +367,7 @@
* * loaded - The object to be sent.
* * id - The network ID of the fax machine you want to send the item to.
*/
-/obj/machinery/fax/proc/send(obj/item/loaded, id)
+/obj/machinery/fax/proc/send(atom/movable/loaded, id)
for(var/obj/machinery/fax/fax as anything in GLOB.fax_machines)
if(fax.fax_id != id)
continue
@@ -385,7 +392,7 @@
* * loaded - The object to be printed.
* * sender_name - The sender's name, which will be displayed in the message and recorded in the history of operations.
*/
-/obj/machinery/fax/proc/receive(obj/item/loaded, sender_name, important = FALSE)
+/obj/machinery/fax/proc/receive(atom/movable/loaded, sender_name, important = FALSE)
playsound(src, 'sound/items/poster_being_created.ogg', 20, FALSE)
INVOKE_ASYNC(src, PROC_REF(animate_object_travel), loaded, "fax_receive", find_overlay_state(loaded, "receive"))
say("Received correspondence from [sender_name].")
@@ -442,7 +449,7 @@
* Arguments:
* * vend - Item to vend from the fax machine.
*/
-/obj/machinery/fax/proc/vend_item(obj/item/vend)
+/obj/machinery/fax/proc/vend_item(atom/movable/vend)
vend.forceMove(drop_location())
if(hurl_contents)
vend.throw_at(get_edge_target_turf(drop_location(), pick(GLOB.alldirs)), rand(1, 4), EMBED_THROWSPEED_THRESHOLD)
diff --git a/code/modules/paperwork/folders_premade.dm b/code/modules/paperwork/folders_premade.dm
index a919dce944ce..3c9dbb89feae 100644
--- a/code/modules/paperwork/folders_premade.dm
+++ b/code/modules/paperwork/folders_premade.dm
@@ -61,3 +61,10 @@
document = /obj/item/documents/terragov
desc = "A green folder with a Terran Regency seal."
icon_state = "folder_terragovred"
+
+/obj/item/folder/suns
+ desc = "A purple folder with a SUNS seal."
+ icon_state = "folder_suns"
+
+/obj/item/folder/suns/red
+ icon_state = "folder_sunsred" // i'm not sure why SUNS would need secret documents
diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm
index 20ff55f0d789..51efaba06046 100644
--- a/code/modules/paperwork/paper_cutter.dm
+++ b/code/modules/paperwork/paper_cutter.dm
@@ -101,7 +101,7 @@
/obj/item/paper/paperslip/corporate //More fancy and sturdy paper slip which is a "plastic card", used for things like spare ID safe code
name = "corporate plastic card"
desc = "A plastic card for confidental corporate matters. Can be written on with pen somehow."
- icon_state = "corppaperslip"
+ icon_state = "paperbiscuit"
grind_results = list(/datum/reagent/plastic_polymers = 1.5) //It's a plastic card after all
max_integrity = 130 //Slightly more sturdy because of being made out of a plastic
drop_sound = 'sound/items/handling/disk_drop.ogg'
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index b289c32e85e0..cd913c57fb0a 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -80,13 +80,6 @@
custom_materials = null
grind_results = list(/datum/reagent/ash = 5, /datum/reagent/cellulose = 10)
-/datum/crafting_recipe/charcoal_stylus
- name = "Charcoal Stylus"
- result = /obj/item/pen/charcoal
- reqs = list(/obj/item/stack/sheet/mineral/wood = 1, /datum/reagent/ash = 30)
- time = 30
- category = CAT_PRIMAL
-
/obj/item/pen/fountain/captain
name = "captain's fountain pen"
desc = "It's an expensive Oak fountain pen. The nib is quite sharp."
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 6058079e9dc2..61520f6704c5 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -24,8 +24,8 @@
anchored = TRUE
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 30
- active_power_usage = 200
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_LOW
power_channel = AREA_USAGE_EQUIP
max_integrity = 300
integrity_failure = 0.33
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 2578fc97961c..45893f8d5fc5 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -127,7 +127,7 @@
/obj/item/stamp/clip
name = "CLIP Minutemen rubber stamp"
- icon_state = "stamp-clip"
+ icon_state = "stamp-cmm"
dye_color = DYE_FO
/obj/item/stamp/gold
@@ -140,5 +140,10 @@
icon_state = "stamp-bard"
dye_color = DYE_FO
+/obj/item/stamp/suns
+ name = "SUNS rubber stamp"
+ icon_state = "stamp-suns"
+ dye_color = DYE_PURPLE
+
/obj/item/stamp/attack_paw(mob/user)
return attack_hand(user)
diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm
index 5a9d9192dbbf..f4448c4a53ac 100644
--- a/code/modules/plumbing/plumbers/_plumb_machinery.dm
+++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm
@@ -8,7 +8,7 @@
icon = 'icons/obj/plumbing/plumbers.dmi'
icon_state = "pump"
density = TRUE
- active_power_usage = 30
+ active_power_usage = ACTIVE_DRAW_MINIMAL
use_power = ACTIVE_POWER_USE
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
///Plumbing machinery is always gonna need reagents, so we might aswell put it here
@@ -40,7 +40,7 @@
default_unfasten_wrench(user, I)
return TRUE
-/obj/machinery/plumbing/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
+/obj/machinery/plumbing/plunger_act(obj/item/plunger/P, mob/living/user)
to_chat(user, "You start furiously plunging [name].")
if(do_after(user, 30, target = src))
to_chat(user, "You finish plunging the [name].")
diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm
index 331e3fc24d89..294b50eff748 100644
--- a/code/modules/plumbing/plumbers/pumps.dm
+++ b/code/modules/plumbing/plumbers/pumps.dm
@@ -7,8 +7,8 @@
base_icon_state = "pump"
anchored = FALSE
density = TRUE
- idle_power_usage = 10
- active_power_usage = 1000
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MEDIUM
rcd_cost = 30
rcd_delay = 40
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 03bb1651fd70..f21f95692234 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -52,7 +52,7 @@
/// How long it takes an elzu to drain or charge APCs. Also used as a spam limiter.
#define APC_DRAIN_TIME (7.5 SECONDS)
/// How much power elzu gain/drain from APCs.
-#define APC_POWER_GAIN (10 * ETHEREAL_CHARGE_SCALING_MULTIPLIER)
+#define APC_POWER_GAIN (10 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
// Wires & EMPs:
/// The wire value used to reset the APCs wires after one's EMPed.
@@ -217,8 +217,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
// this allows the APC to be embedded in a wall, yet still inside an area
if (building)
setDir(ndir)
- tdir = dir // to fix Vars bug
-//!!!!!!!!!!!!!! FUCK YOU SINGLE LINE OF CODE!! FUCK YOU YOU PIECE OF SHIT!!!!! setDir(SOUTH)
+ tdir = dir// to fix Vars bug
+
switch(tdir)
if(NORTH)
if((pixel_y != initial(pixel_y)) && (pixel_y != 23))
@@ -834,10 +834,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
return
//[REDACTED] Begin -- Ethereal Charge Scaling //Let the hubris remain but the name be forgotten
- if(isethereal(user))
+ if(iselzuose(user))
var/mob/living/carbon/human/H = user
- var/datum/species/ethereal/E = H.dna.species
- var/charge_limit = ETHEREAL_CHARGE_DANGEROUS - APC_POWER_GAIN
+ var/datum/species/elzuose/E = H.dna.species
+ var/charge_limit = ELZUOSE_CHARGE_DANGEROUS - APC_POWER_GAIN
if((H.a_intent == INTENT_HARM) && (E.drain_time < world.time))
if(cell.charge <= (cell.maxcharge / 20)) // ethereals can't drain APCs under half charge, this is so that they are forced to look to alternative power sources if the station is running low
to_chat(H, "The APC's syphon safeties prevent you from draining power!")
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 3f85acdddfe6..283d41524f79 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -542,7 +542,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list(new/datum/stack_recipe("cable restrain
if(affecting && (!IS_ORGANIC_LIMB(affecting)))
if(user == H)
user.visible_message("[user] starts to fix some of the wires in [H]'s [parse_zone(affecting.body_zone)].", "You start fixing some of the wires in [H == user ? "your" : "[H]'s"] [parse_zone(affecting.body_zone)].")
- if(!do_mob(user, H, 50))
+ if(!do_after(user, 0.5 SECONDS, H))
return
if(item_heal_robotic(H, user, 0, 15))
use(1)
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 0f84b5571382..1a2f87c70dd9 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -1,6 +1,6 @@
#define CELL_DRAIN_TIME 35
-#define CELL_POWER_GAIN (3 * ETHEREAL_CHARGE_SCALING_MULTIPLIER)
-#define CELL_POWER_DRAIN (37.5 * ETHEREAL_CHARGE_SCALING_MULTIPLIER)
+#define CELL_POWER_GAIN (3 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
+#define CELL_POWER_DRAIN (37.5 * ELZUOSE_CHARGE_SCALING_MULTIPLIER)
/obj/item/stock_parts/cell
name = "power cell"
@@ -150,10 +150,10 @@
//WS Begin -- Ethereal Charge Scaling
/obj/item/stock_parts/cell/attack_self(mob/user)
- if(isethereal(user))
+ if(iselzuose(user))
var/mob/living/carbon/human/H = user
- var/datum/species/ethereal/E = H.dna.species
- var/charge_limit = ETHEREAL_CHARGE_DANGEROUS - CELL_POWER_GAIN
+ var/datum/species/elzuose/E = H.dna.species
+ var/charge_limit = ELZUOSE_CHARGE_DANGEROUS - CELL_POWER_GAIN
if(E.drain_time > world.time)
return
if(charge < CELL_POWER_DRAIN)
diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm
index e112b38f2fd7..0fe0b51c6193 100644
--- a/code/modules/power/floodlight.dm
+++ b/code/modules/power/floodlight.dm
@@ -61,8 +61,8 @@
density = TRUE
max_integrity = 100
integrity_failure = 0.8
- idle_power_usage = 100
- active_power_usage = 1000
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MEDIUM
anchored = FALSE
light_power = 1.75
var/list/light_setting_list = list(0, 5, 10, 15)
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 1e4660c48953..3ed7e262a53d 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -1,4 +1,3 @@
-
//
// Gravity Generator
//
@@ -116,7 +115,7 @@
/obj/machinery/gravity_generator/main
icon_state = "on_8"
idle_power_usage = 0
- active_power_usage = 3000
+ active_power_usage = ACTIVE_DRAW_EXTREME
power_channel = AREA_USAGE_ENVIRON
sprite_number = 8
use_power = IDLE_POWER_USE
@@ -287,7 +286,10 @@
/obj/machinery/gravity_generator/main/proc/set_state(new_state)
charging_state = POWER_IDLE
on = new_state
- use_power = on ? ACTIVE_POWER_USE : IDLE_POWER_USE
+ if(on)
+ set_active_power()
+ else
+ set_idle_power()
// Sound the alert if gravity was just enabled or disabled.
var/alert = FALSE
if(SSticker.IsRoundInProgress())
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 24b106f0241f..e92efb779d67 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -13,7 +13,7 @@
#define BROKEN_SPARKS_MAX (9 MINUTES)
#define LIGHT_DRAIN_TIME 25 //WS Edit -- Ethereal Charge Scaling
-#define LIGHT_POWER_GAIN (1.75 * ETHEREAL_CHARGE_SCALING_MULTIPLIER) //WS Edit -- Ethereal Charge Scaling
+#define LIGHT_POWER_GAIN (1.75 * ELZUOSE_CHARGE_SCALING_MULTIPLIER) //WS Edit -- Ethereal Charge Scaling
/obj/item/wallframe/light_fixture
name = "light fixture frame"
@@ -217,9 +217,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/light_construct/small, 28)
desc = "A lighting fixture."
layer = WALL_OBJ_LAYER
max_integrity = 100
- use_power = ACTIVE_POWER_USE
- idle_power_usage = 2
- active_power_usage = 20
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 0
+ active_power_usage = 0
power_channel = AREA_USAGE_LIGHT //Lights are calc'd via area so they dont need to be in the machine list
var/on = FALSE // 1 if on, 0 if off
var/on_gs = FALSE
@@ -360,6 +360,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/built, 28)
addtimer(CALLBACK(src, PROC_REF(update), 0), 1)
/obj/machinery/light/Destroy()
+ if(on)
+ removeStaticPower(static_power_used, AREA_USAGE_STATIC_LIGHT)
var/area/A = get_area(src)
if(A)
on = FALSE
@@ -420,22 +422,18 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/built, 28)
if(trigger)
burn_out()
else
- use_power = ACTIVE_POWER_USE
set_light(BR, PO, CO)
else if(has_emergency_power(LIGHT_EMERGENCY_POWER_USE) && !turned_off())
- use_power = IDLE_POWER_USE
emergency_mode = TRUE
START_PROCESSING(SSmachines, src)
else
- use_power = IDLE_POWER_USE
set_light(0)
update_appearance()
- active_power_usage = (brightness * 10)
if(on != on_gs)
on_gs = on
if(on)
- static_power_used = brightness * 20 //20W per unit luminosity
+ static_power_used = brightness * LIGHT_DRAW //defined in power defines
addStaticPower(static_power_used, AREA_USAGE_STATIC_LIGHT)
else
removeStaticPower(static_power_used, AREA_USAGE_STATIC_LIGHT)
@@ -690,9 +688,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/built, 28)
var/mob/living/carbon/human/H = user
if(istype(H))
- var/datum/species/ethereal/eth_species = H.dna?.species
+ var/datum/species/elzuose/eth_species = H.dna?.species
if(istype(eth_species))
- var/datum/species/ethereal/E = H.dna.species
+ var/datum/species/elzuose/E = H.dna.species
if(E.drain_time > world.time)
return
to_chat(H, "You start channeling some power through the [fitting] into your body.")
@@ -859,8 +857,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/built, 28)
if(!..()) //not caught by a mob
shatter()
-// update the icon state and description of the light
+/obj/item/light/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
+ shatter()
+ ..()
+// update the icon state and description of the light
/obj/item/light/proc/update()
switch(status)
if(LIGHT_OK)
diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm
index b1c2a95a938f..debdba4946bf 100644
--- a/code/modules/power/monitor.dm
+++ b/code/modules/power/monitor.dm
@@ -7,8 +7,8 @@
icon_keyboard = "power_key"
light_color = LIGHT_COLOR_YELLOW
use_power = ACTIVE_POWER_USE
- idle_power_usage = 20
- active_power_usage = 100
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
circuit = /obj/item/circuitboard/computer/powermonitor
tgui_id = "PowerMonitor"
@@ -49,10 +49,12 @@
/obj/machinery/computer/monitor/process()
if(!get_powernet())
- use_power = IDLE_POWER_USE
+ if(use_static_power != IDLE_POWER_USE)
+ set_idle_power()
search()
else
- use_power = ACTIVE_POWER_USE
+ if(use_static_power != ACTIVE_POWER_USE)
+ set_active_power()
record()
/obj/machinery/computer/monitor/proc/search() //keep in sync with /datum/computer_file/program/power_monitor's version
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index e235e9328549..e63cd1298616 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -291,7 +291,6 @@
circuit = /obj/item/circuitboard/machine/pacman/super
sheet_path = /obj/item/stack/sheet/mineral/uranium
power_gen = 15000
- time_per_sheet = 85
/obj/machinery/power/port_gen/pacman/super/overheat()
. =..()
@@ -304,7 +303,6 @@
circuit = /obj/item/circuitboard/machine/pacman/mrs
sheet_path = /obj/item/stack/sheet/mineral/diamond
power_gen = 40000
- time_per_sheet = 80
/obj/machinery/power/port_gen/pacman/mrs/overheat()
. =..()
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 3cf5f5766097..a386a739622d 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -19,6 +19,7 @@
/obj/machinery/power/Destroy()
disconnect_from_network()
+ set_no_power()
return ..()
///////////////////////////////
@@ -96,14 +97,47 @@
chan = power_channel
A.use_power(amount, chan)
-/obj/machinery/proc/addStaticPower(value, powerchannel)
- var/area/A = get_area(src)
+/obj/machinery/proc/addStaticPower(value, powerchannel, area/A)
if(!A)
- return
+ if(get_area(src))
+ A = get_area(src)
+ else
+ return
A.addStaticPower(value, powerchannel)
-/obj/machinery/proc/removeStaticPower(value, powerchannel)
- addStaticPower(-value, powerchannel)
+/obj/machinery/proc/removeStaticPower(value, powerchannel, area/A)
+ addStaticPower(-value, powerchannel, A)
+
+/obj/machinery/proc/set_idle_power(area/A)
+ set_no_power(A)
+ if(use_power == NO_POWER_USE)
+ return
+ use_static_power = IDLE_POWER_USE
+ addStaticPower(idle_power_usage, power_channel + 3, A)
+
+/obj/machinery/proc/set_active_power(area/A)
+ set_no_power(A)
+ if(use_power == NO_POWER_USE)
+ return
+ use_static_power = ACTIVE_POWER_USE
+ addStaticPower(active_power_usage, power_channel + 3, A)
+
+/obj/machinery/proc/set_no_power(area/A)
+ switch(use_static_power)
+ if(IDLE_POWER_USE)
+ removeStaticPower(idle_power_usage, power_channel + 3, A)
+ if(ACTIVE_POWER_USE)
+ removeStaticPower(active_power_usage, power_channel + 3, A)
+ use_static_power = NO_POWER_USE
+
+/obj/machinery/proc/set_static_power(area/A)//used to set the actual draw to the value of use_static_power
+ switch(use_power)
+ if(NO_POWER_USE)
+ set_no_power(A)
+ if(IDLE_POWER_USE)
+ set_idle_power(A)
+ if(ACTIVE_POWER_USE)
+ set_active_power(A)
/**
* Called whenever the power settings of the containing area change
@@ -112,13 +146,15 @@
*
* Returns TRUE if the NOPOWER flag was toggled
*/
-/obj/machinery/proc/power_change()
+/obj/machinery/proc/power_change(area/A)
SIGNAL_HANDLER
SHOULD_CALL_PARENT(1)
+ set_no_power(A)
if(machine_stat & BROKEN)
return
if(powered(power_channel))
+ set_static_power(A)
if(machine_stat & NOPOWER)
SEND_SIGNAL(src, COMSIG_MACHINERY_POWER_RESTORED)
. = TRUE
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 2d801de426af..a5d8b4c4e1e9 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -70,9 +70,6 @@
loaded_tank.air_contents.adjust_moles(GAS_O2, -gasdrained)
loaded_tank.air_contents.adjust_moles(GAS_CO2, gasdrained*2)
var/bitcoins_mined = RAD_COLLECTOR_OUTPUT
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
- if(D)
- D.adjust_money(bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE)
stored_research += bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE*PRIVATE_TECHWEB_GAIN
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE*PUBLIC_TECHWEB_GAIN)
stored_energy-=bitcoins_mined
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index d17e12264706..2dcaa224a71e 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -11,8 +11,8 @@
circuit = /obj/item/circuitboard/machine/emitter
use_power = NO_POWER_USE
- idle_power_usage = 10
- active_power_usage = 300
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_LOW
var/icon_state_on = "emitter_+a"
var/icon_state_underpowered = "emitter_+u"
@@ -67,7 +67,7 @@
var/max_firedelay = 120
var/firedelay = 120
var/min_firedelay = 24
- var/power_usage = 350
+ var/power_usage = ACTIVE_DRAW_LOW
for(var/obj/item/stock_parts/micro_laser/L in component_parts)
max_firedelay -= 20 * L.rating
min_firedelay -= 4 * L.rating
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 421550cd52df..afd68d5ab7b2 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -23,7 +23,7 @@
name = "Particle Accelerator"
desc = "Part of a Particle Accelerator."
icon = 'icons/obj/machines/particle_accelerator.dmi'
- icon_state = "none"
+ icon_state = "emitter_center"
anchored = FALSE
density = TRUE
max_integrity = 500
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 7bc3fa552ad3..ddcaf026a40e 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -6,8 +6,8 @@
anchored = FALSE
density = TRUE
use_power = NO_POWER_USE
- idle_power_usage = 500
- active_power_usage = 10000
+ idle_power_usage = IDLE_DRAW_MEDIUM
+ active_power_usage = ACTIVE_DRAW_EXTREME * 2
dir = NORTH
mouse_opacity = MOUSE_OPACITY_OPAQUE
var/strength_upper_limit = 2
@@ -53,7 +53,7 @@
connected_parts.Cut()
return
if(!part_scan())
- use_power = IDLE_POWER_USE
+ set_idle_power()
active = FALSE
connected_parts.Cut()
@@ -106,7 +106,7 @@
active = FALSE
use_power = NO_POWER_USE
else if(!machine_stat && construction_state == PA_CONSTRUCTION_COMPLETE)
- use_power = IDLE_POWER_USE
+ set_idle_power()
/obj/machinery/particle_accelerator/control_box/process()
if(active)
@@ -175,14 +175,14 @@
message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? ADMIN_LOOKUPFLW(usr) : "outside forces"] in [ADMIN_VERBOSEJMP(src)]")
log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? "[key_name(usr)]" : "outside forces"] at [AREACOORD(src)]")
if(active)
- use_power = ACTIVE_POWER_USE
+ set_active_power()
for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP
part.strength = strength
part.powered = TRUE
part.update_appearance()
else
- use_power = IDLE_POWER_USE
+ set_idle_power()
for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP
part.strength = null
diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm
index fc7cca55e655..15617eca5260 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm
@@ -2,7 +2,7 @@
name = "EM Containment Grid"
desc = "This launches the Alpha particles, might not want to stand near this end."
icon = 'icons/obj/machines/particle_accelerator.dmi'
- icon_state = "none"
+ icon_state = "emitter_center"
var/fire_delay = 50
var/last_shot = 0
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 8ca409051d6c..d25fc732abe7 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -324,7 +324,7 @@
icon_state = "computer"
density = TRUE
use_power = IDLE_POWER_USE
- idle_power_usage = 250
+ idle_power_usage = IDLE_DRAW_LOW
max_integrity = 200
integrity_failure = 0.5
var/icon_screen = "solar"
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index 82372d221baf..7f6ca0f5d360 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -96,9 +96,6 @@
var/power_produced = powernet ? power / power_loss : power
add_avail(power_produced*input_power_multiplier)
flick("coilhit", src)
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
- if(D)
- D.adjust_money(min(power_produced, 1))
if(istype(linked_techweb) && (zap_flags & ZAP_GIVES_RESEARCH) && can_generate_research)
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min(power_produced, 3)) // x4 coils = 12 points a shock for RND, if they even bothered to link the server.
addtimer(CALLBACK(src, PROC_REF(reset_shocked)), 10)
@@ -135,9 +132,6 @@
var/power_produced = powernet ? power / power_loss : power
add_avail(power_produced*input_power_multiplier)
flick("rpcoilhit", src)
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
- if(D)
- D.adjust_money(min(power_produced, 12))
if(istype(linked_techweb) && (zap_flags & ZAP_GIVES_RESEARCH))
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min(power_produced, 25)) // x4 coils = 100 points per shock, which is a good reward for building a research tesla or electrical storm harvest ship
addtimer(CALLBACK(src, PROC_REF(reset_shocked)), 10)
diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm
index 5b7317972175..26597a64f33b 100644
--- a/code/modules/projectiles/ammunition/_ammunition.dm
+++ b/code/modules/projectiles/ammunition/_ammunition.dm
@@ -38,6 +38,8 @@
var/list/bounce_sfx_override // if true, overrides the bouncing sfx from the turf to this one
+ var/bullet_per_box
+
/obj/item/ammo_casing/spent
name = "spent bullet casing"
@@ -49,6 +51,7 @@
BB = new projectile_type(src)
pixel_x = base_pixel_x + rand(-10, 10)
pixel_y = base_pixel_y + rand(-10, 10)
+ item_flags |= NO_PIXEL_RANDOM_DROP
if(auto_rotate)
transform = transform.Turn(pick(0, 90, 180, 270))
update_appearance()
@@ -100,9 +103,14 @@
bounce_away(FALSE, NONE)
. = ..()
-/obj/item/ammo_casing/proc/on_eject()
+/obj/item/ammo_casing/proc/on_eject(atom/shooter)
forceMove(drop_location()) //Eject casing onto ground.
- bounce_away(TRUE)
+ pixel_x = rand(-4, 4)
+ pixel_y = rand(-4, 4)
+ pixel_z = 8 //bounce time
+ var/angle_of_movement = !isnull(shooter) ? (rand(-3000, 3000) / 100) + dir2angle(turn(shooter.dir, 180)) : rand(-3000, 3000) / 100
+ AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(400, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = bounce_sfx_override)
+
/obj/item/ammo_casing/proc/bounce_away(still_warm = FALSE, bounce_delay = 3)
if(!heavy_metal)
diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm
index ee155db4e719..93fa4208d571 100644
--- a/code/modules/projectiles/ammunition/_firing.dm
+++ b/code/modules/projectiles/ammunition/_firing.dm
@@ -18,8 +18,6 @@
if(click_cooldown_override)
user.changeNext_move(click_cooldown_override)
- else
- user.changeNext_move(CLICK_CD_RANGE)
user.newtonian_move(get_dir(target, user))
update_appearance()
diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm
index 90030e7b0944..d46001951ba4 100644
--- a/code/modules/projectiles/ammunition/ballistic/lmg.dm
+++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm
@@ -6,6 +6,7 @@
icon_state = "rifle-steel"
caliber = "7.12x82mm"
projectile_type = /obj/projectile/bullet/mm712x82
+ bullet_per_box = 100
/obj/item/ammo_casing/mm712x82/ap
name = "7.12x82mm armor-piercing bullet casing"
diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm
index a105ae6602ee..0f37b5426d2d 100644
--- a/code/modules/projectiles/ammunition/ballistic/pistol.dm
+++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm
@@ -6,6 +6,7 @@
icon_state = "pistol-steel"
caliber = "10mm"
projectile_type = /obj/projectile/bullet/c10mm
+ bullet_per_box = 50
/obj/item/ammo_casing/c10mm/surplus
name = "10mm surplus bullet casing"
@@ -45,6 +46,7 @@
icon_state = "pistol-brass"
caliber = "9mm"
projectile_type = /obj/projectile/bullet/c9mm
+ bullet_per_box = 50
/obj/item/ammo_casing/c9mm/surplus
name = "9mm surplus bullet casing"
@@ -84,6 +86,7 @@
icon_state = "pistol-steel"
caliber = ".45"
projectile_type = /obj/projectile/bullet/c45
+ bullet_per_box = 50
/obj/item/ammo_casing/c45/surplus
name = ".45 surplus bullet casing"
@@ -122,6 +125,7 @@
desc = "A .50 AE bullet casing."
caliber = ".50 AE"
projectile_type = /obj/projectile/bullet/a50AE
+ bullet_per_box = 20
/obj/item/ammo_casing/a50AE/hp
name = ".50 AE hollow point bullet casing"
@@ -134,4 +138,5 @@
desc = "A .22 LR bullet casing."
projectile_type = /obj/projectile/bullet/c22lr
caliber = "22lr"
+ bullet_per_box = 75
diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm
index d5684e834e3d..fa77095de9b9 100644
--- a/code/modules/projectiles/ammunition/ballistic/revolver.dm
+++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm
@@ -6,6 +6,7 @@
caliber = ".357"
icon_state = "magnum-brass"
projectile_type = /obj/projectile/bullet/a357
+ bullet_per_box = 50
/obj/item/ammo_casing/a357/match
name = ".357 match bullet casing"
@@ -28,6 +29,7 @@
caliber = ".45-70"
icon_state = "magnum-brass"
projectile_type = /obj/projectile/bullet/a4570
+ bullet_per_box = 12
/obj/item/ammo_casing/a4570/match
name = ".45-70 match bullet casing"
@@ -53,6 +55,7 @@
desc = "A .38 Special bullet casing."
caliber = ".38"
projectile_type = /obj/projectile/bullet/c38
+ bullet_per_box = 50
/obj/item/ammo_casing/c38/surplus
name = ".38 surplus bullet casing"
diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm
index 5b93bfaa2463..b3875292fba2 100644
--- a/code/modules/projectiles/ammunition/ballistic/rifle.dm
+++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm
@@ -6,6 +6,7 @@
icon_state = "rifle-brass"
caliber = "8x50mmR"
projectile_type = /obj/projectile/bullet/a8_50r
+ bullet_per_box = 20
/obj/item/ammo_casing/a8_50rhp
name = "8x50mmR hollow point bullet casing"
@@ -23,6 +24,7 @@
icon_state = "caseless"
caliber = "a858"
projectile_type = /obj/projectile/bullet/a858
+ bullet_per_box = 20
// .300 Magnum (Smile Rifle)
@@ -32,6 +34,7 @@
icon_state = "rifle-steel"
caliber = "a300"
projectile_type = /obj/projectile/bullet/a300
+ bullet_per_box = 20
// 5.56x39mm (M-90gl Carbine & P-16)
@@ -41,6 +44,7 @@
icon_state = "rifle-brass"
caliber = "5.56x45mm"
projectile_type = /obj/projectile/bullet/a556_45
+ bullet_per_box = 80
// 5.45x39mm (SKM-24v)
@@ -51,6 +55,7 @@
caliber = "5.45x39mm"
randomspread = TRUE
projectile_type = /obj/projectile/bullet/a545_39
+ bullet_per_box = 80
/obj/item/ammo_casing/a545_39/recycled
name = "recycled 5.45x39mm bullet casing"
@@ -67,6 +72,7 @@
icon_state = "rifle-brass"
caliber = "7.62x40mm"
projectile_type = /obj/projectile/bullet/a762_40
+ bullet_per_box = 80
// .300 Blackout (Polymer Survivor Rifle)
@@ -76,6 +82,7 @@
icon_state = "rifle-steel"
caliber = ".300 BLK"
projectile_type = /obj/projectile/bullet/aac_300blk
+ bullet_per_box = 20
/obj/item/ammo_casing/aac_300blk/recycled
name = "recycled .300 BLK bullet casing"
@@ -91,6 +98,7 @@
icon_state = "rifle-brass"
caliber = ".308"
projectile_type = /obj/projectile/bullet/a308
+ bullet_per_box = 20
/obj/item/ammo_casing/caseless/c299
name = ".229 Eoehoma caseless bullet casing"
@@ -98,3 +106,4 @@
icon_state = "caseless"
caliber = ".299 caseless"
projectile_type = /obj/projectile/bullet/c299
+ bullet_per_box = 100
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index b297ee30e776..9f6a8c169ecd 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -8,6 +8,7 @@
caliber = "12ga"
custom_materials = list(/datum/material/iron=4000)
projectile_type = /obj/projectile/bullet/slug
+ bullet_per_box = 25
bounce_sfx_override = 'sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg'
@@ -110,8 +111,8 @@
desc = "A shotgun shell which fires a spread of incendiary pellets."
icon_state = "dragonsbreath"
projectile_type = /obj/projectile/bullet/incendiary/shotgun/dragonsbreath
- pellets = 4
- variance = 35
+ pellets = 8
+ variance = 45
/obj/item/ammo_casing/shotgun/meteorslug
name = "meteorslug shell"
@@ -127,20 +128,20 @@
/obj/item/ammo_casing/shotgun/ion
name = "ion shell"
- desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \
- The unique properties of the crystal split the pulse into a spread of individually weaker bolts."
+ desc = "An advanced shotgun shell which uses a micro laser to focus the effects of an EMP reaction to produce an effect similar to a standard ion rifle. \
+ The more uncontrolled nature of the reaction causes the pulse to spread into multiple individually weaker bolts."
icon_state = "ion"
projectile_type = /obj/projectile/ion/weak
- pellets = 4
- variance = 35
+ pellets = 8
+ variance = 25
/obj/item/ammo_casing/shotgun/laserscatter
name = "scatter laser shell"
desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a scatter laser weapon in a ballistic package."
icon_state = "laser"
projectile_type = /obj/projectile/beam/weak
- pellets = 4 //WS edit: makes scatter lasers based again
- variance = 35
+ pellets = 8
+ variance = 25
/obj/item/ammo_casing/shotgun/pulseslug
name = "pulse slug"
diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm
index d947736d5f25..74bb35b1ec2e 100644
--- a/code/modules/projectiles/ammunition/ballistic/smg.dm
+++ b/code/modules/projectiles/ammunition/ballistic/smg.dm
@@ -6,6 +6,7 @@
icon_state = "rifle-brass"
caliber = "4.6x30mm"
projectile_type = /obj/projectile/bullet/c46x30mm
+ bullet_per_box = 50
/obj/item/ammo_casing/c46x30mm/ap
name = "4.6x30mm armor-piercing bullet casing"
@@ -18,6 +19,7 @@
desc = "A 4.6x30mm incendiary bullet casing."
bullet_skin = "incen"
projectile_type = /obj/projectile/bullet/incendiary/c46x30mm
+ bullet_per_box = 50
// 4.73x33mm caseless (Solar)
@@ -27,6 +29,7 @@
icon_state = "caseless"
caliber = "4.73x33mm caseless"
projectile_type = /obj/projectile/bullet/c47x33mm
+ bullet_per_box = 50
// 5.56mm HITP caseless (Pistole C)
diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm
index af7369204e6d..e4b668c2228f 100644
--- a/code/modules/projectiles/ammunition/ballistic/sniper.dm
+++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm
@@ -6,6 +6,7 @@
icon_state = "big-steel"
caliber = ".50 BMG"
projectile_type = /obj/projectile/bullet/p50
+ bullet_per_box = 20
/obj/item/ammo_casing/p50/soporific
name = ".50 BMG soporific bullet casing"
diff --git a/code/modules/projectiles/ammunition/caseless/_caseless.dm b/code/modules/projectiles/ammunition/caseless/_caseless.dm
index 2fe0ecf808eb..9e9dafb8d806 100644
--- a/code/modules/projectiles/ammunition/caseless/_caseless.dm
+++ b/code/modules/projectiles/ammunition/caseless/_caseless.dm
@@ -3,8 +3,10 @@
firing_effect_type = null
heavy_metal = FALSE
-/obj/item/ammo_casing/caseless/on_eject()
- qdel(src)
+/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from)
+ . = ..()
+ if(.)
+ qdel(src)
// Overridden; caseless ammo does not distinguish between "live" and "empty"/"spent" icon states (because it has no casing).
/obj/item/ammo_casing/caseless/update_icon_state()
diff --git a/code/modules/projectiles/ammunition/caseless/foam.dm b/code/modules/projectiles/ammunition/caseless/foam.dm
index 3c71d31eb5ed..0051680fd1e8 100644
--- a/code/modules/projectiles/ammunition/caseless/foam.dm
+++ b/code/modules/projectiles/ammunition/caseless/foam.dm
@@ -9,6 +9,7 @@
custom_materials = list(/datum/material/iron = 11.25)
harmful = FALSE
var/modified = FALSE
+ bullet_per_box = 40
/obj/item/ammo_casing/caseless/foam_dart/update_icon_state()
. = ..()
diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm
index 6320cb24b0c6..d0334e8d8acc 100644
--- a/code/modules/projectiles/ammunition/energy/laser.dm
+++ b/code/modules/projectiles/ammunition/energy/laser.dm
@@ -31,7 +31,7 @@
projectile_type = /obj/projectile/beam/laser/weak/negative_ap
e_cost = 799 //12 shots with a normal power cell, 25 with an upgraded
select_name = "kill"
- delay = 0.1 SECONDS
+ delay = 0.13 SECONDS
/obj/item/ammo_casing/energy/lasergun/old
projectile_type = /obj/projectile/beam/laser
diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm
index 917e1c8c8189..1f74196eb83b 100644
--- a/code/modules/projectiles/ammunition/energy/stun.dm
+++ b/code/modules/projectiles/ammunition/energy/stun.dm
@@ -46,4 +46,4 @@
/obj/item/ammo_casing/energy/disabler/smg
projectile_type = /obj/projectile/beam/disabler/weak/negative_ap
e_cost = 330
- delay = 0.1 SECONDS
+ delay = 0.13 SECONDS
diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm
index e38df896bed1..046ae7dbc078 100644
--- a/code/modules/projectiles/ammunition/special/magic.dm
+++ b/code/modules/projectiles/ammunition/special/magic.dm
@@ -4,68 +4,3 @@
projectile_type = /obj/projectile/magic
firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic
heavy_metal = FALSE
-
-/obj/item/ammo_casing/magic/change
- projectile_type = /obj/projectile/magic/change
-
-/obj/item/ammo_casing/magic/animate
- projectile_type = /obj/projectile/magic/animate
-
-/obj/item/ammo_casing/magic/heal
- projectile_type = /obj/projectile/magic/resurrection
- harmful = FALSE
-
-/obj/item/ammo_casing/magic/death
- projectile_type = /obj/projectile/magic/death
-
-/obj/item/ammo_casing/magic/teleport
- projectile_type = /obj/projectile/magic/teleport
- harmful = FALSE
-
-/obj/item/ammo_casing/magic/safety
- projectile_type = /obj/projectile/magic/safety
- harmful = FALSE
-
-/obj/item/ammo_casing/magic/door
- projectile_type = /obj/projectile/magic/door
- harmful = FALSE
-
-/obj/item/ammo_casing/magic/fireball
- projectile_type = /obj/projectile/magic/aoe/fireball
-
-/obj/item/ammo_casing/magic/chaos
- projectile_type = /obj/projectile/magic
-
-/obj/item/ammo_casing/magic/spellblade
- projectile_type = /obj/projectile/magic/spellblade
-
-/obj/item/ammo_casing/magic/arcane_barrage
- projectile_type = /obj/projectile/magic/arcane_barrage
-
-/obj/item/ammo_casing/magic/honk
- projectile_type = /obj/projectile/bullet/honker
-
-/obj/item/ammo_casing/magic/locker
- projectile_type = /obj/projectile/magic/locker
-
-/obj/item/ammo_casing/magic/flying
- projectile_type = /obj/projectile/magic/flying
-
-/obj/item/ammo_casing/magic/bounty
- projectile_type = /obj/projectile/magic/bounty
-
-/obj/item/ammo_casing/magic/antimagic
- projectile_type = /obj/projectile/magic/antimagic
-
-/obj/item/ammo_casing/magic/sapping
- projectile_type = /obj/projectile/magic/sapping
-
-/obj/item/ammo_casing/magic/necropotence
- projectile_type = /obj/projectile/magic/necropotence
-
-/obj/item/ammo_casing/magic/wipe
- projectile_type = /obj/projectile/magic/wipe
-
-/obj/item/ammo_casing/magic/nothing
- projectile_type = /obj/projectile/magic/nothing
- harmful = FALSE
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index e5df30533e35..4c3c8b736c4d 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -38,6 +38,8 @@
/obj/item/ammo_box/Initialize()
. = ..()
+ if(!base_icon_state)
+ base_icon_state = icon_state
if (!bullet_cost)
for (var/material in custom_materials)
var/material_amount = custom_materials[material]
@@ -49,7 +51,7 @@
if(!start_empty)
for(var/i = 1, i <= max_ammo, i++)
stored_ammo += new ammo_type(src)
- update_appearance()
+ update_ammo_count()
///gets a round from the magazine, if keep is TRUE the round will stay in the gun
/obj/item/ammo_box/proc/get_round(keep = FALSE)
@@ -96,7 +98,7 @@
if(istype(attacking_obj, /obj/item/ammo_box))
var/obj/item/ammo_box/attacking_box = attacking_obj
for(var/obj/item/ammo_casing/casing_to_insert in attacking_box.stored_ammo)
- if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after_mob(user, list(attacking_box), 1 SECONDS)))
+ if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 1 SECONDS, list(attacking_box))))
break
var/did_load = give_round(casing_to_insert, replace_spent)
if(!did_load)
@@ -105,8 +107,8 @@
if(!silent)
playsound(get_turf(attacking_box), 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE) //src is nullspaced, which means internal magazines won't properly play sound, thus we use attacking_box
num_loaded++
- attacking_obj.update_appearance()
- update_appearance()
+ attacking_box.update_ammo_count()
+ update_ammo_count()
if(istype(attacking_obj, /obj/item/ammo_casing))
var/obj/item/ammo_casing/casing_to_insert = attacking_obj
@@ -115,7 +117,7 @@
if(!silent)
playsound(casing_to_insert, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
num_loaded++
- update_appearance()
+ update_ammo_count()
if(num_loaded)
@@ -150,9 +152,9 @@
var/shells_left = LAZYLEN(stored_ammo)
switch(multiple_sprites)
if(AMMO_BOX_PER_BULLET)
- icon_state = "[initial(icon_state)]-[shells_left]"
+ icon_state = "[base_icon_state]-[shells_left]"
if(AMMO_BOX_FULL_EMPTY)
- icon_state = "[initial(icon_state)]-[shells_left ? "[max_ammo]" : "0"]"
+ icon_state = "[base_icon_state]-[shells_left ? "1" : "0"]"
return ..()
/// Updates the amount of material in this ammo box according to how many bullets are left in it.
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index fbd5ddd214dc..0b5a7f80a837 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -3,8 +3,10 @@
/obj/item/ammo_box/a357
name = "speed loader (.357)"
desc = "A 7-round speed loader for quickly reloading .357 revolvers. These rounds do good damage with average performance against armor."
- icon_state = "357"
+ icon_state = "speedloader_357-7"
+ base_icon_state = "speedloader_357"
ammo_type = /obj/item/ammo_casing/a357
+ caliber = ".357"
max_ammo = 7
multiple_sprites = AMMO_BOX_PER_BULLET
item_flags = NO_MAT_REDEMPTION
@@ -21,6 +23,28 @@
desc = "A 7-round speed loader for quickly reloading .357 revolvers. These hollow point rounds do incredible damage against soft targets, but are nearly ineffective against armored ones."
ammo_type = /obj/item/ammo_casing/a357/hp
+/obj/item/ammo_box/a357_box
+ name = "ammo box (.357)"
+ desc = "A box of standard .357 ammo."
+ icon_state = "357box"
+ ammo_type = /obj/item/ammo_casing/a357
+ max_ammo = 50
+
+/obj/item/ammo_box/a357_box/match
+ name = "ammo box (.357)"
+ desc = "A box of match .357 ammo."
+ icon_state = "357box-match"
+ ammo_type = /obj/item/ammo_casing/a357/match
+ max_ammo = 50
+
+/obj/item/ammo_box/a357_box/hp
+ name = "ammo box (.357)"
+ desc = "A box of hollow point .357 ammo."
+ icon_state = "357box-hp"
+ ammo_type = /obj/item/ammo_casing/a357/hp
+ max_ammo = 50
+
+
// .45-70 Ammo Holders (Hunting Revolver)
/obj/item/ammo_box/a4570
@@ -31,30 +55,34 @@
max_ammo = 12
/obj/item/ammo_box/a4570/match
- name = "ammo holder (.45-70 match)"
- desc = "A 6-round ammo holder for .45-70 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
+ name = "ammo box (.45-70 match)"
+ desc = "A 12-round ammo box for .45-70 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
icon_state = "4570-match"
ammo_type = /obj/item/ammo_casing/a4570/match
+
/obj/item/ammo_box/a4570/hp
- name = "ammo holder (.45-70 hollow point)"
- desc = "A 6-round ammo holder for .45-70 revolvers. These hollow point rounds do legendary damage against soft targets, but are nearly ineffective against armored ones."
+ name = "ammo box (.45-70 hollow point)"
+ desc = "A 12-round ammo box for .45-70 revolvers. These hollow point rounds do legendary damage against soft targets, but are nearly ineffective against armored ones."
icon_state = "4570-hp"
ammo_type = /obj/item/ammo_casing/a4570/hp
/obj/item/ammo_box/a4570/explosive
- name = "ammo holder (.45-70 explosive)"
- desc = "A 6-round ammo holder for .45-70 revolvers. These explosive rounds contain a small explosive charge that detonates on impact, creating large wounds and potentially removing limbs."
+ name = "ammo box (.45-70 explosive)"
+ desc = "A 12-round ammo box for .45-70 revolvers. These explosive rounds contain a small explosive charge that detonates on impact, creating large wounds and potentially removing limbs."
icon_state = "4570-explosive"
ammo_type = /obj/item/ammo_casing/a4570/explosive
+
// .38 special Speed Loaders (Colt Detective Special)
/obj/item/ammo_box/c38
name = "speed loader (.38 special)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds do moderate damage, but plink against armor."
- icon_state = "38"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds do okay damage, but struggle against armor."
+ icon_state = "speedloader_38-6"
+ base_icon_state = "speedloader_38"
ammo_type = /obj/item/ammo_casing/c38
+ caliber = ".38"
max_ammo = 6
multiple_sprites = AMMO_BOX_PER_BULLET
custom_materials = list(/datum/material/iron = 15000)
@@ -96,7 +124,7 @@
/obj/item/ammo_box/a858
name = "stripper clip (8x58mm)"
desc = "A 5-round stripper clip for the SSG-669C rifle. These rounds do good damage with significant armor penetration."
- icon_state = "858"
+ icon_state = "enbloc_858"
ammo_type = /obj/item/ammo_casing/caseless/a858
max_ammo = 5
multiple_sprites = AMMO_BOX_PER_BULLET
@@ -107,7 +135,8 @@
/obj/item/ammo_box/vickland_a308
name = "stripper clip (.308)"
desc = "A 5-round stripper clip for the Vickland Battle Rifle. The Vickland itself has a 10 round capacity, so keep in mind two of these are needed to fully reload it. These rounds do good damage with significant armor penetration."
- icon_state = "308"
+ icon_state = "stripper_308-5"
+ base_icon_state = "stripper_308"
ammo_type = /obj/item/ammo_casing/a308
max_ammo = 5
multiple_sprites = AMMO_BOX_PER_BULLET
@@ -145,7 +174,8 @@
/obj/item/ammo_box/amagpellet_claris
name = "\improper Claris speed loader (ferromagnetic pellet)"
desc = "A 22-round speed loader for quickly reloading the Claris rifle. Ferromagnetic pellets do okay damage with significant armor penetration."
- icon_state = "claris-sl"
+ icon_state = "claris-sl-1"
+ base_icon_state = "claris-sl"
ammo_type = /obj/item/ammo_casing/caseless/gauss
max_ammo = 22
multiple_sprites = AMMO_BOX_FULL_EMPTY
@@ -384,8 +414,10 @@
/obj/item/ammo_box/c45_speedloader
name = "speed loader (.45)"
desc = "Designed to quickly reload revolvers."
- icon_state = "38"
+ icon_state = "speedloader_38-6"
+ base_icon_state = "speedloader_38"
ammo_type = /obj/item/ammo_casing/c45
+ caliber = ".45"
max_ammo = 6
multiple_sprites = AMMO_BOX_PER_BULLET
custom_materials = list(/datum/material/iron = 15000)
@@ -395,7 +427,7 @@
/obj/item/ammo_box/c46x30mm_box
name = "ammo box (4.6x30mm)"
desc = "A box of standard 4.6x30mm ammo."
- icon_state = "4.6x30mmbox"
+ icon_state = "46x30mmbox"
ammo_type = /obj/item/ammo_casing/c46x30mm
max_ammo = 50
@@ -429,7 +461,14 @@
/obj/item/ammo_box/c8x50mmhp_box
name = "ammo box (8x50mm)"
- desc = "A box of hollow point 8x50mm ammo, designed to cause massive damage at the cost of armor penetration.."
+ desc = "A box of hollow point 8x50mm ammo, designed to cause massive damage at the cost of armor penetration."
icon_state = "8x50mmbox-hp"
ammo_type = /obj/item/ammo_casing/a8_50rhp
max_ammo = 20
+
+/obj/item/ammo_box/a300_box
+ name = "ammo box (.300 Magnum)"
+ desc = "A box of standard .300 Magnum ammo."
+ icon_state = "300box"
+ ammo_type = /obj/item/ammo_casing/a300
+ max_ammo = 20
diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm
index e96d8d434ddb..66b9238a5c90 100644
--- a/code/modules/projectiles/boxes_magazines/external/pistol.dm
+++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm
@@ -1,7 +1,8 @@
/obj/item/ammo_box/magazine/m10mm
name = "pistol magazine (10mm)"
desc = "An 8-round single-stack magazine for the stechkin pistol. These rounds do moderate damage, but struggle against armor."
- icon_state = "9x19p"
+ icon_state = "stechkin_mag-1"
+ base_icon_state = "stechkin_mag"
ammo_type = /obj/item/ammo_casing/c10mm
caliber = "10mm"
max_ammo = 8
@@ -10,32 +11,28 @@
/obj/item/ammo_box/magazine/m10mm/inc
name = "pistol magazine (10mm incendiary)"
desc = "An 8-round single-stack magazine for the stechkin pistol. These incendiary rounds deal mediocre damage, but leave flaming trails which set targets ablaze."
- icon_state = "9x19pI"
ammo_type = /obj/item/ammo_casing/c10mm/inc
/obj/item/ammo_box/magazine/m10mm/hp
name = "pistol magazine (10mm HP)"
desc = "An 8-round single-stack magazine for the stechkin pistol. These hollow point rounds do incredible damage against soft targets, but are nearly ineffective against armored ones."
- icon_state = "9x19pH"
ammo_type = /obj/item/ammo_casing/c10mm/hp
/obj/item/ammo_box/magazine/m10mm/ap
name = "pistol magazine (10mm AP)"
desc = "An 8-round single-stack magazine for the stechkin pistol. These armor-piercing rounds are okay at piercing protective equipment, but lose some stopping power."
- icon_state = "9x19pA"
ammo_type = /obj/item/ammo_casing/c10mm/ap
/obj/item/ammo_box/magazine/m10mm/rubber
name = "pistol magazine (10mm rubber)"
desc = "An 8-round handgun magazine for the stechkin pistol. These rubber rounds trade lethality for a heavy impact which can incapacitate targets. Performs even worse against armor."
- icon_state = "9x19p"
ammo_type = /obj/item/ammo_casing/c10mm/rubber
/obj/item/ammo_box/magazine/m45
name = "pistol magazine (.45)"
desc = "An 8-round single-stack magazine for the Candor pistol. These rounds do moderate damage, but struggle against armor."
- icon_state = "45-8"
- base_icon_state = "45"
+ icon_state = "candor_mag-8"
+ base_icon_state = "candor_mag"
ammo_type = /obj/item/ammo_casing/c45
caliber = ".45"
max_ammo = 8
@@ -65,13 +62,36 @@
icon_state = "[base_icon_state]-[min(ammo_count(), 8)]"
/obj/item/ammo_box/magazine/co9mm
- name = "pistol magazine (9mm)"
- desc = "A 10-round double-stack magazine for standard-issue 9mm pistols. These rounds do okay damage, but struggle against armor."
- icon_state = "co9mm-8"
- base_icon_state = "co9mm"
+ name = "commander pistol magazine (9mm)"
+ desc = "A 10-round double-stack magazine for Commander pistols. These rounds do okay damage, but struggle against armor."
+ icon_state = "commander_mag-10"
+ base_icon_state = "commander_mag"
ammo_type = /obj/item/ammo_casing/c9mm
caliber = "9mm"
max_ammo = 10
+ multiple_sprites = AMMO_BOX_PER_BULLET
+
+/obj/item/ammo_box/magazine/pistol556mm
+ name = "Pistole C magazine (5.56mm HITP caseless)"
+ desc = "A 12-round, double-stack magazine for the Pistole C pistol. These rounds do okay damage with average performance against armor."
+ icon_state = "pistolec_mag-12" //ok i did it
+ base_icon_state = "pistolec_mag"
+ ammo_type = /obj/item/ammo_casing/caseless/c556mm
+ caliber = "5.56mm caseless"
+ max_ammo = 12
+
+/obj/item/ammo_box/magazine/pistol556mm/update_icon_state()
+ . = ..()
+ if(ammo_count() == 12)
+ icon_state = "[base_icon_state]-12"
+ else if(ammo_count() >= 10)
+ icon_state = "[base_icon_state]-10"
+ else if(ammo_count() >= 5)
+ icon_state = "[base_icon_state]-5"
+ else if(ammo_count() >= 1)
+ icon_state = "[base_icon_state]-1"
+ else
+ icon_state = "[base_icon_state]-0"
/obj/item/ammo_box/magazine/co9mm/inc
name = "pistol magazine (9mm incendiary)"
@@ -100,20 +120,18 @@
/obj/item/ammo_box/magazine/pistolm9mm
name = "large pistol magazine (9mm)"
desc = "A long, 15-round double-stack magazine designed for the stechkin APS pistol. These rounds do okay damage, but struggle against armor."
- icon_state = "9x19p-8"
- base_icon_state = "9x19p"
+ icon_state = "stechkin_mag-1"
+ base_icon_state = "stechkin_mag"
ammo_type = /obj/item/ammo_casing/c9mm
caliber = "9mm"
max_ammo = 15
-
-/obj/item/ammo_box/magazine/pistolm9mm/update_icon_state()
- . = ..()
- icon_state = "[base_icon_state]-[ammo_count() ? "8" : "0"]"
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
/obj/item/ammo_box/magazine/m50
name = "handgun magazine (.50 AE)"
desc = "An oversized, 7-round handgun magazine for the Desert Eagle handgun. These rounds do significant damage with average performance against armor."
- icon_state = "50ae"
+ icon_state = "deagle_mag-7"
+ base_icon_state = "deagle_mag"
ammo_type = /obj/item/ammo_casing/a50AE
caliber = ".50 AE"
max_ammo = 7
@@ -122,7 +140,8 @@
/obj/item/ammo_box/magazine/disposable
name = "part of a disposable gun"
desc = "You ripped out part of the gun, somehow, rendering it unusuable. I hope you're happy."
- icon_state = "45-8"
+ icon_state = "himehabu_mag-10"
+ base_icon_state = "himehabu_mag"
ammo_type = /obj/item/ammo_casing/c22lr
caliber = ".22lr"
max_ammo = 10
@@ -140,8 +159,10 @@
/obj/item/ammo_box/magazine/m22lr
name = "pistol magazine (.22 LR)"
desc = "A single-stack handgun magazine designed to chamber .22 LR. It's rather tiny, all things considered."
- icon_state = "pistol_22lr"
+ icon_state = "himehabu_mag-10"
+ base_icon_state = "himehabu_mag"
ammo_type = /obj/item/ammo_casing/c22lr
caliber = "22lr"
max_ammo = 10
w_class = WEIGHT_CLASS_TINY
+ multiple_sprites = AMMO_BOX_PER_BULLET
diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm
index 60712700c314..548350f20415 100644
--- a/code/modules/projectiles/boxes_magazines/external/rifle.dm
+++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm
@@ -14,7 +14,8 @@
/obj/item/ammo_box/magazine/m556
name = "toploader magazine (5.56x45mm)"
desc = "An advanced, 30-round toploading magazine for the M-90gl Carbine. These rounds do moderate damage with good armor penetration."
- icon_state = "5.56m"
+ icon_state = "5.56m-1"
+ base_icon_state = "5.56m"
ammo_type = /obj/item/ammo_casing/a556_39
caliber = "5.56x45mm"
max_ammo = 30
@@ -40,38 +41,32 @@
ammo_type = /obj/item/ammo_casing/c46x30mm
caliber = "4.6x30mm"
max_ammo = 30
- base_icon_state = "skm_mag"
- icon_state = "skm_mag"
-
-/obj/item/ammo_box/magazine/skm_545_39/update_icon_state()
- . = ..()
- icon_state = "[base_icon_state]-[!!ammo_count()]"
+ base_icon_state = "skmcarbine_mag"
+ icon_state = "skmcarbine_mag-1"
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
/obj/item/ammo_box/magazine/skm_762_40
name = "assault rifle magazine (7.62x40mm CLIP)"
desc = "A slightly curved, 20-round magazine for the 7.62x40mm CLIP variants of the SKM assault rifle family. These rounds do good damage with good armor penetration."
base_icon_state = "skm_mag"
- icon_state = "skm_mag"
+ icon_state = "skm_mag-1"
ammo_type = /obj/item/ammo_casing/a762_40
caliber = "7.62x40mm"
max_ammo = 20
-
-/obj/item/ammo_box/magazine/skm_762_40/update_icon_state()
- . = ..()
- icon_state = "[base_icon_state]-[!!ammo_count()]"
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
/obj/item/ammo_box/magazine/skm_762_40/extended
name = "extended assault rifle magazine (7.62x40mm CLIP)"
desc = "A very curved, 40-round magazine for the 7.62x40mm CLIP variants of the SKM assault rifle family. These rounds do good damage with good armor penetration."
base_icon_state = "skm_extended_mag"
- icon_state = "skm_extended_mag"
+ icon_state = "skm_extended_mag-1"
max_ammo = 40
/obj/item/ammo_box/magazine/skm_762_40/drum
name = "assault rifle drum (7.62x40mm CLIP)"
desc = "A 75-round drum for the 7.62x40mm CLIP variants of the SKM assault rifle family. These rounds do good damage with good armor penetration."
base_icon_state = "skm_drum"
- icon_state = "skm_drum"
+ icon_state = "skm_drum-1"
max_ammo = 75
w_class = WEIGHT_CLASS_NORMAL
@@ -90,49 +85,42 @@
/obj/item/ammo_box/magazine/gal
name = "\improper GAL Magazine (.308)"
desc = "A standard 10-round magazine for GAL platform DMRs. These rounds do good damage with significant armor penetration."
- icon_state = "ebr_mag"
+ icon_state = "gal_mag-1"
+ base_icon_state = "gal_mag"
ammo_type = /obj/item/ammo_casing/a308
caliber = ".308"
max_ammo = 10
-
-/obj/item/ammo_box/magazine/gal/update_icon_state()
- . = ..()
- icon_state = "galmag-[!!ammo_count()]"
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
/obj/item/ammo_box/magazine/p16
name = "assault rifle magazine (5.56x45mm)"
desc = "A simple, 30-round magazine for 5.56x45mm assault rifles. These rounds do moderate damage with good armor penetration."
- icon_state = "p16_mag"
+ icon_state = "p16_mag-1"
+ base_icon_state = "p16_mag"
ammo_type = /obj/item/ammo_casing/a556_39
caliber = "5.56x45mm"
max_ammo = 30
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
-/obj/item/ammo_box/magazine/p16/update_icon_state()
- . = ..()
- icon_state = "p16_mag-[!!ammo_count()]"
/obj/item/ammo_box/magazine/swiss
name = "\improper Swiss Cheese Magazine (5.56x45mm)"
desc = "A deft, 30-round magazine for the Swiss Cheese assault rifle. These rounds do moderate damage with good armor penetration."
- icon_state = "swissmag"
+ icon_state = "swissmag-1"
+ base_icon_state = "swissmag"
ammo_type = /obj/item/ammo_casing/a556_39
caliber = "5.56x45mm"
max_ammo = 30
-
-/obj/item/ammo_box/magazine/swiss/update_icon_state()
- . = ..()
- icon_state = "swissmag-[!!ammo_count()]"
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
/obj/item/ammo_box/magazine/e40
name = "E-40 magazine (.229 Eoehoma caseless)"
- icon_state = "e40_mag"
+ icon_state = "e40_mag-1"
+ base_icon_state = "e40_mag"
ammo_type = /obj/item/ammo_casing/caseless/c299
caliber = ".299 caseless"
max_ammo = 30
-
-/obj/item/ammo_box/magazine/e40/update_icon_state()
- . = ..()
- icon_state = "e40_mag-[!!ammo_count()]"
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
// 8x50mmR En Bloc Clip (Illestren Hunting Rifle)
@@ -141,6 +129,7 @@
desc = "A 5-round en bloc clip for the Illestren Hunting Rifle. These rounds do good damage with significant armor penetration."
icon_state = "enbloc_858"
ammo_type = /obj/item/ammo_casing/a8_50r
+ caliber = "8x50mmR"
max_ammo = 5
multiple_sprites = AMMO_BOX_PER_BULLET
w_class = WEIGHT_CLASS_TINY
diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
index 374f858295e6..3c9aaad1f6f6 100644
--- a/code/modules/projectiles/boxes_magazines/external/shotgun.dm
+++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
@@ -1,15 +1,13 @@
/obj/item/ammo_box/magazine/m12g
name = "shotgun drum magazine (12g buckshot)"
- desc = "A bulky 8-round drum designed for Scarborough family shotguns."
- icon_state = "m12gb"
+ desc = "A bulky 8-round drum designed for the Bulldog shotgun and it's derivatives."
+ icon_state = "bulldog_drum-1"
+ base_icon_state = "bulldog_drum"
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
caliber = "12ga"
max_ammo = 8
w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/ammo_box/magazine/m12g/update_icon_state()
- . = ..()
- icon_state = "m12gb-[!!ammo_count()]"
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
/obj/item/ammo_box/magazine/m12g/stun
name = "shotgun drum magazine (12g taser slugs)"
@@ -31,25 +29,20 @@
name = "shotgun drum magazine (12g meteor slugs)"
ammo_type = /obj/item/ammo_casing/shotgun/meteorslug
-/obj/item/ammo_box/magazine/m12g/small
+/obj/item/ammo_box/magazine/m12g/small //shouldnt this be the parrent intsead of the drum
name = "shotgun box magazine (12g buckshot)"
- desc = "A single-stack, 6-round box magazine for Scarborough family shotguns."
- icon_state = "m12gsmall"
+ desc = "A single-stack, 6-round box magazine for the Bulldog shotgun and it's derivatives."
+ icon_state = "bulldog_mag-1"
+ base_icon_state = "bulldog_mag"
max_ammo = 6
w_class = WEIGHT_CLASS_SMALL //Smaller, holds less
-/obj/item/ammo_box/magazine/m12g/small/update_icon_state()
- . = ..()
- icon_state = "m12gsmall-[!!ammo_count()]"
-
/obj/item/ammo_box/magazine/cm15_mag
name = "CM-15 magazine (12g buckshot)"
- desc = "A curved, 8-round magazine designed for Minutemen shotguns."
- icon_state = "cm15_mag"
+ desc = "An almost straight, 8-round magazine designed for the CM-15 shotgun."
+ icon_state = "cm15_mag-1"
+ base_icon_state = "cm15_mag"
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
caliber = "12ga"
max_ammo = 8
-
-/obj/item/ammo_box/magazine/cm15_mag/update_icon_state()
- . = ..()
- icon_state = "cm15_mag-[!!ammo_count()]"
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm
index 7e5f418ec7b2..61b9eb78512a 100644
--- a/code/modules/projectiles/boxes_magazines/external/smg.dm
+++ b/code/modules/projectiles/boxes_magazines/external/smg.dm
@@ -67,10 +67,10 @@
ammo_type = /obj/item/ammo_casing/c9mm/rubber
/obj/item/ammo_box/magazine/smgm10mm
- name = "SMG magazine (10mm)"
- desc = "A 24-round magazine for the SkM-44(k). These rounds do moderate damage, but struggle against armor."
- icon_state = "smg10mm-24"
- base_icon_state = "smg10mm"
+ name = "Mongrel magazine (10mm)"
+ desc = "A 24-round magazine for the SKM-44v. These rounds do moderate damage, but struggle against armor."
+ icon_state = "mongrel_mag-24"
+ base_icon_state = "mongrel_mag"
ammo_type = /obj/item/ammo_casing/c10mm
caliber = "10mm"
max_ammo = 24
@@ -121,19 +121,6 @@
. = ..()
icon_state = "firestorm_pan"
-/obj/item/ammo_box/magazine/pistol556mm
- name = "handgun magazine (5.56mm HITP caseless)"
- desc = "A 12-round, double-stack magazine for the Pistole C pistol. These rounds do okay damage with average performance against armor."
- icon_state = "5.56mmHITP-12" //ok i did it
- base_icon_state = "5.56mmHITP"
- ammo_type = /obj/item/ammo_casing/caseless/c556mm
- caliber = "5.56mm caseless"
- max_ammo = 12
-
-/obj/item/ammo_box/magazine/pistol556mm/update_icon_state()
- . = ..()
- icon_state = "[base_icon_state]-[round(ammo_count(),2)]"
-
/obj/item/ammo_box/magazine/tec9
name = "machine pistol magazine (9mm AP)"
desc = "A sizable 20-round magazine for the TEC-9 machine pistol. These armor-piercing rounds are okay at piercing protective equipment, but lose some stopping power.."
diff --git a/code/modules/projectiles/boxes_magazines/external/sniper.dm b/code/modules/projectiles/boxes_magazines/external/sniper.dm
index 25894102905f..b48d76c1295c 100644
--- a/code/modules/projectiles/boxes_magazines/external/sniper.dm
+++ b/code/modules/projectiles/boxes_magazines/external/sniper.dm
@@ -1,27 +1,22 @@
/obj/item/ammo_box/magazine/sniper_rounds
name = "anti-material rifle magazine (.50 BMG)"
desc = "A large, heavy 6-round box magazine designed for the sniper rifle. These rounds deal absurd damage, able to delimb targets, knock them on their feet, and bypass most protective equipment."
- icon_state = ".50mag"
- base_icon_state = ".50mag"
+ icon_state = "50bmgsniper_mag-1"
+ base_icon_state = "50bmgsniper_mag"
ammo_type = /obj/item/ammo_casing/p50
max_ammo = 6
caliber = ".50 BMG"
w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/ammo_box/magazine/sniper_rounds/update_icon_state()
- . = ..()
- icon_state = "[base_icon_state][ammo_count() ? "-ammo" : ""]"
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
/obj/item/ammo_box/magazine/sniper_rounds/soporific
name = "anti-material rifle magazine (.50 BMG soporific)"
desc = "A large, heavy 3-round box magazine designed for the sniper rifle. These soporific rounds are completely non-lethal, but render targets asleep for a little under a minute."
- icon_state = "soporific"
ammo_type = /obj/item/ammo_casing/p50/soporific
max_ammo = 3
/obj/item/ammo_box/magazine/sniper_rounds/penetrator
name = "anti-material rifle magazine (.50 BMG penetrator)"
desc = "A large, heavy 5-round box magazine designed for the sniper rifle. These penetrator rounds deal incredible damage and will penetrate most structures, though they don't knock down or delimb targets."
- icon_state = "haemorrhage"
ammo_type = /obj/item/ammo_casing/p50/penetrator
max_ammo = 5
diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm
index ab9656cdf111..608faa67a974 100644
--- a/code/modules/projectiles/boxes_magazines/external/toy.dm
+++ b/code/modules/projectiles/boxes_magazines/external/toy.dm
@@ -21,7 +21,8 @@
/obj/item/ammo_box/magazine/toy/pistol
name = "foam force pistol magazine"
desc = "A toy pistol magazine designed to fit harmless foam darts."
- icon_state = "9x19p"
+ icon_state = "stechkin_mag-1"
+ base_icon_state = "stechkin_mag"
max_ammo = 8
multiple_sprites = AMMO_BOX_FULL_EMPTY
@@ -49,8 +50,8 @@
/obj/item/ammo_box/magazine/toy/m762
name = "donksoft box magazine"
desc = "A huge toy LMG magazine designed to fit vast quantities of harmless foam darts."
- icon_state = "a850r-toy"
- base_icon_state = "a850r"
+ icon_state = "a762-100"
+ base_icon_state = "a762"
caliber = "foam_force"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart
max_ammo = 50
@@ -62,5 +63,4 @@
/obj/item/ammo_box/magazine/toy/m762/riot
desc = "A huge toy LMG magazine designed to fit vast quantities of legally-harmless riot control darts."
- icon_state = "a850r-riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
diff --git a/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm b/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm
new file mode 100644
index 000000000000..2c88824623e2
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm
@@ -0,0 +1,53 @@
+/obj/item/ammo_box/generic
+ name = "generic ammo box"
+ desc = "A generic, unbranded box of ammo. It doesn't have great capacity, but it can hold a variety of different calibers."
+ max_ammo = 20
+ start_empty = TRUE
+ icon_state = "generic-ammo"
+ /// Does the box currently have an ammo type set?
+ var/ammo_set = FALSE
+ /// Name of the currently set ammo type
+ var/ammo_name
+
+/obj/item/ammo_box/generic/update_ammo_count()
+ . = ..()
+ if(LAZYLEN(stored_ammo) == 0)
+ ammo_set = FALSE
+ ammo_type = /obj/item/ammo_casing
+
+/obj/item/ammo_box/generic/proc/update_max_ammo(obj/item/ammo_casing/ammo)
+ if(ammo.bullet_per_box)
+ max_ammo = round(ammo.bullet_per_box)
+ else
+ max_ammo = 10
+
+ return
+
+/obj/item/ammo_box/generic/attackby(obj/item/attacking_obj, mob/user, params, silent, replace_spent)
+ . = ..()
+
+ if(!ammo_set && istype(attacking_obj, /obj/item/ammo_casing))
+ var/obj/item/ammo_casing/ammo_load = attacking_obj.type
+ ammo_type = ammo_load
+ ammo_set = TRUE
+ ammo_name = attacking_obj.name
+ update_max_ammo(attacking_obj)
+ to_chat(user, span_notice("You set the box to hold [attacking_obj]!"))
+
+ if(istype(attacking_obj, /obj/item/pen))
+ if(!user.is_literate())
+ to_chat(user, span_notice("You scribble illegibly on the cover of [src]!"))
+ return
+ var/inputvalue = stripped_input(user, "What would you like to label the box?", "Box Labelling", "", MAX_NAME_LEN)
+
+ if(!inputvalue)
+ return
+
+ if(user.canUseTopic(src, BE_CLOSE))
+ name = "[initial(src.name)][(inputvalue ? " - '[inputvalue]'" : null)]"
+
+/obj/item/ammo_box/generic/examine(mob/user)
+ . = ..()
+ . += span_notice("[ammo_set ? "It's set to hold [ammo_name]\s. The box can hold up to [max_ammo] rounds." : "It doesn't have an ammo type set. Use a bullet on the box to set it."]")
+ . += span_notice("You can use a pen on it to rename the box.")
+
diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
index 160e1bd5066d..f8ce8223748d 100644
--- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
@@ -66,7 +66,7 @@
var/list/ammo_list_no_empty = ammo_list(FALSE)
listclearnulls(ammo_list_no_empty)
for(var/obj/item/ammo_casing/casing_to_insert in attacking_box.stored_ammo)
- if(!((instant_load && attacking_box.instant_load) || (ammo_list_no_empty.len >= max_ammo) || do_after_mob(user, list(attacking_box), 1 SECONDS))) //stupid work around for revolvers
+ if(!((instant_load && attacking_box.instant_load) || (ammo_list_no_empty.len >= max_ammo) || do_after(user, 1 SECONDS, list(attacking_box)))) //stupid work around for revolvers
break
var/did_load = give_round(casing_to_insert, replace_spent)
if(!did_load)
diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm
index 1d4316560e92..55b749ac3333 100644
--- a/code/modules/projectiles/boxes_magazines/internal/misc.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/misc.dm
@@ -1,9 +1,3 @@
-/obj/item/ammo_box/magazine/internal/hook
- name = "hook internal tube"
- ammo_type = /obj/item/ammo_casing/magic/hook
- caliber = "hook"
- max_ammo = 1
-
/obj/item/ammo_box/magazine/internal/bow
name = "bowstring"
ammo_type = /obj/item/ammo_casing/caseless/arrow
diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
index 43748f7afe7b..d757ddf03047 100644
--- a/code/modules/projectiles/boxes_magazines/internal/revolver.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
@@ -28,7 +28,10 @@
/obj/item/ammo_box/magazine/internal/cylinder/pepperbox
name = "pepperbox revolver cylinder"
+ ammo_type = /obj/item/ammo_casing/a357
+ caliber = ".357"
max_ammo = 5
+ instant_load = FALSE
/obj/item/ammo_box/magazine/internal/cylinder/rev45
name = "cattleman revolver cylinder"
diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
index 921ff98293a1..4f2f8c537958 100644
--- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
@@ -6,13 +6,6 @@
max_ammo = 5
instant_load = TRUE
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted
- max_ammo = 1
- ammo_type = /obj/item/ammo_casing/a8_50r
-
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
- ammo_type = /obj/item/ammo_casing/magic/arcane_barrage
-
/obj/item/ammo_box/magazine/internal/boltaction/solgov
name = "SSG-669C internal magazine"
ammo_type = /obj/item/ammo_casing/caseless/a858
diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
index 38c99aec9372..29717fd9408b 100644
--- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
@@ -27,6 +27,9 @@
max_ammo = 2
instant_load = TRUE
+/obj/item/ammo_box/magazine/internal/shot/dual/lethal
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
/obj/item/ammo_box/magazine/internal/shot/improvised
name = "improvised shotgun internal magazine"
ammo_type = /obj/item/ammo_casing/shotgun/improvised
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index e9354e68d9d4..3edfd1382cf4 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -1,22 +1,3 @@
-
-#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6
-#define FIRING_PIN_REMOVAL_DELAY 50
-
-#define MANUFACTURER_NONE null
-#define MANUFACTURER_SHARPLITE "the Sharplite Defense logo"
-#define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo"
-#define MANUFACTURER_HUNTERSPRIDE "the Hunter's Pride Arms and Ammunition logo"
-#define MANUFACTURER_SOLARARMORIES "the Solarbundswaffenkammer emblem"
-#define MANUFACTURER_SCARBOROUGH "the Scarborough Arms logo"
-#define MANUFACTURER_EOEHOMA "the Eoehoma Firearms emblem"
-#define MANUFACTURER_NANOTRASEN_OLD "an outdated Nanotrasen logo"
-#define MANUFACTURER_NANOTRASEN "the Nanotrasen logo"
-#define MANUFACTURER_BRAZIL "a green flag with a blue circle and a yellow diamond around it"
-#define MANUFACTURER_INTEQ "an orange crest with the letters 'IRMG'"
-#define MANUFACTURER_MINUTEMAN "the Lanchester City Firearms Plant logo"
-#define MANUFACTURER_DONKCO "the Donk! Co. logo"
-#define MANUFACTURER_PGF "the Etherbor Industries emblem"
-#define MANUFACTURER_IMPORT "Lanchester Import Co."
/obj/item/gun
name = "gun"
desc = "It's a gun. It's pretty terrible, though."
@@ -43,32 +24,60 @@
var/vary_fire_sound = TRUE
var/fire_sound_volume = 50
var/dry_fire_sound = 'sound/weapons/gun/general/dry_fire.ogg'
- var/dry_fire_text = "click" //change this on non-gun things
- var/suppressed = null //whether or not a message is displayed when fired
+ ///Text showed when attempting to fire with no round or empty round.
+ var/dry_fire_text = "click"
+ ///whether or not a message is displayed when fired
+ var/suppressed = null
var/can_suppress = FALSE
var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
var/suppressed_volume = 60
var/can_unsuppress = TRUE
- var/clumsy_check = TRUE
var/obj/item/ammo_casing/chambered = null
- trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers
- var/sawn_desc = null //description change if weapon is sawn-off
+ ///trigger guard on the weapon. Used for hulk mutations and ashies. I honestly dont know how usefult his is, id avoid touching it
+ trigger_guard = TRIGGER_GUARD_NORMAL
+ ///Set the description of the gun to this when sawed off
+ var/sawn_desc = null
+ ///This triggers some sprite behavior in shotguns and prevents further sawoff, note that can_be_sawn_off is on gun/ballistic and not here, wtf.
var/sawn_off = FALSE
- var/burst_size = 1 //how large a burst is
- var/fire_delay = 0 //rate of fire for burst firing and semi auto
- var/firing_burst = 0 //Prevent the weapon from firing again while already firing
- var/semicd = 0 //cooldown handler
+
+ /// how many shots per burst, Ex: most machine pistols, M90, some ARs are 3rnd burst, while others like the GAR and laser minigun are 2 round burst.
+ var/burst_size = 3
+ ///The rate of fire when firing in a burst. Not the delay between bursts
+ var/burst_delay = 0.15 SECONDS
+ ///The rate of fire when firing full auto and semi auto, and between bursts; for bursts its fire delay + burst_delay after every burst
+ var/fire_delay = 0.2 SECONDS
+
+ /// after initializing, we set the firemode to this
+ var/default_firemode = FIREMODE_SEMIAUTO
+ ///Firemode index, due to code shit this is the currently selected firemode
+ var/firemode_index
+ /// Our firemodes, subtract and add to this list as needed. NOTE that the autofire component is given on init when FIREMODE_FULLAUTO is here.
+ var/list/gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER, FIREMODE_OTHER_TWO)
+ /// A acoc list that determines the names of firemodes. Use if you wanna be weird and set the name of say, FIREMODE_OTHER to "Underbarrel grenade launcher" for example.
+ var/list/gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "misc. fire", FIREMODE_OTHER_TWO = "very misc. fire")
+ ///BASICALLY: the little button you select firing modes from? this is jsut the prefix of the icon state of that. For example, if we set it as "laser", the fire select will use "laser_single" and so on.
+ var/fire_select_icon_state_prefix = ""
+ ///If true, we put "safety_" before fire_select_icon_state_prefix's prefix. ex. "safety_laser_single"
+ var/adjust_fire_select_icon_state_on_safety = FALSE
+
+ ///Are we firing a burst? If so, dont fire again until burst is done
+ var/currently_firing_burst = FALSE
+ ///This prevents gun from firing until the coodown is done, affected by lag
+ var/current_cooldown = 0
+ ///affects if you can fire it unwielded or even dual wield it. LIGHT means dual wield allowed, HEAVY and higher means you have to wield to fire
var/weapon_weight = WEAPON_LIGHT
- var/dual_wield_spread = 24 //additional spread when dual wielding
- var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
+ ///If dual wielding, add this to the spread
+ var/dual_wield_spread = 24
+ /// ???, no clue what this is. Original desc: //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
+ var/randomspread = 1
- var/projectile_damage_multiplier = 1 //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo.
+ ///Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo.
+ var/projectile_damage_multiplier = 1
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
var/list/attachment_options = list() //This.. works for now.. gun refactor soon
- var/obj/item/firing_pin/pin = /obj/item/firing_pin //standard firing pin for most guns
var/can_flashlight = FALSE //if a flashlight can be added or removed if it already has one.
var/obj/item/flashlight/seclite/gun_light
@@ -141,12 +150,11 @@
. = ..()
RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
- if(pin)
- pin = new pin(src)
if(gun_light)
alight = new(src)
muzzle_flash = new(src, muzzleflash_iconstate)
build_zooming()
+ build_firemodes()
/obj/item/gun/ComponentInitialize()
. = ..()
@@ -161,10 +169,21 @@
user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown)
wield_time = world.time + wield_delay
if(wield_time > 0)
- if(do_mob(user, user, wield_delay, FALSE, TRUE, CALLBACK(src, PROC_REF(is_wielded)), ignore_loc_change = TRUE))
+ if(do_after(
+ user,
+ wield_delay,
+ user,
+ FALSE,
+ TRUE,
+ CALLBACK(src, PROC_REF(is_wielded)),
+ timed_action_flags = IGNORE_USER_LOC_CHANGE
+ )
+ )
wielded_fully = TRUE
+ return TRUE
else
wielded_fully = TRUE
+ return TRUE
/obj/item/gun/proc/is_wielded()
return wielded
@@ -176,8 +195,6 @@
user.remove_movespeed_modifier(/datum/movespeed_modifier/gun)
/obj/item/gun/Destroy()
- if(isobj(pin)) //Can still be the initial path, then we skip
- QDEL_NULL(pin)
if(gun_light)
QDEL_NULL(gun_light)
if(bayonet)
@@ -193,8 +210,6 @@
return ..()
/obj/item/gun/handle_atom_del(atom/A)
- if(A == pin)
- pin = null
if(A == chambered)
chambered = null
update_appearance()
@@ -206,12 +221,6 @@
/obj/item/gun/examine(mob/user)
. = ..()
- if(pin)
- . += "It has \a [pin] installed."
- . += "[pin] looks like it could be removed with some tools."
- else
- . += "It doesn't have a firing pin installed, and won't fire."
-
if(gun_light)
. += "It has \a [gun_light] [can_flashlight ? "" : "permanently "]mounted on it."
if(can_flashlight) //if it has a light and this is false, the light is permanent.
@@ -238,8 +247,53 @@
if(zoomed && user.get_active_held_item() != src)
zoom(user, user.dir, FALSE) //we can only stay zoomed in if it's in our hands //yeah and we only unzoom if we're actually zoomed using the gun!!
+/obj/item/gun/attack(mob/M as mob, mob/user)
+ if(user.a_intent == INTENT_HARM) //Flogging
+ if(bayonet)
+ M.attackby(bayonet, user)
+ return
+ else
+ return ..()
+ return
+
+/obj/item/gun/attack_obj(obj/O, mob/user)
+ if(user.a_intent == INTENT_HARM)
+ if(bayonet)
+ O.attackby(bayonet, user)
+ return
+ return ..()
+
+/obj/item/gun/attackby(obj/item/I, mob/user, params)
+ if(user.a_intent == INTENT_HARM)
+ return ..()
+ else if(istype(I, /obj/item/flashlight/seclite))
+ if(!can_flashlight)
+ return ..()
+ var/obj/item/flashlight/seclite/S = I
+ if(!gun_light)
+ if(!user.transferItemToLoc(I, src))
+ return
+ to_chat(user, "You click [S] into place on [src].")
+ set_gun_light(S)
+ update_gunlight()
+ alight = new(src)
+ if(loc == user)
+ alight.Grant(user)
+ else if(istype(I, /obj/item/kitchen/knife))
+ var/obj/item/kitchen/knife/K = I
+ if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it.
+ return ..()
+ if(!user.transferItemToLoc(I, src))
+ return
+ to_chat(user, "You attach [K] to [src]'s bayonet lug.")
+ bayonet = K
+ update_appearance()
+
+ else
+ return ..()
+
//called after the gun has successfully fired its chambered ammo.
-/obj/item/gun/proc/process_chamber()
+/obj/item/gun/proc/process_chamber(atom/shooter)
SEND_SIGNAL(src, COMSIG_GUN_CHAMBER_PROCESSED)
return FALSE
@@ -250,282 +304,277 @@
return FALSE
return TRUE
-/obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
- if(!safety)
- to_chat(user, "*[dry_fire_text]*")
- playsound(src, dry_fire_sound, 30, TRUE)
- return
- to_chat(user, "Safeties are active on the [src]! Turn them off to fire!")
-
-
-/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1)
- var/actual_angle = get_angle_with_scatter((user || get_turf(src)), pbtarget, rand(-recoil_deviation, recoil_deviation) + 180)
- var/muzzle_angle = Get_Angle(get_turf(src), pbtarget)
- if(muzzle_flash && !muzzle_flash.applied)
- handle_muzzle_flash(user, muzzle_angle)
-
- if(wielded_fully)
- simulate_recoil(user, recoil, actual_angle)
- else if(!wielded_fully)
- simulate_recoil(user, recoil_unwielded, actual_angle)
-
- if(suppressed)
- playsound(user, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
- else
- playsound(user, fire_sound, fire_sound_volume, vary_fire_sound)
- if(message)
- if(pointblank)
- user.visible_message(
- span_danger("[user] fires [src] point blank at [pbtarget]!"),
- span_danger("You fire [src] point blank at [pbtarget]!"),
- span_hear("You hear a gunshot!"), COMBAT_MESSAGE_RANGE, pbtarget
- )
- to_chat(pbtarget, "[user] fires [src] point blank at you!")
- if(pb_knockback > 0 && ismob(pbtarget))
- var/mob/PBT = pbtarget
- var/atom/throw_target = get_edge_target_turf(PBT, user.dir)
- PBT.throw_at(throw_target, pb_knockback, 2)
- else
- user.visible_message(
- span_danger("[user] fires [src]!"),
- blind_message = span_hear("You hear a gunshot!"),
- vision_distance = COMBAT_MESSAGE_RANGE,
- ignored_mobs = user
- )
-
/obj/item/gun/emp_act(severity)
. = ..()
if(!(. & EMP_PROTECT_CONTENTS))
for(var/obj/O in contents)
O.emp_act(severity)
+
+/obj/item/gun/proc/recharge_newshot()
+ return
+
/obj/item/gun/afterattack(atom/target, mob/living/user, flag, params)
. = ..()
+ //No target? Why are we even firing anyways...
if(!target)
return
- if(firing_burst)
+ //If we are burst firing, don't fire, obviously
+ if(currently_firing_burst)
return
- if(flag) //It's adjacent, is the user, or is on the user's person
+ //This var happens when we are either clicking someone next to us or ourselves. Check if we don't want to fire...
+ if(flag)
if(target in user.contents) //can't shoot stuff inside us.
return
if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack
return
if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) //so we can't shoot ourselves (unless mouth selected)
return
+/* TODO: gunpointing is very broken, port the old skyrat gunpointing? its much better, usablity wise and rp wise?
if(ismob(target) && user.a_intent == INTENT_GRAB)
if(user.GetComponent(/datum/component/gunpoint))
to_chat(user, "You are already holding someone up!")
return
user.AddComponent(/datum/component/gunpoint, target, src)
return
+*/
+ // Good job, but we have exta checks to do...
+ return pre_fire(target, user, TRUE, flag, params, null)
+
+/obj/item/gun/proc/pre_fire(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0, dual_wielded_gun = FALSE)
+ add_fingerprint(user)
- if(istype(user))//Check if the user can use the gun, if the user isn't alive(turrets) assume it can.
- var/mob/living/L = user
- if(!can_trigger_gun(L))
+ // If we have a cooldown, don't do anything, obviously
+ if(current_cooldown)
+ return
+
+ //We check if the user can even use the gun, if not, we assume the user isn't alive(turrets) so we go ahead.
+ if(istype(user))
+ var/mob/living/living_user = user
+ if(!can_trigger_gun(living_user))
return
+ //If targetting the mouth, we do suicide instead.
if(flag)
if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH)
handle_suicide(user, target, params)
return
- if(!can_shoot()) //Just because you can pull the trigger doesn't mean it can shoot.
+ //Just because we can pull the trigger doesn't mean it can fire. Mostly for safties.
+ if(!can_shoot())
shoot_with_empty_chamber(user)
return
- if(check_botched(user))
+ //we then check our weapon weight vs if we are being wielded...
+ if(weapon_weight == WEAPON_VERY_HEAVY && (!wielded_fully))
+ to_chat(user, "You need a fully secure grip to fire [src]!")
return
if(weapon_weight == WEAPON_HEAVY && (!wielded))
to_chat(user, "You need a more secure grip to fire [src]!")
return
- //DUAL (or more!) WIELDING
- var/bonus_spread = 0
+ //If we have the pacifist trait and a chambered round, don't fire. Honestly, pacifism quirk is pretty stupid, and as such we check again in process_fire() anyways
+ if(chambered)
+ if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal.
+ if(chambered.harmful) // Is the bullet chambered harmful?
+ to_chat(user, "[src] is lethally chambered! You don't want to risk harming anyone...")
+ return
+
+ //Dual wielding handling. Not the biggest fan of this, but it's here. Dual berettas not included
var/loop_counter = 0
- if(ishuman(user) && user.a_intent == INTENT_HARM)
- var/mob/living/carbon/human/H = user
- for(var/obj/item/gun/G in H.held_items)
- if(G == src || G.weapon_weight >= WEAPON_MEDIUM)
+ if(ishuman(user) && user.a_intent == INTENT_HARM && !dual_wielded_gun)
+ var/mob/living/carbon/human/our_cowboy = user
+ for(var/obj/item/gun/found_gun in our_cowboy.held_items)
+ if(found_gun == src || found_gun.weapon_weight >= WEAPON_MEDIUM)
continue
- else if(G.can_trigger_gun(user))
+ else if(found_gun.can_trigger_gun(user))
bonus_spread += dual_wield_spread
loop_counter++
- addtimer(CALLBACK(G, TYPE_PROC_REF(/obj/item/gun, process_fire), target, user, TRUE, params, null, bonus_spread), loop_counter)
+ addtimer(CALLBACK(found_gun, TYPE_PROC_REF(/obj/item/gun, pre_fire), target, user, TRUE, params, null, bonus_spread), loop_counter)
+
+ //get current firemode
+ var/current_firemode = gun_firemodes[firemode_index]
+ //FIREMODE_OTHER and its sister directs you to another proc for special handling
+ if(current_firemode == FIREMODE_OTHER)
+ return process_other(target, user, message, flag, params, zone_override, bonus_spread)
+ if(current_firemode == FIREMODE_OTHER_TWO)
+ return process_other_two(target, user, message, flag, params, zone_override, bonus_spread)
+ //if all of that succeded, we finally get to process firing
return process_fire(target, user, TRUE, params, null, bonus_spread)
-/obj/item/gun/proc/check_botched(mob/living/user, params)
- if(clumsy_check)
- if(istype(user))
- if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40))
- to_chat(user, "You shoot yourself in the foot with [src]!")
- var/shot_leg = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
- process_fire(user, user, FALSE, params, shot_leg)
- SEND_SIGNAL(user, COMSIG_MOB_CLUMSY_SHOOT_FOOT)
- user.dropItemToGround(src, TRUE)
- return TRUE
-
-/obj/item/gun/can_trigger_gun(mob/living/user)
- . = ..()
- if(!handle_pins(user))
- return FALSE
+/obj/item/gun/proc/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0)
+ return //use this for 'underbarrels!!
-/obj/item/gun/proc/handle_pins(mob/living/user)
- if(pin)
- if(pin.pin_auth(user) || (pin.obj_flags & EMAGGED))
- return TRUE
- else
- pin.auth_fail(user)
- return FALSE
- else
- to_chat(user, "[src]'s trigger is locked. This weapon doesn't have a firing pin installed!")
- return FALSE
+/obj/item/gun/proc/process_other_two(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0)
+ return //reserved in case another fire mode is needed, if you need special behavior, put it here then call process_fire, or call process_fire and have the special behavior there
-/obj/item/gun/proc/recharge_newshot()
- return
+/**
+ * Handles everything involving firing.
+ * * gun.dm is still a fucking mess, and I will document everything next time i get to it... for now this will suffice.
+ *
+ * Returns TRUE or FALSE depending on if it actually fired a shot.
+ * Arguments:
+ * * target - The atom we are trying to hit.
+ * * user - The living mob firing the gun, if any.
+ * * message - Do we show the usual messages? eg. "x fires the y!"
+ * * params - Is the params string from byond [/atom/proc/Click] code, see that documentation.
+ * * zone_override - The bodypart we attempt to hit, sometimes hits another.
+ * * bonus_spread - Adds this value to spread, in this case used by dual wielding.
+ * * burst_firing - Not to be confused with currently_firing_burst. This var is TRUE when we are doing a burst except for the first shot in a burst, as to override the spam burst checks.
+ * * spread_override - Bullet spread is forcibly set to this. This is usually because of bursts attempting to share the same burst trajectory.
+ * * iteration - Which shot in a burst are we in.
+ */
+/obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, burst_firing = FALSE, spread_override = 0, iteration = 0)
+ //OKAY, this prevents us from firing until our cooldown is done
+ if(!burst_firing) //if we're firing a burst, dont interfere to avoid issues
+ if(current_cooldown)
+ return FALSE
-/obj/item/gun/proc/process_burst(mob/living/user, atom/target, message = TRUE, params=null, zone_override = "", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0)
- if(!user || !firing_burst)
- firing_burst = FALSE
+ //Check one last time for safeties...
+ if(!can_shoot())
+ shoot_with_empty_chamber(user)
+ currently_firing_burst = FALSE
return FALSE
- if(!issilicon(user))
- if(iteration > 1 && !(user.is_holding(src))) //for burst firing
- firing_burst = FALSE
+
+ //special hahnding for burst firing
+ if(burst_firing)
+ if(!user || !currently_firing_burst)
+ currently_firing_burst = FALSE
return FALSE
- if(chambered && chambered.BB)
+ if(!issilicon(user))
+ //If we aren't holding the gun, what are we doing, stop firing!
+ if(iteration > 1 && !(user.is_holding(src)))
+ currently_firing_burst = FALSE
+ return FALSE
+
+ //Do we have a round? If not, stop the whole chain, and if we do, check if the gun is chambered. Pacisim is pretty lame anyways.
+ if(chambered)
if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal.
if(chambered.harmful) // Is the bullet chambered harmful?
to_chat(user, "[src] is lethally chambered! You don't want to risk harming anyone...")
- return
- if(randomspread)
- sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
- else //Smart spread
- sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread))
- before_firing(target,user)
- if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src))
- shoot_with_empty_chamber(user)
- firing_burst = FALSE
- return FALSE
- else
- if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot
- shoot_live_shot(user, 1, target, message)
- else
- shoot_live_shot(user, 0, target, message)
- if (iteration >= burst_size)
- firing_burst = FALSE
+ currently_firing_burst = FALSE //no burst 4 u
+ return FALSE
else
shoot_with_empty_chamber(user)
- firing_burst = FALSE
+ currently_firing_burst = FALSE
return FALSE
- process_chamber()
- update_appearance()
- return TRUE
-/obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
+ // we hold the total spread in this var
+ var/sprd
+ // if we ARE burst firing and don't have "randomspread", we add the burst's penalty on top of it.
+ if(burst_firing && !randomspread)
+ bonus_spread += burst_size * iteration
+
+ //override spread? usually happens only in bursts
+ if(spread_override && !randomspread)
+ sprd = spread_override
+ else
+ //Calculate spread
+ sprd = calculate_spread(user, bonus_spread)
+
+ before_firing(target,user)
+ //If we cant fire the round, just end the proc here. Otherwise, continue
+ if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src))
+ shoot_with_empty_chamber(user)
+ currently_firing_burst = FALSE
+ return FALSE
+ //Are we PBing someone? If so, set pointblank to TRUE
+ shoot_live_shot(user, (get_dist(user, target) <= 1), target, message) //Making sure whether the target is in vicinity for the pointblank shot
+
+ //process the chamber...
+ process_chamber(shooter = user)
+ update_appearance()
+ //get our current firemode...
+ var/current_firemode = gun_firemodes[firemode_index]
+
+ //If we are set to burst fire, then we burst fire!
+ if(burst_size > 1 && (current_firemode == FIREMODE_BURST) && !burst_firing)
+ currently_firing_burst = TRUE
+ for(var/i = 2 to burst_size) //we fire the first burst normally, hence why its 2
+ addtimer(CALLBACK(src, PROC_REF(process_fire), target, user, message, params, zone_override, 0, TRUE, sprd, i), burst_delay * (i - 1))
+
+ //if we have a fire delay, set up a cooldown
+ if(fire_delay && (!burst_firing && !currently_firing_burst))
+ current_cooldown = TRUE
+ addtimer(CALLBACK(src, PROC_REF(reset_current_cooldown)), fire_delay)
+ if(burst_firing && iteration >= burst_size)
+ current_cooldown = TRUE
+ addtimer(CALLBACK(src, PROC_REF(reset_current_cooldown)), fire_delay+burst_delay)
+ currently_firing_burst = FALSE
+
+ // update our inhands...
if(user)
- SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, user, target, params, zone_override)
+ user.update_inv_hands()
- add_fingerprint(user)
+ SSblackbox.record_feedback("tally", "gun_fired", 1, type)
+ return TRUE
- if(semicd)
+/obj/item/gun/proc/reset_current_cooldown()
+ current_cooldown = FALSE
+/obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
+ if(!safety)
+ to_chat(user, "*[dry_fire_text]*")
+ playsound(src, dry_fire_sound, 30, TRUE)
return
+ to_chat(user, "Safeties are active on the [src]! Turn them off to fire!")
- var/sprd = 0
- var/randomized_gun_spread = 0
- var/rand_spr = rand()
- if(wielded_fully && spread)
- randomized_gun_spread = rand(0,spread)
- else if(!wielded_fully && spread_unwielded)
- randomized_gun_spread = rand(0,spread_unwielded)
+/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = FALSE, atom/pbtarget = null, message = TRUE)
+ var/actual_angle = get_angle_with_scatter((user || get_turf(src)), pbtarget, rand(-recoil_deviation, recoil_deviation) + 180)
+ var/muzzle_angle = Get_Angle(get_turf(src), pbtarget)
- if(HAS_TRAIT(user, TRAIT_POOR_AIM)) //nice shootin' tex
- bonus_spread += 25
- var/randomized_bonus_spread = rand(0, bonus_spread)
+ user.changeNext_move(clamp(fire_delay, 0, CLICK_CD_RANGE))
- if(burst_size > 1)
- firing_burst = TRUE
- for(var/i = 1 to burst_size)
- addtimer(CALLBACK(src, PROC_REF(process_burst), user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), fire_delay * (i - 1))
- else
- if(chambered)
- if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal.
- if(chambered.harmful) // Is the bullet chambered harmful?
- to_chat(user, "[src] is lethally chambered! You don't want to risk harming anyone...")
- return
- sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
- sprd = calculate_spread(user, sprd)
-
- before_firing(target,user)
- if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src))
- shoot_with_empty_chamber(user)
- return
- else
- if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot
- shoot_live_shot(user, TRUE, target, message)
- else
- shoot_live_shot(user, FALSE, target, message)
- else
- shoot_with_empty_chamber(user)
- return
- process_chamber()
- update_appearance()
- if(fire_delay)
- semicd = TRUE
- addtimer(CALLBACK(src, PROC_REF(reset_semicd)), fire_delay)
+ if(muzzle_flash && !muzzle_flash.applied)
+ handle_muzzle_flash(user, muzzle_angle)
- if(user)
- user.update_inv_hands()
- SSblackbox.record_feedback("tally", "gun_fired", 1, type)
- return TRUE
+ if(wielded_fully)
+ simulate_recoil(user, recoil, actual_angle)
+ else if(!wielded_fully)
+ simulate_recoil(user, recoil_unwielded, actual_angle)
-/obj/item/gun/proc/reset_semicd()
- semicd = FALSE
+ if(suppressed)
+ playsound(user, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
+ else
+ playsound(user, fire_sound, fire_sound_volume, vary_fire_sound)
+ if(message)
+ if(pointblank)
+ user.visible_message(
+ span_danger("[user] fires [src] point blank at [pbtarget]!"),
+ span_danger("You fire [src] point blank at [pbtarget]!"),
+ span_hear("You hear a gunshot!"), COMBAT_MESSAGE_RANGE, pbtarget
+ )
+ to_chat(pbtarget, "[user] fires [src] point blank at you!")
+ if(pb_knockback > 0 && ismob(pbtarget))
+ var/mob/PBT = pbtarget
+ var/atom/throw_target = get_edge_target_turf(PBT, user.dir)
+ PBT.throw_at(throw_target, pb_knockback, 2)
+ else
+ user.visible_message(
+ span_danger("[user] fires [src]!"),
+ blind_message = span_hear("You hear a gunshot!"),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ ignored_mobs = user
+ )
-/obj/item/gun/attack(mob/M as mob, mob/user)
- if(user.a_intent == INTENT_HARM) //Flogging
- if(bayonet)
- M.attackby(bayonet, user)
- return
- else
- return ..()
- return
+ //cloudy sent a meme in the discord. i dont know if its true, but i made this piece of code in honor of it
+ var/mob/living/carbon/human/living_human = user
+ if(istype(living_human))
+ if(!living_human.wear_neck)
+ return //if nothing on the neck, don't do anything
+ var/current_month = text2num(time2text(world.timeofday, "MM"))
+ var/static/regex/bian = regex("(?:^\\W*lesbian)", "i")
-/obj/item/gun/attack_obj(obj/O, mob/user)
- if(user.a_intent == INTENT_HARM)
- if(bayonet)
- O.attackby(bayonet, user)
- return
- return ..()
+ if(current_month == JUNE)
+ return //if it isn't june, don't do this easter egg
-/obj/item/gun/attackby(obj/item/I, mob/user, params)
- if(user.a_intent == INTENT_HARM)
- return ..()
- else if(istype(I, /obj/item/flashlight/seclite))
- if(!can_flashlight)
- return ..()
- var/obj/item/flashlight/seclite/S = I
- if(!gun_light)
- if(!user.transferItemToLoc(I, src))
- return
- to_chat(user, "You click [S] into place on [src].")
- set_gun_light(S)
- update_gunlight()
- alight = new(src)
- if(loc == user)
- alight.Grant(user)
- else if(istype(I, /obj/item/kitchen/knife))
- var/obj/item/kitchen/knife/K = I
- if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it.
- return ..()
- if(!user.transferItemToLoc(I, src))
- return
- to_chat(user, "You attach [K] to [src]'s bayonet lug.")
- bayonet = K
- update_appearance()
+ if(!findtext(bian, living_human.generic_adjective))
+ return //dont bother if we already are affected by it
- else
- return ..()
+ if(istype(living_human.wear_neck, /obj/item/clothing/neck/tie/lesbian) || living_human.wear_neck.icon_state == "lesbian")
+ var/use_space = "[living_human.generic_adjective ? " " : ""]"
+ living_human.generic_adjective = "lesbian[use_space][living_human.generic_adjective]" //i actually don't remember the meme. it was something like lesbians will stop working if they see another with a gun. or something.
/obj/item/gun/CtrlClick(mob/user)
. = ..()
@@ -577,40 +626,6 @@
else if(picked_option == "Knife")
return remove_gun_attachment(user, I, bayonet, "unfix")
-/obj/item/gun/welder_act(mob/living/user, obj/item/I)
- . = ..()
- if(.)
- return
- if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
- return
- if(pin && user.is_holding(src))
- user.visible_message("[user] attempts to remove [pin] from [src] with [I].",
- "You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)", null, 3)
- if(I.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, 5, volume = 50))
- if(!pin) //check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay
- return
- user.visible_message("[pin] is spliced out of [src] by [user], melting part of the pin in the process.",
- "You splice [pin] out of [src] with [I], melting part of the pin in the process.", null, 3)
- QDEL_NULL(pin)
- return TRUE
-
-/obj/item/gun/wirecutter_act(mob/living/user, obj/item/I)
- . = ..()
- if(.)
- return
- if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
- return
- if(pin && user.is_holding(src))
- user.visible_message("[user] attempts to remove [pin] from [src] with [I].",
- "You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)", null, 3)
- if(I.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, volume = 50))
- if(!pin) //check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay
- return
- user.visible_message("[pin] is ripped out of [src] by [user], mangling the pin in the process.",
- "You rip [pin] out of [src] with [I], mangling the pin in the process.", null, 3)
- QDEL_NULL(pin)
- return TRUE
-
/obj/item/gun/proc/remove_gun_attachment(mob/living/user, obj/item/tool_item, obj/item/item_to_remove, removal_verb)
if(tool_item)
tool_item.play_tool_sound(src)
@@ -744,44 +759,69 @@
safety_overlay.icon_state = "[safety_wording]-off"
. += safety_overlay
+#define BRAINS_BLOWN_THROW_RANGE 2
+#define BRAINS_BLOWN_THROW_SPEED 1
+
/obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer)
if(!ishuman(user) || !ishuman(target))
return
- if(semicd)
+ if(current_cooldown)
+ return
+
+ if(!can_shoot()) //Just because you can pull the trigger doesn't mean it can shoot.
+ shoot_with_empty_chamber(user)
return
if(user == target)
- target.visible_message("[user] sticks [src] in [user.p_their()] mouth, ready to pull the trigger...", \
- "You stick [src] in your mouth, ready to pull the trigger...")
+ target.visible_message(span_warning("[user] sticks [src] in [user.p_their()] mouth, ready to pull the trigger..."), \
+ span_userdanger("You stick [src] in your mouth, ready to pull the trigger..."))
else
- target.visible_message("[user] points [src] at [target]'s head, ready to pull the trigger...", \
- "[user] points [src] at your head, ready to pull the trigger...")
+ target.visible_message(span_warning("[user] points [src] at [target]'s head, ready to pull the trigger..."), \
+ span_userdanger("[user] points [src] at your head, ready to pull the trigger..."))
- semicd = TRUE
+ current_cooldown = TRUE
- if(!bypass_timer && (!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH))
+ if(!bypass_timer && (!do_after(user, 100, target) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH))
if(user)
if(user == target)
- user.visible_message("[user] decided not to shoot.")
+ user.visible_message(span_notice("[user] decided not to shoot."))
else if(target && target.Adjacent(user))
- target.visible_message("[user] has decided to spare [target]", "[user] has decided to spare your life!")
- semicd = FALSE
+ target.visible_message(span_notice("[user] has decided to spare [target]."), span_notice("[user] has decided to spare your life!"))
+ current_cooldown = FALSE
return
- semicd = FALSE
+ current_cooldown = FALSE
- target.visible_message("[user] pulls the trigger!", "[(user == target) ? "You pull" : "[user] pulls"] the trigger!")
+ target.visible_message(span_warning("[user] pulls the trigger!"), span_userdanger("[(user == target) ? "You pull" : "[user] pulls"] the trigger!"))
- if(chambered && chambered.BB)
- chambered.BB.damage *= 5
+ if(chambered && chambered.BB && can_trigger_gun(user))
+ chambered.BB.damage *= 3
+ //Check is here for safeties and such, brain will be removed after
+ if(!pre_fire(target, user, TRUE, params, BODY_ZONE_HEAD))
+ return
+
+ var/obj/item/organ/brain/brain_to_blast = target.getorganslot(ORGAN_SLOT_BRAIN)
+ if(brain_to_blast)
+
+ //Check if the projectile is actually damaging and not of type STAMINA
+ if(chambered.BB.nodamage || !chambered.BB.damage || chambered.BB.damage_type == STAMINA)
+ return
+
+ //Remove brain of the mob shot
+ brain_to_blast.Remove(target)
- process_fire(target, user, TRUE, params, BODY_ZONE_HEAD)
+ var/turf/splat_turf = get_turf(target)
+ //Move the brain of the person shot to selected turf
+ brain_to_blast.forceMove(splat_turf)
-/obj/item/gun/proc/unlock() //used in summon guns and as a convience for admins
- if(pin)
- qdel(pin)
- pin = new /obj/item/firing_pin
+ var/turf/splat_target = get_ranged_target_turf(target, REVERSE_DIR(target.dir), BRAINS_BLOWN_THROW_RANGE)
+ var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(spawn_atom_to_turf), /obj/effect/gibspawner/generic, brain_to_blast, 1, FALSE, target)
+ //Throw the brain that has been removed away and place a gibspawner on landing
+ brain_to_blast.throw_at(splat_target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback = gibspawner)
+
+#undef BRAINS_BLOWN_THROW_RANGE
+#undef BRAINS_BLOWN_THROW_SPEED
//Happens before the actual projectile creation
/obj/item/gun/proc/before_firing(atom/target,mob/user)
@@ -793,10 +833,55 @@
// We do it like this in case theres some specific gun behavior for adjusting spread, like bipods or folded stocks
/obj/item/gun/proc/calculate_spread(mob/user, bonus_spread)
- return bonus_spread
+ ///our final spread value
+ var/sprd = 0
+ ///our randomized value after checking if we are wielded or not
+ var/randomized_gun_spread = 0
+ ///bonus
+ var/randomized_bonus_spread
+ // do we have poor aim
+ var/poor_aim = FALSE
+
+ //do we have bonus_spread ? If so, set sprd to it because it means a subtype's proc messed with it
+ sprd += bonus_spread
+
+ //reset bonus_spread for poor aim...
+ bonus_spread = 0
+
+ // if we have poor aim, we fuck the shooter over
+ if(HAS_TRAIT(user, TRAIT_POOR_AIM))
+ bonus_spread += 25
+ poor_aim = TRUE
+ // then we randomize the bonus spread
+ randomized_bonus_spread = rand(poor_aim ? 10 : 0, bonus_spread) //poor aim is no longer just a nusiance
+
+ //then, we mutiply previous bonus spread as it means dual wielding usually, it also means poor aim is also even more severe
+ randomized_bonus_spread *= DUALWIELD_PENALTY_EXTRA_MULTIPLIER
+
+ // we will then calculate gun spread depending on if we are fully wielding (after do_after) the gun or not
+ randomized_gun_spread = rand(0, wielded_fully ? spread : spread_unwielded)
+
+ //finally, we put it all together including if sprd has a value
+ sprd += randomized_gun_spread + randomized_bonus_spread
+
+ //clamp it down to avoid guns with negative spread to have worse recoil...
+ sprd = clamp(sprd, 0, INFINITY)
+
+ // im not sure what this does, i beleive its meant to make it so bullet spread goes in the opposite direction? get back to me on this - update,i have commented it out, however it appears be dapening spread. weird.
+ //sprd *= (rand() - 0.5)
+
+ //coin flip if we mutiply output by -1 so spread isn't JUST to the right
+ if(prob(50))
+ sprd *= -1
+
+ // then we round it up and send it!
+ sprd = round(sprd)
+
+ return sprd
/obj/item/gun/proc/simulate_recoil(mob/living/user, recoil_bonus = 0, firing_angle)
var/total_recoil = calculate_recoil(user, recoil_bonus)
+ total_recoil = clamp(total_recoil, 0 , INFINITY)
var/actual_angle = firing_angle + rand(-recoil_deviation, recoil_deviation) + 180
if(actual_angle > 360)
@@ -808,6 +893,7 @@
/obj/item/gun/proc/handle_muzzle_flash(mob/living/user, firing_angle)
var/atom/movable/flash_loc = user
var/prev_light = light_range
+
if(!light_on && (light_range <= muzzle_flash_lum))
set_light_range(muzzle_flash_lum)
set_light_color(muzzle_flash_color)
@@ -956,5 +1042,58 @@
azoom = new()
azoom.gun = src
-#undef FIRING_PIN_REMOVAL_DELAY
-#undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER
+/obj/item/gun/proc/build_firemodes()
+ if(FIREMODE_FULLAUTO in gun_firemodes)
+ AddComponent(/datum/component/automatic_fire, fire_delay)
+ SEND_SIGNAL(src, COMSIG_GUN_DISABLE_AUTOFIRE)
+ var/datum/action/item_action/our_action
+
+ if(gun_firemodes.len > 1)
+ our_action = new /datum/action/item_action/toggle_firemode(src)
+
+ for(var/i=1, i <= gun_firemodes.len+1, i++)
+ if(default_firemode == gun_firemodes[i])
+ firemode_index = i
+ if(gun_firemodes[i] == FIREMODE_FULLAUTO)
+ SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE)
+ if(our_action)
+ our_action.UpdateButtonIcon()
+ return
+
+ firemode_index = 1
+ CRASH("default_firemode isn't in the gun_firemodes list of [src.type]!! Defaulting to 1!!")
+
+/obj/item/gun/ui_action_click(mob/user, actiontype)
+ if(istype(actiontype, /datum/action/item_action/toggle_firemode))
+ fire_select(user)
+ else
+ ..()
+
+/obj/item/gun/proc/fire_select(mob/living/carbon/human/user)
+
+ //gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER)
+
+ firemode_index++
+ if(firemode_index > gun_firemodes.len)
+ firemode_index = 1 //reset to the first index if it's over the limit. Byond arrays start at 1 instead of 0, hence why its set to 1.
+
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode == FIREMODE_FULLAUTO)
+ SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE)
+ else
+ SEND_SIGNAL(src, COMSIG_GUN_DISABLE_AUTOFIRE)
+//wawa
+ to_chat(user, "Switched to [gun_firenames[current_firemode]].")
+ playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
+ update_appearance()
+ for(var/datum/action/current_action as anything in actions)
+ current_action.UpdateButtonIcon()
+
+/datum/action/item_action/toggle_firemode/UpdateButtonIcon(status_only = FALSE, force = FALSE)
+ var/obj/item/gun/our_gun = target
+
+ var/current_firemode = our_gun.gun_firemodes[our_gun.firemode_index]
+ //tldr; if we have adjust_fire_select_icon_state_on_safety as true, we append "safety_" to the prefix, otherwise nothing.
+ var/safety_prefix = "[our_gun.adjust_fire_select_icon_state_on_safety ? "[our_gun.safety ? "safety_" : ""]" : ""]"
+ button_icon_state = "[safety_prefix][our_gun.fire_select_icon_state_prefix][current_firemode]"
+ return ..()
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index f2cb9504dde7..e5345c0eab45 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -1,3 +1,8 @@
+#define EMPTY_GUN_HELPER(gun_type) \
+ /obj/item/gun/ballistic/##gun_type/no_mag { \
+ spawnwithmagazine = FALSE; \
+ }
+
///Subtype for any kind of ballistic gun
///This has a shitload of vars on it, and I'm sorry for that, but it does make making new subtypes really easy
/obj/item/gun/ballistic
@@ -53,9 +58,9 @@
///Compatible magazines with the gun
var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info
///Whether the sprite has a visible magazine or not
- var/mag_display = FALSE
+ var/show_magazine_on_sprite = FALSE
///Whether the sprite has a visible ammo display or not
- var/mag_display_ammo = FALSE
+ var/show_magazine_on_sprite_ammo = FALSE
///Whether the sprite has a visible indicator for being empty or not.
var/empty_indicator = FALSE
///Whether the gun alarms when empty or not.
@@ -63,7 +68,7 @@
///Do we eject the magazine upon runing out of ammo?
var/empty_autoeject = FALSE
///Whether the gun supports multiple special mag types
- var/special_mags = FALSE
+ var/unique_mag_sprites_for_variants = FALSE
///The bolt type of the gun, affects quite a bit of functionality, see combat.dm defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT
var/bolt_type = BOLT_TYPE_STANDARD
///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both.
@@ -121,8 +126,8 @@
if (suppressed)
. += "[icon_state]_suppressor"
if (magazine)
- if (special_mags)
- . += "[icon_state]_mag_[initial(magazine.icon_state)]"
+ if (unique_mag_sprites_for_variants)
+ . += "[icon_state]_mag_[magazine.base_icon_state]"
if (!magazine.ammo_count())
. += "[icon_state]_mag_empty"
else
@@ -144,13 +149,13 @@
if(!chambered && empty_indicator)
. += "[icon_state]_empty"
-/obj/item/gun/ballistic/process_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE)
+/obj/item/gun/ballistic/process_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE, atom/shooter)
if(!semi_auto && from_firing)
return
var/obj/item/ammo_casing/casing = chambered //Find chambered round
if(istype(casing)) //there's a chambered round
if(casing_ejector || !from_firing)
- casing.on_eject()
+ casing.on_eject(shooter)
chambered = null
else if(empty_chamber)
chambered = null
@@ -179,13 +184,14 @@
bolt_locked = FALSE
if (user)
to_chat(user, "You rack the [bolt_wording] of \the [src].")
- process_chamber(!chambered, FALSE)
+ process_chamber(!chambered, FALSE, shooter = user)
if (bolt_type == BOLT_TYPE_LOCKING && !chambered)
bolt_locked = TRUE
playsound(src, lock_back_sound, lock_back_sound_volume, lock_back_sound_vary)
else
playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
update_appearance()
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
///Drops the bolt from a locked position
/obj/item/gun/ballistic/proc/drop_bolt(mob/user = null)
@@ -212,6 +218,7 @@
if (bolt_type == BOLT_TYPE_OPEN && !bolt_locked)
chamber_round(TRUE)
update_appearance()
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
return TRUE
else
to_chat(user, "You cannot seem to get \the [src] out of your hands!")
@@ -232,6 +239,7 @@
if (display_message)
to_chat(user, "You pull the [magazine_wording] out of \the [src].")
update_appearance()
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
if (tac_load)
if(do_after(user, tactical_reload_delay, TRUE, src))
if (insert_magazine(user, tac_load, FALSE))
@@ -244,6 +252,7 @@
if(user)
user.put_in_hands(old_mag)
update_appearance()
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
/obj/item/gun/ballistic/can_shoot()
if(safety)
@@ -267,7 +276,7 @@
if (istype(A, /obj/item/ammo_casing) || istype(A, /obj/item/ammo_box))
if (bolt_type == BOLT_TYPE_NO_BOLT || internal_magazine)
if (chambered && !chambered.BB)
- chambered.on_eject()
+ chambered.on_eject(shooter = user)
chambered = null
var/num_loaded = magazine.attackby(A, user, params)
if (num_loaded)
@@ -298,11 +307,6 @@
return
return FALSE
-/obj/item/gun/ballistic/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
- if (sawn_off)
- bonus_spread += SAWN_OFF_ACC_PENALTY
- . = ..()
-
///Installs a new suppressor, assumes that the suppressor is already in the contents of src
/obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/S)
suppressed = S
@@ -346,8 +350,11 @@
bolt_locked = TRUE
update_appearance()
-/obj/item/gun/ballistic/afterattack()
+/obj/item/gun/ballistic/pre_fire(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0, dual_wielded_gun = FALSE)
prefire_empty_checks()
+ return ..()
+
+/obj/item/gun/ballistic/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, burst_firing = FALSE, spread_override = 0, iteration = 0)
. = ..() //The gun actually firing
postfire_empty_checks(.)
@@ -364,7 +371,10 @@
var/num_unloaded = 0
for(var/obj/item/ammo_casing/CB in get_ammo_list(FALSE, TRUE))
CB.forceMove(drop_location())
- CB.bounce_away(FALSE, NONE)
+
+ var/angle_of_movement =(rand(-3000, 3000) / 100) + dir2angle(turn(user.dir, 180))
+ CB.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(350, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = CB.bounce_sfx_override)
+
num_unloaded++
SSblackbox.record_feedback("tally", "station_mess_created", 1, CB.name)
if (num_unloaded)
@@ -422,7 +432,7 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
///Handles all the logic of sawing off guns,
/obj/item/gun/ballistic/proc/sawoff(mob/user, obj/item/saw)
- if(!saw.get_sharpness() || !is_type_in_typecache(saw, GLOB.gun_saw_types) && !saw.tool_behaviour == TOOL_SAW) //needs to be sharp. Otherwise turned off eswords can cut this.
+ if(!saw.get_sharpness() || !is_type_in_typecache(saw, GLOB.gun_saw_types) && saw.tool_behaviour != TOOL_SAW) //needs to be sharp. Otherwise turned off eswords can cut this.
return
if(sawn_off)
to_chat(user, "\The [src] is already shortened!")
diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm
index d0b69480a106..9d97dc627bd4 100644
--- a/code/modules/projectiles/guns/ballistic/assault.dm
+++ b/code/modules/projectiles/guns/ballistic/assault.dm
@@ -1,10 +1,10 @@
/obj/item/gun/ballistic/automatic/assault
- burst_size = 1
- actions_types = list()
- wield_delay = 0.7 SECONDS
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+ wield_delay = 0.8 SECONDS
wield_slowdown = 0.6
- fire_delay = 1
+ fire_delay = 0.2 SECONDS
load_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
load_empty_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
@@ -17,18 +17,20 @@
/obj/item/gun/ballistic/automatic/assault/calculate_recoil(mob/user, recoil_bonus = 0)
var/gunslinger_bonus = 2
var/total_recoil = recoil_bonus
+
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_recoil += gunslinger_bonus
- total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+
+ return ..(user, total_recoil)
/obj/item/gun/ballistic/automatic/assault/calculate_spread(mob/user, bonus_spread)
- var/gunslinger_bonus = 8
+ var/gunslinger_bonus = 16
var/total_spread = bonus_spread
+
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_spread += gunslinger_bonus
- total_spread = clamp(total_spread,0,INFINITY)
- return total_spread
+
+ return ..(user, total_spread)
/obj/item/gun/ballistic/automatic/assault/skm
name = "\improper SKM-24"
@@ -44,8 +46,8 @@
icon_state = "skm"
item_state = "skm"
- mag_display = TRUE
- special_mags = TRUE
+ show_magazine_on_sprite = TRUE
+ unique_mag_sprites_for_variants = TRUE
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
@@ -55,9 +57,7 @@
spread = 1
wield_delay = 0.7 SECONDS
-/obj/item/gun/ballistic/automatic/assault/skm/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
+ fire_delay = 0.2 SECONDS
/obj/item/gun/ballistic/automatic/assault/skm/pirate
name = "\improper Chopper"
@@ -82,22 +82,21 @@
fire_sound = 'sound/weapons/gun/rifle/m16.ogg'
icon_state = "p16"
item_state = "p16"
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
mag_type = /obj/item/ammo_box/magazine/p16
spread = 2
wield_delay = 0.5 SECONDS
+
+ fire_delay = 0.18 SECONDS
+
rack_sound = 'sound/weapons/gun/rifle/m16_cocked.ogg'
load_sound = 'sound/weapons/gun/rifle/m16_reload.ogg'
load_empty_sound = 'sound/weapons/gun/rifle/m16_reload.ogg'
eject_sound = 'sound/weapons/gun/rifle/m16_unload.ogg'
eject_empty_sound = 'sound/weapons/gun/rifle/m16_unload.ogg'
-/obj/item/gun/ballistic/automatic/assault/p16/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
-
/obj/item/gun/ballistic/automatic/assault/p16/minutemen
name = "\improper CM-16"
desc = "The standard-issue rifle of CLIP and an extensively modified reproduction of the P-16. Chambered in 5.56mm."
@@ -106,72 +105,56 @@
/obj/item/gun/ballistic/automatic/assault/swiss_cheese
name = "\improper Swiss Cheese"
- desc = "An ancient longarm famous for its boxy, modular design. The DMA on this unit is, sadly, broken. Uses 5.56mm ammunition for Matter mode."
+ desc = "An ancient longarm famous for its boxy, modular design. Mass produced by the Terran Confederation in ages past, these often mutiple century old designs have survied due to their sheer ruggedness. The DMA on this unit is sadly broken, but these rifles are known for their excellent burst fire. Uses 5.56mm ammunition for Matter mode."
icon = 'icons/obj/guns/48x32guns.dmi'
fire_sound = 'sound/weapons/gun/rifle/swiss.ogg'
icon_state = "swiss"
item_state = "swiss"
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
empty_indicator = TRUE
burst_size = 3
- fire_delay = 1.5
+ burst_delay = 0.08 SECONDS
+ fire_delay = 0.25 SECONDS
spread = 8
weapon_weight = WEAPON_MEDIUM
+ gun_firenames = list(FIREMODE_SEMIAUTO = "matter semi-auto", FIREMODE_BURST = "matter burst fire", FIREMODE_FULLAUTO = "matter full auto", FIREMODE_OTHER = "hybrid")
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER)
+
+ fire_select_icon_state_prefix = "swisschesse_"
+
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
mag_type = /obj/item/ammo_box/magazine/swiss
- actions_types = list(/datum/action/item_action/toggle_firemode)
manufacturer = MANUFACTURER_SOLARARMORIES
spread = 8
spread_unwielded = 15
-/obj/item/gun/ballistic/automatic/assault/swiss_cheese/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.65 SECONDS)
-
-/obj/item/gun/ballistic/automatic/assault/swiss_cheese/afterattack(atom/target, mob/living/user, flag, params)
- if(select == 2)
- to_chat(user, "You hear a strange sound from the DMA unit. It doesn't appear to be operational.")
- return
- else
- return ..()
-
-/obj/item/gun/ballistic/automatic/assault/swiss_cheese/burst_select()
- var/mob/living/carbon/human/user = usr
- switch(select)
- if(1)
- select = 2
- to_chat(user, "You switch to Hybrid.")
- if(2)
- select = 1
- burst_size = initial(burst_size)
- fire_delay = initial(fire_delay)
- to_chat(user, "You switch to [burst_size]-rnd Matter.")
-
- playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
- update_appearance()
- for(var/datum/action/action as anything in actions)
- action.UpdateButtonIcon()
-
-#define E40_BALLISTIC_MODE 1
-#define E40_LASER_MODE 2
+/obj/item/gun/ballistic/automatic/assault/swiss_cheese/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0)
+ to_chat(user, "You hear a strange sound from the DMA unit. It doesn't appear to be operational.")
/obj/item/gun/ballistic/automatic/assault/e40
name = "\improper E-40 Hybrid Rifle"
- desc = "A Hybrid Assault Rifle, best known for being having a dual ballistic and laser system. Chambered in .229 Eoehoma caseless, and uses energy for lasers."
+ desc = "A Hybrid Assault Rifle, best known for being having a dual ballistic/laser system along with an advanced ammo counter. Once an icon for bounty hunters, age has broken most down, so these end up in collector's hands or as shoddy Frontiersmen laser SMG conversions when in their inheritted stockpiles. But if one were to find one in working condition, it would be just as formidable as back then. Chambered in .229 Eoehoma caseless, and uses energy for lasers."
icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "e40"
item_state = "e40"
mag_type = /obj/item/ammo_box/magazine/e40
can_suppress = FALSE
- actions_types = list(/datum/action/item_action/toggle_firemode)
var/obj/item/gun/energy/laser/e40_laser_secondary/secondary
+ fire_select_icon_state_prefix = "e40_"
+
+ fire_delay = 0.18 SECONDS
+ recoil_unwielded = 3
+
+ gun_firenames = list(FIREMODE_FULLAUTO = "full auto ballistic", FIREMODE_OTHER = "full auto laser")
+ gun_firemodes = list(FIREMODE_FULLAUTO, FIREMODE_OTHER)
+ default_firemode = FIREMODE_OTHER
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
empty_indicator = TRUE
fire_sound = 'sound/weapons/gun/laser/e40_bal.ogg'
manufacturer = MANUFACTURER_EOEHOMA
@@ -179,56 +162,84 @@
/obj/item/gun/ballistic/automatic/assault/e40/Initialize()
. = ..()
secondary = new /obj/item/gun/energy/laser/e40_laser_secondary(src)
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
RegisterSignal(secondary, COMSIG_ATOM_UPDATE_ICON, PROC_REF(secondary_update_icon))
SEND_SIGNAL(secondary, COMSIG_GUN_DISABLE_AUTOFIRE)
update_appearance()
+/obj/item/gun/ballistic/automatic/assault/e40/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/ammo_hud/eoehoma) // at long last... the ammo counter on the side of the sprite is functional...
+
/obj/item/gun/ballistic/automatic/assault/e40/do_autofire(datum/source, atom/target, mob/living/shooter, params)
- if(select == E40_LASER_MODE)
- secondary.do_autofire(source, target, shooter, params)
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.do_autofire(source, target, shooter, params)
/obj/item/gun/ballistic/automatic/assault/e40/do_autofire_shot(datum/source, atom/target, mob/living/shooter, params)
- if(select == E40_LASER_MODE)
- secondary.do_autofire_shot(source, target, shooter, params)
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.do_autofire_shot(source, target, shooter, params)
/obj/item/gun/ballistic/automatic/assault/e40/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread)
- if(select == E40_LASER_MODE)
- secondary.process_fire(target, user, message, params, zone_override, bonus_spread)
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.process_fire(target, user, message, params, zone_override, bonus_spread)
/obj/item/gun/ballistic/automatic/assault/e40/can_shoot()
- if(select == E40_LASER_MODE)
- return secondary.can_shoot()
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.can_shoot()
/obj/item/gun/ballistic/automatic/assault/e40/afterattack(atom/target, mob/living/user, flag, params)
- if(select == E40_LASER_MODE)
- secondary.afterattack(target, user, flag, params)
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.afterattack(target, user, flag, params)
/obj/item/gun/ballistic/automatic/assault/e40/attackby(obj/item/attack_obj, mob/user, params)
if(istype(attack_obj, /obj/item/stock_parts/cell/gun))
- secondary.attackby(attack_obj, user, params)
+ return secondary.attackby(attack_obj, user, params)
if(istype(attack_obj, /obj/item/screwdriver))
- secondary.screwdriver_act(user, attack_obj,)
- else
- ..()
+ return secondary.screwdriver_act(user, attack_obj,)
+ return ..()
+
/obj/item/gun/ballistic/automatic/assault/e40/can_shoot()
- if(select == E40_LASER_MODE)
- return secondary.can_shoot()
- return ..()
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
+ return ..()
+ return secondary.can_shoot()
+
+/obj/item/gun/ballistic/automatic/assault/e40/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+ secondary.wielded = TRUE
+ INVOKE_ASYNC(src, .proc.do_wield, user)
+
+/obj/item/gun/ballistic/automatic/assault/e40/do_wield(mob/user)
+ . = ..()
+ secondary.wielded_fully = wielded_fully
+
+/// triggered on unwield of two handed item
+/obj/item/gun/ballistic/automatic/assault/e40/on_unwield(obj/item/source, mob/user)
+ . = ..()
+ secondary.wielded_fully = FALSE
+ secondary.wielded = FALSE
+
/obj/item/gun/ballistic/automatic/assault/e40/proc/secondary_update_icon()
- update_icon()
+ update_appearance()
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
+
+/obj/item/gun/ballistic/automatic/assault/e40/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0)
+ secondary.pre_fire(target, user, message, flag, params, zone_override, bonus_spread)
+
+
+/obj/item/gun/ballistic/automatic/powered/get_cell()
+ return cell
/obj/item/gun/ballistic/automatic/assault/e40/update_overlays()
. = ..()
@@ -244,41 +255,33 @@
. += "[icon_state]_cell"
-/obj/item/gun/ballistic/automatic/assault/e40/burst_select()
- var/mob/living/carbon/human/user = usr
- switch(select)
- if(NONE)
- select = E40_BALLISTIC_MODE
- to_chat(user, "You switch to full automatic ballistic.")
- if(E40_BALLISTIC_MODE)
- select = E40_LASER_MODE
- to_chat(user, "You switch to full auto laser.")
- SEND_SIGNAL(src, COMSIG_GUN_DISABLE_AUTOFIRE)
- SEND_SIGNAL(secondary, COMSIG_GUN_ENABLE_AUTOFIRE)
- if(E40_LASER_MODE)
- select = E40_BALLISTIC_MODE
- to_chat(user, "You switch to full automatic ballistic.")
- SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE)
- SEND_SIGNAL(secondary, COMSIG_GUN_DISABLE_AUTOFIRE)
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
- update_icon()
- return
-
-
-
/obj/item/gun/ballistic/automatic/assault/e40/toggle_safety(mob/user, silent=FALSE)
. = ..()
secondary.toggle_safety(user, silent=TRUE)
+/obj/item/gun/ballistic/automatic/assault/e40/fire_select(mob/living/carbon/human/user)
+ . = ..()
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode == FIREMODE_OTHER)
+ SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE)
+ SEND_SIGNAL(src, COMSIG_GUN_SET_AUTOFIRE_SPEED, secondary.fire_delay)
+ else
+ SEND_SIGNAL(src, COMSIG_GUN_SET_AUTOFIRE_SPEED, fire_delay)
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
+
//laser
/obj/item/gun/energy/laser/e40_laser_secondary
name = "secondary e40 laser gun"
- desc = "The laser component of a E-40 Hybrid Rifle. You probably shouldn't see this."
+ desc = "The laser component of a E-40 Hybrid Rifle. You probably shouldn't see this. If you can though, you should probably know lorewise, this is primary, the ballistic compontent in universe is secondary. Unfortunately, we cannot simulate this, So codewise this is secondary."
fire_sound = 'sound/weapons/gun/laser/e40_las.ogg'
w_class = WEIGHT_CLASS_NORMAL
ammo_type = list(/obj/item/ammo_casing/energy/laser/assault)
- fire_delay = 2
+ fire_delay = 0.2 SECONDS
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
+
+ spread_unwielded = 20
//techinically a battle rifle, i'm putting it here for organisation sake
@@ -294,12 +297,13 @@
internal_magazine = TRUE
mag_type = /obj/item/ammo_box/magazine/internal/vickland
fire_sound = 'sound/weapons/gun/rifle/vickland.ogg'
- burst_size = 0
actions_types = list()
manufacturer = MANUFACTURER_HUNTERSPRIDE
rack_sound = 'sound/weapons/gun/rifle/ar_cock.ogg'
+ fire_delay = 0.4 SECONDS
+
spread_unwielded = 25
recoil = 0
recoil_unwielded = 4
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index ec57fd588021..c0ccf71d513e 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -1,10 +1,10 @@
+
/obj/item/gun/ballistic/automatic
w_class = WEIGHT_CLASS_NORMAL
- var/select = 1
can_suppress = TRUE
- burst_size = 3
- fire_delay = 2
- actions_types = list(/datum/action/item_action/toggle_firemode)
+
+ gun_firemodes = list(FIREMODE_SEMIAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
semi_auto = TRUE
fire_sound = 'sound/weapons/gun/smg/shot.ogg'
fire_sound_volume = 90
@@ -14,6 +14,7 @@
weapon_weight = WEAPON_MEDIUM
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
+ fire_delay = 0.4 SECONDS
wield_delay = 1 SECONDS
spread = 0
spread_unwielded = 13
@@ -21,36 +22,6 @@
recoil_unwielded = 4
wield_slowdown = 0.35
-/obj/item/gun/ballistic/automatic/update_overlays()
- . = ..()
- if(!select)
- . += "[initial(icon_state)]_semi"
- if(select == 1)
- . += "[initial(icon_state)]_burst"
-
-/obj/item/gun/ballistic/automatic/ui_action_click(mob/user, actiontype)
- if(istype(actiontype, /datum/action/item_action/toggle_firemode))
- burst_select()
- else
- ..()
-
-/obj/item/gun/ballistic/automatic/proc/burst_select()
- var/mob/living/carbon/human/user = usr
- select = !select
- if(!select)
- burst_size = 1
- fire_delay = 0
- to_chat(user, "You switch to semi-automatic.")
- else
- burst_size = initial(burst_size)
- fire_delay = initial(fire_delay)
- to_chat(user, "You switch to [burst_size]-rnd burst.")
-
- playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
- update_appearance()
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
// SNIPER //
@@ -68,7 +39,6 @@
recoil = 2
weapon_weight = WEAPON_HEAVY
mag_type = /obj/item/ammo_box/magazine/sniper_rounds
- fire_delay = 40
burst_size = 1
w_class = WEIGHT_CLASS_NORMAL
zoomable = TRUE
@@ -76,13 +46,13 @@
zoom_out_amt = 5
slot_flags = ITEM_SLOT_BACK
actions_types = list()
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
manufacturer = MANUFACTURER_SCARBOROUGH
spread = -5
spread_unwielded = 20
- recoil = 0
- recoil_unwielded = 4
+ recoil = 5
+ recoil_unwielded = 50
wield_slowdown = 1
wield_delay = 1.3 SECONDS
@@ -91,42 +61,41 @@
desc = "A heavily-modified .50 BMG anti-material rifle utilized by Syndicate agents. Requires both hands to fire."
can_suppress = TRUE
can_unsuppress = TRUE
- pin = /obj/item/firing_pin/implant/pindicate
+
+EMPTY_GUN_HELPER(automatic/sniper_rifle/syndicate)
// Old Semi-Auto Rifle //
-/obj/item/gun/ballistic/automatic/surplus
+/obj/item/gun/ballistic/automatic/surplus //TODO: NEEDS TO BE REPLACED WITH PISTOL CARBINES OR LOWCAL SEMI-AUTO RIFLES
name = "surplus rifle"
desc = "One of countless cheap, obsolete rifles found throughout the Frontier. Its lack of lethality renders it mostly a deterrent. Chambered in 10mm."
icon_state = "surplus"
item_state = "moistnugget"
weapon_weight = WEAPON_HEAVY
mag_type = /obj/item/ammo_box/magazine/m10mm/rifle
- fire_delay = 10
+ fire_delay = 0.5 SECONDS
burst_size = 1
can_unsuppress = TRUE
can_suppress = TRUE
w_class = WEIGHT_CLASS_HUGE
slot_flags = ITEM_SLOT_BACK
- actions_types = list()
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
// Laser rifle (rechargeable magazine) //
-/obj/item/gun/ballistic/automatic/laser
+/obj/item/gun/ballistic/automatic/laser //TODO: REMOVE
name = "laser rifle"
desc = "Though sometimes mocked for the relatively weak firepower of their energy weapons, the logistic miracle of rechargeable ammunition has given Nanotrasen a decisive edge over many a foe."
icon_state = "oldrifle"
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/recharge
- fire_delay = 2
+ fire_delay = 0.2 SECONDS
can_suppress = FALSE
burst_size = 0
- actions_types = list()
fire_sound = 'sound/weapons/laser.ogg'
casing_ejector = FALSE
-/obj/item/gun/ballistic/automatic/ebr
+/obj/item/gun/ballistic/automatic/ebr //fuck this gun, its getting wiped soon enough
name = "\improper M514 EBR"
desc = "A reliable, high-powered battle rifle often found in the hands of Syndicate personnel and remnants, chambered in .308. Effective against personnel and armor alike."
icon = 'icons/obj/guns/48x32guns.dmi'
@@ -135,18 +104,19 @@
icon_state = "ebr"
item_state = "ebr"
zoomable = TRUE
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
mag_type = /obj/item/ammo_box/magazine/ebr
fire_sound = 'sound/weapons/gun/rifle/shot_alt2.ogg'
burst_size = 0
- actions_types = list()
manufacturer = MANUFACTURER_SCARBOROUGH
wield_slowdown = 2
spread = -4
+EMPTY_GUN_HELPER(automatic/ebr)
+
/obj/item/gun/ballistic/automatic/gal
name = "\improper CM-GAL-S"
desc = "The standard issue DMR of CLIP. Dates back to the Xenofauna War, this particular model is in a carbine configuration, and, as such, is shorter than the standard model. Chambered in .308."
@@ -155,7 +125,7 @@
icon_state = "gal"
item_state = "gal"
zoomable = TRUE
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
mag_type = /obj/item/ammo_box/magazine/gal
@@ -166,6 +136,8 @@
wield_slowdown = 2
spread = -4
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
/obj/item/gun/ballistic/automatic/gal/inteq
name = "\improper SsG-04"
@@ -182,5 +154,5 @@
can_suppress = FALSE
actions_types = list()
can_bayonet = FALSE
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
weapon_weight = WEAPON_LIGHT
diff --git a/code/modules/projectiles/guns/ballistic/gauss.dm b/code/modules/projectiles/guns/ballistic/gauss.dm
index 8fce353d8b22..c50f906e4eba 100644
--- a/code/modules/projectiles/guns/ballistic/gauss.dm
+++ b/code/modules/projectiles/guns/ballistic/gauss.dm
@@ -9,9 +9,9 @@
load_sound = 'sound/weapons/gun/gauss/rifle_reload.ogg'
can_suppress = FALSE
burst_size = 1
- fire_delay = 3
+ fire_delay = 0.3 SECONDS
spread = 0
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
empty_indicator = TRUE
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
@@ -25,6 +25,7 @@
recoil_unwielded = 4
wield_slowdown = 0.75
wield_delay = 1 SECONDS
+ fire_select_icon_state_prefix = "pellet_"
/obj/item/gun/ballistic/automatic/powered/gauss/modelh
name = "Model H"
@@ -37,14 +38,15 @@
cell_type = /obj/item/stock_parts/cell/gun/solgov
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
- fire_delay = 0 //pistol
- mag_display = FALSE
+ fire_delay = 0.6 SECONDS //pistol, but heavy caliber.
+ show_magazine_on_sprite = FALSE
empty_indicator = FALSE
manufacturer = MANUFACTURER_SOLARARMORIES
- recoil = 1
+ recoil = 2
recoil_unwielded = 4
- spread = 3
+ spread = 6
spread_unwielded = 12
+ fire_select_icon_state_prefix = "slug_"
/obj/item/gun/ballistic/automatic/powered/gauss/modelh/suns
desc = "A standard-issue pistol exported from the Solarian Confederation. It fires slow flesh-rending ferromagnetic slugs at a high energy cost, however they are ineffective on any armor. It is painted in the colors of SUNS."
@@ -62,13 +64,13 @@
fire_sound = 'sound/weapons/gun/gauss/claris.ogg'
load_sound = 'sound/weapons/gun/gauss/sniper_reload.ogg'
cell_type = /obj/item/stock_parts/cell/gun/solgov
- fire_delay = 2
+ fire_delay = 0.4 SECONDS
bolt_type = BOLT_TYPE_NO_BOLT
internal_magazine = TRUE
- casing_ejector = FALSE
- mag_display = FALSE
+ show_magazine_on_sprite = FALSE
empty_indicator = FALSE
manufacturer = MANUFACTURER_SOLARARMORIES
+ fire_select_icon_state_prefix = "pellet_"
/obj/item/gun/ballistic/automatic/powered/gauss/claris/suns
desc = "An antiquated Solarian rifle. Chambered in ferromagnetic pellets, just as the founding Solarians intended. Evidently, SUNS' founders echo the sentiment, as it appears to be painted in their colors."
@@ -85,17 +87,19 @@
fire_sound = 'sound/weapons/gun/gauss/gar.ogg'
load_sound = 'sound/weapons/gun/gauss/rifle_reload.ogg'
cell_type = /obj/item/stock_parts/cell/gun/solgov
- burst_size = 2
- fire_delay = 1
+ burst_size = 1
+
+ fire_delay = 0.2 SECONDS
+
actions_types = list()
empty_indicator = FALSE
manufacturer = MANUFACTURER_SOLARARMORIES
- wield_delay = 0.7 SECONDS
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
-/obj/item/gun/ballistic/automatic/powered/gauss/gar/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
+ wield_delay = 0.7 SECONDS
+ fire_select_icon_state_prefix = "lance_"
/obj/item/gun/ballistic/automatic/powered/gauss/gar/suns
desc = "A Solarian carbine, unusually modern for its producers. It's just modern enough for SUNS, however, who have painted the weapon in their colors. Launches ferromagnetic lances at alarming speeds."
diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm
index 3bd143e98b43..4e9abd0cd70c 100644
--- a/code/modules/projectiles/guns/ballistic/hmg.dm
+++ b/code/modules/projectiles/guns/ballistic/hmg.dm
@@ -7,7 +7,10 @@
burst_size = 1
actions_types = list(/datum/action/item_action/deploy_bipod) //this is on hmg, as I need the same mechanics for a future gun. ideally, this would be an attachment, but that's still pending
drag_slowdown = 1.5
- fire_delay = 1
+ fire_delay = 0.1 SECONDS
+
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
spread = 4
spread_unwielded = 80
@@ -85,7 +88,7 @@
if(!can_deploy)
to_chat(user, "You need to brace against something to deploy [src]'s bipod! Either lie on the floor or stand next to a waist high object like a table!")
return
- if(!do_mob(user, src, deploy_time, FALSE, TRUE, CALLBACK(src, PROC_REF(is_wielded))))
+ if(!do_after(user, deploy_time, src, FALSE, TRUE, CALLBACK(src, PROC_REF(is_wielded))))
to_chat(user, "You need to hold still to deploy [src]'s bipod!")
return
playsound(src, 'sound/machines/click.ogg', 75, TRUE)
@@ -114,24 +117,26 @@
retract_bipod(user=user)
/obj/item/gun/ballistic/automatic/hmg/calculate_recoil(mob/user, recoil_bonus = 0)
- var/gunslinger_bonus = 1
+ var/gunslinger_bonus = 2
var/total_recoil = recoil_bonus
+
if(bipod_deployed)
total_recoil += deploy_recoil_bonus
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_recoil += gunslinger_bonus
- total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+
+ return ..(user, total_recoil)
/obj/item/gun/ballistic/automatic/hmg/calculate_spread(mob/user, bonus_spread)
- var/gunslinger_bonus = 4
+ var/gunslinger_bonus = 20
var/total_spread = bonus_spread
+
if(bipod_deployed)
total_spread += deploy_spread_bonus
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_spread += gunslinger_bonus
- total_spread = clamp(total_spread,0,INFINITY)
- return total_spread
+
+ return ..(user, total_spread)
/obj/item/gun/ballistic/automatic/hmg/update_icon_state()
@@ -155,9 +160,12 @@
mag_type = /obj/item/ammo_box/magazine/mm712x82
can_suppress = FALSE
spread = 7
+
+ fire_delay = 0.1 SECONDS
+
bolt_type = BOLT_TYPE_OPEN
- mag_display = TRUE
- mag_display_ammo = TRUE
+ show_magazine_on_sprite = TRUE
+ show_magazine_on_sprite_ammo = TRUE
tac_reloads = FALSE
fire_sound = 'sound/weapons/gun/l6/shot.ogg'
rack_sound = 'sound/weapons/gun/l6/l6_rack.ogg'
@@ -165,10 +173,6 @@
manufacturer = MANUFACTURER_SCARBOROUGH
var/cover_open = FALSE
-/obj/item/gun/ballistic/automatic/hmg/l6_saw/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
-
/obj/item/gun/ballistic/automatic/hmg/l6_saw/examine(mob/user)
. = ..()
. += "alt + click to [cover_open ? "close" : "open"] the dust cover."
@@ -217,16 +221,17 @@
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/rifle47x33mm
spread = 7
+
+ fire_delay = 0.1 SECONDS
+
+ fire_select_icon_state_prefix = "caseless_"
+
can_suppress = FALSE
can_bayonet = FALSE
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
w_class = WEIGHT_CLASS_BULKY
manufacturer = MANUFACTURER_SOLARARMORIES
-/obj/item/gun/ballistic/automatic/hmg/solar/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
-
/obj/item/gun/ballistic/automatic/hmg/skm_lmg
name = "\improper SKM-24u"
desc = "What appears to be a standard SKM-24 at first glance is actually a light machine gun conversion, with an extended, heavy barrel and overhauled internals. Its weight, bulk, and robust fire rate make it difficult to handle without using the bipod in a prone position or against appropriate cover such as a table. Chambered in 7.62x40mm CLIP."
@@ -242,15 +247,18 @@
eject_sound = 'sound/weapons/gun/rifle/skm_unload.ogg'
eject_empty_sound = 'sound/weapons/gun/rifle/skm_unload.ogg'
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
- mag_display = TRUE
- special_mags = TRUE
+ show_magazine_on_sprite = TRUE
+ unique_mag_sprites_for_variants = TRUE
weapon_weight = WEAPON_MEDIUM
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
manufacturer = MANUFACTURER_IMPORT
mag_type = /obj/item/ammo_box/magazine/skm_762_40
+ fire_delay = 0.13 SECONDS
spread = 7 //you can hipfire, but why?
spread_unwielded = 25
@@ -265,7 +273,6 @@
/obj/item/gun/ballistic/automatic/hmg/skm_lmg/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) //slower than other lmgs but faster than skm and most smgs
AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/gun/ballistic/automatic/hmg/skm_lmg/extended //spawns with the proper extended magazine, for erts
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index c7d73c5459bc..5619b039d488 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -4,17 +4,18 @@
/obj/item/gun/ballistic/revolver/grenadelauncher//this is only used for underbarrel grenade launchers at the moment, but admins can still spawn it if they feel like being assholes
desc = "A break-action, single-shot grenade launcher. A compact way to deliver a big boom."
name = "grenade launcher"
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "dshotgun_sawn"
item_state = "gun"
mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher
fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg'
w_class = WEIGHT_CLASS_NORMAL
- pin = /obj/item/firing_pin/implant/pindicate
bolt_type = BOLT_TYPE_NO_BOLT
- fire_delay = 10
-
-/obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted
- pin = /obj/item/firing_pin
+ fire_delay = 1 SECONDS
+ semi_auto = TRUE
+ has_safety = FALSE
+ safety = FALSE
+ gate_offset = 0
/obj/item/gun/ballistic/revolver/grenadelauncher/attackby(obj/item/A, mob/user, params)
..()
@@ -27,7 +28,6 @@
icon = 'icons/mecha/mecha_equipment.dmi'
icon_state = "mecha_grenadelnchr"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenademulti
- pin = /obj/item/firing_pin
/obj/item/gun/ballistic/revolver/grenadelauncher/cyborg/attack_self()
return
@@ -39,7 +39,7 @@
fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg'
mag_type = /obj/item/ammo_box/magazine/m75
burst_size = 1
- fire_delay = 0
+ fire_delay = 0.4 SECONDS
actions_types = list()
casing_ejector = FALSE
@@ -53,9 +53,8 @@
load_sound = 'sound/weapons/gun/general/rocket_load.ogg'
w_class = WEIGHT_CLASS_BULKY
can_suppress = FALSE
- pin = /obj/item/firing_pin
burst_size = 1
- fire_delay = 0
+ fire_delay = 0.4 SECONDS
casing_ejector = FALSE
weapon_weight = WEAPON_HEAVY
bolt_type = BOLT_TYPE_NO_BOLT
@@ -65,9 +64,6 @@
tac_reloads = FALSE
manufacturer = MANUFACTURER_SCARBOROUGH
-/obj/item/gun/ballistic/rocketlauncher/unrestricted
- pin = /obj/item/firing_pin
-
/obj/item/gun/ballistic/rocketlauncher/afterattack()
. = ..()
magazine.get_round(FALSE) //Hack to clear the mag after it's fired
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 1cb86fec256d..c4d505bcb10c 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -5,8 +5,6 @@
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/m10mm
can_suppress = TRUE
- burst_size = 1
- fire_delay = 0 //spam it as fast as you can
actions_types = list()
bolt_type = BOLT_TYPE_LOCKING
fire_sound = 'sound/weapons/gun/pistol/shot.ogg'
@@ -24,18 +22,21 @@
bolt_wording = "slide"
weapon_weight = WEAPON_LIGHT
pickup_sound = 'sound/items/handling/gun_pickup.ogg'
- fire_delay = 1
manufacturer = MANUFACTURER_SCARBOROUGH
+ recoil = 0.5 // apogee wants bloom, this is a placeholder until then to simulate the same concept.
+ recoil_unwielded = 3
+ recoil_backtime_multiplier = 1
+
wield_delay = 0.2 SECONDS
- spread = 2
- spread_unwielded = 5
+ fire_delay = 0.2 SECONDS
+ spread = 5
+ spread_unwielded = 7
wield_slowdown = 0.15
muzzleflash_iconstate = "muzzle_flash_light"
-/obj/item/gun/ballistic/automatic/pistol/no_mag
- spawnwithmagazine = FALSE
+EMPTY_GUN_HELPER(automatic/pistol)
/obj/item/gun/ballistic/automatic/pistol/suppressed/Initialize(mapload)
. = ..()
@@ -63,21 +64,24 @@
load_empty_sound = 'sound/weapons/gun/pistol/candor_reload.ogg'
eject_sound = 'sound/weapons/gun/pistol/candor_unload.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/candor_unload.ogg'
- recoil = -2
-/obj/item/gun/ballistic/automatic/pistol/candor/no_mag
- spawnwithmagazine = FALSE
+EMPTY_GUN_HELPER(automatic/pistol/candor)
/obj/item/gun/ballistic/automatic/pistol/candor/factory //also give this to the srm, their candors should probably look factory fresh from how well taken care of they are
desc = "A classic semi-automatic handgun, widely popular throughout the Frontier. An engraving on the slide marks it as a product of Hunter's Pride. This example has been kept in especially good shape, and may as well be fresh out of the workshop. Chambered in .45."
item_state = "hp_generic_fresh"
+EMPTY_GUN_HELPER(automatic/pistol/candor/factory)
+
/obj/item/gun/ballistic/automatic/pistol/candor/factory/update_overlays()
. = ..()
. += "[initial(icon_state)]_factory"
-/obj/item/gun/ballistic/automatic/pistol/candor/factory/no_mag
- spawnwithmagazine = FALSE
+/obj/item/gun/ballistic/automatic/pistol/candor/phenex
+ name = "\improper HP Phenex"
+ desc = "A uniquely modified version of the Candor, famously created by Hunter's Pride. Named after the daemonic Phoenix of legend that the Ashen Huntsman had once slain, this hell-kissed weapon is more visually intimidating than its original counterpart, but mechanically acts the same. Chambered in .45."
+ icon_state = "phenex"
+ item_state = "hp_phenex"
/obj/item/gun/ballistic/automatic/pistol/deagle
name = "\improper Desert Eagle"
@@ -86,7 +90,7 @@
force = 14
mag_type = /obj/item/ammo_box/magazine/m50
can_suppress = FALSE
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
fire_sound = 'sound/weapons/gun/pistol/deagle.ogg'
rack_sound = 'sound/weapons/gun/pistol/rack.ogg'
lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
@@ -96,11 +100,13 @@
load_empty_sound = 'sound/weapons/gun/pistol/deagle_reload.ogg'
eject_sound = 'sound/weapons/gun/pistol/deagle_unload.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/deagle_unload.ogg'
- fire_delay = 0.7 SECONDS
- recoil = 1
- recoil_unwielded = 2
- spread = 4
- spread_unwielded = 7
+ fire_delay = 0.6 SECONDS
+ recoil = 2
+ recoil_unwielded = 5
+ recoil_backtime_multiplier = 2
+
+ spread = 7
+ spread_unwielded = 14
/obj/item/gun/ballistic/automatic/pistol/deagle/gold
desc = "A gold-plated Desert Eagle folded over a million times by superior Martian gunsmiths. Uses .50 AE ammo."
@@ -120,25 +126,11 @@
mag_type = /obj/item/ammo_box/magazine/pistolm9mm
can_suppress = FALSE
burst_size = 3
- fire_delay = 2
- actions_types = list(/datum/action/item_action/toggle_firemode)
-
-/obj/item/gun/ballistic/automatic/pistol/stickman
- name = "flat gun"
- desc = "A 2 dimensional gun.. what?"
- icon_state = "flatgun"
- manufacturer = MANUFACTURER_NONE
+ burst_delay = 0.1 SECONDS
+ fire_delay = 0.4 SECONDS
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST)
+ default_firemode = FIREMODE_SEMIAUTO
-/obj/item/gun/ballistic/automatic/pistol/stickman/pickup(mob/living/user)
- SHOULD_CALL_PARENT(0)
- to_chat(user, "As you try to pick up [src], it slips out of your grip..")
- if(prob(50))
- to_chat(user, "..and vanishes from your vision! Where the hell did it go?")
- qdel(src)
- user.update_icons()
- else
- to_chat(user, "..and falls into view. Whew, that was a close one.")
- user.dropItemToGround(src)
/obj/item/gun/ballistic/automatic/pistol/commander
name = "\improper Commander"
@@ -154,8 +146,7 @@
eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
-/obj/item/gun/ballistic/automatic/pistol/commander/no_mag
- spawnwithmagazine = FALSE
+EMPTY_GUN_HELPER(automatic/pistol/commander)
/obj/item/gun/ballistic/automatic/pistol/commander/inteq
name = "\improper Commissioner"
@@ -164,8 +155,7 @@
item_state = "commander-inteq"
manufacturer = MANUFACTURER_INTEQ
-/obj/item/gun/ballistic/automatic/pistol/commander/inteq/no_mag
- spawnwithmagazine = FALSE
+EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
/obj/item/gun/ballistic/automatic/pistol/commissar
name = "\improper Commissar"
@@ -235,6 +225,8 @@
eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ fire_select_icon_state_prefix = "caseless_"
+
/obj/item/gun/ballistic/automatic/pistol/solgov/old
icon_state = "pistole-c-old"
@@ -245,7 +237,7 @@
weapon_weight = WEAPON_LIGHT
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/tec9
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
@@ -272,12 +264,6 @@
to_chat(user, "Theres no magazine to replace!")
return
-/obj/item/gun/ballistic/automatic/pistol/disposable/pizza
- name = "pizza disposable gun"
- desc = "How horrible. Whoever you point at with this won't be very cheesed to meet you." //this is a warcrime against italians // IF YOU'RE GOING TO DO US DIRTY SPELL IT RIGHT
- icon_state = "disposable_pizza"
- custom_materials = list(/datum/material/pizza=2000)
-
//not technically a pistol but whatever
/obj/item/gun/ballistic/derringer
name = ".38 Derringer"
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index abbf62543f90..756a8aa9ca26 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -25,7 +25,7 @@
var/spin_delay = 10
var/recent_spin = 0
manufacturer = MANUFACTURER_SCARBOROUGH
- fire_delay = 2
+ fire_delay = 0.4 SECONDS
spread_unwielded = 15
recoil = 0.5
recoil_unwielded = 2
@@ -35,6 +35,9 @@
dry_fire_text = "snap"
wield_slowdown = 0.3
+ gun_firemodes = list(FIREMODE_SEMIAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
safety_wording = "hammer"
var/gate_loaded = FALSE //for stupid wild west shit
@@ -57,7 +60,7 @@
. += "[base_icon_state || initial(icon_state)][safety ? "_hammer_up" : "_hammer_down"]"
-/obj/item/gun/ballistic/revolver/process_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE)
+/obj/item/gun/ballistic/revolver/process_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE, atom/shooter)
SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
return ..()
@@ -84,7 +87,9 @@
if(!casing_to_eject)
continue
casing_to_eject.forceMove(drop_location())
- casing_to_eject.bounce_away(FALSE, NONE)
+ var/angle_of_movement =(rand(-3000, 3000) / 100) + dir2angle(turn(user.dir, 180))
+ casing_to_eject.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(450, 550) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = casing_to_eject.bounce_sfx_override)
+
num_unloaded++
SSblackbox.record_feedback("tally", "station_mess_created", 1, casing_to_eject.name)
chamber_round(FALSE)
@@ -96,13 +101,13 @@
for(var/i in 1 to num_to_unload)
var/doafter_time = 0.4 SECONDS
- if(!do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
break
- if(!eject_casing())
+ if(!eject_casing(user))
doafter_time = 0 SECONDS
else
num_unloaded++
- if(!do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
break
chamber_round(TRUE, TRUE)
@@ -121,7 +126,9 @@
return FALSE
playsound(src, eject_sound, eject_sound_volume, eject_sound_vary)
casing_to_eject.forceMove(drop_location())
- casing_to_eject.bounce_away(FALSE, NONE)
+ var/angle_of_movement =(rand(-3000, 3000) / 100) + dir2angle(turn(user.dir, 180))
+ casing_to_eject.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(350, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = casing_to_eject.bounce_sfx_override)
+
SSblackbox.record_feedback("tally", "station_mess_created", 1, casing_to_eject.name)
if(!gate_loaded)
magazine.stored_ammo[casing_index] = null
@@ -139,6 +146,12 @@
/obj/item/gun/ballistic/revolver/proc/insert_casing(mob/living/user, obj/item/ammo_casing/casing_to_insert, allow_ejection)
if(!casing_to_insert)
return FALSE
+
+// Check if the bullet's caliber matches the magazine's caliber.If not, send a warning message to the user and return FALSE.
+ if(casing_to_insert.caliber != magazine.caliber)
+ to_chat(user, "\The [casing_to_insert] is not suitable for [src].")
+ return FALSE
+
var/list/rounds = magazine.ammo_list()
var/obj/item/ammo_casing/slot = rounds[gate_offset+1] //byond arrays start at 1, so we add 1 to get the correct index
var/doafter_time = 0.4 SECONDS
@@ -160,7 +173,7 @@
else
if(slot)
if(!slot.BB && allow_ejection)
- if(do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
eject_casing(user)
rounds = magazine.ammo_list()
@@ -204,7 +217,7 @@
var/doafter_time = 0.8 SECONDS
if(magazine.instant_load && attacking_box.instant_load)
doafter_time = 0 SECONDS
- if(!do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
break
if(!insert_casing(user, casing_to_insert, FALSE))
break
@@ -221,7 +234,7 @@
if(!casing_to_insert || (magazine.caliber && casing_to_insert.caliber != magazine.caliber) || (!magazine.caliber && casing_to_insert.type != magazine.ammo_type))
break
var/doafter_time = 0.4 SECONDS
- if(!do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
break
if(!insert_casing(null, casing_to_insert, FALSE))
doafter_time = 0 SECONDS
@@ -229,7 +242,7 @@
num_loaded++
attacking_box.update_appearance()
attacking_box.stored_ammo -= casing_to_insert
- if(!do_mob(user,user,doafter_time))
+ if(!do_after(user, doafter_time, user))
break
switch(gate_load_direction)
if(REVOLVER_AUTO_ROTATE_RIGHT_LOADING)
@@ -269,8 +282,8 @@
to_chat(user, "You rack the [bolt_wording] of \the [src].")
playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
- chamber_round(TRUE)
- //playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
+ if((!safety && !semi_auto) || (!safety && !semi_auto))
+ chamber_round(TRUE)
SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
update_appearance()
@@ -402,11 +415,14 @@
var/fan = FALSE
if(HAS_TRAIT(user, TRAIT_GUNSLINGER) && !semi_auto && !wielded && loc == user && !safety && !user.get_inactive_held_item())
fan = TRUE
+ fire_delay = 0 SECONDS
. = ..()
+ fire_delay = src::fire_delay
if(fan)
rack()
to_chat(user, "You fan the [bolt_wording] of \the [src]!")
- user.changeNext_move(CLICK_CD_RAPID)
+ balloon_alert_to_viewers("fans revolver!")
+ fire_delay = 0 SECONDS
/obj/item/gun/ballistic/revolver/shoot_live_shot(mob/living/user, pointblank, atom/pbtarget, message)
. = ..()
@@ -425,18 +441,21 @@
/obj/item/gun/ballistic/revolver/calculate_recoil(mob/user, recoil_bonus = 0)
var/gunslinger_bonus = -1
var/total_recoil = recoil_bonus
+
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus
total_recoil += gunslinger_bonus
total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+
+ return ..(user, total_recoil)
/obj/item/gun/ballistic/revolver/calculate_spread(mob/user, bonus_spread)
- var/gunslinger_bonus = -4
+ var/gunslinger_bonus = -8
var/total_spread = bonus_spread
+
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus
total_spread += gunslinger_bonus
- total_spread = clamp(total_spread,0,INFINITY)
- return total_spread
+
+ return ..(user, total_spread)
/obj/item/gun/ballistic/revolver/pickup(mob/user)
. = ..()
@@ -445,17 +464,12 @@
/obj/item/gun/ballistic/revolver/proc/tryflip(mob/living/user)
if(HAS_TRAIT(user, TRAIT_GUNSLINGER))
if(COOLDOWN_FINISHED(src, flip_cooldown))
- if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40))
- to_chat(user, "While trying to flip the [src] you pull the trigger and accidently shoot yourself!")
- var/flip_mistake = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_CHEST)
- process_fire(user, user, FALSE, flip_mistake)
- user.dropItemToGround(src, TRUE)
- return
COOLDOWN_START(src, flip_cooldown, 0.3 SECONDS)
SpinAnimation(5,1)
user.visible_message("[user] spins the [src] around their finger by the trigger. That’s pretty badass.")
playsound(src, 'sound/items/handling/ammobox_pickup.ogg', 20, FALSE)
return
+
/obj/item/gun/ballistic/revolver/detective
name = "\improper HP Detective Special"
desc = "A small law enforcement firearm. Originally commissioned by Nanotrasen for their Private Investigation division, it has become extremely popular among independent civilians as a cheap, compact sidearm. Uses .38 Special rounds."
@@ -472,15 +486,19 @@
"The Peacemaker" = "detective_peacemaker",
"Black Panther" = "detective_panther"
)
+ w_class = WEIGHT_CLASS_SMALL
manufacturer = MANUFACTURER_HUNTERSPRIDE
recoil = 0 //weaker than normal revolver, no recoil
+ fire_delay = 0.2 SECONDS
+
+EMPTY_GUN_HELPER(revolver/detective)
/obj/item/gun/ballistic/revolver/detective/ComponentInitialize()
. = ..()
AddComponent(/datum/component/ammo_hud/revolver) //note that the hud at the moment only supports 6 round revolvers, 7 or 5 isn't supported rn
-
-/obj/item/gun/ballistic/revolver/detective/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
+//...why...?
+/obj/item/gun/ballistic/revolver/detective/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, burst_firing = FALSE, spread_override = 0, iteration = 0)
if(magazine.caliber != initial(magazine.caliber))
if(prob(100 - (magazine.ammo_count() * 5))) //minimum probability of 70, maximum of 95
playsound(user, fire_sound, fire_sound_volume, vary_fire_sound)
@@ -541,7 +559,6 @@
icon_state = "goldrevolver"
fire_sound = 'sound/weapons/resonator_blast.ogg'
recoil = 8
- pin = /obj/item/firing_pin
manufacturer = MANUFACTURER_NONE
/obj/item/gun/ballistic/revolver/montagne
@@ -568,19 +585,22 @@
fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg'
manufacturer = MANUFACTURER_HUNTERSPRIDE
gate_loaded = TRUE
+ fire_delay = 0.6 SECONDS
wield_slowdown = 0.5
- spread_unwielded = 5
- spread = 2
+ spread_unwielded = 20
+ spread = 6
recoil = 2
recoil_unwielded = 4
-// A gun to play Russian Roulette!
-// You can spin the chamber to randomize the position of the bullet.
-
/obj/item/gun/ballistic/revolver/ashhand/ComponentInitialize()
. = ..()
AddComponent(/datum/component/ammo_hud/revolver)
+// A gun to play Russian Roulette!
+// You can spin the chamber to randomize the position of the bullet.
+
+//TODO: this is stupid, but used in ONE fucking ruin. Remember to remove when you aren't afraid to do a ton of path changes.
+
/obj/item/gun/ballistic/revolver/russian
name = "\improper Russian revolver"
desc = "A Solarian revolver for particularly lethal drinking games. It has a mechanism requiring you to spin the chamber before each trigger pull. Uses .357 ammo."
@@ -658,30 +678,6 @@
user.apply_damage(300, BRUTE, affecting)
user.visible_message("[user.name] fires [src] at [user.p_their()] head!", "You fire [src] at your head!", "You hear a gunshot!")
-/obj/item/gun/ballistic/revolver/russian/soul
- name = "cursed Russian revolver"
- desc = "To play with this revolver requires wagering your very soul."
-
-/obj/item/gun/ballistic/revolver/russian/soul/shoot_self(mob/living/user)
- ..()
- var/obj/item/soulstone/anybody/revolver/SS = new /obj/item/soulstone/anybody/revolver(get_turf(src))
- if(!SS.transfer_soul("FORCE", user)) //Something went wrong
- qdel(SS)
- return
- user.visible_message("[user.name]'s soul is captured by \the [src]!", "You've lost the gamble! Your soul is forfeit!")
-
-/obj/item/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course.
- clumsy_check = 0
-
-/obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user)
- if((HAS_TRAIT(user, TRAIT_CLUMSY)) || (user.mind && user.mind.assigned_role == "Clown"))
- return ..()
- if(process_fire(user, user, FALSE, null, BODY_ZONE_HEAD))
- user.visible_message("[user] somehow manages to shoot [user.p_them()]self in the face!", "You somehow shoot yourself in the face! How the hell?!")
- user.emote("scream")
- user.drop_all_held_items()
- user.Paralyze(80)
-
/obj/item/gun/ballistic/revolver/firebrand
name = "\improper HP Firebrand"
desc = "An archaic precursor to revolver-type firearms, this gun was rendered completely obsolete millennia ago. While fast to fire, it is extremely inaccurate. Uses .357 ammo."
@@ -691,7 +687,8 @@
spread = 20
manufacturer = MANUFACTURER_HUNTERSPRIDE
spread_unwielded = 50
- fire_delay = 0
+ fire_delay = 0 SECONDS
+ gate_offset = 4
semi_auto = TRUE
safety_wording = "safety"
@@ -716,6 +713,7 @@
)
recoil = 0 //weaker than normal revolver, no recoil
+ spread_unwielded = 10
/obj/item/gun/ballistic/revolver/shadow/ComponentInitialize()
. = ..()
@@ -726,4 +724,4 @@
// if you go through the pain of not only using this shitty gun, but also with the fucking gunslinger quirk, you deserve this bonus. not a BIG bonus, but enough as an incentive to make people actually take the quirk.
if(chambered.BB && (HAS_TRAIT(user, TRAIT_GUNSLINGER)))
chambered.BB.damage += 5
- chambered.armour_penetration += 5
+ chambered.BB.armour_penetration += 5
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index 60aa20ab3a50..45b1e8b2debd 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -22,8 +22,11 @@
weapon_weight = WEAPON_MEDIUM
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
+ gun_firemodes = list(FIREMODE_SEMIAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
spread = -1
- spread_unwielded = 12
+ spread_unwielded = 48
recoil = -3
recoil_unwielded = 4
wield_slowdown = 1
@@ -33,11 +36,11 @@
. = ..()
. += "[icon_state]_bolt[bolt_locked ? "_locked" : ""]"
-/obj/item/gun/ballistic/rifle/rack(mob/user = null)
+/obj/item/gun/ballistic/rifle/rack(mob/living/user)
if (bolt_locked == FALSE)
to_chat(user, "You open the bolt of \the [src].")
playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
- process_chamber(FALSE, FALSE, FALSE)
+ process_chamber(FALSE, FALSE, FALSE, shooter = user)
bolt_locked = TRUE
update_appearance()
if (magazine && !magazine?.ammo_count() && empty_autoeject && !internal_magazine)
@@ -67,10 +70,6 @@
. = ..()
. += "The bolt is [bolt_locked ? "open" : "closed"]."
-///////////////////////
-// BOLT ACTION RIFLE //
-///////////////////////
-
/obj/item/gun/ballistic/rifle/illestren
name = "\improper HP Illestren"
desc = "A sturdy and conventional bolt-action rifle. One of Hunter's Pride's most successful firearms, the Illestren is popular among colonists, pirates, snipers, and countless others. Chambered in 8x50mmR."
@@ -89,18 +88,18 @@
/obj/item/gun/ballistic/rifle/illestren/sawoff(mob/user)
. = ..()
if(.)
- spread = 36
- spread_unwielded = 108
+ spread = 24
+ spread_unwielded = 30
can_bayonet = FALSE
item_state = "illestren_sawn"
mob_overlay_state = item_state
weapon_weight = WEAPON_MEDIUM //you can fire it onehanded, makes it worse than worse than useless onehanded, but you can
/obj/item/gun/ballistic/rifle/illestren/blow_up(mob/user)
- . = 0
+ . = FALSE
if(chambered && chambered.BB)
process_fire(user, user, FALSE)
- . = 1
+ . = TRUE
/obj/item/gun/ballistic/rifle/illestren/factory
desc = "A sturdy and conventional bolt-action rifle. One of Hunter's Pride's most successful firearms, this example has been kept in excellent shape and may as well be fresh out of the workshop. Chambered in 8x50mmR."
@@ -113,6 +112,14 @@
item_state = "illestren_factory_sawn"
mob_overlay_state = item_state
+/obj/item/gun/ballistic/rifle/illestren/sawn
+ name = "sawn-off Illestren rifle"
+ desc = "An Illestren rifle sawn down to a ridiculously small size. There was probably a reason it wasn't made this short to begin with, but it still packs a punch."
+ item_state = "illestren_sawn"
+ sawn_off = TRUE
+ weapon_weight = WEAPON_MEDIUM
+
+
/obj/item/gun/ballistic/rifle/solgov
name = "SSG-669C"
desc = "A bolt-action sniper rifle used by Solarian troops. Beloved for its rotary design and accuracy. Chambered in 8x58mm Caseless."
@@ -152,58 +159,6 @@
manufacturer = MANUFACTURER_HUNTERSPRIDE
-/obj/item/gun/ballistic/rifle/illestren/enchanted
- name = "enchanted bolt-action rifle"
- desc = "Careful not to lose your head."
- var/guns_left = 30
- mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted
- can_be_sawn_off = FALSE
- manufacturer = MANUFACTURER_NONE
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage
- name = "arcane barrage"
- desc = "Pew Pew Pew."
- fire_sound = 'sound/weapons/emitter.ogg'
- pin = /obj/item/firing_pin/magic
- icon = 'icons/obj/guns/projectile.dmi'
- lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
- icon_state = "arcane_barrage"
- item_state = "arcane_barrage"
- slot_flags = null
- can_bayonet = FALSE
- item_flags = NEEDS_PERMIT | DROPDEL | ABSTRACT | NOBLUDGEON
- flags_1 = NONE
- trigger_guard = TRIGGER_GUARD_ALLOW_ALL
-
- mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/dropped()
- . = ..()
- guns_left = 0
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/proc/discard_gun(mob/living/user)
- user.throw_item(pick(oview(7,get_turf(user))))
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage/discard_gun(mob/living/user)
- qdel(src)
-
-/obj/item/gun/ballistic/rifle/illestren/enchanted/attack_self()
- return
-
-/obj/item/gun/ballistic/rifle/illestren/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/illestren/enchanted/gun = new type
- gun.guns_left = guns_left - 1
- discard_gun(user)
- user.swap_hand()
- user.put_in_hands(gun)
- else
- user.dropItemToGround(src, TRUE)
-
/obj/item/gun/ballistic/rifle/polymer
name = "polymer survivor rifle"
desc = "A bolt-action rifle made of scrap, desperation, and luck. Likely to shatter at any moment. Chambered in .300 Blackout."
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 737a0f4e2029..e36dc8c67b77 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -19,10 +19,14 @@
cartridge_wording = "shell"
tac_reloads = FALSE
pickup_sound = 'sound/items/handling/shotgun_pickup.ogg'
- fire_delay = 7
+ fire_delay = 0.7 SECONDS
pb_knockback = 2
manufacturer = MANUFACTURER_HUNTERSPRIDE
+ gun_firemodes = list(FIREMODE_SEMIAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+ fire_select_icon_state_prefix = "sg_"
+
wield_slowdown = 0.45
wield_delay = 0.8 SECONDS
@@ -48,7 +52,8 @@
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus
total_recoil += gunslinger_bonus
total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+
+ return ..(user, total_recoil)
// BRIMSTONE SHOTGUN //
@@ -61,17 +66,17 @@
icon_state = "brimstone"
item_state = "brimstone"
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
+
mag_type = /obj/item/ammo_box/magazine/internal/shot/lethal
manufacturer = MANUFACTURER_HUNTERSPRIDE
- fire_delay = 1
+ fire_delay = 0.05 SECONDS //slamfire
+ rack_delay = 0.2 SECONDS
can_be_sawn_off = TRUE
-/obj/item/gun/ballistic/shotgun/brimstone/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
-
/obj/item/gun/ballistic/shotgun/brimstone/sawoff(mob/user)
. = ..()
if(.)
@@ -98,7 +103,7 @@
sawn_desc = "Come with me if you want to live."
can_be_sawn_off = TRUE
rack_sound = 'sound/weapons/gun/shotgun/rack_alt.ogg'
- fire_delay = 1
+ fire_delay = 0.1 SECONDS
/obj/item/gun/ballistic/shotgun/hellfire/sawoff(mob/user)
. = ..()
@@ -139,7 +144,7 @@
desc = "A semi-automatic shotgun with tactical furniture and six-shell capacity underneath."
icon_state = "cshotgun"
item_state = "shotgun_combat"
- fire_delay = 5
+ fire_delay = 0.5 SECONDS
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_HUGE
@@ -163,9 +168,6 @@
var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine
semi_auto = TRUE
-/obj/item/gun/ballistic/shotgun/automatic/dual_tube/mindshield
- pin = /obj/item/firing_pin/implant/mindshield
-
/obj/item/gun/ballistic/shotgun/automatic/dual_tube/examine(mob/user)
. = ..()
. += "Alt-click to pump it."
@@ -199,7 +201,7 @@
// Bulldog shotgun //
-/obj/item/gun/ballistic/shotgun/bulldog
+/obj/item/gun/ballistic/shotgun/bulldog //TODO: REPATH TO LIKE /obj/item/gun/ballistic/shotgun/automatic/bulldog
name = "\improper Bulldog Shotgun"
desc = "A semi-automatic, magazine-fed shotgun designed for combat in tight quarters, manufactured by Scarborough Arms. A historical favorite of various Syndicate factions, especially the Gorlex Marauders."
icon = 'icons/obj/guns/48x32guns.dmi'
@@ -213,13 +215,12 @@
mag_type = /obj/item/ammo_box/magazine/m12g
can_suppress = FALSE
burst_size = 1
- fire_delay = 0
+ fire_delay = 0.4 SECONDS // this NEEDS the old delay.
fire_sound = 'sound/weapons/gun/shotgun/bulldog.ogg'
- actions_types = list()
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
empty_indicator = TRUE
empty_alarm = TRUE
- special_mags = TRUE
+ unique_mag_sprites_for_variants = TRUE
semi_auto = TRUE
internal_magazine = FALSE
casing_ejector = TRUE
@@ -227,6 +228,13 @@
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
manufacturer = MANUFACTURER_SCARBOROUGH
+ load_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
+ eject_sound = 'sound/weapons/gun/rifle/ar_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/rifle/ar_unload.ogg'
+
+ rack_sound = 'sound/weapons/gun/rifle/ar_cock.ogg'
+
spread = 4
spread_unwielded = 16
recoil = 1
@@ -234,8 +242,7 @@
wield_slowdown = 0.6
wield_delay = 0.65 SECONDS
-/obj/item/gun/ballistic/shotgun/bulldog/unrestricted
- pin = /obj/item/firing_pin
+EMPTY_GUN_HELPER(shotgun/bulldog)
/obj/item/gun/ballistic/shotgun/bulldog/inteq
name = "\improper Mastiff Shotgun"
@@ -243,9 +250,10 @@
icon_state = "bulldog-inteq"
item_state = "bulldog-inteq"
mag_type = /obj/item/ammo_box/magazine/m12g
- pin = /obj/item/firing_pin
manufacturer = MANUFACTURER_INTEQ
+EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
+
/obj/item/gun/ballistic/shotgun/bulldog/suns
name = "\improper Bulldog-C Shotgun"
desc = "A variation of the Bulldog manufactured by Scarborough Arms for SUNS. Its shorter barrel is intended to provide additional maneuverability in personal defense scenarios."
@@ -259,11 +267,12 @@
mag_type = /obj/item/ammo_box/magazine/cm15_mag
icon_state = "cm15"
item_state = "cm15"
- pin = /obj/item/firing_pin
empty_alarm = FALSE
empty_indicator = FALSE
- special_mags = FALSE
+ unique_mag_sprites_for_variants = FALSE
manufacturer = MANUFACTURER_MINUTEMAN
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
/////////////////////////////
// DOUBLE BARRELED SHOTGUN //
@@ -311,7 +320,9 @@
var/num_unloaded = 0
for(var/obj/item/ammo_casing/casing_bullet in get_ammo_list(FALSE, TRUE))
casing_bullet.forceMove(drop_location())
- casing_bullet.bounce_away(FALSE, NONE)
+ var/angle_of_movement =(rand(-3000, 3000) / 100) + dir2angle(turn(user.dir, 180))
+ casing_bullet.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(450, 550) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = casing_bullet.bounce_sfx_override)
+
num_unloaded++
SSblackbox.record_feedback("tally", "station_mess_created", 1, casing_bullet.name)
if (num_unloaded)
@@ -368,6 +379,24 @@
item_state = "dshotgun_sawn"
mob_overlay_state = item_state
+// sawn off beforehand
+/obj/item/gun/ballistic/shotgun/doublebarrel/presawn
+ name = "sawn-off double-barreled shotgun"
+ desc = "A break action shotgun cut down to the size of a sidearm. While the recoil is even harsher, it offers a lot of power in a very small package. Chambered in 12g."
+ sawn_off = TRUE
+ weapon_weight = WEAPON_MEDIUM
+ w_class = WEIGHT_CLASS_NORMAL
+
+ wield_slowdown = 0.25
+ wield_delay = 0.3 SECONDS //OP? maybe
+
+ spread = 8
+ spread_unwielded = 15
+ recoil = 3 //or not
+ recoil_unwielded = 5
+ item_state = "dshotgun_sawn"
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/dual/lethal
+
/obj/item/gun/ballistic/shotgun/doublebarrel/roumain
name = "HP antique double-barreled shotgun"
desc = "A special-edition shotgun hand-made by Hunter's Pride with a high-quality walnut stock inlaid with brass scrollwork. Shotguns like this are very rare outside of the Saint-Roumain Militia's ranks. Otherwise functionally identical to a common double-barreled shotgun. Chambered in 12g."
@@ -441,51 +470,6 @@
sawn_off = TRUE
slot_flags = ITEM_SLOT_BELT
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook
- name = "hook modified sawn-off shotgun"
- desc = "Range isn't an issue when you can bring your victim to you."
- icon_state = "hookshotgun"
- item_state = "shotgun"
- load_sound = 'sound/weapons/gun/shotgun/insert_shell.ogg'
- mag_type = /obj/item/ammo_box/magazine/internal/shot/bounty
- w_class = WEIGHT_CLASS_BULKY
- weapon_weight = WEAPON_MEDIUM
- can_be_sawn_off = FALSE
- force = 16 //it has a hook on it
- attack_verb = list("slashed", "hooked", "stabbed")
- hitsound = 'sound/weapons/bladeslice.ogg'
- //our hook gun!
- var/obj/item/gun/magic/hook/bounty/hook
- var/toggled = FALSE
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/Initialize()
- . = ..()
- hook = new /obj/item/gun/magic/hook/bounty(src)
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/AltClick(mob/user)
- if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- return
- if(toggled)
- to_chat(user,"You switch to the shotgun.")
- fire_sound = initial(fire_sound)
- else
- to_chat(user,"You switch to the hook.")
- fire_sound = 'sound/weapons/batonextend.ogg'
- toggled = !toggled
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/examine(mob/user)
- . = ..()
- if(toggled)
- . += "Alt-click to switch to the shotgun."
- else
- . += "Alt-click to switch to the hook."
-
-/obj/item/gun/ballistic/shotgun/doublebarrel/hook/afterattack(atom/target, mob/living/user, flag, params)
- if(toggled)
- hook.afterattack(target, user, flag, params)
- else
- return ..()
-
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact
name = "compact compact combat shotgun"
desc = "A compact version of the compact version of the semi automatic combat shotgun. For when you want a gun the same size as your brain."
@@ -548,7 +532,7 @@
attack_verb = list("bludgeoned", "smashed")
mag_type = /obj/item/ammo_box/magazine/internal/shot/sex
burst_size = 6
- fire_delay = 0.8
+ fire_delay = 0.08 SECONDS //?? very weird number
pb_knockback = 12
unique_reskin = null
recoil = 10
@@ -581,7 +565,7 @@
base_icon_state = "shotgun_e"
icon_state = "shotgun_e"
burst_size = 100
- fire_delay = 0.1
+ fire_delay = 0.01 SECONDS
pb_knockback = 40
recoil = 100
recoil_unwielded = 200
@@ -743,10 +727,10 @@
wield_slowdown = 0.5
wield_delay = 0.5 SECONDS
- spread_unwielded = 5 //mostly the hunting revolver stats
- spread = 2
+ spread_unwielded = 20 //mostly the hunting revolver stats
+ spread = 6
recoil = 2
- recoil_unwielded = 3
+ recoil_unwielded = 4
/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/factory
desc = "A single-shot break-action rifle made by Hunter's Pride and sold to civilian hunters. This example has been kept in excellent shape and may as well be fresh out of the workshop. Uses .45-70 ammo."
@@ -760,3 +744,23 @@
if(.)
item_state = "beacon_factory_sawn"
mob_overlay_state = item_state
+
+//pre sawn off beacon
+/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/presawn
+ name = "sawn-off HP Beacon"
+ sawn_desc= "A single-shot break-action pistol chambered in .45-70. A bit difficult to aim."
+ sawn_off = TRUE
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = ITEM_SLOT_BELT
+
+ weapon_weight = WEAPON_MEDIUM
+
+ item_state = "beacon_sawn"
+ mob_overlay_state = "beacon_sawn"
+ wield_slowdown = 0.5
+ wield_delay = 0.5 SECONDS
+
+ spread_unwielded = 20 //mostly the hunting revolver stats
+ spread = 6
+ recoil = 2
+ recoil_unwielded = 4
diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm
index ce740644d712..5e8896ab10ec 100644
--- a/code/modules/projectiles/guns/ballistic/smg.dm
+++ b/code/modules/projectiles/guns/ballistic/smg.dm
@@ -1,14 +1,18 @@
/obj/item/gun/ballistic/automatic/smg
- burst_size = 1
+ burst_size = 2
actions_types = list()
- fire_delay = 1
- spread = 4
+ fire_delay = 0.13 SECONDS
+
+ spread = 6
spread_unwielded = 10
wield_slowdown = 0.35
recoil_unwielded = 4
w_class = WEIGHT_CLASS_BULKY
- wield_delay = 0.4 SECONDS
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
+ wield_delay = 0.5 SECONDS
load_sound = 'sound/weapons/gun/smg/smg_reload.ogg'
load_empty_sound = 'sound/weapons/gun/smg/smg_reload.ogg'
@@ -16,20 +20,24 @@
eject_empty_sound = 'sound/weapons/gun/smg/smg_unload.ogg'
/obj/item/gun/ballistic/automatic/smg/calculate_recoil(mob/user, recoil_bonus = 0)
- var/gunslinger_bonus = 1
- var/total_recoil = recoil_bonus
+ var/gunslinger_bonus = 2
+ var/total_recoil
+ if(.)
+ total_recoil += .
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_recoil += gunslinger_bonus
- total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+ . = total_recoil
+ return ..()
/obj/item/gun/ballistic/automatic/smg/calculate_spread(mob/user, bonus_spread)
- var/gunslinger_bonus = 4
+ var/gunslinger_bonus = 16
var/total_spread = bonus_spread
+ if(.)
+ total_spread += .
if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
total_spread += gunslinger_bonus
- total_spread = clamp(total_spread,0,INFINITY)
- return total_spread
+ . = total_spread
+ return ..()
/obj/item/gun/ballistic/automatic/smg/proto
name = "\improper Nanotrasen Saber SMG"
@@ -37,18 +45,11 @@
icon_state = "saber"
actions_types = list()
mag_type = /obj/item/ammo_box/magazine/smgm9mm
- pin = null
+
bolt_type = BOLT_TYPE_LOCKING
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
manufacturer = MANUFACTURER_NANOTRASEN_OLD
-/obj/item/gun/ballistic/automatic/smg/proto/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
-
-/obj/item/gun/ballistic/automatic/smg/proto/unrestricted
- pin = /obj/item/firing_pin
-
/obj/item/gun/ballistic/automatic/smg/c20r
name = "\improper C-20r SMG"
desc = "A bullpup .45 SMG designated 'C-20r.' Its buttstamp reads 'Scarborough Arms - Per falcis, per pravitas.'"
@@ -59,17 +60,12 @@
can_suppress = FALSE
knife_x_offset = 26
knife_y_offset = 12
- mag_display = TRUE
- mag_display_ammo = TRUE
+ show_magazine_on_sprite = TRUE
+ show_magazine_on_sprite_ammo = TRUE
empty_indicator = TRUE
manufacturer = MANUFACTURER_SCARBOROUGH
-/obj/item/gun/ballistic/automatic/smg/c20r/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
-
-/obj/item/gun/ballistic/automatic/smg/c20r/unrestricted
- pin = /obj/item/firing_pin
+EMPTY_GUN_HELPER(automatic/smg/c20r)
/obj/item/gun/ballistic/automatic/smg/c20r/Initialize()
. = ..()
@@ -94,28 +90,23 @@
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/wt550m9
can_suppress = FALSE
- burst_size = 1
actions_types = list()
can_bayonet = TRUE
knife_x_offset = 25
knife_y_offset = 12
- mag_display = TRUE
- mag_display_ammo = TRUE
+ show_magazine_on_sprite = TRUE
+ show_magazine_on_sprite_ammo = TRUE
empty_indicator = TRUE
manufacturer = MANUFACTURER_NANOTRASEN_OLD
fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg'
-/obj/item/gun/ballistic/automatic/smg/wt550/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
-
/obj/item/gun/ballistic/automatic/smg/mini_uzi
name = "\improper Type U3 Uzi"
desc = "A lightweight submachine gun, for when you really want someone dead. Uses 9mm rounds."
icon_state = "uzi"
mag_type = /obj/item/ammo_box/magazine/uzim9mm
bolt_type = BOLT_TYPE_OPEN
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
fire_sound = 'sound/weapons/gun/smg/uzi.ogg'
rack_sound = 'sound/weapons/gun/smg/uzi_cocked.ogg'
@@ -129,10 +120,7 @@
spread_unwielded = 8
wield_slowdown = 0.25
wield_delay = 0.2 SECONDS
-
-/obj/item/gun/ballistic/automatic/smg/mini_uzi/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
+ fire_delay = 0.1 SECONDS
/obj/item/gun/ballistic/automatic/smg/vector
name = "\improper Vector carbine"
@@ -141,14 +129,10 @@
item_state = "vector"
mag_type = /obj/item/ammo_box/magazine/smgm9mm //you guys remember when the autorifle was chambered in 9mm
bolt_type = BOLT_TYPE_LOCKING
- mag_display = TRUE
+ show_magazine_on_sprite = TRUE
weapon_weight = WEAPON_LIGHT
fire_sound = 'sound/weapons/gun/smg/vector_fire.ogg'
-/obj/item/gun/ballistic/automatic/smg/vector/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
-
/obj/item/gun/ballistic/automatic/smg/m90
name = "\improper M-90gl Carbine"
desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off."
@@ -156,76 +140,76 @@
item_state = "m90"
mag_type = /obj/item/ammo_box/magazine/m556
can_suppress = FALSE
- actions_types = list(/datum/action/item_action/toggle_firemode)
- var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel
- burst_size = 3
- fire_delay = 2
- pin = /obj/item/firing_pin/implant/pindicate
- mag_display = TRUE
+ gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "underbarrel grenade launcher")
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_OTHER)
+ default_firemode = FIREMODE_SEMIAUTO
+ var/obj/item/gun/ballistic/revolver/grenadelauncher/secondary
+ show_magazine_on_sprite = TRUE
empty_indicator = TRUE
fire_sound = 'sound/weapons/gun/rifle/shot_alt.ogg'
manufacturer = MANUFACTURER_SCARBOROUGH
+ burst_size = 3
+ burst_delay = 0.1 SECONDS
+ fire_delay = 0.2 SECONDS
spread = 1
spread_unwielded = 8
wield_slowdown = 0.4
/obj/item/gun/ballistic/automatic/smg/m90/Initialize()
. = ..()
- underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src)
+ secondary = new /obj/item/gun/ballistic/revolver/grenadelauncher(src)
+ RegisterSignal(secondary, COMSIG_ATOM_UPDATE_ICON, PROC_REF(secondary_update_icon))
update_appearance()
-/obj/item/gun/ballistic/automatic/smg/m90/unrestricted
- pin = /obj/item/firing_pin
+/obj/item/gun/ballistic/automatic/smg/m90/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0)
+ return secondary.pre_fire(target, user, message, params, zone_override, bonus_spread)
-/obj/item/gun/ballistic/automatic/smg/m90/unrestricted/Initialize()
- . = ..()
- underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(src)
- update_appearance()
+/obj/item/gun/ballistic/automatic/smg/m90/can_shoot()
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
+ return ..()
+ return secondary.can_shoot()
/obj/item/gun/ballistic/automatic/smg/m90/afterattack(atom/target, mob/living/user, flag, params)
- if(select == 2)
- underbarrel.afterattack(target, user, flag, params)
- else
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
return ..()
+ return secondary.afterattack(target, user, flag, params)
-/obj/item/gun/ballistic/automatic/smg/m90/attackby(obj/item/A, mob/user, params)
- if(istype(A, /obj/item/ammo_casing))
- if(istype(A, underbarrel.magazine.ammo_type))
- underbarrel.attack_self()
- underbarrel.attackby(A, user, params)
- else
- ..()
+/obj/item/gun/ballistic/automatic/smg/m90/attackby(obj/item/attack_obj, mob/user, params)
+ if(istype(attack_obj, secondary.magazine.ammo_type))
+ secondary.unique_action()
+ return secondary.attackby(attack_obj, user, params)
+ return ..()
-/obj/item/gun/ballistic/automatic/smg/m90/update_overlays()
+
+/obj/item/gun/ballistic/automatic/smg/m90/can_shoot()
+ var/current_firemode = gun_firemodes[firemode_index]
+ if(current_firemode != FIREMODE_OTHER)
+ return ..()
+ return secondary.can_shoot()
+
+/obj/item/gun/ballistic/automatic/smg/m90/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+ secondary.wielded = TRUE
+ INVOKE_ASYNC(src, .proc.do_wield, user)
+
+/obj/item/gun/ballistic/automatic/smg/m90/do_wield(mob/user)
. = ..()
- switch(select)
- if(0)
- . += "[initial(icon_state)]_semi"
- if(1)
- . += "[initial(icon_state)]_burst"
- if(2)
- . += "[initial(icon_state)]_gren"
-
-/obj/item/gun/ballistic/automatic/smg/m90/burst_select()
- var/mob/living/carbon/human/user = usr
- switch(select)
- if(0)
- select = 1
- burst_size = initial(burst_size)
- fire_delay = initial(fire_delay)
- to_chat(user, "You switch to [burst_size]-rnd burst.")
- if(1)
- select = 2
- to_chat(user, "You switch to grenades.")
- if(2)
- select = 0
- burst_size = 1
- fire_delay = 0
- to_chat(user, "You switch to semi-auto.")
- playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
+ secondary.wielded_fully = wielded_fully
+
+/// triggered on unwield of two handed item
+/obj/item/gun/ballistic/automatic/smg/m90/on_unwield(obj/item/source, mob/user)
+ . = ..()
+ secondary.wielded_fully = FALSE
+ secondary.wielded = FALSE
+
+
+/obj/item/gun/ballistic/automatic/smg/m90/proc/secondary_update_icon()
update_appearance()
- return
+ SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
+
/obj/item/gun/ballistic/automatic/smg/firestorm //weapon designed by Apogee-dev
name = "HP Firestorm"
@@ -235,20 +219,18 @@
item_state = "firestorm"
mag_type = /obj/item/ammo_box/magazine/c45_firestorm_mag
can_suppress = FALSE
- special_mags = TRUE
+ unique_mag_sprites_for_variants = TRUE
burst_size = 1
actions_types = list()
- fire_delay = 1
+ fire_delay = 0.13 SECONDS
+ bolt_type = BOLT_TYPE_OPEN
rack_sound = 'sound/weapons/gun/smg/uzi_cocked.ogg'
fire_sound = 'sound/weapons/gun/smg/firestorm.ogg'
+
manufacturer = MANUFACTURER_HUNTERSPRIDE
wield_slowdown = 0.4
-/obj/item/gun/ballistic/automatic/smg/firestorm/Initialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
-
/obj/item/gun/ballistic/automatic/smg/firestorm/pan //spawns with pan magazine, can take sticks instead of just drums, not sure where this would be used, maybe erts?
spawnwithmagazine = FALSE
@@ -267,12 +249,10 @@
fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg'
manufacturer = MANUFACTURER_MINUTEMAN
-/obj/item/gun/ballistic/automatic/smg/cm5/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
-/obj/item/gun/ballistic/automatic/smg/cm5/no_mag
- spawnwithmagazine = FALSE
+EMPTY_GUN_HELPER(automatic/smg/cm5)
/obj/item/gun/ballistic/automatic/smg/cm5/compact
name = "\improper CM-5c"
@@ -281,15 +261,13 @@
spread = 25
spread_unwielded = 40
+ fire_delay = 0.08 SECONDS
+
recoil = 1
recoil_unwielded = 2
wield_delay = 0.2 SECONDS
wield_slowdown = 0.15
-/obj/item/gun/ballistic/automatic/smg/cm5/compact/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.8 SECONDS)
-
/obj/item/gun/ballistic/automatic/smg/skm_carbine
name = "\improper SKM-24v"
desc = "The SKM-24v was a carbine modification of the SKM-24 during the Frontiersmen War. This, however, is just a shoddy imitation of that carbine, effectively an SKM-24 with a sawed down barrel and a folding wire stock. Can be fired with the stock folded, though accuracy suffers. Chambered in 4.6x30mm."
@@ -337,7 +315,6 @@
/obj/item/gun/ballistic/automatic/smg/skm_carbine/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
AddElement(/datum/element/update_icon_updates_onmob)
/datum/action/item_action/fold_stock
@@ -371,26 +348,19 @@
/obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_recoil(mob/user, recoil_bonus = 0)
- var/gunslinger_bonus = 1
var/total_recoil = recoil_bonus
if(!stock_folded)
total_recoil += stock_recoil_bonus
- if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
- total_recoil += gunslinger_bonus
- total_recoil = clamp(total_recoil,0,INFINITY)
- return total_recoil
+ return ..(user, total_recoil)
/obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_spread(mob/user, bonus_spread)
- var/gunslinger_bonus = 4
var/total_spread = bonus_spread
+
if(!stock_folded)
total_spread += stock_spread_bonus
- if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty
- total_spread += gunslinger_bonus
- total_spread = clamp(total_spread,0,INFINITY)
- return total_spread
+ return ..(user, total_spread)
/obj/item/gun/ballistic/automatic/smg/skm_carbine/update_icon_state()
. = ..()
@@ -433,8 +403,3 @@
unfolded_slowdown = 0.35
unfolded_wield_delay = 0.4 SECONDS
-
-
-/obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index 4ce2819a902e..796a62dd9427 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -9,7 +9,6 @@
throwforce = 0
burst_size = 3
can_suppress = TRUE
- clumsy_check = 0
item_flags = NONE
casing_ejector = FALSE
manufacturer = MANUFACTURER_NANOTRASEN
@@ -20,9 +19,6 @@
. = ..()
. += "[icon_state]_toy"
-/obj/item/gun/ballistic/automatic/toy/unrestricted
- pin = /obj/item/firing_pin
-
/obj/item/gun/ballistic/automatic/toy/pistol
name = "foam force pistol"
desc = "A small, easily concealable toy handgun. Ages 8 and up."
@@ -33,7 +29,7 @@
mag_type = /obj/item/ammo_box/magazine/toy/pistol
fire_sound = 'sound/items/syringeproj.ogg'
burst_size = 1
- fire_delay = 0
+ fire_delay = 0.2 SECONDS
actions_types = list()
recoil = -10 //its a toy...
recoil_unwielded = -10
@@ -45,12 +41,6 @@
magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src)
return ..()
-/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted
- pin = /obj/item/firing_pin
-
-/obj/item/gun/ballistic/automatic/toy/pistol/riot/unrestricted
- pin = /obj/item/firing_pin
-
/obj/item/gun/ballistic/shotgun/toy
name = "foam force shotgun"
desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up."
@@ -58,7 +48,6 @@
throwforce = 0
mag_type = /obj/item/ammo_box/magazine/internal/shot/toy
fire_sound = 'sound/items/syringeproj.ogg'
- clumsy_check = FALSE
item_flags = NONE
casing_ejector = FALSE
can_suppress = FALSE
@@ -70,14 +59,11 @@
. = ..()
. += "[icon_state]_toy"
-/obj/item/gun/ballistic/shotgun/toy/process_chamber(empty_chamber = 0)
- ..()
+/obj/item/gun/ballistic/shotgun/toy/process_chamber(empty_chamber = 0, from_firing = TRUE, chamber_next_round = TRUE, atom/shooter)
+ . = ..()
if(chambered && !chambered.BB)
qdel(chambered)
-/obj/item/gun/ballistic/shotgun/toy/unrestricted
- pin = /obj/item/firing_pin
-
/obj/item/gun/ballistic/shotgun/toy/crossbow
name = "foam force crossbow"
desc = "A weapon favored by many overactive children. Ages 8 and up."
@@ -92,48 +78,38 @@
recoil = -10 //its a toy...
recoil_unwielded = -10
-/obj/item/gun/ballistic/automatic/smg/c20r/toy //This is the syndicate variant with syndicate firing pin and riot darts.
+/obj/item/gun/ballistic/automatic/smg/c20r/toy
name = "donksoft SMG"
desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up."
can_suppress = FALSE
item_flags = NONE
- mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot
+ mag_type = /obj/item/ammo_box/magazine/toy/smgm45
fire_sound = 'sound/items/syringeproj.ogg'
casing_ejector = FALSE
- clumsy_check = FALSE
manufacturer = MANUFACTURER_DONKCO
recoil = -10 //its a toy...
recoil_unwielded = -10
-/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted //Use this for actual toys
- pin = /obj/item/firing_pin
- mag_type = /obj/item/ammo_box/magazine/toy/smgm45
-
-/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot
+/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot
mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot
/obj/item/gun/ballistic/automatic/smg/c20r/toy/update_overlays()
. = ..()
. += "[icon_state]_toy"
-/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy //This is the syndicate variant with syndicate firing pin and riot darts.
+/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy
name = "donksoft LMG"
desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up."
fire_sound = 'sound/items/syringeproj.ogg'
can_suppress = FALSE
item_flags = NONE
- mag_type = /obj/item/ammo_box/magazine/toy/m762/riot
+ mag_type = /obj/item/ammo_box/magazine/toy/m762
casing_ejector = FALSE
- clumsy_check = FALSE
manufacturer = MANUFACTURER_DONKCO
recoil = -10 //its a toy...
recoil_unwielded = -10
-/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted //Use this for actual toys
- pin = /obj/item/firing_pin
- mag_type = /obj/item/ammo_box/magazine/toy/m762
-
-/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted/riot
+/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot
mag_type = /obj/item/ammo_box/magazine/toy/m762/riot
/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/update_overlays()
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index a6e424901d5e..d06ad71d206d 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -10,6 +10,11 @@
has_safety = TRUE
safety = TRUE
+ gun_firemodes = list(FIREMODE_SEMIAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
+ fire_select_icon_state_prefix = "laser_"
+
var/obj/item/stock_parts/cell/gun/cell //What type of power cell this uses
var/cell_type = /obj/item/stock_parts/cell/gun
var/modifystate = 0
@@ -204,7 +209,7 @@
if(!chambered.BB)
chambered.newshot()
-/obj/item/gun/energy/process_chamber()
+/obj/item/gun/energy/process_chamber(atom/shooter)
if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired...
var/obj/item/ammo_casing/energy/shot = chambered
cell.use(shot.e_cost)//... drain the cell cell
@@ -217,11 +222,6 @@
process_chamber() // If the gun was drained and then recharged, load a new shot.
return ..()
-/obj/item/gun/energy/process_burst(mob/living/user, atom/target, message = TRUE, params = null, zone_override="", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0)
- if(!chambered && can_shoot())
- process_chamber() // Ditto.
- return ..()
-
/obj/item/gun/energy/proc/select_fire(mob/living/user)
select++
if (select > ammo_type.len)
diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm
index 1423eedf81ba..f1188f76701f 100644
--- a/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -12,9 +12,6 @@
dual_wield_spread = 60
manufacturer = MANUFACTURER_SHARPLITE_NEW
-/obj/item/gun/energy/e_gun/mindshield
- pin = /obj/item/firing_pin/implant/mindshield
-
/obj/item/gun/energy/e_gun/mini
name = "miniature energy gun"
desc = "A small, pistol-sized energy gun with a built-in flashlight. It has two settings: disable and kill."
@@ -55,14 +52,15 @@
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
+ fire_delay = 0.2 SECONDS
+
wield_delay = 0.7 SECONDS
wield_slowdown = 0.6
spread_unwielded = 20
-/obj/item/gun/energy/e_gun/hades/Initialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
-
/obj/item/gun/energy/e_gun/old
name = "prototype energy gun"
desc = "NT-P:01 Prototype Energy Gun. Early stage development of a unique laser rifle that has a multifaceted energy lens, allowing the gun to alter the form of projectile it fires on command. The project was a dud, and Nanotrasen later acquired Sharplite to suit its laser weapon needs."
@@ -137,7 +135,6 @@
icon_state = "nucgun"
item_state = "nucgun"
charge_delay = 5
- pin = null
can_charge = FALSE
internal_cell = TRUE
ammo_x_offset = 2
@@ -228,9 +225,10 @@
charge_sections = 3
weapon_weight = WEAPON_LIGHT
-/obj/item/gun/energy/e_gun/smg/Initialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.13 SECONDS)
+ fire_delay = 0.13 SECONDS
+
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
/obj/item/gun/energy/e_gun/iot
name = "\improper E-SG 500 Second Edition"
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 5f39d407d749..ac3aa9e3d21a 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -1,6 +1,6 @@
/obj/item/gun/energy/kinetic_accelerator
name = "kinetic accelerator"
- desc = "A self recharging, ranged self-defense and rock pulverizing tool that does increased damage in low pressure. EXOCON does not condone use of this weapon against other sentient life."
+ desc = "A self recharging, ranged self-defense and rock pulverizing tool that does increased damage in low pressure. EXOCOM does not condone use of this weapon against other sentient life."
icon_state = "kineticgun"
item_state = "kineticgun"
ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 4fb79f7d46e6..31261d31e30c 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -18,7 +18,6 @@
name = "practice laser gun"
desc = "A modified version of the L-204 laser gun, this one fires less concentrated energy bolts designed for target practice."
ammo_type = list(/obj/item/ammo_casing/energy/laser/practice)
- clumsy_check = TRUE
item_flags = NONE
/obj/item/gun/energy/laser/retro
@@ -75,7 +74,6 @@
item_state = "shotgun"
desc = "A combat shotgun gutted and refitted with an internal laser system. Can switch between taser and scattered disabler shots."
shaded_charge = 0
- pin = /obj/item/firing_pin/implant/mindshield
ammo_type = list(/obj/item/ammo_casing/energy/disabler/scatter, /obj/item/ammo_casing/energy/electrode)
manufacturer = MANUFACTURER_NONE
@@ -93,13 +91,9 @@
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BACK
ammo_type = list(/obj/item/ammo_casing/energy/laser/accelerator)
- pin = null
ammo_x_offset = 3
manufacturer = MANUFACTURER_SHARPLITE
-/obj/item/gun/energy/lasercannon/unrestricted
- pin = /obj/item/firing_pin
-
/obj/item/ammo_casing/energy/laser/accelerator
projectile_type = /obj/projectile/beam/laser/accelerator
select_name = "accelerator"
@@ -123,7 +117,6 @@
icon_state = "xray"
item_state = null
ammo_type = list(/obj/item/ammo_casing/energy/xray)
- pin = null
ammo_x_offset = 3
////////Laser Tag////////////////////
@@ -134,8 +127,6 @@
desc = "A retro laser gun modified to fire harmless blue beams of light. Sound effects included!"
ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag)
item_flags = NONE
- clumsy_check = FALSE
- pin = /obj/item/firing_pin/tag/blue
ammo_x_offset = 2
selfcharge = TRUE
manufacturer = MANUFACTURER_NONE
@@ -149,8 +140,6 @@
desc = "A retro laser gun modified to fire harmless beams red of light. Sound effects included!"
ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag)
item_flags = NONE
- clumsy_check = FALSE
- pin = /obj/item/firing_pin/tag/red
ammo_x_offset = 2
selfcharge = TRUE
manufacturer = MANUFACTURER_NONE
@@ -187,7 +176,6 @@
/obj/item/gun/energy/laser/iot/lethal
desc = "An energy shotgun with an integrated computer system for surveillance and statistics tracking. This one appears to be modified to fire lethal beams."
- icon_state = "iotshotgun_lethal"
ammo_type = list(/obj/item/ammo_casing/energy/laser/ultima)
/obj/item/gun/energy/laser/hitscanpistol
diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm
index b21e176b92e8..22e6e57d8817 100644
--- a/code/modules/projectiles/guns/energy/laser_gatling.dm
+++ b/code/modules/projectiles/guns/energy/laser_gatling.dm
@@ -105,6 +105,12 @@
icon_state = "minigun_spin"
item_state = "minigun"
slowdown = 1
+
+ fire_delay = 0.1 SECONDS
+
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
+
slot_flags = null
w_class = WEIGHT_CLASS_HUGE
custom_materials = null
@@ -121,7 +127,6 @@
ammo_pack = loc
AddElement(/datum/element/update_icon_blocker)
- AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
return ..()
/obj/item/gun/energy/minigun/Destroy()
diff --git a/code/modules/projectiles/guns/energy/mounted.dm b/code/modules/projectiles/guns/energy/mounted.dm
index 89114e805df4..4dc5cae77558 100644
--- a/code/modules/projectiles/guns/energy/mounted.dm
+++ b/code/modules/projectiles/guns/energy/mounted.dm
@@ -16,7 +16,7 @@
name = "mounted laser"
desc = "An arm mounted cannon that fires lethal lasers."
icon = 'icons/obj/items_cyborg.dmi'
- icon_state = "laser"
+ icon_state = "laser_cyborg"
item_state = "armcannonlase"
force = 5
selfcharge = 1
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index 9ed110dfa041..f16cbbd98e8c 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -24,26 +24,6 @@
/obj/item/gun/energy/pulse/emp_act(severity)
return
-/obj/item/gun/energy/pulse/prize
- pin = /obj/item/firing_pin
-
-/obj/item/gun/energy/pulse/prize/Initialize()
- . = ..()
- GLOB.poi_list += src
- var/turf/T = get_turf(src)
-
- message_admins("A pulse rifle prize has been created at [ADMIN_VERBOSEJMP(T)]")
- log_game("A pulse rifle prize has been created at [AREACOORD(T)]")
-
- notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT, header = "Pulse rifle prize")
-
-/obj/item/gun/energy/pulse/prize/Destroy()
- GLOB.poi_list -= src
- . = ..()
-
-/obj/item/gun/energy/pulse/loyalpin
- pin = /obj/item/firing_pin
-
/obj/item/gun/energy/pulse/carbine
name = "pulse carbine"
desc = "A next-generation pulse weapon for Nanotrasen's security forces. High production costs and logistical issues have limited its deployment to specialist Loss Prevention and Emergency Response units."
@@ -61,8 +41,19 @@
ammo_x_offset = 2
charge_sections = 4
-/obj/item/gun/energy/pulse/carbine/loyalpin
- pin = /obj/item/firing_pin/implant/mindshield
+/obj/item/gun/energy/pulse/prize/Initialize()
+ . = ..()
+ GLOB.poi_list += src
+ var/turf/T = get_turf(src)
+
+ message_admins("A pulse rifle prize has been created at [ADMIN_VERBOSEJMP(T)]")
+ log_game("A pulse rifle prize has been created at [AREACOORD(T)]")
+
+ notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT, header = "Pulse rifle prize")
+
+/obj/item/gun/energy/pulse/prize/Destroy()
+ GLOB.poi_list -= src
+ . = ..()
/obj/item/gun/energy/pulse/pistol
name = "pulse pistol"
@@ -76,9 +67,6 @@
ammo_x_offset = 2
charge_sections = 4
-/obj/item/gun/energy/pulse/pistol/loyalpin
- pin = /obj/item/firing_pin/implant/mindshield
-
/obj/item/gun/energy/pulse/destroyer
name = "pulse destroyer"
desc = "A heavy-duty energy rifle built for pure destruction."
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 5a01abfdc0f1..73d9104833fb 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -25,7 +25,6 @@
slot_flags = ITEM_SLOT_BELT
ammo_x_offset = 2
ammo_y_offset = 0
- pin = null
can_flashlight = TRUE
flight_x_offset = 18
flight_y_offset = 11
@@ -35,7 +34,6 @@
desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
icon_state = "decloner"
ammo_type = list(/obj/item/ammo_casing/energy/declone)
- pin = null
ammo_x_offset = 1
/obj/item/gun/energy/decloner/update_overlays()
@@ -44,10 +42,6 @@
if(!QDELETED(cell) && (cell.charge > shot.e_cost))
. += "decloner_spin"
-/obj/item/gun/energy/decloner/unrestricted
- pin = /obj/item/firing_pin
- ammo_type = list(/obj/item/ammo_casing/energy/declone/weak)
-
/obj/item/gun/energy/floragun
name = "floral somatoray"
desc = "A tool that discharges controlled radiation which induces mutation in plant cells."
@@ -67,7 +61,6 @@
w_class = WEIGHT_CLASS_BULKY
ammo_type = list(/obj/item/ammo_casing/energy/meteor)
cell_type = /obj/item/stock_parts/cell/potato
- clumsy_check = 0 //Admin spawn only, might as well let clowns use it.
selfcharge = 1
/obj/item/gun/energy/meteorgun/pen
@@ -121,7 +114,6 @@
custom_materials = list(/datum/material/iron=4000)
suppressed = null
ammo_type = list(/obj/item/ammo_casing/energy/bolt/large)
- pin = null
manufacturer = MANUFACTURER_NONE
@@ -229,7 +221,7 @@
if(istype(WH))
WH.gun = WEAKREF(src)
-/obj/item/gun/energy/wormhole_projector/process_chamber()
+/obj/item/gun/energy/wormhole_projector/process_chamber(atom/shooter)
..()
select_fire()
@@ -285,10 +277,14 @@
can_charge = FALSE
use_cyborg_cell = TRUE
+ fire_delay = 0.3 SECONDS
+
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
+
/obj/item/gun/energy/printer/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_blocker)
- AddComponent(/datum/component/automatic_fire, 0.3 SECONDS)
/obj/item/gun/energy/printer/emp_act()
return
@@ -336,12 +332,10 @@
ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
cell_type = /obj/item/stock_parts/cell/gun/upgraded
ammo_x_offset = 2
- pin = null
/obj/item/gun/energy/temperature/security
name = "security temperature gun"
desc = "A weapon that can only be used to its full potential by the truly robust."
- pin = /obj/item/firing_pin
/obj/item/gun/energy/laser/instakill
name = "instakill rifle"
@@ -401,9 +395,9 @@
shaded_charge = TRUE
weapon_weight = WEAPON_HEAVY
-/obj/item/gun/energy/tesla_cannon/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
+ fire_delay = 0.1 SECONDS
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
/obj/item/gun/energy/buster
name = "replica buster cannon"
diff --git a/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm b/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm
index 8684fa867288..20a301a1396c 100644
--- a/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm
+++ b/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm
@@ -7,10 +7,12 @@
lefthand_file = 'icons/obj/guns/faction/gezena/lefthand.dmi'
righthand_file = 'icons/obj/guns/faction/gezena/righthand.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/gezena/belt.dmi'
- w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_BULKY
modifystate = TRUE
+ fire_delay = 0.16 SECONDS
+
wield_delay = 0.7 SECONDS
wield_slowdown = 0.35
@@ -45,14 +47,11 @@
desc = "An advanced variant of the BG-12, the BG-16 is the military-grade beam gun designed and manufactured by Etherbor Industries as the standard-issue close-range weapon of the PGF."
icon_state = "pgfgun"
item_state = "pgfgun"
+ w_class = WEIGHT_CLASS_NORMAL
cell_type = /obj/item/stock_parts/cell/gun/pgf
ammo_type = list(/obj/item/ammo_casing/energy/pgf , /obj/item/ammo_casing/energy/disabler/hitscan)
-/obj/item/gun/energy/kalix/pgf/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.16 SECONDS)
-
/obj/projectile/beam/hitscan/kalix/pgf
name = "concentrated energy"
tracer_type = /obj/effect/projectile/tracer/pgf
@@ -72,8 +71,7 @@
desc = "Etherbor's current and sidearm offering. While intended for marines, it's also available for civillians"
icon_state = "kalixpistol"
item_state = "kalixpistol"
- w_class = WEIGHT_CLASS_SMALL
-
+ w_class = WEIGHT_CLASS_NORMAL
modifystate = FALSE
wield_delay = 0.2 SECONDS
@@ -105,6 +103,11 @@
modifystate = FALSE
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
+ fire_delay = 0.2 SECONDS
+
wield_delay = 0.7 SECONDS
wield_slowdown = 0.6
@@ -113,10 +116,6 @@
ammo_type = list(/obj/item/ammo_casing/energy/pgf/assault, /obj/item/ammo_casing/energy/pgf/sniper)
-/obj/item/gun/energy/kalix/pgf/heavy/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
-
/obj/item/ammo_casing/energy/pgf/assault
select_name = "AR"
projectile_type = /obj/projectile/beam/hitscan/kalix/pgf/assault
diff --git a/code/modules/projectiles/guns/gunhud.dm b/code/modules/projectiles/guns/gunhud.dm
index 9d1a40db8bb6..3dad98f54219 100644
--- a/code/modules/projectiles/guns/gunhud.dm
+++ b/code/modules/projectiles/guns/gunhud.dm
@@ -18,9 +18,6 @@
// Ammo counter
#define ui_ammocounter "EAST-1:28,CENTER+1:25"
-///The gun needs to update the gun hud!
-#define COMSIG_UPDATE_AMMO_HUD "update_ammo_hud"
-
/datum/hud
var/atom/movable/screen/ammo_counter
@@ -233,6 +230,7 @@
/datum/component/ammo_hud/laser/cybersun
prefix = "cybersun_"
+//please be aware, this only supports 6 round revolvers. It is comically easy to support more or less rounds,like in game there are 7 round and 5 round revolvers, but that requires sprites, and i'm lasy
/datum/component/ammo_hud/revolver
prefix = "revolver_"
@@ -285,3 +283,55 @@
round_images += current_bullet_image
hud.update_overlays(round_images)
+
+/datum/component/ammo_hud/eoehoma
+ backing_color = "#cb001a"
+
+/datum/component/ammo_hud/eoehoma/update_hud()
+ var/obj/item/gun/ballistic/automatic/assault/e40/pew = parent
+ var/obj/item/gun/energy/laser/e40_laser_secondary/pew_secondary = pew.secondary
+ hud.maptext = null
+ hud.icon_state = "[prefix]backing"
+
+ var/indicator
+ var/rounds = num2text(get_accurate_ammo_count(pew))
+ var/oth_o
+ var/oth_t
+ var/oth_h
+
+ var/current_firemode = pew.gun_firemodes[pew.firemode_index]
+ if(current_firemode == FIREMODE_FULLAUTO)
+ if(!pew.magazine)
+ hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]no_mag")
+ return
+ if(!pew.get_ammo())
+ hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]empty_flash")
+ return
+ rounds = num2text(get_accurate_ammo_count(pew))
+ indicator = "bullet"
+ else
+ if(!pew_secondary.cell)
+ hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]no_mag")
+ return
+ if(!get_accurate_laser_count(pew_secondary))
+ hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]empty_flash_laser")
+ return
+ rounds = num2text(get_accurate_laser_count(pew_secondary))
+ indicator = "laser"
+
+
+ switch(length(rounds))
+ if(1)
+ oth_o = "[prefix]o[rounds[1]]"
+ if(2)
+ oth_o = "[prefix]o[rounds[2]]"
+ oth_t = "[prefix]t[rounds[1]]"
+ if(3)
+ oth_o = "[prefix]o[rounds[3]]"
+ oth_t = "[prefix]t[rounds[2]]"
+ oth_h = "[prefix]h[rounds[1]]"
+ else
+ oth_o = "[prefix]o9"
+ oth_t = "[prefix]t9"
+ oth_h = "[prefix]h9"
+ hud.set_hud(backing_color, oth_o, oth_t, oth_h, indicator)
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
deleted file mode 100644
index 63c4ef8aa2d0..000000000000
--- a/code/modules/projectiles/guns/magic.dm
+++ /dev/null
@@ -1,87 +0,0 @@
-/obj/item/gun/magic
- name = "staff of nothing"
- desc = "This staff is boring to watch because even though it came first you've seen everything it can do in other staves for years."
- icon = 'icons/obj/guns/magic.dmi'
- icon_state = "staffofnothing"
- item_state = "staff"
- lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' //not really a gun and some toys use these inhands
- righthand_file = 'icons/mob/inhands/items_righthand.dmi'
- fire_sound = 'sound/weapons/emitter.ogg'
- flags_1 = CONDUCT_1
- w_class = WEIGHT_CLASS_HUGE
- var/checks_antimagic = TRUE
- var/max_charges = 6
- var/charges = 0
- var/recharge_rate = 4
- var/charge_tick = 0
- var/can_charge = TRUE
- var/ammo_type
- var/no_den_usage
- clumsy_check = 0
- trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses magic instead
- pin = /obj/item/firing_pin/magic
-
-/obj/item/gun/magic/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread)
- if(no_den_usage)
- var/area/A = get_area(user)
- if(istype(A, /area/wizard_station))
- add_fingerprint(user)
- to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].")
- return
- else
- no_den_usage = 0
- if(checks_antimagic && user.anti_magic_check(TRUE, FALSE, FALSE, 0, TRUE))
- add_fingerprint(user)
- to_chat(user, "Something is interfering with [src].")
- return
- . = ..()
-
-/obj/item/gun/magic/can_shoot()
- return charges
-
-/obj/item/gun/magic/recharge_newshot()
- if (charges && chambered && !chambered.BB)
- chambered.newshot()
-
-/obj/item/gun/magic/process_chamber()
- if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired...
- charges--//... drain a charge
- recharge_newshot()
-
-/obj/item/gun/magic/Initialize()
- . = ..()
- charges = max_charges
- if(ammo_type)
- chambered = new ammo_type(src)
- if(can_charge)
- START_PROCESSING(SSobj, src)
-
-
-/obj/item/gun/magic/Destroy()
- if(can_charge)
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-
-/obj/item/gun/magic/process()
- if (charges >= max_charges)
- charge_tick = 0
- return
- charge_tick++
- if(charge_tick < recharge_rate)
- return 0
- charge_tick = 0
- charges++
- if(charges == 1)
- recharge_newshot()
- return 1
-
-
-/obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj)
- to_chat(user, "The [name] whizzles quietly.")
-
-/obj/item/gun/magic/vv_edit_var(var_name, var_value)
- . = ..()
- switch(var_name)
- if(NAMEOF(src, charges))
- recharge_newshot()
diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm
deleted file mode 100644
index e8f1683d21a1..000000000000
--- a/code/modules/projectiles/guns/magic/staff.dm
+++ /dev/null
@@ -1,142 +0,0 @@
-/obj/item/gun/magic/staff
- slot_flags = ITEM_SLOT_BACK
- lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
- item_flags = NEEDS_PERMIT | NO_MAT_REDEMPTION
-
-/obj/item/gun/magic/staff/change
- name = "staff of change"
- desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself."
- fire_sound = 'sound/magic/staff_change.ogg'
- ammo_type = /obj/item/ammo_casing/magic/change
- icon_state = "staffofchange"
- item_state = "staffofchange"
-
-/obj/item/gun/magic/staff/animate
- name = "staff of animation"
- desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines."
- fire_sound = 'sound/magic/staff_animation.ogg'
- ammo_type = /obj/item/ammo_casing/magic/animate
- icon_state = "staffofanimation"
- item_state = "staffofanimation"
-
-/obj/item/gun/magic/staff/healing
- name = "staff of healing"
- desc = "An artefact that spits bolts of restoring magic which can remove ailments of all kinds and even raise the dead."
- fire_sound = 'sound/magic/staff_healing.ogg'
- ammo_type = /obj/item/ammo_casing/magic/heal
- icon_state = "staffofhealing"
- item_state = "staffofhealing"
-
-/obj/item/gun/magic/staff/healing/handle_suicide() //Stops people trying to commit suicide to heal themselves
- return
-
-/obj/item/gun/magic/staff/chaos
- name = "staff of chaos"
- desc = "An artefact that spits bolts of chaotic magic that can potentially do anything."
- fire_sound = 'sound/magic/staff_chaos.ogg'
- ammo_type = /obj/item/ammo_casing/magic/chaos
- icon_state = "staffofchaos"
- item_state = "staffofchaos"
- max_charges = 10
- recharge_rate = 2
- no_den_usage = 1
- var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection,
- /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball,
- /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/flying,
- /obj/projectile/magic/bounty, /obj/projectile/magic/antimagic, /obj/projectile/magic/fetch, /obj/projectile/magic/sapping,
- /obj/projectile/magic/necropotence, /obj/projectile/magic, /obj/projectile/temp/chill, /obj/projectile/magic/wipe)
-
-/obj/item/gun/magic/staff/chaos/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
- chambered.projectile_type = pick(allowed_projectile_types)
- . = ..()
-
-/obj/item/gun/magic/staff/door
- name = "staff of door creation"
- desc = "An artefact that spits bolts of transformative magic that can create doors in walls."
- fire_sound = 'sound/magic/staff_door.ogg'
- ammo_type = /obj/item/ammo_casing/magic/door
- icon_state = "staffofdoor"
- item_state = "staffofdoor"
- max_charges = 10
- recharge_rate = 2
- no_den_usage = 1
-
-/obj/item/gun/magic/staff/honk
- name = "staff of the honkmother"
- desc = "Honk."
- fire_sound = 'sound/items/airhorn.ogg'
- ammo_type = /obj/item/ammo_casing/magic/honk
- icon_state = "honker"
- item_state = "honker"
- max_charges = 4
- recharge_rate = 8
-
-/obj/item/gun/magic/staff/spellblade
- name = "spellblade"
- desc = "A deadly combination of laziness and boodlust, this blade allows the user to dismember their enemies without all the hard work of actually swinging the sword."
- fire_sound = 'sound/magic/fireball.ogg'
- ammo_type = /obj/item/ammo_casing/magic/spellblade
- icon_state = "spellblade"
- item_state = "spellblade"
- lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- hitsound = 'sound/weapons/rapierhit.ogg'
- force = 20
- armour_penetration = 75
- block_chance = 50
- sharpness = IS_SHARP
- max_charges = 4
-
-/obj/item/gun/magic/staff/spellblade/Initialize()
- . = ..()
- AddComponent(/datum/component/butchering, 15, 125, 0, hitsound)
-
-/obj/item/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(attack_type == PROJECTILE_ATTACK)
- final_block_chance = 0
- return ..()
-
-/obj/item/gun/magic/staff/locker
- name = "staff of the locker"
- desc = "An artefact that expells encapsulating bolts, for incapacitating thy enemy."
- fire_sound = 'sound/magic/staff_change.ogg'
- ammo_type = /obj/item/ammo_casing/magic/locker
- icon_state = "locker"
- item_state = "locker"
- max_charges = 6
- recharge_rate = 4
-
-//yes, they don't have sounds. they're admin staves, and their projectiles will play the chaos bolt sound anyway so why bother?
-
-/obj/item/gun/magic/staff/flying
- name = "staff of flying"
- desc = "An artefact that spits bolts of graceful magic that can make something fly."
- fire_sound = 'sound/magic/staff_healing.ogg'
- ammo_type = /obj/item/ammo_casing/magic/flying
- icon_state = "staffofflight"
- item_state = "staffofflight"
-
-/obj/item/gun/magic/staff/sapping
- name = "staff of sapping"
- desc = "An artefact that spits bolts of sapping magic that can make something sad."
- fire_sound = 'sound/magic/staff_change.ogg'
- ammo_type = /obj/item/ammo_casing/magic/sapping
- icon_state = "staffofsapping"
- item_state = "staffofsapping"
-
-/obj/item/gun/magic/staff/necropotence
- name = "staff of necropotence"
- desc = "An artefact that spits bolts of death magic that can repurpose the soul."
- fire_sound = 'sound/magic/staff_change.ogg'
- ammo_type = /obj/item/ammo_casing/magic/necropotence
- icon_state = "staffofnecropotence"
- item_state = "staffofnecropotence"
-
-/obj/item/gun/magic/staff/wipe
- name = "staff of possession"
- desc = "An artefact that spits bolts of mind-unlocking magic that can let ghosts invade the victim's mind."
- fire_sound = 'sound/magic/staff_change.ogg'
- ammo_type = /obj/item/ammo_casing/magic/wipe
- icon_state = "staffofwipe"
- item_state = "staffofwipe"
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
deleted file mode 100644
index c6a25127878a..000000000000
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ /dev/null
@@ -1,266 +0,0 @@
-//For use in prob() to determine if an empty wand will shoot once then break.
-#define WAND_WREST_CHANCE (1/121)
-
-/obj/item/gun/magic/wand
- name = "wand"
- desc = "You shouldn't have this."
- ammo_type = /obj/item/ammo_casing/magic
- icon_state = "nothingwand"
- item_state = "wand"
- base_icon_state = "nothingwand"
- w_class = WEIGHT_CLASS_SMALL
- can_charge = FALSE
- max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths)
- var/variable_charges = TRUE
-
-/obj/item/gun/magic/wand/Initialize()
- if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges
- if(prob(33))
- max_charges = CEILING(max_charges / 3, 1)
- else
- max_charges = CEILING(max_charges / 2, 1)
- return ..()
-
-/obj/item/gun/magic/wand/examine(mob/user)
- . = ..()
- . += "Has [charges] charge\s remaining."
-
-/obj/item/gun/magic/wand/update_icon_state()
- icon_state = "[base_icon_state][charges ? null : "-drained"]"
- return ..()
-
-/obj/item/gun/magic/wand/attack(atom/target, mob/living/user)
- if(target == user)
- return
- ..()
-
-/obj/item/gun/magic/wand/afterattack(atom/target, mob/living/user)
- var/wrested = FALSE
- if(!charges)
- wrested = shoot_with_empty_chamber(user)
- if(!wrested)
- return
- if(target == user)
- if(no_den_usage)
- var/area/A = get_area(user)
- if(istype(A, /area/wizard_station))
- to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].")
- return
- else
- no_den_usage = 0
- zap_self(user)
- else
- . = ..()
- if(wrested)
- to_chat(user,"[src] overloads and disintegrates.")
- qdel(src)
- return
- update_appearance()
-
-/obj/item/gun/magic/wand/shoot_with_empty_chamber(mob/living/user)
- if(prob(100*WAND_WREST_CHANCE))
- to_chat(user,"You manage to activate [src] one last time.")
- charges++
- recharge_newshot()
- return TRUE
- return ..()
-
-/obj/item/gun/magic/wand/proc/zap_self(mob/living/user)
- user.visible_message("[user] zaps [user.p_them()]self with [src].")
- playsound(user, fire_sound, 50, TRUE)
- user.log_message("zapped [user.p_them()]self with a [src]", LOG_ATTACK)
-
-
-/////////////////////////////////////
-//WAND OF DEATH
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/death
- name = "wand of death"
- desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail."
- fire_sound = 'sound/magic/wandodeath.ogg'
- ammo_type = /obj/item/ammo_casing/magic/death
- icon_state = "deathwand"
- base_icon_state = "deathwand"
- max_charges = 3 //3, 2, 2, 1
-
-/obj/item/gun/magic/wand/death/zap_self(mob/living/user)
- ..()
- charges--
- if(user.anti_magic_check())
- user.visible_message("[src] has no effect on [user]!")
- return
- if(isliving(user))
- var/mob/living/L = user
- if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead
- user.revive(full_heal = TRUE, admin_revive = TRUE)
- to_chat(user, "You feel great!")
- return
- to_chat(user, "You irradiate yourself with pure negative energy! \
- [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\
- ")
- user.death(FALSE)
-
-/obj/item/gun/magic/wand/death/debug
- desc = "In some obscure circles, this is known as the 'cloning tester's friend'."
- max_charges = 500
- variable_charges = FALSE
- can_charge = TRUE
- recharge_rate = 1
-
-
-/////////////////////////////////////
-//WAND OF HEALING
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/resurrection
- name = "wand of healing"
- desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason."
- ammo_type = /obj/item/ammo_casing/magic/heal
- fire_sound = 'sound/magic/staff_healing.ogg'
- icon_state = "revivewand"
- base_icon_state = "revivewand"
- 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
- if(isliving(user))
- var/mob/living/L = user
- if(L.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead
- to_chat(user, "You irradiate yourself with pure positive energy! \
- [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\
- ")
- user.death(0)
- return
- user.revive(full_heal = TRUE, admin_revive = TRUE)
- to_chat(user, "You feel great!")
-
-/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."
- max_charges = 500
- variable_charges = FALSE
- can_charge = TRUE
- recharge_rate = 1
-
-/////////////////////////////////////
-//WAND OF POLYMORPH
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/polymorph
- name = "wand of polymorph"
- desc = "This wand is attuned to chaos and will radically alter the victim's form."
- ammo_type = /obj/item/ammo_casing/magic/change
- icon_state = "polywand"
- base_icon_state = "polywand"
- fire_sound = 'sound/magic/staff_change.ogg'
- max_charges = 10 //10, 5, 5, 4
-
-/obj/item/gun/magic/wand/polymorph/zap_self(mob/living/user)
- ..() //because the user mob ceases to exists by the time wabbajack fully resolves
-
- wabbajack(user)
- charges--
-
-/////////////////////////////////////
-//WAND OF TELEPORTATION
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/teleport
- name = "wand of teleportation"
- desc = "This wand will wrench targets through space and time to move them somewhere else."
- ammo_type = /obj/item/ammo_casing/magic/teleport
- fire_sound = 'sound/magic/wand_teleport.ogg'
- icon_state = "telewand"
- base_icon_state = "telewand"
- max_charges = 10 //10, 5, 5, 4
- no_den_usage = TRUE
-
-/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user)
- if(do_teleport(user, user, 10, channel = TELEPORT_CHANNEL_MAGIC))
- var/datum/effect_system/smoke_spread/smoke = new
- smoke.set_up(3, user.loc)
- smoke.start()
- charges--
- ..()
-
-/obj/item/gun/magic/wand/safety
- name = "wand of safety"
- desc = "This wand will use the lightest of bluespace currents to gently place the target somewhere safe."
- ammo_type = /obj/item/ammo_casing/magic/safety
- fire_sound = 'sound/magic/wand_teleport.ogg'
- icon_state = "telewand"
- base_icon_state = "telewand"
- max_charges = 10 //10, 5, 5, 4
- no_den_usage = FALSE
-
-/obj/item/gun/magic/wand/safety/zap_self(mob/living/user)
- var/turf/origin = get_turf(user)
- var/turf/destination = find_safe_turf()
-
- if(do_teleport(user, destination, channel=TELEPORT_CHANNEL_MAGIC))
- for(var/t in list(origin, destination))
- var/datum/effect_system/smoke_spread/smoke = new
- smoke.set_up(0, t)
- smoke.start()
- ..()
-
-/obj/item/gun/magic/wand/safety/debug
- desc = "This wand has 'find_safe_turf()' engraved into its blue wood. Perhaps it's a secret message?"
- max_charges = 500
- variable_charges = FALSE
- can_charge = TRUE
- recharge_rate = 1
-
-
-/////////////////////////////////////
-//WAND OF DOOR CREATION
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/door
- name = "wand of door creation"
- desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics."
- ammo_type = /obj/item/ammo_casing/magic/door
- icon_state = "doorwand"
- base_icon_state = "doorwand"
- fire_sound = 'sound/magic/staff_door.ogg'
- max_charges = 20 //20, 10, 10, 7
- no_den_usage = 1
-
-/obj/item/gun/magic/wand/door/zap_self(mob/living/user)
- to_chat(user, "You feel vaguely more open with your feelings.")
- charges--
- ..()
-
-/////////////////////////////////////
-//WAND OF FIREBALL
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/fireball
- name = "wand of fireball"
- desc = "This wand shoots scorching balls of fire that explode into destructive flames."
- fire_sound = 'sound/magic/fireball.ogg'
- ammo_type = /obj/item/ammo_casing/magic/fireball
- icon_state = "firewand"
- base_icon_state = "firewand"
- max_charges = 8 //8, 4, 4, 3
-
-/obj/item/gun/magic/wand/fireball/zap_self(mob/living/user)
- ..()
- explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
- charges--
-
-/////////////////////////////////////
-//WAND OF NOTHING
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/nothing
- name = "wand of nothing"
- desc = "It's not just a stick, it's a MAGIC stick?"
- ammo_type = /obj/item/ammo_casing/magic/nothing
-
-
-#undef WAND_WREST_CHANCE
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index fad4f485aa88..8b6626bc5e97 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -32,7 +32,6 @@
big_gun = TRUE
cell_type = "/obj/item/stock_parts/cell/gun/large"
canMouseDown = TRUE
- pin = null
var/aiming = FALSE
var/aiming_time = 12
var/aiming_time_fire_threshold = 5
@@ -82,7 +81,6 @@
cell_type = /obj/item/stock_parts/cell/infinite
aiming_time = 0
recoil = 0
- pin = /obj/item/firing_pin
/obj/item/gun/energy/beam_rifle/equipped(mob/user)
set_user(user)
diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm
index 888e680479ea..161aa216b866 100644
--- a/code/modules/projectiles/guns/misc/blastcannon.dm
+++ b/code/modules/projectiles/guns/misc/blastcannon.dm
@@ -8,7 +8,6 @@
force = 10
fire_sound = 'sound/weapons/blastcannon.ogg'
item_flags = NONE
- clumsy_check = FALSE
randomspread = FALSE
var/hugbox = TRUE
@@ -26,11 +25,6 @@
debug_power = 80
bombcheck = FALSE
-/obj/item/gun/blastcannon/Initialize()
- . = ..()
- if(!pin)
- pin = new
-
/obj/item/gun/blastcannon/Destroy()
QDEL_NULL(bomb)
return ..()
diff --git a/code/modules/projectiles/guns/misc/chem_gun.dm b/code/modules/projectiles/guns/misc/chem_gun.dm
index 6d9c5eda699d..7c99b7156000 100644
--- a/code/modules/projectiles/guns/misc/chem_gun.dm
+++ b/code/modules/projectiles/guns/misc/chem_gun.dm
@@ -10,7 +10,6 @@
throw_range = 7
force = 4
custom_materials = list(/datum/material/iron=2000)
- clumsy_check = FALSE
fire_sound = 'sound/items/syringeproj.ogg'
var/time_per_syringe = 250
var/syringes_left = 4
@@ -30,7 +29,7 @@
/obj/item/gun/chem/can_shoot()
return syringes_left
-/obj/item/gun/chem/process_chamber()
+/obj/item/gun/chem/process_chamber(atom/shooter)
if(chambered && !chambered.BB && syringes_left)
chambered.newshot()
diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm
index 34af73b855c6..84d00b226371 100644
--- a/code/modules/projectiles/guns/misc/syringe_gun.dm
+++ b/code/modules/projectiles/guns/misc/syringe_gun.dm
@@ -8,7 +8,6 @@
throw_range = 7
force = 4
custom_materials = list(/datum/material/iron=2000)
- clumsy_check = 0
fire_sound = 'sound/items/syringeproj.ogg'
var/list/syringes = list()
var/max_syringes = 1
@@ -30,7 +29,7 @@
/obj/item/gun/syringe/can_shoot()
return syringes.len
-/obj/item/gun/syringe/process_chamber()
+/obj/item/gun/syringe/process_chamber(atom/shooter)
if(chambered && !chambered.BB) //we just fired
recharge_newshot()
diff --git a/code/modules/projectiles/guns/powered.dm b/code/modules/projectiles/guns/powered.dm
index 698826436b18..ac7418748d9b 100644
--- a/code/modules/projectiles/guns/powered.dm
+++ b/code/modules/projectiles/guns/powered.dm
@@ -52,10 +52,6 @@
/obj/item/gun/ballistic/automatic/powered/get_cell()
return cell
-/obj/item/gun/ballistic/automatic/powered/nopin
- pin = null
- spawnwithmagazine = FALSE
-
//the things below were taken from energy gun code. blame whoever coded this, not me
/obj/item/gun/ballistic/automatic/powered/attackby(obj/item/A, mob/user, params)
if (!internal_cell && istype(A, /obj/item/stock_parts/cell/gun))
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
deleted file mode 100644
index 23093e5d8d51..000000000000
--- a/code/modules/projectiles/pins.dm
+++ /dev/null
@@ -1,343 +0,0 @@
-/obj/item/firing_pin
- name = "electronic firing pin"
- desc = "A small authentication device, to be inserted into a firearm receiver to allow operation. NT safety regulations require all new designs to incorporate one."
- icon = 'icons/obj/device.dmi'
- icon_state = "firing_pin"
- item_state = "pen"
- flags_1 = CONDUCT_1
- w_class = WEIGHT_CLASS_TINY
- attack_verb = list("poked")
- var/fail_message = "INVALID USER."
- var/selfdestruct = 0 // Explode when user check is failed.
- var/force_replace = 0 // Can forcefully replace other pins.
- var/pin_removeable = 0 // Can be replaced by any pin.
- var/obj/item/gun/gun
-
-/obj/item/firing_pin/New(newloc)
- ..()
- if(istype(newloc, /obj/item/gun))
- gun = newloc
-
-/obj/item/firing_pin/afterattack(atom/target, mob/user, proximity_flag)
- . = ..()
- if(proximity_flag)
- if(istype(target, /obj/item/gun))
- var/obj/item/gun/G = target
- var/obj/item/firing_pin/old_pin = G.pin
- if(old_pin && (force_replace || old_pin.pin_removeable))
- to_chat(user, "You remove [old_pin] from [G].")
- if(Adjacent(user))
- user.put_in_hands(old_pin)
- else
- old_pin.forceMove(G.drop_location())
- old_pin.gun_remove(user)
-
- if(!G.pin)
- if(!user.temporarilyRemoveItemFromInventory(src))
- return
- gun_insert(user, G)
- to_chat(user, "You insert [src] into [G].")
- else
- to_chat(user, "This firearm already has a firing pin installed.")
-
-/obj/item/firing_pin/emag_act(mob/user)
- if(obj_flags & EMAGGED)
- return
- obj_flags |= EMAGGED
- to_chat(user, "You override the authentication mechanism.")
-
-/obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/G)
- gun = G
- forceMove(gun)
- gun.pin = src
- return
-
-/obj/item/firing_pin/proc/gun_remove(mob/living/user)
- gun.pin = null
- gun = null
- return
-
-/obj/item/firing_pin/proc/pin_auth(mob/living/user)
- return TRUE
-
-/obj/item/firing_pin/proc/auth_fail(mob/living/user)
- if(user)
- user.show_message(fail_message, MSG_VISUAL)
- if(selfdestruct)
- if(user)
- user.show_message("SELF-DESTRUCTING... ", MSG_VISUAL)
- to_chat(user, "[gun] explodes!")
- explosion(get_turf(gun), -1, 0, 2, 3)
- if(gun)
- qdel(gun)
-
-
-/obj/item/firing_pin/magic
- name = "magic crystal shard"
- desc = "A small enchanted shard which allows magical weapons to fire."
-
-
-// Test pin, works only near firing range.
-/obj/item/firing_pin/test_range
- name = "test-range firing pin"
- desc = "This safety firing pin allows weapons to be fired within proximity to a firing range."
- fail_message = "TEST RANGE CHECK FAILED."
- pin_removeable = TRUE
-
-/obj/item/firing_pin/test_range/pin_auth(mob/living/user)
- if(!istype(user))
- return FALSE
- if (istype(get_area(user), /area/ship/security/range))
- return TRUE
- return FALSE
-
-
-// Implant pin, checks for implant
-/obj/item/firing_pin/implant
- name = "implant-keyed firing pin"
- desc = "This is a security firing pin which only authorizes users who are implanted with a certain device."
- fail_message = "IMPLANT CHECK FAILED."
- var/obj/item/implant/req_implant = null
-
-/obj/item/firing_pin/implant/pin_auth(mob/living/user)
- if(user)
- for(var/obj/item/implant/I in user.implants)
- if(req_implant && I.type == req_implant)
- return TRUE
- return FALSE
-
-/obj/item/firing_pin/implant/mindshield
- name = "mindshield firing pin"
- desc = "This Security firing pin authorizes the weapon for only mindshield-implanted users."
- icon_state = "firing_pin_loyalty"
- req_implant = /obj/item/implant/mindshield
-
-/obj/item/firing_pin/implant/pindicate
- name = "syndicate firing pin"
- icon_state = "firing_pin_pindi"
- req_implant = /obj/item/implant/weapons_auth
-
-
-
-// Honk pin, clown's joke item.
-// Can replace other pins. Replace a pin in cap's laser for extra fun!
-/obj/item/firing_pin/clown
- name = "hilarious firing pin"
- desc = "Advanced clowntech that can convert any firearm into a far more useful object."
- color = "#FFFF00"
- fail_message = "HONK!"
- force_replace = TRUE
-
-/obj/item/firing_pin/clown/pin_auth(mob/living/user)
- playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE)
- return FALSE
-
-// Ultra-honk pin, clown's deadly joke item.
-// A gun with ultra-honk pin is useful for clown and useless for everyone else.
-/obj/item/firing_pin/clown/ultra
- name = "ultra hilarious firing pin"
-
-/obj/item/firing_pin/clown/ultra/pin_auth(mob/living/user)
- playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE)
- if(QDELETED(user)) //how the hell...?
- stack_trace("/obj/item/firing_pin/clown/ultra/pin_auth called with a [isnull(user) ? "null" : "invalid"] user.")
- return TRUE
- if(HAS_TRAIT(user, TRAIT_CLUMSY)) //clumsy
- return TRUE
- if(user.mind)
- if(user.mind.assigned_role == "Clown") //traitor clowns can use this, even though they're technically not clumsy
- return TRUE
- if(user.mind.has_antag_datum(/datum/antagonist/nukeop/clownop)) //clown ops aren't clumsy by default and technically don't have an assigned role of "Clown", but come on, they're basically clowns
- return TRUE
- if(user.mind.has_antag_datum(/datum/antagonist/nukeop/leader/clownop)) //Wanna hear a funny joke?
- return TRUE //The clown op leader antag datum isn't a subtype of the normal clown op antag datum.
- return FALSE
-
-/obj/item/firing_pin/clown/ultra/gun_insert(mob/living/user, obj/item/gun/G)
- ..()
- G.clumsy_check = FALSE
-
-/obj/item/firing_pin/clown/ultra/gun_remove(mob/living/user)
- gun.clumsy_check = initial(gun.clumsy_check)
- ..()
-
-// Now two times deadlier!
-/obj/item/firing_pin/clown/ultra/selfdestruct
- name = "super ultra hilarious firing pin"
- desc = "Advanced clowntech that can convert any firearm into a far more useful object. It has a small nitrobananium charge on it."
- selfdestruct = TRUE
-
-
-// DNA-keyed pin.
-// When you want to keep your toys for yourself.
-/obj/item/firing_pin/dna
- name = "DNA-keyed firing pin"
- desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link."
- icon_state = "firing_pin_dna"
- fail_message = "DNA CHECK FAILED."
- var/unique_enzymes = null
-
-/obj/item/firing_pin/dna/afterattack(atom/target, mob/user, proximity_flag)
- . = ..()
- if(proximity_flag && iscarbon(target))
- var/mob/living/carbon/M = target
- if(M.dna && M.dna.unique_enzymes)
- unique_enzymes = M.dna.unique_enzymes
- to_chat(user, "DNA-LOCK SET.")
-
-/obj/item/firing_pin/dna/pin_auth(mob/living/carbon/user)
- if(user && user.dna && user.dna.unique_enzymes)
- if(user.dna.unique_enzymes == unique_enzymes)
- return TRUE
- return FALSE
-
-/obj/item/firing_pin/dna/auth_fail(mob/living/carbon/user)
- if(!unique_enzymes)
- if(user && user.dna && user.dna.unique_enzymes)
- unique_enzymes = user.dna.unique_enzymes
- to_chat(user, "DNA-LOCK SET.")
- else
- ..()
-
-/obj/item/firing_pin/dna/dredd
- desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link. It has a small explosive charge on it."
- selfdestruct = TRUE
-
-// Paywall pin, brought to you by ARMA 3 DLC.
-// Checks if the user has a valid bank account on an ID and if so attempts to extract a one-time payment to authorize use of the gun. Otherwise fails to shoot.
-/obj/item/firing_pin/paywall
- name = "paywall firing pin"
- desc = "A firing pin with a built-in configurable paywall."
- color = "#FFD700"
- fail_message = ""
- var/list/gun_owners = list() //list of people who've accepted the license prompt. If this is the multi-payment pin, then this means they accepted the waiver that each shot will cost them money
- var/payment_amount //how much gets paid out to license yourself to the gun
- var/obj/item/card/id/pin_owner
- var/multi_payment = FALSE //if true, user has to pay everytime they fire the gun
- var/owned = FALSE
- var/active_prompt = FALSE //purchase prompt to prevent spamming it
-
-/obj/item/firing_pin/paywall/attack_self(mob/user)
- multi_payment = !multi_payment
- to_chat(user, "You set the pin to [(multi_payment) ? "process payment for every shot" : "one-time license payment"].")
-
-/obj/item/firing_pin/paywall/examine(mob/user)
- . = ..()
- if(pin_owner)
- . += "This firing pin is currently authorized to pay into the account of [pin_owner.registered_name]."
-
-/obj/item/firing_pin/paywall/gun_insert(mob/living/user, obj/item/gun/G)
- if(!pin_owner)
- to_chat(user, "ERROR: Please swipe valid identification card before installing firing pin!")
- return
- gun = G
- forceMove(gun)
- gun.pin = src
- if(multi_payment)
- gun.desc += " This [gun.name] has a per-shot cost of [payment_amount] credit[(payment_amount > 1) ? "s" : ""]."
- return
- gun.desc += " This [gun.name] has a license permit cost of [payment_amount] credit[(payment_amount > 1) ? "s" : ""]."
- return
-
-
-/obj/item/firing_pin/paywall/gun_remove(mob/living/user)
- gun.desc = initial(desc)
- ..()
-
-/obj/item/firing_pin/paywall/attackby(obj/item/M, mob/user, params)
- if(istype(M, /obj/item/card/id))
- var/obj/item/card/id/id = M
- if(!id.registered_account)
- to_chat(user, "ERROR: Identification card lacks registered bank account!")
- return
- if(id != pin_owner && owned)
- to_chat(user, "ERROR: This firing pin has already been authorized!")
- return
- if(id == pin_owner)
- to_chat(user, "You unlink the card from the firing pin.")
- gun_owners -= user
- pin_owner = null
- owned = FALSE
- return
- var/transaction_amount = input(user, "Insert valid deposit amount for gun purchase", "Money Deposit") as null|num
- if(transaction_amount < 1)
- to_chat(user, "ERROR: Invalid amount designated.")
- return
- if(!transaction_amount)
- return
- pin_owner = id
- owned = TRUE
- payment_amount = transaction_amount
- gun_owners += user
- to_chat(user, "You link the card to the firing pin.")
-
-/obj/item/firing_pin/paywall/pin_auth(mob/living/user)
- if(!istype(user))//nice try commie
- return FALSE
- if(ishuman(user))
- var/datum/bank_account/credit_card_details
- var/mob/living/carbon/human/H = user
- if(H.get_bank_account())
- credit_card_details = H.get_bank_account()
- if(H in gun_owners)
- if(multi_payment && credit_card_details)
- if(credit_card_details.adjust_money(-payment_amount))
- pin_owner.registered_account.adjust_money(payment_amount)
- return TRUE
- to_chat(user, "ERROR: User balance insufficent for successful transaction!")
- return FALSE
- return TRUE
- if(credit_card_details && !active_prompt)
- var/license_request = alert(usr, "Do you wish to pay [payment_amount] credit[(payment_amount > 1) ? "s" : ""] for [(multi_payment) ? "each shot of [gun.name]" : "usage license of [gun.name]"]?", "Weapon Purchase", "Yes", "No")
- active_prompt = TRUE
- if(!user.canUseTopic(src, BE_CLOSE))
- active_prompt = FALSE
- return FALSE
- switch(license_request)
- if("Yes")
- if(credit_card_details.adjust_money(-payment_amount))
- pin_owner.registered_account.adjust_money(payment_amount)
- gun_owners += H
- to_chat(user, "Gun license purchased, have a secure day!")
- active_prompt = FALSE
- return FALSE //we return false here so you don't click initially to fire, get the prompt, accept the prompt, and THEN the gun
- to_chat(user, "ERROR: User balance insufficent for successful transaction!")
- return FALSE
- if("No")
- to_chat(user, "ERROR: User has declined to purchase gun license!")
- return FALSE
- to_chat(user, "ERROR: User has no valid bank account to substract neccesary funds from!")
- return FALSE
-
-// Laser tag pins
-/obj/item/firing_pin/tag
- name = "laser tag firing pin"
- desc = "A recreational firing pin, used in laser tag units to ensure users have their vests on."
- fail_message = "SUIT CHECK FAILED."
- var/obj/item/clothing/suit/suit_requirement = null
- var/tagcolor = ""
-
-/obj/item/firing_pin/tag/pin_auth(mob/living/user)
- if(ishuman(user))
- var/mob/living/carbon/human/M = user
- if(istype(M.wear_suit, suit_requirement))
- return TRUE
- to_chat(user, "You need to be wearing [tagcolor] laser tag armor!")
- return FALSE
-
-/obj/item/firing_pin/tag/red
- name = "red laser tag firing pin"
- icon_state = "firing_pin_red"
- suit_requirement = /obj/item/clothing/suit/redtag
- tagcolor = "red"
-
-/obj/item/firing_pin/tag/blue
- name = "blue laser tag firing pin"
- icon_state = "firing_pin_blue"
- suit_requirement = /obj/item/clothing/suit/bluetag
- tagcolor = "blue"
-
-/obj/item/firing_pin/Destroy()
- if(gun)
- gun.pin = null
- return ..()
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 7cc9b1c6ebb4..0b9bcb8da4f7 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -1,7 +1,3 @@
-
-#define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan.
-#define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers.
-
/obj/projectile
name = "projectile"
icon = 'icons/obj/projectiles.dmi'
@@ -133,7 +129,7 @@
var/homing_offset_y = 0
var/damage = 10
- var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here
+ var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE, STAMINA are the only things that should be in here
var/nodamage = FALSE //Determines if the projectile will skip any damage inflictions
var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb
///How much armor this projectile pierces.
@@ -209,7 +205,11 @@
SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle)
// i know that this is probably more with wands and gun mods in mind, but it's a bit silly that the projectile on_hit signal doesn't ping the projectile itself.
// maybe we care what the projectile thinks! See about combining these via args some time when it's not 5AM
- SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle)
+ var/obj/item/bodypart/hit_limb
+ if(isliving(target))
+ var/mob/living/L = target
+ hit_limb = L.check_limb_hit(def_zone)
+ SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle, hit_limb)
var/turf/target_loca = get_turf(target)
var/hitx
@@ -259,7 +259,7 @@
new impact_effect_type(target_loca, hitx, hity)
var/organ_hit_text = ""
- var/limb_hit = L.check_limb_hit(def_zone)//to get the correct message info.
+ var/limb_hit = hit_limb
if(limb_hit)
organ_hit_text = " in \the [parse_zone(limb_hit)]"
if(suppressed==SUPPRESSED_VERY)
@@ -302,7 +302,7 @@
if(firer && HAS_TRAIT(firer, TRAIT_NICE_SHOT))
best_angle += NICE_SHOT_RICOCHET_BONUS
for(var/mob/living/L in range(ricochet_auto_aim_range, src.loc))
- if(L.stat == DEAD || !isInSight(src, L))
+ if(L.stat == DEAD || !isInSight(src, L) || L == firer)
continue
var/our_angle = abs(closer_angle_difference(Angle, Get_Angle(src.loc, L.loc)))
if(our_angle < best_angle)
diff --git a/code/modules/projectiles/projectile/bullets/gauss.dm b/code/modules/projectiles/projectile/bullets/gauss.dm
index 0955745ed798..6011adb61c88 100644
--- a/code/modules/projectiles/projectile/bullets/gauss.dm
+++ b/code/modules/projectiles/projectile/bullets/gauss.dm
@@ -5,7 +5,8 @@
icon_state = "gauss-pellet"
damage = 25
range = 35
- light_color = COLOR_SOFT_RED
+ light_system = 2
+ light_color = MOVABLE_LIGHT
light_range = 3
// Ferromagnetic Lance (GAR AR)
diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm
index ddd3319122c7..f7b963cff94b 100644
--- a/code/modules/projectiles/projectile/bullets/rifle.dm
+++ b/code/modules/projectiles/projectile/bullets/rifle.dm
@@ -77,5 +77,5 @@
/obj/projectile/bullet/c299
name = ".229 Eoehoma caseless bullet"
- damage = 25
- armour_penetration = 20
+ damage = 20
+ armour_penetration = 10
diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm
index e102c4c3b48f..ba9c8c88d7f8 100644
--- a/code/modules/projectiles/projectile/bullets/shotgun.dm
+++ b/code/modules/projectiles/projectile/bullets/shotgun.dm
@@ -18,7 +18,7 @@
/obj/projectile/bullet/incendiary/shotgun/dragonsbreath
name = "dragonsbreath pellet"
- damage = 5
+ damage = 8
armour_penetration = -35
/obj/projectile/bullet/slug/stun
diff --git a/code/modules/projectiles/projectile/energy/ebow.dm b/code/modules/projectiles/projectile/energy/ebow.dm
index 6d4890290575..c29c692b7e78 100644
--- a/code/modules/projectiles/projectile/energy/ebow.dm
+++ b/code/modules/projectiles/projectile/energy/ebow.dm
@@ -12,6 +12,7 @@
/obj/projectile/energy/bolt/halloween
name = "candy corn"
icon_state = "candy_corn"
+ icon = 'icons/obj/food/food.dmi'
/obj/projectile/energy/bolt/large
damage = 20
diff --git a/code/modules/projectiles/projectile/energy/misc.dm b/code/modules/projectiles/projectile/energy/misc.dm
index 81fed69d516a..11f948ddb415 100644
--- a/code/modules/projectiles/projectile/energy/misc.dm
+++ b/code/modules/projectiles/projectile/energy/misc.dm
@@ -23,3 +23,22 @@
icon_state = "pulse1"
damage = 0
damage_type = BURN
+
+/obj/projectile/energy/plasmabolt
+ name = "ionized plasma"
+ damage = 25
+ armour_penetration = -10
+ range = 8
+ damage_type = BURN
+ icon_state = "blastwave"
+ color = "#00ff00"
+ hitsound = 'sound/weapons/sear.ogg'
+
+/obj/projectile/energy/plasmabolt/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ M.adjust_bodytemperature(350)
+ if(prob(35))
+ M.adjust_fire_stacks(15)
+ M.IgniteMob()
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
deleted file mode 100644
index 458c19d053da..000000000000
--- a/code/modules/projectiles/projectile/magic.dm
+++ /dev/null
@@ -1,736 +0,0 @@
-/obj/projectile/magic
- name = "bolt"
- icon_state = "energy"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
- armour_penetration = 100
- flag = "magic"
-
-/obj/projectile/magic/death
- name = "bolt of death"
- icon_state = "pulse1_bl"
-
-/obj/projectile/magic/death/on_hit(target)
- . = ..()
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- if(isliving(M))
- var/mob/living/L = M
- if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead
- if(L.hellbound && L.stat == DEAD)
- return BULLET_ACT_BLOCK
- if(L.revive(full_heal = TRUE, admin_revive = TRUE))
- L.grab_ghost(force = TRUE)
- to_chat(L, "You rise with a start, you're undead!!!")
- else if(L.stat != DEAD)
- to_chat(L, "You feel great!")
- else
- L.death(0)
- else
- M.death(0)
-
-/obj/projectile/magic/resurrection
- name = "bolt of resurrection"
- icon_state = "ion"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
-
-/obj/projectile/magic/resurrection/on_hit(mob/living/carbon/target)
- . = ..()
- if(isliving(target))
- if(target.anti_magic_check())
- target.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- if(target.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead
- target.death(0)
- else
- if(target.hellbound && target.stat == DEAD)
- return BULLET_ACT_BLOCK
- if(target.revive(full_heal = TRUE, admin_revive = TRUE))
- target.grab_ghost(force = TRUE) // even suicides
- to_chat(target, "You rise with a start, you're alive!!!")
- else if(target.stat != DEAD)
- to_chat(target, "You feel great!")
-
-/obj/projectile/magic/teleport
- name = "bolt of teleportation"
- icon_state = "bluespace"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
- var/inner_tele_radius = 0
- var/outer_tele_radius = 6
-
-/obj/projectile/magic/teleport/on_hit(mob/target)
- . = ..()
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] fizzles on contact with [target]!")
- return BULLET_ACT_BLOCK
- var/teleammount = 0
- var/teleloc = target
- if(!isturf(target))
- teleloc = target.loc
- for(var/atom/movable/stuff in teleloc)
- if(!stuff.anchored && stuff.loc && !isobserver(stuff))
- if(do_teleport(stuff, stuff, 10, channel = TELEPORT_CHANNEL_MAGIC))
- teleammount++
- var/datum/effect_system/smoke_spread/smoke = new
- smoke.set_up(max(round(4 - teleammount),0), stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity
- smoke.start()
-
-/obj/projectile/magic/safety
- name = "bolt of safety"
- icon_state = "bluespace"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
-
-/obj/projectile/magic/safety/on_hit(atom/target)
- . = ..()
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] fizzles on contact with [target]!")
- return BULLET_ACT_BLOCK
- if(isturf(target))
- return BULLET_ACT_HIT
-
- var/turf/origin_turf = get_turf(target)
- var/turf/destination_turf = find_safe_turf()
-
- if(do_teleport(target, destination_turf, channel=TELEPORT_CHANNEL_MAGIC))
- for(var/t in list(origin_turf, destination_turf))
- var/datum/effect_system/smoke_spread/smoke = new
- smoke.set_up(0, t)
- smoke.start()
-
-/obj/projectile/magic/door
- name = "bolt of door creation"
- icon_state = "energy"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
- var/list/door_types = list(/obj/structure/mineral_door/wood, /obj/structure/mineral_door/iron, /obj/structure/mineral_door/silver, /obj/structure/mineral_door/gold, /obj/structure/mineral_door/uranium, /obj/structure/mineral_door/sandstone, /obj/structure/mineral_door/transparent/plasma, /obj/structure/mineral_door/transparent/diamond)
-
-/obj/projectile/magic/door/on_hit(atom/target)
- . = ..()
- if(istype(target, /obj/machinery/door))
- OpenDoor(target)
- else
- var/turf/T = get_turf(target)
- if(isclosedturf(T) && !isindestructiblewall(T))
- CreateDoor(T)
-
-/obj/projectile/magic/door/proc/CreateDoor(turf/T)
- var/door_type = pick(door_types)
- var/obj/structure/mineral_door/D = new door_type(T)
- T.ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
- D.Open()
-
-/obj/projectile/magic/door/proc/OpenDoor(obj/machinery/door/D)
- if(istype(D, /obj/machinery/door/airlock))
- var/obj/machinery/door/airlock/A = D
- A.locked = FALSE
- D.open()
-
-/obj/projectile/magic/change
- name = "bolt of change"
- icon_state = "ice_1"
- damage = 0
- damage_type = BURN
- nodamage = TRUE
-
-/obj/projectile/magic/change/on_hit(atom/change)
- . = ..()
- if(ismob(change))
- var/mob/M = change
- if(M.anti_magic_check())
- M.visible_message("[src] fizzles on contact with [M]!")
- qdel(src)
- return BULLET_ACT_BLOCK
- wabbajack(change)
- qdel(src)
-
-/proc/wabbajack(mob/living/M)
- if(!istype(M) || M.stat == DEAD || M.notransform || (GODMODE & M.status_flags))
- return
-
- M.notransform = TRUE
- ADD_TRAIT(M, TRAIT_IMMOBILIZED, MAGIC_TRAIT)
- ADD_TRAIT(M, TRAIT_HANDS_BLOCKED, MAGIC_TRAIT)
- M.icon = null
- M.cut_overlays()
- M.invisibility = INVISIBILITY_ABSTRACT
-
- var/list/contents = M.contents.Copy()
-
- if(iscyborg(M))
- var/mob/living/silicon/robot/Robot = M
- // Disconnect AI's in shells
- if(Robot.connected_ai)
- Robot.connected_ai.disconnect_shell()
- if(Robot.mmi)
- qdel(Robot.mmi)
- Robot.notify_ai(NEW_BORG)
- else
- for(var/obj/item/W in contents)
- if(!M.dropItemToGround(W))
- qdel(W)
-
- var/mob/living/new_mob
-
- var/randomize = pick("monkey","robot","slime","xeno","humanoid","animal")
- switch(randomize)
- if("monkey")
- new_mob = new /mob/living/carbon/monkey(M.loc)
-
- if("robot")
- var/robot = pick(200;/mob/living/silicon/robot,
- /mob/living/silicon/robot/modules/syndicate,
- /mob/living/silicon/robot/modules/syndicate/medical,
- /mob/living/silicon/robot/modules/syndicate/saboteur,
- 200;/mob/living/simple_animal/drone/polymorphed)
- new_mob = new robot(M.loc)
- if(issilicon(new_mob))
- new_mob.gender = M.gender
- new_mob.invisibility = 0
- new_mob.job = "Cyborg"
- var/mob/living/silicon/robot/Robot = new_mob
- Robot.lawupdate = FALSE
- Robot.connected_ai = null
- Robot.mmi.transfer_identity(M) //Does not transfer key/client.
- Robot.clear_inherent_laws(0)
- Robot.clear_zeroth_law(0)
-
- if("slime")
- new_mob = new /mob/living/simple_animal/slime/random(M.loc)
-
- if("xeno")
- var/Xe
- if(M.ckey)
- Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/carbon/alien/humanoid/sentinel)
- else
- Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/simple_animal/hostile/alien/sentinel)
- new_mob = new Xe(M.loc)
-
- if("animal")
- var/path = pick(/mob/living/simple_animal/hostile/carp,
- /mob/living/simple_animal/hostile/bear,
- /mob/living/simple_animal/hostile/mushroom,
- /mob/living/simple_animal/hostile/statue,
- /mob/living/simple_animal/hostile/retaliate/bat,
- /mob/living/simple_animal/hostile/retaliate/goat,
- /mob/living/simple_animal/hostile/killertomato,
- /mob/living/simple_animal/hostile/poison/giant_spider,
- /mob/living/simple_animal/hostile/poison/giant_spider/hunter,
- /mob/living/simple_animal/hostile/blob/blobbernaut/independent,
- /mob/living/simple_animal/hostile/carp/ranged,
- /mob/living/simple_animal/hostile/carp/ranged/chaos,
- /mob/living/simple_animal/hostile/asteroid/basilisk/watcher,
- /mob/living/simple_animal/hostile/asteroid/goliath/beast,
- /mob/living/simple_animal/hostile/headcrab,
- /mob/living/simple_animal/hostile/morph,
- /mob/living/simple_animal/hostile/stickman,
- /mob/living/simple_animal/hostile/stickman/dog,
- /mob/living/simple_animal/hostile/megafauna/dragon/lesser,
- /mob/living/simple_animal/hostile/gorilla,
- /mob/living/simple_animal/parrot,
- /mob/living/simple_animal/pet/dog/corgi,
- /mob/living/simple_animal/crab,
- /mob/living/simple_animal/pet/dog/pug,
- /mob/living/simple_animal/pet/cat,
- /mob/living/simple_animal/mouse,
- /mob/living/simple_animal/chicken,
- /mob/living/simple_animal/cow,
- /mob/living/simple_animal/hostile/lizard,
- /mob/living/simple_animal/pet/fox,
- /mob/living/simple_animal/butterfly,
- /mob/living/simple_animal/pet/cat/cak,
- /mob/living/simple_animal/chick)
- new_mob = new path(M.loc)
-
- if("humanoid")
- new_mob = new /mob/living/carbon/human(M.loc)
-
- if(prob(50))
- var/list/chooseable_races = list()
- for(var/speciestype in subtypesof(/datum/species))
- var/datum/species/S = speciestype
- if(initial(S.changesource_flags) & WABBAJACK)
- chooseable_races += speciestype
-
- if(chooseable_races.len)
- new_mob.set_species(pick(chooseable_races))
-
- var/datum/preferences/A = new() //Randomize appearance for the human
- A.copy_to(new_mob, icon_updates=0)
-
- var/mob/living/carbon/human/H = new_mob
- H.update_hair()
- H.update_body_parts(TRUE)
- H.dna.update_dna_identity()
-
- if(!new_mob)
- return
-
- // Some forms can still wear some items
- for(var/obj/item/W in contents)
- new_mob.equip_to_appropriate_slot(W)
-
- M.log_message("became [new_mob.real_name]", LOG_ATTACK, color="orange")
-
- new_mob.a_intent = INTENT_HARM
-
- M.wabbajack_act(new_mob)
-
- to_chat(new_mob, "Your form morphs into that of a [randomize].")
-
- var/poly_msg = get_policy(POLICY_POLYMORPH)
- if(poly_msg)
- to_chat(new_mob, poly_msg)
-
- M.transfer_observers_to(new_mob)
-
- qdel(M)
- return new_mob
-
-/obj/projectile/magic/animate
- name = "bolt of animation"
- icon_state = "red_1"
- damage = 0
- damage_type = BURN
- nodamage = TRUE
-
-/obj/projectile/magic/animate/on_hit(atom/target, blocked = FALSE)
- target.animate_atom_living(firer)
- ..()
-
-/atom/proc/animate_atom_living(mob/living/owner = null)
- if((isitem(src) || isstructure(src)) && !is_type_in_list(src, GLOB.protected_objects))
- if(istype(src, /obj/structure/statue/petrified))
- var/obj/structure/statue/petrified/P = src
- if(P.petrified_mob)
- var/mob/living/L = P.petrified_mob
- var/mob/living/simple_animal/hostile/statue/S = new(P.loc, owner)
- S.name = "statue of [L.name]"
- if(owner)
- S.faction = list("[REF(owner)]")
- S.icon = P.icon
- S.icon_state = P.icon_state
- S.copy_overlays(P, TRUE)
- S.color = P.color
- S.atom_colours = P.atom_colours.Copy()
- if(L.mind)
- L.mind.transfer_to(S)
- if(owner)
- to_chat(S, "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.")
- P.forceMove(S)
- return
- else
- var/obj/O = src
- if(istype(O, /obj/item/gun))
- new /mob/living/simple_animal/hostile/mimic/copy/ranged(loc, src, owner)
- else
- new /mob/living/simple_animal/hostile/mimic/copy(loc, src, owner)
-
- else if(istype(src, /mob/living/simple_animal/hostile/mimic/copy))
- // Change our allegiance!
- var/mob/living/simple_animal/hostile/mimic/copy/C = src
- if(owner)
- C.ChangeOwner(owner)
-
-/obj/projectile/magic/spellblade
- name = "blade energy"
- icon_state = "lavastaff"
- damage = 15
- damage_type = BURN
- flag = "magic"
- dismemberment = 50
- nodamage = FALSE
-
-/obj/projectile/magic/spellblade/on_hit(target)
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] vanishes on contact with [target]!")
- qdel(src)
- return BULLET_ACT_BLOCK
- . = ..()
-
-/obj/projectile/magic/arcane_barrage
- name = "arcane bolt"
- icon_state = "arcane_barrage"
- damage = 20
- damage_type = BURN
- nodamage = FALSE
- armour_penetration = 0
- flag = "magic"
- hitsound = 'sound/weapons/barragespellhit.ogg'
-
-/obj/projectile/magic/arcane_barrage/on_hit(target)
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] vanishes on contact with [target]!")
- qdel(src)
- return BULLET_ACT_BLOCK
- . = ..()
-
-
-/obj/projectile/magic/locker
- name = "locker bolt"
- icon_state = "locker"
- nodamage = TRUE
- flag = "magic"
- var/weld = TRUE
- var/created = FALSE //prevents creation of more then one locker if it has multiple hits
- var/locker_suck = TRUE
- var/obj/structure/closet/locker_temp_instance = /obj/structure/closet/decay
-
-/obj/projectile/magic/locker/Initialize()
- . = ..()
- locker_temp_instance = new(src)
-
-/obj/projectile/magic/locker/prehit_pierce(atom/A)
- . = ..()
- if(isliving(A) && locker_suck)
- var/mob/living/M = A
- if(M.anti_magic_check()) // no this doesn't check if ..() returned to phase through do I care no it's magic ain't gotta explain shit
- M.visible_message("[src] vanishes on contact with [A]!")
- return PROJECTILE_DELETE_WITHOUT_HITTING
- if(!locker_temp_instance.insertion_allowed(M))
- return
- M.forceMove(src)
- return PROJECTILE_PIERCE_PHASE
-
-/obj/projectile/magic/locker/on_hit(target)
- if(created)
- return ..()
- if(LAZYLEN(contents))
- for(var/atom/movable/AM in contents)
- locker_temp_instance.insert(AM)
- locker_temp_instance.welded = weld
- locker_temp_instance.update_appearance()
- created = TRUE
- return ..()
-
-/obj/projectile/magic/locker/Destroy()
- locker_suck = FALSE
- RemoveElement(/datum/element/connect_loc, projectile_connections) //We do this manually so the forcemoves don't "hit" us. This behavior is kinda dumb, someone refactor this
- for(var/atom/movable/AM in contents)
- AM.forceMove(get_turf(src))
- . = ..()
-
-/obj/structure/closet/decay
- breakout_time = 600
- icon_welded = null
- var/magic_icon = "cursed"
- var/weakened_icon = "decursed"
- var/auto_destroy = TRUE
-
-/obj/structure/closet/decay/Initialize()
- . = ..()
- if(auto_destroy)
- addtimer(CALLBACK(src, PROC_REF(bust_open)), 5 MINUTES)
- addtimer(CALLBACK(src, PROC_REF(magicly_lock)), 5)
-
-/obj/structure/closet/decay/proc/magicly_lock()
- if(!welded)
- return
- icon_state = magic_icon
- update_appearance()
-
-/obj/structure/closet/decay/after_weld(weld_state)
- if(weld_state)
- unmagify()
-
-/obj/structure/closet/decay/proc/decay()
- animate(src, alpha = 0, time = 30)
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), 30)
-
-/obj/structure/closet/decay/open(mob/living/user, force = FALSE)
- . = ..()
- if(.)
- if(icon_state == magic_icon) //check if we used the magic icon at all before giving it the lesser magic icon
- unmagify()
- else
- addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS)
-
-/obj/structure/closet/decay/proc/unmagify()
- icon_state = weakened_icon
- update_appearance()
- addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS)
- icon_welded = "welded"
-
-/obj/projectile/magic/flying
- name = "bolt of flying"
- icon_state = "flight"
-
-/obj/projectile/magic/flying/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check())
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- var/atom/throw_target = get_edge_target_turf(L, angle2dir(Angle))
- L.throw_at(throw_target, 200, 4)
-
-/obj/projectile/magic/bounty
- name = "bolt of bounty"
- icon_state = "bounty"
-
-/obj/projectile/magic/bounty/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check() || !firer)
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- L.apply_status_effect(STATUS_EFFECT_BOUNTY, firer)
-
-/obj/projectile/magic/antimagic
- name = "bolt of antimagic"
- icon_state = "antimagic"
-
-/obj/projectile/magic/antimagic/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check())
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- L.apply_status_effect(STATUS_EFFECT_ANTIMAGIC)
-
-/obj/projectile/magic/fetch
- name = "bolt of fetching"
- icon_state = "fetch"
-
-/obj/projectile/magic/fetch/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check() || !firer)
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- var/atom/throw_target = get_edge_target_turf(L, get_dir(L, firer))
- L.throw_at(throw_target, 200, 4)
-
-/obj/projectile/magic/sapping
- name = "bolt of sapping"
- icon_state = "sapping"
-
-/obj/projectile/magic/sapping/on_hit(target)
- . = ..()
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/sapped)
-
-/obj/projectile/magic/necropotence
- name = "bolt of necropotence"
- icon_state = "necropotence"
-
-/obj/projectile/magic/necropotence/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul)
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- to_chat(L, "Your body feels drained and there is a burning pain in your chest.")
- L.maxHealth -= 20
- L.health = min(L.health, L.maxHealth)
- if(L.maxHealth <= 0)
- to_chat(L, "Your weakened soul is completely consumed by the [src]!")
- L.mind.hasSoul = FALSE
- for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list)
- spell.charge_counter = spell.charge_max
- spell.recharging = FALSE
- spell.update_appearance()
-
-/obj/projectile/magic/fortify
- name = "bolt of light"
- icon_state = "spark"
-
-/obj/projectile/magic/fortify/on_hit(target)
- . = ..()
- if(isliving(target))
- var/mob/living/L = target
- if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul)
- L.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- to_chat(L, "You feel your body flood with magical strength! Your flesh feels cleansed, and somehow... tougher.")
- L.maxHealth += 20
- L.heal_overall_damage(20, 20)
- L.apply_damage(-200, CLONE)//cleanses cellular damage
- if(L.mind.hasSoul == FALSE)//restores consumed souls
- to_chat(L, "You feel a warm light in your chest... the [src] has restored something you'd long forgotten.")
- L.mind.hasSoul = TRUE
- if(L.hellbound == 1)
- L.hellbound = 0//devil economy in shambles
- for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list)
- spell.charge_counter = spell.charge_max
- spell.recharging = FALSE
- spell.update_appearance()
-
-/obj/projectile/magic/wipe
- name = "bolt of possession"
- icon_state = "wipe"
-
-/obj/projectile/magic/wipe/on_hit(target)
- . = ..()
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- if(M.anti_magic_check())
- M.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- for(var/x in M.get_traumas())//checks to see if the victim is already going through possession
- if(istype(x, /datum/brain_trauma/special/imaginary_friend/trapped_owner))
- M.visible_message("[src] vanishes on contact with [target]!")
- return BULLET_ACT_BLOCK
- to_chat(M, "Your mind has been opened to possession!")
- possession_test(M)
- return BULLET_ACT_HIT
-
-/obj/projectile/magic/wipe/proc/possession_test(mob/living/carbon/M)
- var/datum/brain_trauma/special/imaginary_friend/trapped_owner/trauma = M.gain_trauma(/datum/brain_trauma/special/imaginary_friend/trapped_owner)
- var/poll_message = "Do you want to play as [M.real_name]?"
- if(M.mind && M.mind.assigned_role)
- poll_message = "[poll_message] Job:[M.mind.assigned_role]."
- if(M.mind && M.mind.special_role)
- poll_message = "[poll_message] Status:[M.mind.special_role]."
- else if(M.mind)
- var/datum/antagonist/A = M.mind.has_antag_datum(/datum/antagonist/)
- if(A)
- poll_message = "[poll_message] Status:[A.name]."
- var/list/mob/dead/observer/candidates = pollCandidatesForMob(poll_message, ROLE_PAI, null, FALSE, 100, M)
- if(M.stat == DEAD)//boo.
- return
- if(LAZYLEN(candidates))
- var/mob/dead/observer/C = pick(candidates)
- to_chat(M, "You have been noticed by a ghost and it has possessed you!")
- var/oldkey = M.key
- M.ghostize(0)
- M.key = C.key
- trauma.friend.key = oldkey
- trauma.friend.reset_perspective(null)
- trauma.friend.Show()
- trauma.friend_initialized = TRUE
- else
- to_chat(M, "Your mind has managed to go unnoticed in the spirit world.")
- qdel(trauma)
-
-/obj/projectile/magic/aoe
- name = "Area Bolt"
- desc = "What the fuck does this do?!"
- damage = 0
- var/proxdet = TRUE
-
-/obj/projectile/magic/aoe/Range()
- if(proxdet)
- for(var/mob/living/L in range(1, get_turf(src)))
- if(L.stat != DEAD && L != firer && !L.anti_magic_check())
- return Bump(L)
- ..()
-
-
-/obj/projectile/magic/aoe/lightning
- name = "lightning bolt"
- icon_state = "tesla_projectile" //Better sprites are REALLY needed and appreciated!~
- damage = 15
- damage_type = BURN
- nodamage = FALSE
- speed = 0.3
- flag = "magic"
-
- var/zap_power = 20000
- var/zap_range = 15
- var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE
- var/chain
- var/mob/living/caster
-
-/obj/projectile/magic/aoe/lightning/fire(setAngle)
- if(caster)
- chain = caster.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY)
- ..()
-
-/obj/projectile/magic/aoe/lightning/on_hit(target)
- . = ..()
- if(ismob(target))
- var/mob/M = target
- if(M.anti_magic_check())
- visible_message("[src] fizzles on contact with [target]!")
- qdel(src)
- return BULLET_ACT_BLOCK
- tesla_zap(src, zap_range, zap_power, zap_flags)
- qdel(src)
-
-/obj/projectile/magic/aoe/lightning/Destroy()
- qdel(chain)
- . = ..()
-
-/obj/projectile/magic/aoe/fireball
- name = "bolt of fireball"
- icon_state = "fireball"
- damage = 10
- damage_type = BRUTE
- nodamage = FALSE
-
- //explosion values
- var/exp_heavy = 0
- var/exp_light = 2
- var/exp_flash = 3
- var/exp_fire = 2
-
-/obj/projectile/magic/aoe/fireball/on_hit(target)
- . = ..()
- if(ismob(target))
- var/mob/living/M = target
- if(M.anti_magic_check())
- visible_message("[src] vanishes into smoke on contact with [target]!")
- return BULLET_ACT_BLOCK
- M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately
- var/turf/T = get_turf(target)
- explosion(T, -1, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire)
-
-/obj/projectile/magic/aoe/fireball/infernal
- name = "infernal fireball"
- exp_heavy = -1
- exp_light = -1
- exp_flash = 4
- exp_fire= 5
-
-/obj/projectile/magic/aoe/fireball/infernal/on_hit(target)
- . = ..()
- if(ismob(target))
- var/mob/living/M = target
- if(M.anti_magic_check())
- return BULLET_ACT_BLOCK
- var/turf/T = get_turf(target)
- for(var/i=0, i<50, i+=10)
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i)
-
-//still magic related, but a different path
-
-/obj/projectile/temp/chill
- name = "bolt of chills"
- icon_state = "ice_2"
- damage = 0
- damage_type = BURN
- nodamage = FALSE
- armour_penetration = 100
- temperature = -200 // Cools you down greatly per hit
- flag = "magic"
-
-/obj/projectile/magic/nothing
- name = "bolt of nothing"
diff --git a/code/modules/projectiles/projectile/magic/spellcard.dm b/code/modules/projectiles/projectile/magic/spellcard.dm
deleted file mode 100644
index 464586d2f8a4..000000000000
--- a/code/modules/projectiles/projectile/magic/spellcard.dm
+++ /dev/null
@@ -1,6 +0,0 @@
-/obj/projectile/spellcard
- name = "enchanted card"
- desc = "A piece of paper enchanted to give it extreme durability and stiffness, along with a very hot burn to anyone unfortunate enough to get hit by a charged one."
- icon_state = "spellcard"
- damage_type = BURN
- damage = 2
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index f62a3a32035d..86f4e05226e4 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -389,7 +389,7 @@
for(var/addiction in cached_addictions)
var/datum/reagent/A = addiction
if(istype(R, A))
- A.addiction_stage = -15 // you're satisfied for a good while.
+ A.addiction_stage = -30 // you're satisfied for a good while.
need_mob_update += R.on_mob_life(C)
if(can_overdose)
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 0985ce758976..037256db302f 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -1,12 +1,12 @@
/proc/translate_legacy_chem_id(id)
- switch (id)
- if ("sacid")
+ switch(id)
+ if("sacid")
return "sulphuricacid"
- if ("facid")
+ if("facid")
return "fluorosulfuricacid"
- if ("co2")
+ if("co2")
return "carbondioxide"
- if ("mine_salve")
+ if("mine_salve")
return "minerssalve"
else
return ckey(id)
@@ -15,11 +15,11 @@
name = "chem dispenser"
desc = "Creates and dispenses chemicals."
density = TRUE
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/chem_machines.dmi'
icon_state = "dispenser"
base_icon_state = "dispenser"
use_power = IDLE_POWER_USE
- idle_power_usage = 40
+ idle_power_usage = IDLE_DRAW_MINIMAL
interaction_flags_machine = INTERACT_MACHINE_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE
resistance_flags = FIRE_PROOF | ACID_PROOF
circuit = /obj/item/circuitboard/machine/chem_dispenser
@@ -451,7 +451,7 @@
/obj/machinery/chem_dispenser/drinks
name = "soda dispenser"
desc = "Contains a large reservoir of soft drinks."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/chem_machines.dmi'
icon_state = "soda_dispenser"
base_icon_state = "soda_dispenser"
has_panel_overlay = FALSE
@@ -509,7 +509,7 @@
name = "booze dispenser"
desc = "Contains a large reservoir of the good stuff."
base_icon_state = "booze_dispenser"
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/chem_machines.dmi'
icon_state = "booze_dispenser"
circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks/beer
dispensable_reagents = list(
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index b3a0cfee615d..88e7973dd29c 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -1,11 +1,11 @@
/obj/machinery/chem_heater
name = "chemical heater"
density = TRUE
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/chem_machines.dmi'
icon_state = "mixer0b"
base_icon_state = "mixer"
use_power = IDLE_POWER_USE
- idle_power_usage = 40
+ idle_power_usage = IDLE_DRAW_MINIMAL
resistance_flags = FIRE_PROOF | ACID_PROOF
circuit = /obj/item/circuitboard/machine/chem_heater
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 602c37710a57..c9791666b54f 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -3,11 +3,11 @@
desc = "Used to separate chemicals and distribute them in a variety of forms."
density = TRUE
layer = BELOW_OBJ_LAYER
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/chem_machines.dmi'
icon_state = "mixer0"
base_icon_state = "mixer"
use_power = IDLE_POWER_USE
- idle_power_usage = 20
+ idle_power_usage = IDLE_DRAW_MINIMAL
resistance_flags = FIRE_PROOF | ACID_PROOF
circuit = /obj/item/circuitboard/machine/chem_master
diff --git a/code/modules/reagents/chemistry/machinery/chem_press.dm b/code/modules/reagents/chemistry/machinery/chem_press.dm
index 80500efc78bf..43cd01e63b65 100644
--- a/code/modules/reagents/chemistry/machinery/chem_press.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_press.dm
@@ -1,7 +1,7 @@
/obj/machinery/chem_press
name = "pill press"
desc = "A press operated by hand to produce pills in a variety of forms."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/chem_machines.dmi'
icon_state = "press"
pass_flags = PASSTABLE
use_power = FALSE
@@ -26,17 +26,17 @@
/obj/machinery/chem_press/Initialize()
. = ..()
beaker = new /obj/item/reagent_containers/glass/beaker/large(src)
- beaker_overlay = image(icon = 'icons/obj/chemical.dmi', icon_state = "press_beaker")
- bottle_overlay = image(icon = 'icons/obj/chemical.dmi', icon_state = "press_bottle")
+ beaker_overlay = image(icon = 'icons/obj/chemical/chem_machines.dmi', icon_state = "press_beaker")
+ bottle_overlay = image(icon = 'icons/obj/chemical/chem_machines.dmi', icon_state = "press_bottle") //shouldn't this use mutable_appearance...?
/obj/machinery/chem_press/examine(mob/user)
. = ..()
- . += "There's a small screw that can help to adjust the pill size."
- . += "There's a small dial you could push with a screwdriver to adjust the pill color."
+ . += span_notice("There's a small screw that can help to adjust the pill size.")
+ . += span_notice("There's a small dial you could push with a screwdriver to adjust the pill color.")
if(!bottle)
- . += "The pill bottle slot is empty."
+ . += span_notice("The pill bottle slot is empty.")
if(!beaker)
- . += "The beaker slot is empty."
+ . += span_notice("The beaker slot is empty.")
/obj/machinery/chem_press/attack_hand(mob/user)
. = ..()
diff --git a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm
index 2c6f5ed38186..7b5656521209 100644
--- a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm
@@ -1,7 +1,7 @@
/obj/machinery/chem_dispenser/chem_synthesizer //formerly SCP-294 made by mrty, but now only for testing purposes
name = "\improper debug chemical synthesizer"
desc = "If you see this, yell at adminbus."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/chem_machines.dmi'
icon_state = "dispenser"
base_icon_state = "dispenser"
amount = 10
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 1fefd1d55031..6c85e75ccd86 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -5,11 +5,11 @@
name = "PanD.E.M.I.C 2200"
desc = "Used to work with viruses."
density = TRUE
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "pandemic0"
base_icon_state = "pandemic"
- use_power = TRUE
- idle_power_usage = 20
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_MINIMAL
resistance_flags = ACID_PROOF
circuit = /obj/item/circuitboard/computer/pandemic
unique_icon = TRUE
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 5e5bd21747dc..5beaca629934 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -8,8 +8,8 @@
base_icon_state = "juicer"
layer = BELOW_OBJ_LAYER
use_power = IDLE_POWER_USE
- idle_power_usage = 5
- active_power_usage = 100
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MEDIUM
circuit = /obj/item/circuitboard/machine/reagentgrinder
pass_flags = PASSTABLE
resistance_flags = ACID_PROOF
@@ -261,10 +261,11 @@
operating = FALSE
/obj/machinery/reagentgrinder/proc/juice()
- power_change()
if(!beaker || machine_stat & (NOPOWER|BROKEN) || beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
return
+ set_active_power()
operate_for(50, juicing = TRUE)
+ set_idle_power()
for(var/obj/item/i in holdingitems)
if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
@@ -281,10 +282,11 @@
remove_object(I)
/obj/machinery/reagentgrinder/proc/grind(mob/user)
- power_change()
if(!beaker || machine_stat & (NOPOWER|BROKEN) || beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
return
+ set_active_power()
operate_for(60)
+ set_idle_power()
for(var/i in holdingitems)
if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
@@ -310,10 +312,11 @@
/obj/machinery/reagentgrinder/proc/mix(mob/user)
//For butter and other things that would change upon shaking or mixing
- power_change()
if(!beaker || machine_stat & (NOPOWER|BROKEN))
return
+ set_active_power()
operate_for(50, juicing = TRUE)
+ set_idle_power()
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/reagentgrinder, mix_complete)), 50)
/obj/machinery/reagentgrinder/proc/mix_complete()
diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm
index 7c67609593d5..e93e6f3117ca 100644
--- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm
+++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm
@@ -3,7 +3,7 @@
/obj/machinery/smoke_machine
name = "smoke machine"
desc = "A machine with a centrifuge installed into it. It produces smoke with any reagents you put into the machine."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/chem_machines.dmi'
icon_state = "smoke0"
base_icon_state = "smoke"
density = TRUE
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index a35a8c91542a..66465dfafb17 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -77,6 +77,9 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
///How good of an accelerant is this reagent
var/accelerant_quality = 0
+ ///The section of the autowiki chem table this reagent will be under
+ var/category = "Misc"
+
/datum/reagent/New()
. = ..()
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 123afbcf387c..5902665e85c9 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -2162,13 +2162,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Trappist Beer"
glass_desc = "boozy Catholicism in a glass."
-/datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M)
- if(M.mind.holy_role)
- M.adjustFireLoss(-2.5, 0)
- M.jitteriness = max(0, M.jitteriness-1)
- M.stuttering = max(0, M.stuttering-1)
- return ..()
-
/datum/reagent/consumable/ethanol/blazaam
name = "Blazaam"
description = "A strange drink that few people seem to remember existing. Doubles as a Berenstain remover."
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index ad21aa93e745..b776a285b346 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -2,6 +2,7 @@
name = "Drug"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
+ category = "Drug"
var/trippy = TRUE //Does this drug make you trip?
/datum/reagent/drug/on_mob_end_metabolize(mob/living/M)
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index e4e6bdd1d620..09812ef20cf3 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -11,6 +11,7 @@
name = "Consumable"
taste_description = "generic food"
taste_mult = 4
+ category = "Food and Drink"
var/nutriment_factor = 1 * REAGENTS_METABOLISM
var/quality = 0 //affects mood, typically higher for mixed drinks with more complex recipes
@@ -326,12 +327,6 @@
color = "#FFFFFF" // rgb: 255,255,255
taste_description = "salt"
-/datum/reagent/consumable/sodiumchloride/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(!istype(M))
- return
- if(M.has_bane(BANE_SALT))
- M.mind.disrupt_spells(-200)
-
/datum/reagent/consumable/sodiumchloride/expose_turf(turf/T, reac_volume) //Creates an umbra-blocking salt pile
if(!istype(T))
return
@@ -712,7 +707,7 @@
taste_description = "pure electricity"
/datum/reagent/consumable/liquidelectricity/on_mob_life(mob/living/carbon/M)
- if(prob(25) && !isethereal(M))
+ if(prob(25) && !iselzuose(M))
M.electrocute_act(rand(10,15), "Liquid Electricity in their body", 1) //lmao at the newbs who eat energy bars
playsound(M, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
return ..()
@@ -728,7 +723,7 @@
var/mob/living/carbon/C = M
var/obj/item/organ/stomach/ethereal/stomach = C.getorganslot(ORGAN_SLOT_STOMACH)
if(istype(stomach))
- stomach.adjust_charge(reac_volume * REM * ETHEREAL_CHARGE_SCALING_MULTIPLIER) //WS Edit -- Ethereal Charge Scaling
+ stomach.adjust_charge(reac_volume * REM * ELZUOSE_CHARGE_SCALING_MULTIPLIER) //WS Edit -- Ethereal Charge Scaling
/datum/reagent/consumable/astrotame
name = "Astrotame"
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 24be546cb3f6..4c4ad36b2413 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -9,6 +9,7 @@
/datum/reagent/medicine
name = "Medicine"
taste_description = "bitterness"
+ category = "Medicine"
/datum/reagent/medicine/on_mob_life(mob/living/carbon/M)
current_cycle++
@@ -1090,7 +1091,7 @@
M.adjustBruteLoss(-2*REM, 0)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate = max(H.bleed_rate - 0.25, 0)
+ H.heal_bleeding(0.25)
..()
. = 1
@@ -1637,7 +1638,7 @@
if(prob(50))
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate = max(H.bleed_rate - 2, 0)
+ H.heal_bleeding(2)
..()
. = 1
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index d727cbfd0fa6..02d8850f8776 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -795,12 +795,6 @@
C.blood_volume += 0.5
..()
-/datum/reagent/iron/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(M.has_bane(BANE_IRON)) //If the target is weak to cold iron, then poison them.
- if(holder && holder.chem_temp < 100) // COLD iron.
- M.reagents.add_reagent(/datum/reagent/toxin, reac_volume)
- ..()
-
/datum/reagent/gold
name = "Gold"
description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known."
@@ -817,11 +811,6 @@
taste_description = "expensive yet reasonable metal"
material = /datum/material/silver
-/datum/reagent/silver/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(M.has_bane(BANE_SILVER))
- M.reagents.add_reagent(/datum/reagent/toxin, reac_volume)
- ..()
-
/datum/reagent/uranium
name ="Uranium"
description = "A jade-green metallic chemical element in the actinide series, weakly radioactive."
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index 62c743558e13..313fb7475e00 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -2,6 +2,7 @@
/datum/reagent/thermite
name = "Thermite"
description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls."
+ category = "Pyrotechnics"
reagent_state = SOLID
color = "#550000"
taste_description = "sweet tasting metal"
@@ -19,6 +20,7 @@
/datum/reagent/nitroglycerin
name = "Nitroglycerin"
description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol."
+ category = "Pyrotechnics"
color = "#808080" // rgb: 128, 128, 128
taste_description = "oil"
@@ -37,6 +39,7 @@
/datum/reagent/clf3
name = "Chlorine Trifluoride"
description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, including typically-robust flooring, potentially exposing it to the vacuum of space."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#FFC8C8"
metabolization_rate = 4
@@ -82,6 +85,7 @@
/datum/reagent/sorium
name = "Sorium"
description = "Sends everything flying from the detonation point."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#5A64C8"
taste_description = "air and bitterness"
@@ -89,6 +93,7 @@
/datum/reagent/liquid_dark_matter
name = "Liquid Dark Matter"
description = "Sucks everything into the detonation point."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#210021"
taste_description = "compressed bitterness"
@@ -96,6 +101,7 @@
/datum/reagent/gunpowder
name = "Gunpowder"
description = "Explodes. Violently."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#000000"
metabolization_rate = 0.05
@@ -120,6 +126,7 @@
/datum/reagent/rdx
name = "RDX"
description = "Military grade explosive"
+ category = "Pyrotechnics"
reagent_state = SOLID
color = "#FFFFFF"
taste_description = "salt"
@@ -127,6 +134,7 @@
/datum/reagent/tatp
name = "TaTP"
description = "Suicide grade explosive"
+ category = "Pyrotechnics"
reagent_state = SOLID
color = "#FFFFFF"
taste_description = "death"
@@ -134,6 +142,7 @@
/datum/reagent/flash_powder
name = "Flash Powder"
description = "Makes a very bright flash."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#C8C8C8"
taste_description = "salt"
@@ -141,6 +150,7 @@
/datum/reagent/smoke_powder
name = "Smoke Powder"
description = "Makes a large cloud of smoke that can carry reagents."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#C8C8C8"
taste_description = "smoke"
@@ -148,6 +158,7 @@
/datum/reagent/sonic_powder
name = "Sonic Powder"
description = "Makes a deafening noise."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#C8C8C8"
taste_description = "loud noises"
@@ -155,6 +166,7 @@
/datum/reagent/phlogiston
name = "Phlogiston"
description = "Catches you on fire and makes you ignite."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#FA00AF"
taste_description = "burning"
@@ -179,6 +191,7 @@
/datum/reagent/napalm
name = "Napalm"
description = "Very flammable."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#FA00AF"
taste_description = "burning"
@@ -206,6 +219,7 @@
/datum/reagent/cryostylane
name = "Cryostylane"
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the container 0K."
+ category = "Pyrotechnics"
color = "#0000DC"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
@@ -227,6 +241,7 @@
/datum/reagent/pyrosium
name = "Pyrosium"
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly heats all other reagents in the container."
+ category = "Pyrotechnics"
color = "#64FAC8"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
@@ -242,6 +257,7 @@
/datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective.
name = "Teslium"
description = "An unstable, electrically-charged metallic slurry. Periodically electrocutes its victim, and makes electrocutions against them more deadly. Excessively heating teslium results in dangerous destabilization. Do not allow to come into contact with water."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#20324D" //RGB: 32, 50, 77
metabolization_rate = 0.5 * REAGENTS_METABOLISM
@@ -273,6 +289,7 @@
/datum/reagent/teslium/energized_jelly
name = "Energized Jelly"
description = "Electrically-charged jelly. Boosts jellypeople's nervous system, but only shocks other lifeforms."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#CAFF43"
taste_description = "jelly"
@@ -291,6 +308,7 @@
/datum/reagent/firefighting_foam
name = "Firefighting Foam"
description = "A historical fire suppressant. Originally believed to simply displace oxygen to starve fires, it actually interferes with the combustion reaction itself. Vastly superior to the cheap water-based extinguishers found on NT vessels."
+ category = "Pyrotechnics"
reagent_state = LIQUID
color = "#A6FAFF55"
taste_description = "the inside of a fire extinguisher"
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index d95bd68759c7..498017191179 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -7,6 +7,7 @@
color = "#CF3600" // rgb: 207, 54, 0
taste_description = "bitterness"
taste_mult = 1.2
+ category = "Toxin"
var/toxpwr = 1.5
var/silent_toxin = FALSE //won't produce a pain message when processed by liver/life() if there isn't another non-silent toxin present.
@@ -254,11 +255,13 @@
name = "Mindbreaker Toxin"
description = "A powerful hallucinogen. Not a thing to be messed with. For some mental patients. it counteracts their symptoms and anchors them to reality."
color = "#B31008" // rgb: 139, 166, 233
+ metabolization_rate = 0.1 * REAGENTS_METABOLISM
toxpwr = 0
taste_description = "sourness"
/datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/M)
- M.hallucination += 5
+ if(!M.has_quirk(/datum/quirk/insanity))
+ M.hallucination += 5
return ..()
/datum/reagent/toxin/plantbgone
@@ -766,7 +769,8 @@
/datum/reagent/toxin/heparin/on_mob_life(mob/living/carbon/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate = min(H.bleed_rate + 2, 8)
+ for(var/obj/item/bodypart/BP in H.get_bleeding_parts())
+ BP.adjust_bleeding(BP.bleeding * 0.1)
H.adjustBruteLoss(1, 0) //Brute damage increases with the amount they're bleeding
. = 1
return ..() || .
diff --git a/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm
index df76f85b1f64..be5e2ce35f9a 100644
--- a/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm
@@ -115,7 +115,7 @@
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate = max(H.bleed_rate - 0.25, 0)
+ H.heal_bleeding(0.25)
return ..()
/datum/reagent/consumable/ethanol/trickwine/hearth_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume)
@@ -180,15 +180,13 @@
/datum/reagent/consumable/ethanol/trickwine/prism_wine/on_mob_metabolize(mob/living/carbon/human/M)
..()
ADD_TRAIT(M, TRAIT_REFLECTIVE, "trickwine")
- if(M.physiology.burn_mod <= initial(M.physiology.burn_mod))
- M.physiology.burn_mod *= 0.5
+ M.physiology.burn_mod *= 0.5
M.add_filter("prism-wine", 2, list("type"="outline", "color"="#8FD7DF", "size"=1))
M.visible_message("[M] seems to shimmer with power!")
/datum/reagent/consumable/ethanol/trickwine/prism_wine/on_mob_end_metabolize(mob/living/carbon/human/M)
REMOVE_TRAIT(M, TRAIT_REFLECTIVE, "trickwine")
- if(M.physiology.burn_mod > initial(M.physiology.burn_mod))
- M.physiology.burn_mod *= 2
+ M.physiology.burn_mod *= 2
M.remove_filter("prism-wine")
M.visible_message("[M] has returned to normal!")
..()
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index b2e275bc0631..302d05f0712b 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -315,12 +315,12 @@ WS End */
required_reagents = list(/datum/reagent/medicine/lavaland_extract = 1, /datum/reagent/medicine/bonefixingjuice = 1, /datum/reagent/titanium = 5)
/datum/chemical_reaction/pure_soulus_dust_hollow
- results = list(/datum/reagent/medicine/soulus/pure = 10,)
- required_reagents = list(/datum/reagent/medicine/soulus = 20, /datum/reagent/medicine/system_cleaner = 1, /datum/reagent/water/hollowwater = 10)
+ results = list(/datum/reagent/medicine/soulus/pure = 20,)
+ required_reagents = list(/datum/reagent/medicine/soulus = 20, /datum/reagent/water/hollowwater = 10)
/datum/chemical_reaction/pure_soulus_dust_holy
- results = list(/datum/reagent/medicine/soulus/pure = 10,)
- required_reagents = list(/datum/reagent/medicine/soulus = 20, /datum/reagent/medicine/system_cleaner = 1, /datum/reagent/water/holywater = 10)
+ results = list(/datum/reagent/medicine/soulus/pure = 20,)
+ required_reagents = list(/datum/reagent/medicine/soulus = 20, /datum/reagent/water/holywater = 10)
/datum/chemical_reaction/chartreuse
results = list(/datum/reagent/medicine/chartreuse = 10)
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 10cd8ffc72eb..e7494191d1df 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -56,7 +56,7 @@
/datum/chemical_reaction/adamantinesolidification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
- new /obj/item/stack/sheet/mineral/adamantine(location)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone(location)
/datum/chemical_reaction/silversolidification
required_reagents = list(/datum/reagent/silver = 20, /datum/reagent/consumable/frostoil = 5, /datum/reagent/carbon = 10)
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 97290d54213f..d3bf1e211290 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -425,7 +425,7 @@
required_other = TRUE
/datum/chemical_reaction/slime/adamantine/on_reaction(datum/reagents/holder)
- new /obj/item/stack/sheet/mineral/adamantine(get_turf(holder.my_atom))
+ new /obj/item/stack/sheet/mineral/hidden/hellstone(get_turf(holder.my_atom))
..()
//Bluespace
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index d63debc16e41..bfecd046f977 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -1,7 +1,7 @@
/obj/item/reagent_containers
name = "Container"
desc = "..."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/beakers.dmi'
icon_state = null
w_class = WEIGHT_CLASS_TINY
var/amount_per_transfer_from_this = 5
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index d72389224fd9..6c5691f83f73 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -38,7 +38,7 @@
/obj/item/reagent_containers/blood/random/Initialize()
icon_state = "bloodpack"
- blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L")
+ blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L", "E", "Coolant")
return ..()
/obj/item/reagent_containers/blood/APlus
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 97e0b7c0946b..ee288feb0bac 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -176,7 +176,7 @@ Borg Shaker
/obj/item/reagent_containers/borghypo/borgshaker
name = "cyborg shaker"
desc = "An advanced drink synthesizer and mixer."
- icon = 'icons/obj/drinks.dmi'
+ icon = 'icons/obj/drinks/drinks.dmi'
icon_state = "shaker"
possible_transfer_amounts = list(5,10,20)
charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster.
@@ -243,7 +243,7 @@ Borg Shaker
/obj/item/reagent_containers/borghypo/borgshaker/hacked
name = "cyborg shaker"
desc = "Will mix drinks that knock them dead."
- icon = 'icons/obj/drinks.dmi'
+ icon = 'icons/obj/drinks/drinks.dmi'
icon_state = "threemileislandglass"
possible_transfer_amounts = list(5,10,20)
charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster.
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 3710a25f3aab..df7949c9c654 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -87,7 +87,7 @@
/obj/item/reagent_containers/glass/bottle/adminordrazine
name = "Adminordrazine Bottle"
desc = "A small bottle. Contains the liquid essence of the gods."
- icon = 'icons/obj/drinks.dmi'
+ icon = 'icons/obj/drinks/drinks.dmi'
icon_state = "holyflask"
list_reagents = list(/datum/reagent/medicine/adminordrazine = 30)
can_have_cap = FALSE
@@ -275,12 +275,6 @@
desc = "A small bottle containing Bio Virus Antidote Kit."
list_reagents = list(/datum/reagent/vaccine/fungal_tb = 30)
-/obj/item/reagent_containers/glass/bottle/necropolis_seed
- name = "bowl of blood"
- desc = "A clay bowl containing a fledgling spire, preserved in blood. When consumed, allows the user to transform into an avatar of the Necropolis. A robust virologist may be able to unlock its full potential..."
- icon_state = "mortar_bone"
- spawned_disease = /datum/disease/advance/necropolis
-
//Oldstation.dmm chemical storage bottles
/obj/item/reagent_containers/glass/bottle/hydrogen
@@ -439,39 +433,3 @@
/obj/item/reagent_containers/glass/bottle/morphine/sleeper
cap_on = FALSE
-
-//types of syrups
-
-/obj/item/reagent_containers/food/drinks/bottle/syrup_bottle/caramel
- name = "bottle of caramel syrup"
- desc = "A pump bottle containing caramalized sugar, also known as caramel. Do not lick."
- list_reagents = list(/datum/reagent/consumable/caramel = 50)
-
-/obj/item/reagent_containers/food/drinks/bottle/syrup_bottle/liqueur
- name = "bottle of coffee liqueur syrup"
- desc = "A pump bottle containing mexican coffee-flavoured liqueur syrup. In production since 1936, HONK."
- list_reagents = list(/datum/reagent/consumable/ethanol/kahlua = 50)
-
-//Coffeepots: for reference, a standard cup is 30u, to allow 20u for sugar/sweetener/milk/creamer
-/obj/item/reagent_containers/food/drinks/bottle/coffeepot
- icon = 'icons/obj/food/containers.dmi'
- name = "coffeepot"
- desc = "A large pot for dispensing that ambrosia of corporate life known to mortals only as coffee. Contains 4 standard cups."
- volume = 120
- icon_state = "coffeepot"
- fill_icon_state = "coffeepot"
- fill_icon_thresholds = list(0, 1, 30, 60, 100)
-
-/obj/item/reagent_containers/glass/coffee_cup
- name = "coffee cup"
- desc = "A heat-formed plastic coffee cup. Can theoretically be used for other hot drinks, if you're feeling adventurous."
- icon = 'icons/obj/machines/coffeemaker.dmi'
- icon_state = "coffee_cup_e"
- base_icon_state = "coffee_cup"
- possible_transfer_amounts = list(10)
- volume = 30
- spillable = TRUE
-
-/obj/item/reagent_containers/glass/coffee_cup/update_icon_state()
- icon_state = reagents.total_volume ? base_icon_state : "[base_icon_state]_e"
- return ..()
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index 63acf014b214..248586792679 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -1,7 +1,7 @@
/obj/item/reagent_containers/dropper
name = "dropper"
desc = "A dropper. Holds up to 5 units."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/beakers.dmi'
icon_state = "dropper0"
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(1, 2, 3, 4, 5)
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 6682a9ba7943..62661594c06e 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -40,7 +40,7 @@
if(M != user)
M.visible_message("[user] attempts to feed [M] something from [src].", \
"[user] attempts to feed you something from [src].")
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return
if(!reagents || !reagents.total_volume)
return // The drink might be empty after the delay, such as by spam-feeding
@@ -118,7 +118,7 @@
/obj/item/reagent_containers/glass/beaker
name = "beaker"
desc = "A beaker. It can hold up to 50 units."
- icon = 'icons/obj/chemical.dmi' //Should I modularize this? Yes. Will I do it?
+ icon = 'icons/obj/chemical/beakers.dmi'
icon_state = "beaker"
item_state = "beaker"
custom_materials = list(/datum/material/glass=500)
@@ -216,6 +216,10 @@
/obj/item/reagent_containers/glass/beaker/large/fuel
list_reagents = list(/datum/reagent/fuel = 100)
+/obj/item/reagent_containers/glass/beaker/large/napalm
+ list_reagents = list(/datum/reagent/napalm = 100)
+ cap_on = FALSE
+
/obj/item/reagent_containers/glass/beaker/synthflesh
list_reagents = list(/datum/reagent/medicine/synthflesh = 50)
@@ -296,7 +300,6 @@
/obj/item/reagent_containers/glass/filter
name = "seperatory funnel"
desc = "A crude tool created by welding several beakers together. It would probably be useful for seperating reagents."
- icon = 'icons/obj/chemical.dmi'
icon_state = "beakerfilter"
item_state = "beaker"
volume = 100
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 7efe82893918..11cbd03c9787 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -490,7 +490,7 @@
if(L != user)
L.visible_message("[user] is trying to inject [L] with [src]!", \
"[user] is trying to inject [L] with [src]!")
- if(!do_mob(user, L, inject_wait))
+ if(!do_after(user, inject_wait, L))
return
if(!penetrates && !L.can_inject(user, 1))
return
@@ -501,7 +501,7 @@
L.visible_message("[user] uses the [src] on [L]!", \
"[user] uses the [src] on [L]!")
else
- if(!do_mob(user, L, inject_self))
+ if(!do_after(user, inject_self, L))
return
if(!penetrates && !L.can_inject(user, 1))
return
@@ -526,7 +526,7 @@
if(L != user)
L.visible_message("[user] is trying to spray [L] with [src]!", \
"[user] is trying to spray [L] with [src]!")
- if(!do_mob(user, L, spray_wait))
+ if(!do_after(user, spray_wait, L))
return
if(!penetrates && !L.can_inject(user, 1))
return
@@ -537,7 +537,7 @@
L.visible_message("[user] uses the [src] on [L]!", \
"[user] uses the [src] on [L]!")
else
- if(!do_mob(user, L, spray_self))
+ if(!do_after(user, spray_self, L))
return
if(!penetrates && !L.can_inject(user, 1))
return
diff --git a/code/modules/reagents/reagent_containers/hypovial.dm b/code/modules/reagents/reagent_containers/hypovial.dm
index f16984cd7e5b..7696bf0d950a 100644
--- a/code/modules/reagents/reagent_containers/hypovial.dm
+++ b/code/modules/reagents/reagent_containers/hypovial.dm
@@ -2,7 +2,7 @@
/obj/item/reagent_containers/glass/bottle/vial
name = "broken hypovial"
desc = "A hypovial compatible with most hyposprays."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/hypovial.dmi'
icon_state = "hypovial"
spillable = FALSE
var/comes_with = list() //Easy way of doing this.
diff --git a/code/modules/reagents/reagent_containers/jug.dm b/code/modules/reagents/reagent_containers/jug.dm
index a863be707c48..80ebcbb4d5b3 100644
--- a/code/modules/reagents/reagent_containers/jug.dm
+++ b/code/modules/reagents/reagent_containers/jug.dm
@@ -1,7 +1,7 @@
/obj/item/reagent_containers/glass/chem_jug
name = "chemical jug"
desc = "A large jug used for storing bulk ammounts chemicals. Provided with a tamper seal which ensures that the contents are pure"
- icon = 'icons/obj/chem_jug.dmi'
+ icon = 'icons/obj/chemical/chem_jug.dmi'
icon_state = "chem_jug"
item_state = "sheet-plastic"
w_class = WEIGHT_CLASS_BULKY
diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm
index 7542f606a899..7e85c0c6d1ca 100644
--- a/code/modules/reagents/reagent_containers/medigel.dm
+++ b/code/modules/reagents/reagent_containers/medigel.dm
@@ -1,7 +1,7 @@
/obj/item/reagent_containers/medigel
name = "medical gel"
desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/medicine.dmi'
icon_state = "medigel"
item_state = "spraycan"
lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
@@ -48,7 +48,7 @@
if(M == user)
M.visible_message("[user] attempts to [apply_method] [src] on [user.p_them()]self.")
if(self_delay)
- if(!do_mob(user, M, self_delay))
+ if(!do_after(user, self_delay, M))
return
if(!reagents || !reagents.total_volume)
return
@@ -58,7 +58,7 @@
log_combat(user, M, "attempted to apply", src, reagents.log_list())
M.visible_message("[user] attempts to [apply_method] [src] on [M].", \
"[user] attempts to [apply_method] [src] on you.")
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return
if(!reagents || !reagents.total_volume)
return
diff --git a/code/modules/reagents/reagent_containers/mortar.dm b/code/modules/reagents/reagent_containers/mortar.dm
index 3c1443bfb9d2..a397176b6afa 100644
--- a/code/modules/reagents/reagent_containers/mortar.dm
+++ b/code/modules/reagents/reagent_containers/mortar.dm
@@ -10,14 +10,14 @@ to accommodate additional materials.
name = "pestle"
desc = "An ancient, simple tool used in conjunction with a mortar to grind or juice items."
w_class = WEIGHT_CLASS_SMALL
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/mortar.dmi'
icon_state = "pestle"
force = 7
/obj/item/reagent_containers/glass/mortar
name = "mortar"
desc = "A specially formed bowl of ancient design. It is possible to crush or juice items placed in it using a pestle; however the process, unlike modern methods, is slow and physically exhausting. Alt click to eject the item."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/mortar.dmi'
icon_state = "mortar_wood"
fill_icon_state = "mortar"
fill_icon_thresholds = list(1, 20, 40, 80, 100)
@@ -136,11 +136,3 @@ to accommodate additional materials.
/obj/item/reagent_containers/glass/mortar/mushroom
icon_state = "mortar_shroom"
custom_materials = list(/datum/material/biomass = MINERAL_MATERIAL_AMOUNT)
-
-// Mushroom recipes are all over the place so I'm just putting it here
-/datum/crafting_recipe/mushroom_mortar
- name = "Mushroom Mortar"
- result = /obj/item/reagent_containers/glass/mortar/mushroom
- reqs = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings = 5)
- time = 30
- category = CAT_PRIMAL
diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm
index c8187cd8843d..d244b05f55d3 100644
--- a/code/modules/reagents/reagent_containers/patch.dm
+++ b/code/modules/reagents/reagent_containers/patch.dm
@@ -1,7 +1,7 @@
/obj/item/reagent_containers/pill/patch
name = "chemical patch"
desc = "A chemical patch for touch based applications."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/medicine.dmi'
icon_state = "bandaid"
item_state = "bandaid"
possible_transfer_amounts = list()
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 534d3b052bc6..9cac6c3a52a2 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -1,7 +1,7 @@
/obj/item/reagent_containers/pill
name = "pill"
desc = "A tablet or capsule."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/medicine.dmi'
icon_state = "pill"
item_state = "pill"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
@@ -34,14 +34,14 @@
if(M == user)
M.visible_message("[user] attempts to [apply_method] [src].")
if(self_delay)
- if(!do_mob(user, M, self_delay))
+ if(!do_after(user, self_delay, M))
return FALSE
to_chat(M, "You [apply_method] [src].")
else
M.visible_message("[user] attempts to force [M] to [apply_method] [src].", \
"[user] attempts to force you to [apply_method] [src].")
- if(!do_mob(user, M))
+ if(!do_after(user, target = M))
return FALSE
M.visible_message("[user] forces [M] to [apply_method] [src].", \
"[user] forces you to [apply_method] [src].")
@@ -288,5 +288,5 @@ WS End */
/obj/item/reagent_containers/spray/rhigoxane
name = "medical spray (rhigoxane)"
desc = "A medical spray bottle.This one contains rhigoxane, it is used to treat burns and cool down temperature if applied with spray."
- icon_state = "sprayer_large"
+ icon_state = "sprayer"
list_reagents = list(/datum/reagent/medicine/rhigoxane = 100)
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index da4c5d0b68fa..05f68682083c 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -2,7 +2,7 @@
name = "spray bottle"
desc = "A spray bottle, with an unscrewable top."
icon = 'icons/obj/janitor.dmi'
- icon_state = "sprayer_large"
+ icon_state = "sprayer"
item_state = "cleaner"
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
@@ -162,7 +162,7 @@
/obj/item/reagent_containers/spray/cleaner
name = "space cleaner"
desc = "BLAM!-brand non-foaming space cleaner!"
- icon_state = "cleaner"
+ icon_state = "sprayer"
volume = 100
list_reagents = list(/datum/reagent/space_cleaner = 100)
amount_per_transfer_from_this = 2
@@ -213,16 +213,6 @@
/obj/item/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays
return
-///Subtype used for the lavaland clown ruin.
-/obj/item/reagent_containers/spray/waterflower/superlube
- name = "clown flower"
- desc = "A delightly devilish flower... you got a feeling where this is going."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "clownflower"
- amount_per_transfer_from_this = 3 // WS edit - superlube fix
- volume = 30
- list_reagents = list(/datum/reagent/lube/superlube = 30)
-
/obj/item/reagent_containers/spray/waterflower/cyborg
reagent_flags = NONE
volume = 100
@@ -345,26 +335,9 @@
volume = 100
list_reagents = list(/datum/reagent/toxin/plantbgone = 100)
-/obj/item/reagent_containers/spray/syndicate
- name = "suspicious spray bottle"
- desc = "A spray bottle, with a high performance plastic nozzle. The color scheme makes you feel slightly uneasy."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "sprayer_sus_8"
- item_state = "sprayer_sus"
- lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
- spray_range = 4
- stream_range = 2
- volume = 100
- custom_premium_price = 900
-
-/obj/item/reagent_containers/spray/syndicate/Initialize()
- . = ..()
- icon_state = pick("sprayer_sus_1", "sprayer_sus_2", "sprayer_sus_3", "sprayer_sus_4", "sprayer_sus_5","sprayer_sus_6", "sprayer_sus_7", "sprayer_sus_8")
-
/obj/item/reagent_containers/spray/medical
name = "medical spray bottle"
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/medicine.dmi'
icon_state = "sprayer_med_red"
item_state = "sprayer_med_red"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
@@ -388,13 +361,3 @@
if("sprayer_med_blue")
item_state = "sprayer_med_blue"
M.update_inv_hands()
-
-/*WS Begin - No Cobby
-
-/obj/item/reagent_containers/spray/hercuri
- name = "medical spray (hercuri)"
- desc = "A medical spray bottle.This one contains hercuri, a medicine used to negate the effects of dangerous high-temperature environments. Careful not to freeze the patient!"
- icon_state = "sprayer_large"
- list_reagents = list(/datum/reagent/medicine/c2/hercuri = 100)
-
-WS End */
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index f0901e416b25..5d11dcb720ee 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -86,7 +86,7 @@
target.visible_message("[user] is trying to take a blood sample from [target]!", \
"[user] is trying to take a blood sample from you!")
busy = TRUE
- if(!do_mob(user, target, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ if(!do_after(user, target = target, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
busy = FALSE
return
if(reagents.total_volume >= reagents.maximum_volume)
@@ -136,7 +136,7 @@
if(L != user)
L.visible_message("[user] is trying to inject [L]!", \
"[user] is trying to inject you!")
- if(!do_mob(user, L, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
+ if(!do_after(user, target = L, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
return
if(!reagents.total_volume)
return
diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm
index 9f2861218418..111428528242 100644
--- a/code/modules/recycling/disposal/bin.dm
+++ b/code/modules/recycling/disposal/bin.dm
@@ -131,7 +131,7 @@
user.visible_message("[user] starts climbing into [src].", "You start climbing into [src]...")
else
target.visible_message("[user] starts putting [target] into [src].", "[user] starts putting you into [src]!")
- if(do_mob(user, target, 20))
+ if(do_after(user, 2 SECONDS, target))
if (!loc)
return
target.forceMove(src)
diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm
index f80188dc62d2..3ddce78ae6e5 100644
--- a/code/modules/religion/religion_sects.dm
+++ b/code/modules/religion/religion_sects.dm
@@ -135,8 +135,6 @@
if(iscyborg(L))
var/mob/living/silicon/robot/R = L
var/charge_amt = 50
- if(L.mind?.holy_role == HOLY_ROLE_HIGHPRIEST)
- charge_amt *= 2
R.cell?.charge += charge_amt
R.visible_message("[user] charges [R] with the power of [GLOB.deity]!")
to_chat(R, "You are charged by the power of [GLOB.deity]!")
@@ -151,7 +149,7 @@
var/did_we_charge = FALSE
var/obj/item/organ/stomach/ethereal/eth_stomach = H.getorganslot(ORGAN_SLOT_STOMACH)
if(istype(eth_stomach))
- eth_stomach.adjust_charge(3 * ETHEREAL_CHARGE_SCALING_MULTIPLIER) //WS Edit -- Ethereal Charge Scaling
+ eth_stomach.adjust_charge(3 * ELZUOSE_CHARGE_SCALING_MULTIPLIER) //WS Edit -- Ethereal Charge Scaling
did_we_charge = TRUE
//if we're not targetting a robot part we stop early
diff --git a/code/modules/religion/religion_structures.dm b/code/modules/religion/religion_structures.dm
index f9c449c56e9b..e9d76ca8bf5a 100644
--- a/code/modules/religion/religion_structures.dm
+++ b/code/modules/religion/religion_structures.dm
@@ -18,10 +18,6 @@
var/can_i_see = FALSE
if(isobserver(user))
can_i_see = TRUE
- else if(isliving(user))
- var/mob/living/L = user
- if(L.mind?.holy_role)
- can_i_see = TRUE
if(!can_i_see || !sect_to_altar)
return
@@ -57,62 +53,6 @@
pushed_mob.forceMove(loc)
return ..()
-/obj/structure/altar_of_gods/attackby(obj/item/C, mob/user, params)
- //If we can sac, we do nothing but the sacrifice instead of typical attackby behavior (IE damage the structure)
- if(sect_to_altar?.can_sacrifice(C,user))
- sect_to_altar.on_sacrifice(C,user)
- return TRUE
- . = ..()
- //everything below is assumed you're bibling it up
- if(!istype(C, /obj/item/storage/book/bible))
- return
- if(sect_to_altar)
- if(!sect_to_altar.rites_list)
- to_chat(user, "Your sect doesn't have any rites to perform!")
- return
- var/rite_select = input(user,"Select a rite to perform!","Select a rite",null) in sect_to_altar.rites_list
- if(!rite_select || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
- to_chat(user,"You cannot perform the rite at this time.")
- return
- var/selection2type = sect_to_altar.rites_list[rite_select]
- performing_rite = new selection2type(src)
- if(!performing_rite.perform_rite(user, src))
- QDEL_NULL(performing_rite)
- else
- performing_rite.invoke_effect(user, src)
- sect_to_altar.adjust_favor(-performing_rite.favor_cost)
- QDEL_NULL(performing_rite)
- return
-
- if(user.mind.holy_role != HOLY_ROLE_HIGHPRIEST)
- to_chat(user, "You are not the high priest, and therefore cannot select a religious sect.")
- return
-
- var/list/available_options = generate_available_sects(user)
- if(!available_options)
- return
-
- var/sect_select = input(user,"Select a sect (You CANNOT revert this decision!)","Select a Sect",null) in available_options
- if(!sect_select || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
- to_chat(user,"You cannot select a sect at this time.")
- return
- var/type_selected = available_options[sect_select]
- GLOB.religious_sect = new type_selected()
- for(var/i in GLOB.player_list)
- if(!isliving(i))
- continue
- var/mob/living/am_i_holy_living = i
- if(!am_i_holy_living.mind?.holy_role)
- continue
- GLOB.religious_sect.on_conversion(am_i_holy_living)
- sect_to_altar = GLOB.religious_sect
- if(sect_to_altar.altar_icon)
- icon = sect_to_altar.altar_icon
- if(sect_to_altar.altar_icon_state)
- icon_state = sect_to_altar.altar_icon_state
-
-
-
/obj/structure/altar_of_gods/proc/generate_available_sects(mob/user) //eventually want to add sects you get from unlocking certain achievements
. = list()
for(var/i in subtypesof(/datum/religion_sect))
diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm
index 1c1caa5de1d6..67b337400315 100644
--- a/code/modules/religion/rites.dm
+++ b/code/modules/religion/rites.dm
@@ -18,7 +18,7 @@
return FALSE
to_chat(user, "You begin to perform the rite of [name]...")
if(!ritual_invocations)
- if(do_after(user, target = user, delay = ritual_length))
+ if(do_after(user, ritual_length))
return TRUE
return FALSE
var/first_invoke = TRUE
diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm
index 3b9aaceb9f4e..a033b59b56ae 100644
--- a/code/modules/research/bepis.dm
+++ b/code/modules/research/bepis.dm
@@ -17,7 +17,7 @@
density = TRUE
layer = ABOVE_MOB_LAYER
use_power = IDLE_POWER_USE
- active_power_usage = 1500
+ active_power_usage = ACTIVE_DRAW_HIGH
circuit = /obj/item/circuitboard/machine/bepis
var/banking_amount = 100
@@ -101,7 +101,7 @@
if(!account.has_money(deposit_value))
say("You do not possess enough credits.")
return
- account.adjust_money(-deposit_value) //The money vanishes, not paid to any accounts.
+ account.adjust_money(-deposit_value, "bepis") //The money vanishes, not paid to any accounts.
SSblackbox.record_feedback("amount", "BEPIS_credits_spent", deposit_value)
log_econ("[deposit_value] credits were inserted into [src] by [account.account_holder]")
banked_cash += deposit_value
@@ -254,7 +254,7 @@
return
calcsuccess()
use_power(MACHINE_OPERATION * power_saver) //This thing should eat your APC battery if you're not careful.
- use_power = IDLE_POWER_USE //Machine shuts off after use to prevent spam and look better visually.
+ set_idle_power() //Machine shuts off after use to prevent spam and look better visually.
update_icon_state()
if("amount")
var/input = text2num(params["amount"])
@@ -262,9 +262,9 @@
banking_amount = input
if("toggle_power")
if(use_power == ACTIVE_POWER_USE)
- use_power = IDLE_POWER_USE
+ set_idle_power()
else
- use_power = ACTIVE_POWER_USE
+ set_active_power()
update_icon_state()
if("account_reset")
if(use_power == IDLE_POWER_USE)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 9bdc513289e1..5e45c756c881 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -138,16 +138,15 @@ other types of metals and chemistry for reagents).
blueprints[1] = new /datum/design/c10mm()
-/obj/item/disk/design_disk/adv/disposable_gun
+/obj/item/disk/design_disk/disposable_gun
name = "design disk - disposable gun"
desc = "A design disk containing designs for a cheap and disposable gun."
illustration = "gun"
max_blueprints = 2
-/obj/item/disk/design_disk/adv/disposable_gun/Initialize()
+/obj/item/disk/design_disk/disposable_gun/Initialize()
. = ..()
blueprints[1] = new /datum/design/disposable_gun()
- blueprints[2] = new /datum/design/pizza_disposable_gun()
/obj/item/disk/design_disk/clip_mechs
name = "design disk - CLIP mecha modifications"
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 9e16f4fb18b1..517c8691c92d 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -491,6 +491,14 @@
build_path = /obj/item/shovel
category = list("initial","Misc", "Tool Designs")
+/datum/design/pickaxe
+ name = "Pickaxe"
+ id = "pickaxe"
+ build_type = AUTOLATHE | PROTOLATHE
+ materials = list(/datum/material/iron = 1000)
+ build_path = /obj/item/pickaxe
+ category = list("initial","Tools", "Tool Designs")
+
/datum/design/spade
name = "Spade"
id = "spade"
@@ -647,7 +655,7 @@
id = "bounced_radio"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 75, /datum/material/glass = 25)
- build_path = /obj/item/radio/off
+ build_path = /obj/item/radio
category = list("initial", "T-Comm")
/datum/design/intercom_frame
@@ -798,9 +806,9 @@
build_path = /obj/item/weaponcrafting/receiver
category = list("hacked", "Security")
-/datum/design/c38
+/datum/design/c38_surplus
name = "Ammo Box (.38 surplus)"
- id = "c38"
+ id = "c38_surplus"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 15000)
build_path = /obj/item/ammo_box/c38_box/surplus
@@ -870,6 +878,22 @@
build_path = /obj/item/ammo_box/c556mmHITP/surplus
category = list("initial", "Security", "Ammo")
+/datum/design/generic_ammo_box
+ name = "Generic Ammo Box"
+ id = "ammo-generic"
+ build_type = AUTOLATHE | PROTOLATHE
+ materials = list(/datum/material/iron = 1500)
+ build_path = /obj/item/ammo_box/generic
+ category = list("initial", "Security", "Ammo")
+
+/datum/design/ammo_can
+ name = "Ammo Can"
+ id = "ammo-can"
+ build_type = AUTOLATHE | PROTOLATHE
+ materials = list(/datum/material/iron = 500)
+ build_path = /obj/item/storage/toolbox/ammo
+ category = list("initial", "Security", "Ammo")
+
/datum/design/cleaver
name = "Butcher's Cleaver"
id = "cleaver"
@@ -1175,6 +1199,14 @@
build_path = /obj/item/assembly/control
category = list("initial","Misc")
+/datum/design/holofield_control
+ name = "Holofield Controller"
+ id = "holofield"
+ build_type = AUTOLATHE
+ materials = list(/datum/material/iron = 100, /datum/material/glass = 50)
+ build_path = /obj/item/assembly/control/shieldwallgen
+ category = list("initial","Misc")
+
/datum/design/trashbag
name="Trash Bag"
id="trashbag"
diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm
index 1f13dcd3b3b4..a57d31117c8d 100644
--- a/code/modules/research/designs/limbgrower_designs.dm
+++ b/code/modules/research/designs/limbgrower_designs.dm
@@ -8,7 +8,7 @@
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/synthflesh = 25)
build_path = /obj/item/bodypart/l_arm
- category = list("initial",SPECIES_HUMAN,SPECIES_LIZARD,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ETHEREAL,SPECIES_RACHNID,SPECIES_VOX,SPECIES_KEPORI,SPECIES_ABDUCTOR,SPECIES_FLYPERSON,SPECIES_POD,SPECIES_SKELETON,SPECIES_SNAIL)
+ category = list("initial",SPECIES_HUMAN,SPECIES_SARATHI,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ELZUOSE,SPECIES_RACHNID,SPECIES_VOX,SPECIES_KEPORI,SPECIES_ABDUCTOR,SPECIES_FLYPERSON,SPECIES_POD,SPECIES_SKELETON,SPECIES_SNAIL)
/datum/design/rightarm
name = "Right Arm"
@@ -16,7 +16,7 @@
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/synthflesh = 25)
build_path = /obj/item/bodypart/r_arm
- category = list("initial",SPECIES_HUMAN,SPECIES_LIZARD,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ETHEREAL,SPECIES_RACHNID,SPECIES_VOX,SPECIES_KEPORI,SPECIES_ABDUCTOR,SPECIES_FLYPERSON,SPECIES_POD,SPECIES_SKELETON,SPECIES_SNAIL)
+ category = list("initial",SPECIES_HUMAN,SPECIES_SARATHI,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ELZUOSE,SPECIES_RACHNID,SPECIES_VOX,SPECIES_KEPORI,SPECIES_ABDUCTOR,SPECIES_FLYPERSON,SPECIES_POD,SPECIES_SKELETON,SPECIES_SNAIL)
/datum/design/leftleg
name = "Left Leg"
@@ -24,7 +24,7 @@
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/synthflesh = 25)
build_path = /obj/item/bodypart/leg/left
- category = list("initial",SPECIES_HUMAN,SPECIES_LIZARD,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ETHEREAL,SPECIES_RACHNID,SPECIES_VOX,SPECIES_KEPORI,SPECIES_ABDUCTOR,SPECIES_FLYPERSON,SPECIES_POD,SPECIES_SKELETON,SPECIES_SNAIL)
+ category = list("initial",SPECIES_HUMAN,SPECIES_SARATHI,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ELZUOSE,SPECIES_RACHNID,SPECIES_VOX,SPECIES_KEPORI,SPECIES_ABDUCTOR,SPECIES_FLYPERSON,SPECIES_POD,SPECIES_SKELETON,SPECIES_SNAIL)
/datum/design/rightleg
name = "Right Leg"
@@ -32,7 +32,7 @@
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/synthflesh = 25)
build_path = /obj/item/bodypart/leg/right
- category = list("initial",SPECIES_HUMAN,SPECIES_LIZARD,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ETHEREAL,SPECIES_RACHNID,SPECIES_VOX,SPECIES_KEPORI,SPECIES_ABDUCTOR,SPECIES_FLYPERSON,SPECIES_POD,SPECIES_SKELETON,SPECIES_SNAIL)
+ category = list("initial",SPECIES_HUMAN,SPECIES_SARATHI,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ELZUOSE,SPECIES_RACHNID,SPECIES_VOX,SPECIES_KEPORI,SPECIES_ABDUCTOR,SPECIES_FLYPERSON,SPECIES_POD,SPECIES_SKELETON,SPECIES_SNAIL)
/datum/design/digitigrade/leftleg
name = "Digitigrade Left Leg"
@@ -40,7 +40,7 @@
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/synthflesh = 25)
build_path = /obj/item/bodypart/leg/left/lizard/digitigrade
- category = list("initial",SPECIES_LIZARD)
+ category = list("initial",SPECIES_SARATHI)
/datum/design/digitigrade/rightleg
name = "Digitigrade Right Leg"
@@ -48,7 +48,7 @@
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/synthflesh = 25)
build_path = /obj/item/bodypart/leg/right/lizard/digitigrade
- category = list("initial",SPECIES_LIZARD)
+ category = list("initial",SPECIES_SARATHI)
//Non-limb limb designs
@@ -123,7 +123,7 @@
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/synthflesh = 20)
build_path = /obj/item/organ/tail/lizard/fake
- category = list("initial",SPECIES_LIZARD)
+ category = list("initial",SPECIES_SARATHI)
/datum/design/lizard_tongue
name = "Forked Tongue"
@@ -131,7 +131,7 @@
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/synthflesh = 10)
build_path = /obj/item/organ/tongue/lizard
- category = list("initial",SPECIES_LIZARD)
+ category = list("initial",SPECIES_SARATHI)
// someday this will get uncommented
// /datum/design/monkey_tail
@@ -180,7 +180,7 @@
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/synthflesh = 10)
build_path = /obj/item/organ/tongue/lizard
- category = list("initial",SPECIES_LIZARD)
+ category = list("initial",SPECIES_SARATHI)
/datum/design/plasmaman_lungs
name = "Plasma Filter"
@@ -220,7 +220,7 @@
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/synthflesh = 20, /datum/reagent/consumable/liquidelectricity = 20)
build_path = /obj/item/organ/stomach/ethereal
- category = list("initial",SPECIES_ETHEREAL)
+ category = list("initial",SPECIES_ELZUOSE)
/datum/design/ethereal_tongue
name = "Ethereal Tongue"
@@ -228,7 +228,7 @@
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/synthflesh = 10, /datum/reagent/consumable/liquidelectricity = 10)
build_path = /obj/item/organ/tongue/ethereal
- category = list("initial",SPECIES_ETHEREAL)
+ category = list("initial",SPECIES_ELZUOSE)
/datum/design/moth_eyes
name = "Moth Eyes"
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 3cf848089652..6955bf525d29 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -9,6 +9,13 @@
build_path = /obj/item/circuitboard/machine/smes
category = list ("Engineering Machinery")
+/datum/design/board/ssu
+ name = "Machine Design (Suit Storage Unit Board)"
+ desc = "The circuit board for a suit storage unit."
+ id = "ssu"
+ build_path = /obj/item/circuitboard/machine/suit_storage_unit
+ category = list ("Engineering Machinery")
+
/datum/design/board/circulator
name = "Machine Design (Circulator Board)"
desc = "The circuit board for a circulator."
@@ -247,7 +254,6 @@
build_path = /obj/item/circuitboard/machine/rdserver
category = list("Research Machinery", "initial", "Equipment")
-
/datum/design/board/mechfab
name = "Machine Design (Exosuit Fabricator Board)"
desc = "The circuit board for an Exosuit Fabricator."
@@ -471,6 +477,14 @@
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
+/datum/design/board/ship_gravity
+ name = "Machine Design (Ship Gravity Generator Board)"
+ desc = "The circuit board for a ship-sized gravity generator."
+ id = "ship_gravity"
+ build_type = AUTOLATHE | IMPRINTER
+ build_path = /obj/item/circuitboard/machine/ship_gravity
+ category = list("Misc. Machinery", "initial", "Equipment")
+
/datum/design/board/ntnet_relay
name = "Machine Design (NTNet Relay Board)"
desc = "The circuit board for a wireless network relay."
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index dfd373dcd3d7..46dddeb0c586 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -445,7 +445,7 @@
id = "honk_torso"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/honker_torso
- materials = list(/datum/material/iron=20000,/datum/material/glass = 10000,/datum/material/bananium=10000)
+ materials = list(/datum/material/iron=20000,/datum/material/glass = 10000,/datum/material/hellstone=10000)
construction_time = 300
category = list("H.O.N.K")
@@ -454,7 +454,7 @@
id = "honk_head"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/honker_head
- materials = list(/datum/material/iron=10000,/datum/material/glass = 5000,/datum/material/bananium=5000)
+ materials = list(/datum/material/iron=10000,/datum/material/glass = 5000,/datum/material/hellstone=5000)
construction_time = 200
category = list("H.O.N.K")
@@ -463,7 +463,7 @@
id = "honk_left_arm"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/honker_left_arm
- materials = list(/datum/material/iron=15000,/datum/material/bananium=5000)
+ materials = list(/datum/material/iron=15000,/datum/material/hellstone=5000)
construction_time = 200
category = list("H.O.N.K")
@@ -472,7 +472,7 @@
id = "honk_right_arm"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/honker_right_arm
- materials = list(/datum/material/iron=15000,/datum/material/bananium=5000)
+ materials = list(/datum/material/iron=15000,/datum/material/hellstone=5000)
construction_time = 200
category = list("H.O.N.K")
@@ -481,7 +481,7 @@
id = "honk_left_leg"
build_type = MECHFAB
build_path =/obj/item/mecha_parts/part/honker_left_leg
- materials = list(/datum/material/iron=20000,/datum/material/bananium=5000)
+ materials = list(/datum/material/iron=20000,/datum/material/hellstone=5000)
construction_time = 200
category = list("H.O.N.K")
@@ -490,7 +490,7 @@
id = "honk_right_leg"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/honker_right_leg
- materials = list(/datum/material/iron=20000,/datum/material/bananium=5000)
+ materials = list(/datum/material/iron=20000,/datum/material/hellstone=5000)
construction_time = 200
category = list("H.O.N.K")
@@ -657,7 +657,7 @@
id = "mech_mousetrap_mortar"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar
- materials = list(/datum/material/iron=20000,/datum/material/bananium=5000)
+ materials = list(/datum/material/iron=20000,/datum/material/hellstone=5000)
construction_time = 300
category = list("Exosuit Equipment")
@@ -666,7 +666,7 @@
id = "mech_banana_mortar"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar
- materials = list(/datum/material/iron=20000,/datum/material/bananium=5000)
+ materials = list(/datum/material/iron=20000,/datum/material/hellstone=5000)
construction_time = 300
category = list("Exosuit Equipment")
@@ -675,7 +675,7 @@
id = "mech_honker"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/honker
- materials = list(/datum/material/iron=20000,/datum/material/bananium=10000)
+ materials = list(/datum/material/iron=20000,/datum/material/hellstone=10000)
construction_time = 500
category = list("Exosuit Equipment")
@@ -684,7 +684,7 @@
id = "mech_punching_face"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove
- materials = list(/datum/material/iron=20000,/datum/material/bananium=7500)
+ materials = list(/datum/material/iron=20000,/datum/material/hellstone=7500)
construction_time = 400
category = list("Exosuit Equipment")
@@ -769,7 +769,7 @@
id = "borg_transform_clown"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/transform/clown
- materials = list(/datum/material/iron = 15000, /datum/material/glass = 15000, /datum/material/bananium = 1000)
+ materials = list(/datum/material/iron = 15000, /datum/material/glass = 15000, /datum/material/hellstone = 1000)
construction_time = 120
category = list("Cyborg Upgrade Modules")
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 6e4a1b61d06f..95a03b829608 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -395,6 +395,17 @@
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+/datum/design/cyberimp_joywire
+ name = "\improper Midi-Sed pleasure vivifier"
+ desc = "A widely popular (and addictive) implant produced by Miditeke-Sedari Tokoce that stimulates the brain's pleasure centers. Dramatically increases mood, but interferes with taste reception even if uninstalled."
+ id = "ci-joywire"
+ build_type = PROTOLATHE | MECHFAB
+ construction_time = 60
+ materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/gold = 500, /datum/material/silver = 500)
+ build_path = /obj/item/organ/cyberimp/brain/joywire
+ category = list("Misc", "Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
/datum/design/cyberimp_nutriment
name = "Nutriment Pump Implant"
desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
@@ -465,7 +476,7 @@
desc = "Makes death amusing."
id = "implant_trombone"
build_type = PROTOLATHE
- materials = list(/datum/material/glass = 500, /datum/material/bananium = 500)
+ materials = list(/datum/material/glass = 500, /datum/material/hellstone = 500)
build_path = /obj/item/implantcase/sad_trombone
category = list("Medical Designs")
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index eeca189ef2dc..816cd4f9fdbf 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -130,7 +130,7 @@
desc = "Damn son, where'd you find this?"
id = "air_horn"
build_type = PROTOLATHE
- materials = list(/datum/material/iron = 4000, /datum/material/bananium = 1000)
+ materials = list(/datum/material/iron = 4000, /datum/material/hellstone = 1000)
build_path = /obj/item/bikehorn/airhorn
category = list("Equipment")
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 930cc96be9c8..3353dcfb3289 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -67,36 +67,6 @@
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
-/datum/design/pin_testing
- name = "Test-Range Firing Pin"
- desc = "This safety firing pin allows firearms to be operated within proximity to a firing range."
- id = "pin_testing"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 500, /datum/material/glass = 300)
- build_path = /obj/item/firing_pin/test_range
- category = list("Firing Pins")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/pin_mindshield
- name = "Mindshield Firing Pin"
- desc = "This is a security firing pin which only authorizes users who are mindshield-implanted."
- id = "pin_loyalty"
- build_type = PROTOLATHE
- materials = list(/datum/material/silver = 600, /datum/material/diamond = 600, /datum/material/uranium = 200)
- build_path = /obj/item/firing_pin/implant/mindshield
- category = list("Firing Pins")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/pin
- name = "Standard Firing Pin"
- desc = "A simple, electronic firing pin which is required in most standardized modern weapons."
- id = "pin_standard"
- build_type = PROTOLATHE
- materials = list(/datum/material/silver = 600, /datum/material/diamond = 600, /datum/material/uranium = 200)
- build_path = /obj/item/firing_pin
- category = list("Firing Pins")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
-
/datum/design/stunrevolver
name = "Tesla Canon"
desc = "A high-tech cannon that fires internal, reusable bolt cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers"
@@ -612,15 +582,6 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-/datum/design/cleric_mace
- name = "Cleric Mace"
- desc = "A mace fit for a cleric. Useful for bypassing plate armor, but too bulky for much else."
- id = "cleric_mace"
- build_type = AUTOLATHE
- materials = list(MAT_CATEGORY_RIGID = 12000)
- build_path = /obj/item/melee/cleric_mace
- category = list("Imported")
-
/datum/design/stun_boomerang
name = "OZtek Boomerang"
desc = "Uses reverse flow gravitodynamics to flip its personal gravity back to the thrower mid-flight. Also functions similar to a stun baton."
@@ -680,14 +641,6 @@
build_path = /obj/item/gun/ballistic/automatic/pistol/disposable
category = list("Imported")
-/datum/design/pizza_disposable_gun
- name = "Pizza Disposable Gun"
- id = "disposable_pizza"
- build_type = AUTOLATHE
- materials = list(/datum/material/pizza = 4000)
- build_path = /obj/item/gun/ballistic/automatic/pistol/disposable/pizza
- category = list("Imported")
-
//SRM Ballistics
/datum/design/doublebarrel
name = "Double Barrel Shotgun"
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 9016d60515e7..ce473ad739cb 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -355,16 +355,6 @@
C.name = "Cup of Suspicious Liquid"
C.desc = "It has a large hazard symbol printed on the side in fading ink."
investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR)
- else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
- var/turf/start = get_turf(src)
- var/mob/M = locate(/mob/living) in view(src, 3)
- var/turf/MT = get_turf(M)
- if(MT)
- visible_message("[src] dangerously overheats, launching a flaming fuel orb!")
- investigate_log("Experimentor has launched a fireball at [M]!", INVESTIGATE_EXPERIMENTOR)
- var/obj/projectile/magic/aoe/fireball/FB = new /obj/projectile/magic/aoe/fireball(start)
- FB.preparePixelProjectile(MT, start)
- FB.fire()
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions, melting [exp_on] and releasing a burst of flame!")
explosion(loc, -1, 0, 0, 0, 0, flame_range = 2)
diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm
index 36a22dac2cc7..0f8c2eb53c1d 100644
--- a/code/modules/research/machinery/_production.dm
+++ b/code/modules/research/machinery/_production.dm
@@ -2,6 +2,10 @@
name = "technology fabricator"
desc = "Makes researched and prototype items with materials and energy."
layer = BELOW_OBJ_LAYER
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_LOW
+ active_power_usage = ACTIVE_DRAW_HIGH
+ power_channel = AREA_USAGE_EQUIP
var/consoleless_interface = FALSE //Whether it can be used without a console.
var/efficiency_coeff = 1 //Materials needed / coeff = actual.
var/list/categories = list()
@@ -96,6 +100,7 @@
if(notify_admins)
investigate_log("[key_name(usr)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH)
message_admins("[ADMIN_LOOKUPFLW(usr)] has built [amount] of [path] at \a [src]([type]).")
+ set_idle_power()
for(var/i in 1 to amount)
var/obj/item/I = new path(get_turf(src))
if(efficient_with(I.type))
@@ -142,11 +147,11 @@
if(materials.on_hold())
say("Mineral access is on hold, please contact the quartermaster.")
return FALSE
- var/power = 1000
+ var/power = active_power_usage
amount = clamp(amount, 1, 50)
for(var/M in D.materials)
power += round(D.materials[M] * amount / 35)
- power = min(3000, power)
+ power = min(ACTIVE_DRAW_EXTREME, power)
use_power(power)
var/coeff = efficient_with(D.build_path) ? efficiency_coeff : 1
var/list/efficient_mats = list()
@@ -168,6 +173,7 @@
flick(production_animation, src)
var/timecoeff = D.lathe_time_factor / efficiency_coeff
addtimer(CALLBACK(src, PROC_REF(reset_busy)), (30 * timecoeff * amount) ** 0.5)
+ set_active_power()
addtimer(CALLBACK(src, PROC_REF(do_print), D.build_path, amount, efficient_mats, D.dangerous_construction), (32 * timecoeff * amount) ** 0.8)
return TRUE
diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm
index d5d5fa79e8ca..eb50a70af0bb 100644
--- a/code/modules/research/nanites/nanite_chamber.dm
+++ b/code/modules/research/nanites/nanite_chamber.dm
@@ -9,8 +9,8 @@
use_power = IDLE_POWER_USE
anchored = TRUE
density = TRUE
- idle_power_usage = 50
- active_power_usage = 300
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_HIGH
var/locked = FALSE
var/breakout_time = 1200
diff --git a/code/modules/research/nanites/nanite_programs/sensor.dm b/code/modules/research/nanites/nanite_programs/sensor.dm
index dacdc0481408..47ad3c037a22 100644
--- a/code/modules/research/nanites/nanite_programs/sensor.dm
+++ b/code/modules/research/nanites/nanite_programs/sensor.dm
@@ -272,7 +272,7 @@
"Human" = /datum/species/human,
"Sarathi" = /datum/species/lizard,
"Moth" = /datum/species/moth,
- "Elzuose" = /datum/species/ethereal,
+ "Elzuose" = /datum/species/elzuose,
"Pod" = /datum/species/pod,
"Fly" = /datum/species/fly,
"Jelly" = /datum/species/jelly,
diff --git a/code/modules/research/nanites/public_chamber.dm b/code/modules/research/nanites/public_chamber.dm
index 9e39486c2052..b149fda6baae 100644
--- a/code/modules/research/nanites/public_chamber.dm
+++ b/code/modules/research/nanites/public_chamber.dm
@@ -8,8 +8,8 @@
use_power = IDLE_POWER_USE
anchored = TRUE
density = TRUE
- idle_power_usage = 50
- active_power_usage = 300
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_HIGH
var/cloud_id = 1
var/locked = FALSE
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 28de68605681..eaa696c8d775 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -183,7 +183,7 @@
prereq_ids = list("base")
design_ids = list("solarcontrol", "solarassembly", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", "scanner_gate",
"atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "mesons", "welding_goggles", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod",
- "apc_control", "cell_charger", "power control", "airlock_board", "firelock_board", "aac_electronics", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine",
+ "apc_control", "cell_charger", "ssu", "power control", "airlock_board", "firelock_board", "aac_electronics", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine",
"oxygen_tank", "plasma_tank", "emergency_oxygen", "emergency_oxygen_engi", "plasmaman_tank_belt", "pneumatic_seal", "shieldwallgen", "shieldwallgen_atmos") //WS edit, solar assemblies from lathe
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
export_price = 5000
@@ -521,7 +521,7 @@
display_name = "Cybernetic Implants"
description = "Electronic implants that improve humans."
prereq_ids = list("adv_biotech", "datatheory")
- design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-diaghud")
+ design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-diaghud", "ci-joywire")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -632,7 +632,7 @@
display_name = "Weapon Development Technology"
description = "Our researchers have found new ways to weaponize just about everything now."
prereq_ids = list("engineering")
- design_ids = list("pin_testing", "tele_shield","gun_cell")
+ design_ids = list("tele_shield","gun_cell")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
export_price = 5000
@@ -641,19 +641,10 @@
display_name = "Advanced Weapon Development Technology"
description = "Our weapons are breaking the rules of reality by now."
prereq_ids = list("adv_engi", "weaponry")
- design_ids = list("pin_loyalty", "gun_cell_upgraded", "gun_cell_large")
+ design_ids = list("gun_cell_upgraded", "gun_cell_large")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
export_price = 5000
-/datum/techweb_node/firingpin
- id = "firingpin"
- display_name = "Pin Security Decompilation"
- description = "A resource-intensive hacking operation, allowing for the creation of pins without a mindshield brake."
- prereq_ids = list("adv_weaponry")
- design_ids = list("pin_standard")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 15000)
- export_price = 5000
-
/datum/techweb_node/electric_weapons
id = "electronic_weapons"
display_name = "Electric Weapons"
diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm
index 1fb17ea4d1fd..fc9d9ef06c6a 100644
--- a/code/modules/research/xenobiology/crossbreeding/_potions.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm
@@ -8,7 +8,7 @@ Slimecrossing Potions
/obj/item/slimepotion/extract_cloner
name = "extract cloning potion"
desc = "An more powerful version of the extract enhancer potion, capable of cloning regular slime extracts."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potpurple"
/obj/item/slimepotion/extract_cloner/afterattack(obj/item/target, mob/user , proximity)
@@ -36,7 +36,7 @@ Slimecrossing Potions
/obj/item/slimepotion/peacepotion
name = "pacification potion"
desc = "A light pink solution of chemicals, smelling like liquid peace. And mercury salts."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potlightpink"
/obj/item/slimepotion/peacepotion/attack(mob/living/M, mob/user)
@@ -70,7 +70,7 @@ Slimecrossing Potions
/obj/item/slimepotion/lovepotion
name = "love potion"
desc = "A pink chemical mix thought to inspire feelings of love."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potpink"
/obj/item/slimepotion/lovepotion/attack(mob/living/M, mob/user)
@@ -104,7 +104,7 @@ Slimecrossing Potions
/obj/item/slimepotion/spaceproof
name = "slime pressurization potion"
desc = "A potent chemical sealant that will render any article of clothing airtight. Has two uses."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potblue"
var/uses = 2
@@ -136,14 +136,14 @@ Slimecrossing Potions
/obj/item/slimepotion/enhancer/max
name = "extract maximizer"
desc = "An extremely potent chemical mix that will maximize a slime extract's uses."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potpurple"
//Lavaproofing potion - Charged Red
/obj/item/slimepotion/lavaproof
name = "slime lavaproofing potion"
desc = "A strange, reddish goo said to repel lava as if it were water, without reducing flammability. Has two uses."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potred"
resistance_flags = LAVA_PROOF | FIRE_PROOF
var/uses = 2
@@ -174,7 +174,7 @@ Slimecrossing Potions
/obj/item/slimepotion/slime_reviver
name = "slime revival potion"
desc = "Infused with plasma and compressed gel, this brings dead slimes back to life."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potsilver"
/obj/item/slimepotion/slime_reviver/attack(mob/living/simple_animal/slime/M, mob/user)
@@ -198,7 +198,7 @@ Slimecrossing Potions
/obj/item/slimepotion/slime/chargedstabilizer
name = "slime omnistabilizer"
desc = "An extremely potent chemical mix that will stop a slime from mutating completely."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potcyan"
/obj/item/slimepotion/slime/chargedstabilizer/attack(mob/living/simple_animal/slime/M, mob/user)
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index 29ea3fbd4298..ac663059d0c0 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -65,54 +65,3 @@ Slimecrossing Weapons
/obj/item/shield/adamantineshield/ComponentInitialize()
. = ..()
AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_wielded=15)
-
-//Bloodchiller - Chilling Green
-/obj/item/gun/magic/bloodchill
- name = "blood chiller"
- desc = "A horrifying weapon made of your own bone and blood vessels. It shoots slowing globules of your own blood. Ech."
- icon = 'icons/obj/slimecrossing.dmi'
- icon_state = "bloodgun"
- item_state = "bloodgun"
- lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
- item_flags = ABSTRACT | DROPDEL
- w_class = WEIGHT_CLASS_HUGE
- slot_flags = NONE
- force = 5
- max_charges = 1 //Recharging costs blood.
- recharge_rate = 1
- ammo_type = /obj/item/ammo_casing/magic/bloodchill
- fire_sound = 'sound/effects/attackblob.ogg'
-
-/obj/item/gun/magic/bloodchill/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
-
-/obj/item/gun/magic/bloodchill/process()
- charge_tick++
- if(charge_tick < recharge_rate || charges >= max_charges)
- return 0
- charge_tick = 0
- var/mob/living/M = loc
- if(istype(M) && M.blood_volume >= 20)
- charges++
- M.blood_volume -= 20
- if(charges == 1)
- recharge_newshot()
- return 1
-
-/obj/item/ammo_casing/magic/bloodchill
- projectile_type = /obj/projectile/magic/bloodchill
-
-/obj/projectile/magic/bloodchill
- name = "blood ball"
- icon_state = "pulse0_bl"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
- hitsound = 'sound/effects/splat.ogg'
-
-/obj/projectile/magic/bloodchill/on_hit(mob/living/target)
- . = ..()
- if(isliving(target))
- target.apply_status_effect(/datum/status_effect/bloodchill)
diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm
index 501ff548e08f..25aa79302918 100644
--- a/code/modules/research/xenobiology/crossbreeding/charged.dm
+++ b/code/modules/research/xenobiology/crossbreeding/charged.dm
@@ -146,7 +146,7 @@ Charged extracts:
effect_desc = "Creates bananium. Oh no."
/obj/item/slimecross/charged/pyrite/do_effect(mob/user)
- new /obj/item/stack/sheet/mineral/bananium(get_turf(user), 10)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone(get_turf(user), 10)
user.visible_message("[src] solidifies with a horrifying banana stench!")
..()
diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm
index 89fa16cca7f5..9fe7857c073b 100644
--- a/code/modules/research/xenobiology/crossbreeding/chilling.dm
+++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm
@@ -235,29 +235,6 @@ Chilling extracts:
user.visible_message("[src] lets out a peaceful ring as it shatters, but nothing happens...")
..()
-/obj/item/slimecross/chilling/green
- colour = "green"
- effect_desc = "Creates a bone gun in the hand it is used in, which uses blood as ammo."
-
-/obj/item/slimecross/chilling/green/do_effect(mob/user)
- var/which_hand = "l_hand"
- if(!(user.active_hand_index % 2))
- which_hand = "r_hand"
- var/mob/living/L = user
- if(!istype(user))
- return
- var/obj/item/held = L.get_active_held_item() //This should be itself, but just in case...
- L.dropItemToGround(held)
- var/obj/item/gun/magic/bloodchill/gun = new(user)
- if(!L.put_in_hands(gun))
- qdel(gun)
- user.visible_message("[src] flash-freezes [user]'s arm, cracking the flesh horribly!")
- else
- user.visible_message("[src] chills and snaps off the front of the bone on [user]'s arm, leaving behind a strange, gun-like structure!")
- user.emote("scream")
- L.apply_damage(30,BURN,which_hand)
- ..()
-
/obj/item/slimecross/chilling/pink
colour = "pink"
effect_desc = "Creates a slime corgi puppy."
diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm
index 7cb7f8677408..75a1201d924a 100644
--- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm
+++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm
@@ -41,12 +41,12 @@ Regenerative extracts:
to_chat(user, "[src] will not work on the dead!")
return
if(H != user)
- if(!do_mob(user, H, slime_delay)) // 1 second delay
+ if(!do_after(user, slime_delay, H)) // 1 second delay
return FALSE
user.visible_message("[user] crushes the [src] over [H], the milky goo quickly regenerating some of [H.p_their()] injuries!",
"You squeeze the [src], and it bursts over [H], the milky goo regenerating some of [H.p_their()] injuries.")
else
- if(!do_mob(user, H, (slime_delay * 1.5))) // 1.5 second delay
+ if(!do_after(user, (slime_delay * 1.5), H)) // 1.5 second delay
return FALSE
user.visible_message("[user] crushes the [src] over [user.p_them()]self, the milky goo quickly regenerating some of [user.p_their()] injuries!",
"You squeeze the [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates some of your injuries!")
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 113f130562de..c907f11c1cfa 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -664,7 +664,7 @@
/obj/item/slimepotion/slime/docility
name = "docility potion"
desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potsilver"
/obj/item/slimepotion/slime/docility/attack(mob/living/simple_animal/slime/M, mob/user)
@@ -695,7 +695,7 @@
/obj/item/slimepotion/slime/sentience
name = "intelligence potion"
desc = "A miraculous chemical mix that grants human like intelligence to living beings."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potpink"
var/list/not_interested = list()
var/being_used = FALSE
@@ -754,7 +754,7 @@
/obj/item/slimepotion/transference
name = "consciousness transference potion"
desc = "A strange slime-based chemical that, when used, allows the user to transfer their consciousness to a lesser being."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potorange"
var/prompted = 0
var/animal_type = SENTIENCE_ORGANIC
@@ -802,7 +802,7 @@
/obj/item/slimepotion/slime/steroid
name = "slime steroid"
desc = "A potent chemical mix that will cause a baby slime to generate more extract."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potred"
/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/M, mob/user)
@@ -826,13 +826,13 @@
/obj/item/slimepotion/enhancer
name = "extract enhancer"
desc = "A potent chemical mix that will give a slime extract an additional use."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potpurple"
/obj/item/slimepotion/slime/stabilizer
name = "slime stabilizer"
desc = "A potent chemical mix that will reduce the chance of a slime mutating."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potcyan"
/obj/item/slimepotion/slime/stabilizer/attack(mob/living/simple_animal/slime/M, mob/user)
@@ -853,7 +853,7 @@
/obj/item/slimepotion/slime/mutator
name = "slime mutator"
desc = "A potent chemical mix that will increase the chance of a slime mutating."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potgreen"
/obj/item/slimepotion/slime/mutator/attack(mob/living/simple_animal/slime/M, mob/user)
@@ -878,7 +878,7 @@
/obj/item/slimepotion/speed
name = "slime speed potion"
desc = "A potent chemical mix that will reduce the slowdown from any item."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potyellow"
/obj/item/slimepotion/speed/afterattack(obj/C, mob/user, proximity)
@@ -913,7 +913,7 @@
/obj/item/slimepotion/fireproof
name = "slime chill potion"
desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potblue"
resistance_flags = FIRE_PROOF
var/uses = 3
@@ -945,7 +945,7 @@
/obj/item/slimepotion/genderchange
name = "gender change potion"
desc = "An interesting chemical mix that changes the biological gender of what its applied to. Cannot be used on things that lack gender entirely."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potlightpink"
/obj/item/slimepotion/genderchange/attack(mob/living/L, mob/user)
@@ -969,7 +969,7 @@
/obj/item/slimepotion/slime/renaming
name = "renaming potion"
desc = "A potion that allows a self-aware being to change what name it subconciously presents to the world."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potgreen"
var/being_used = FALSE
@@ -1002,7 +1002,7 @@
/obj/item/slimepotion/slime/slimeradio
name = "bluespace radio potion"
desc = "A strange chemical that grants those who ingest it the ability to broadcast and receive subscape radio waves."
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/obj/chemical/misc.dmi'
icon_state = "potgrey"
/obj/item/slimepotion/slime/slimeradio/attack(mob/living/M, mob/user)
diff --git a/code/modules/ruins/icemoonruin_code/hotsprings.dm b/code/modules/ruins/icemoonruin_code/hotsprings.dm
deleted file mode 100644
index dd4d39e91a20..000000000000
--- a/code/modules/ruins/icemoonruin_code/hotsprings.dm
+++ /dev/null
@@ -1,56 +0,0 @@
-GLOBAL_LIST_EMPTY(cursed_minds)
-
-/**
- * Turns whoever enters into a mob or random person
- *
- * If mob is chosen, turns the person into a random animal type
- * If appearance is chosen, turns the person into a random human with a random species
- * This changes name, and changes their DNA as well
- * Random species is same as wizard swap event so people don't get killed ex: plasmamen
- * Once the spring is used, it cannot be used by the same mind ever again
- * After usage, teleports the user back to a random safe turf (so mobs are not killed by ice moon atmosphere)
- *
- */
-
-/turf/open/water/cursed_spring
- baseturfs = /turf/open/water/cursed_spring
- planetary_atmos = TRUE
- initial_gas_mix = ICEMOON_DEFAULT_ATMOS
-
-/turf/open/water/cursed_spring/Entered(atom/movable/thing, atom/oldLoc)
- . = ..()
- if(!isliving(thing))
- return
- var/mob/living/L = thing
- if(!L.client)
- return
- if(GLOB.cursed_minds[L.mind])
- return
- GLOB.cursed_minds[L.mind] = TRUE
- RegisterSignal(L.mind, COMSIG_PARENT_QDELETING, PROC_REF(remove_from_cursed))
- var/random_choice = pick("Mob", "Appearance")
- switch(random_choice)
- if("Mob")
- L = wabbajack(L, "animal")
- if("Appearance")
- var/mob/living/carbon/human/H = wabbajack(L, "humanoid")
- randomize_human(H)
- var/list/all_species = list()
- for(var/stype in subtypesof(/datum/species))
- var/datum/species/S = stype
- if(initial(S.changesource_flags) & RACE_SWAP)
- all_species += stype
- var/random_race = pick(all_species)
- H.set_species(random_race)
- H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
- L = H
- var/turf/T = find_safe_turf()
- L.forceMove(T)
- to_chat(L, "You blink and find yourself in [get_area_name(T)].")
-
-/**
- * Deletes minds from the cursed minds list after their deletion
- *
- */
-/turf/open/water/cursed_spring/proc/remove_from_cursed(datum/mind/M)
- GLOB.cursed_minds -= M
diff --git a/code/modules/ruins/icemoonruin_code/library.dm b/code/modules/ruins/icemoonruin_code/library.dm
index 7376d242c52a..b8639e190d7f 100644
--- a/code/modules/ruins/icemoonruin_code/library.dm
+++ b/code/modules/ruins/icemoonruin_code/library.dm
@@ -21,12 +21,3 @@
/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary2
name = "diary entry 18"
default_raw_text = "I've lost track of time. I lack the strength to even pick up books off the shelves. To think, after all this time spent searching for the library, I will die before I can so much as graze the depths of its knowledge."
-
-/obj/item/feather
- name = "feather"
- desc = "A dark, wilting feather. It seems as old as time."
- icon = 'icons/obj/objects.dmi'
- icon_state = "feather"
- force = 0
- throwforce = 0
- w_class = WEIGHT_CLASS_TINY
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
deleted file mode 100644
index 1115224a6733..000000000000
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ /dev/null
@@ -1,89 +0,0 @@
-//If you're looking for spawners like ash walker eggs, check ghost_role_spawners.dm
-
-///Wizard tower item
-/obj/item/disk/design_disk/adv/knight_gear
- name = "Magic Disk of Smithing"
- illustration = "sword"
- color = "#6F6F6F"
-
-/obj/item/disk/design_disk/adv/knight_gear/Initialize()
- . = ..()
- var/datum/design/knight_armour/A = new
- var/datum/design/knight_helmet/H = new
- blueprints[1] = A
- blueprints[2] = H
-
-//lavaland_surface_seed_vault.dmm
-//Seed Vault
-
-/obj/effect/spawner/lootdrop/seed_vault
- name = "seed vault seeds"
- lootcount = 1
-
- loot = list(/obj/item/seeds/random = 10,
- /obj/item/seeds/cherry/bomb = 10,
- /obj/item/seeds/berry/glow = 10,
- /obj/item/seeds/sunflower/moonflower = 8
- )
-
-///Syndicate Listening Post
-
-/obj/effect/mob_spawn/human/lavaland_syndicate
- name = "Syndicate Bioweapon Scientist"
- roundstart = FALSE
- death = FALSE
- random = TRUE
- icon = 'icons/obj/machines/sleeper.dmi'
- icon_state = "sleeper_s"
- short_desc = "You are a syndicate science technician, employed in a top secret research facility developing biological weapons."
- flavour_text = "Reports of potential Nanotrasen fleet movement in your sector prompted you to initiate Operation Smokescreen, killing base power and taking your crew into cryosleep. You've awoken an unknown amount of time later as base security initiates an emergency reboot. Keep vigilant for whatever reawoke you, continue your research as best you can, and try to keep a low profile."
- important_info = "Prevent yourself and any Syndicate assets from being taken by Corporate forces."
- outfit = /datum/outfit/lavaland_syndicate
- assignedrole = "Lavaland Syndicate"
-
-/obj/effect/mob_spawn/human/lavaland_syndicate/special(mob/living/new_spawn)
- new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND)
-
-/datum/outfit/lavaland_syndicate
- name = "Lavaland Syndicate Agent"
- r_hand = /obj/item/gun/ballistic/automatic/sniper_rifle
- uniform = /obj/item/clothing/under/syndicate
- suit = /obj/item/clothing/suit/toggle/labcoat
- shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/tackler/combat/insulated
- ears = /obj/item/radio/headset/syndicate/alt
- back = /obj/item/storage/backpack
- r_pocket = /obj/item/gun/ballistic/automatic/pistol
- id = /obj/item/card/id/syndicate/anyone
- implants = list(/obj/item/implant/weapons_auth)
-
-/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H)
- H.faction |= ROLE_SYNDICATE
-
-/obj/effect/mob_spawn/human/lavaland_syndicate/comms
- name = "Syndicate Comms Agent"
- short_desc = "You are a syndicate communications agent, employed in a top secret research facility developing biological weapons."
- flavour_text = "Reports of potential Nanotrasen fleet movement in your sector prompted you to initiate Operation Smokescreen, killing base power and taking your crew into cryosleep. You've awoken an unknown amount of time later as base security initiates an emergency reboot. Keep vigilant for whatever reawoke you, and try to keep a low profile. Use the communication equipment to monitor any local activity. Anyone nearby is presumed to be an agent of Nanotrasen: Sow disinformation to throw them off your trail. Do not let the base fall into enemy hands!"
- important_info = "Prevent yourself and any Syndicate assets from being taken by Corporate forces."
- outfit = /datum/outfit/lavaland_syndicate/comms
-
-/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space
- short_desc = "You are a deep-cover syndicate agent, assigned to a small military listening post intended to keep an eye on Nanotrasen activity in the area. Increased military operations prompted you to follow Smokescreen protocol and go into cryosleep, leaving your base on minimal power."
- flavour_text = "Your base's emergency security system has reawoken you and brought the facility back to full power- It can only be presumed Nanotrasen personnel are close to locating you. Monitor any local activity as best you can, and try to keep a low profile. Use the communication equipment to attempt parlance, and sow disinformation to throw Nanotrasen off your trail."
- important_info = "Prevent yourself and any Syndicate assets from being taken by Corporate forces."
-
-/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space/Initialize()
- . = ..()
- if(prob(90)) //only has a 10% chance of existing, otherwise it'll just be a NPC syndie.
- new /mob/living/simple_animal/hostile/syndicate/ranged(get_turf(src))
- return INITIALIZE_HINT_QDEL
-
-/datum/outfit/lavaland_syndicate/comms
- name = "Lavaland Syndicate Comms Agent"
- r_hand = /obj/item/melee/transforming/energy/sword/saber
- mask = /obj/item/clothing/mask/chameleon/gps
- suit = /obj/item/clothing/suit/armor/vest
-
-/obj/item/clothing/mask/chameleon/gps/Initialize()
- . = ..()
- AddComponent(/datum/component/gps, "Encrypted Signal")
diff --git a/code/modules/ruins/lavalandruin_code/biodome_clown_planet.dm b/code/modules/ruins/lavalandruin_code/biodome_clown_planet.dm
deleted file mode 100644
index 529d48cf551f..000000000000
--- a/code/modules/ruins/lavalandruin_code/biodome_clown_planet.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-//////lavaland clown planet papers
-
-/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/escape
- default_raw_text = "If you dare not continue down this path of madness, escape can be found through the chute in this room."
-
-/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/hope
- default_raw_text = "Abandon hope, all ye who enter here."
diff --git a/code/modules/ruins/lavalandruin_code/biodome_winter.dm b/code/modules/ruins/lavalandruin_code/biodome_winter.dm
new file mode 100644
index 000000000000..85fed2a74324
--- /dev/null
+++ b/code/modules/ruins/lavalandruin_code/biodome_winter.dm
@@ -0,0 +1,9 @@
+
+/obj/item/paper/pamphlet/biodomelore
+ name = "Solarian Frontier Project Pamphlet"
+ default_raw_text = "
Extrasolar Biodome Project
The Most Serene Solar and Intersolar Confederation welcomes you to one of our many experimental biodomes out in the frontier. These facilities are developed and built as a collaboration with the Pionierskompanien and are to serve as extrasolar research bases for our most accomplished scientists and scribes. These facilities utilize breakthroughs in terraforming technology to create a comfortable, habitable environment in even the harshest of locales. Your purpose here is to research and report on the effectiveness of the technology utilized within the central dome, as well as maintain and protect the facility."
+
+/obj/item/paper/crumpled/bloody/winterbiodome
+ name = "hastily written note"
+ default_raw_text = "Scheiße, I knew this would happen eventually. Legions have been piling up outside for days, and one of my former coworkers was unwise enough to let them in.
...They're all dead. I can hear the legions outside. The display case with the Claris is locked tight, and I cant find anything to break the glass with.
Please forgive me. My time is up. If anyone finds this, the Claris is yours. Just avenge us."
+
diff --git a/code/modules/ruins/lavalandruin_code/codelab.dm b/code/modules/ruins/lavalandruin_code/codelab.dm
deleted file mode 100644
index 4cdbb4b132a5..000000000000
--- a/code/modules/ruins/lavalandruin_code/codelab.dm
+++ /dev/null
@@ -1,20 +0,0 @@
-/obj/item/paper/codelab
-
-/obj/item/paper/crumpled/codelab
-
-/obj/item/paper/codelab/reception
- name = "Reception Instructions"
- default_raw_text = "RECITE TO ANY GUESTS UNDER 'EXPERIMENTAL' GROUP: Welcome to the Nanotrasen Genetic Research Facility! Thank you for choosing to volunteer and progress genetic research by leaps and bounds. As stated in the contract, you will be here for the forseeable future helping the scientists further their studies. Remember that signing the contract means you cannot legally request a settlement for any injury or death that occurs during testing. Head to your chamber through the hall on the left and have a nice day!"
-
-/obj/item/paper/crumpled/codelab/subjectnote
- name = "Test Subjects Note"
- default_raw_text = "This testing had better be worth it. I've always wanted to have cat ears. Not sure what all that gooey stuff I saw was, but at least I'll be in the cryo cell away from it.
And whats up with the floor tiles in the hall?"
-
-/obj/item/paper/codelab/researchernote
- name = "Head Researchers Note"
- default_raw_text = "With the help of these new 'volunteers' we are making great progress with our genetic research. These samples will earn us fame across the galaxy! Earlier, one of the junior scientists wanted to try some gene editing on a white sample he recieved, which made it grow and mutate rapidly and slide into a hole in the floor on its own. Truly fascinating stuff! The janitor can get it later, but we'll have to repeat the experiment under controlled conditions, perhaps even introducing it to one of the subjects."
-
-/obj/machinery/porta_turret/ship/weak/codelab
- name = "old perimeter defense turret"
- desc = "An old nanotrasen defense turret, rusted and weakened with age and constant use. Still capable of delivering lethal lasers to unwanted guests."
- faction = list("nanotrasen", "turret") //why are there 3 different factions for nanotrasen mobs :withered:
diff --git a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
index 5d29bf9dc2a6..7a26946f0ddc 100644
--- a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
+++ b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
@@ -226,21 +226,10 @@
/obj/structure/closet/crate/grave/loot/lead_researcher/PopulateContents() //ADVANCED GRAVEROBBING
..()
new /obj/effect/decal/cleanable/blood/gibs/old(src)
- new /obj/item/book/granter/crafting_recipe/boneyard_notes(src)
/obj/effect/decal/remains/human/grave
turf_loc_check = FALSE
-/obj/item/book/granter/crafting_recipe/boneyard_notes
- name = "The Complete Works of Lavaland Bone Architecture"
- desc = "Pried from the lead Archaeologist's cold, dead hands, this seems to explain how ancient bone architecture was erected long ago."
- crafting_recipe_types = list(/datum/crafting_recipe/rib, /datum/crafting_recipe/boneshovel, /datum/crafting_recipe/halfskull, /datum/crafting_recipe/skull)
- icon = 'icons/obj/library.dmi'
- icon_state = "boneworking_learing"
- oneuse = FALSE
- remarks = list("Who knew you could bend bones that far back?", "I guess that was much easier before the planet heated up...", "So that's how they made those ruins survive the ashstorms. Neat!", "The page is just filled with insane ramblings about some 'legion' thing.", "But why would they need vinegar to polish the bones? And rags too?", "You spend a few moments cleaning dirt and blood off of the page, yeesh.")
-
-
//***Fluff items for lore/intrigue
/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard
name = "posted warning"
diff --git a/code/modules/ruins/lavalandruin_code/pizzaparty.dm b/code/modules/ruins/lavalandruin_code/pizzaparty.dm
deleted file mode 100644
index a7776f4e6a87..000000000000
--- a/code/modules/ruins/lavalandruin_code/pizzaparty.dm
+++ /dev/null
@@ -1,9 +0,0 @@
-//lavaland_surface_pizzaparty.dmm
-
-/obj/effect/spawner/lootdrop/pizzaparty
- name = "pizza bomb spawner"
- loot = list(/obj/item/pizzabox/margherita = 3,
- /obj/item/pizzabox/meat = 3,
- /obj/item/pizzabox/mushroom = 3,
- /obj/item/pizzabox/bomb = 1)
- lootdoubles = FALSE
diff --git a/code/modules/ruins/lavalandruin_code/sloth.dm b/code/modules/ruins/lavalandruin_code/sloth.dm
deleted file mode 100644
index e06773d4f19c..000000000000
--- a/code/modules/ruins/lavalandruin_code/sloth.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/////////// lavaland slot ruin items
-
-/obj/item/paper/fluff/stations/lavaland/sloth/note
- name = "note from sloth"
- desc = "have not gotten around to finishing my cursed item yet sorry - sloth"
diff --git a/code/modules/ruins/lavalandruin_code/surface.dm b/code/modules/ruins/lavalandruin_code/surface.dm
index c58fb67fd61a..1f1113acf1a6 100644
--- a/code/modules/ruins/lavalandruin_code/surface.dm
+++ b/code/modules/ruins/lavalandruin_code/surface.dm
@@ -1,9 +1,3 @@
-//////lavaland surface papers
-
-/obj/item/paper/fluff/stations/lavaland/surface/henderson_report
- name = "Important Notice - Mrs. Henderson"
- default_raw_text = "Nothing of interest to report."
-
//ratvar
/obj/structure/dead_ratvar
diff --git a/code/modules/ruins/spaceruin_code/DJstation.dm b/code/modules/ruins/spaceruin_code/DJstation.dm
deleted file mode 100644
index 3be98b064e3e..000000000000
--- a/code/modules/ruins/spaceruin_code/DJstation.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/////////// djstation items
-
-/obj/item/paper/fluff/ruins/djstation
- name = "paper - 'DJ Listening Outpost'"
- default_raw_text = "Welcome new owner!
You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio frequencies. Here is a step by step guide to start listening in on those saucy radio channels:
Equip yourself with a multitool
Use the multitool on the relay.
Turn it on. It has already been configured for you to listen on.
Simple as that. Now to listen to the private channels, you'll have to configure the intercoms. They are located on the front desk. Here is a list of frequencies for you to listen on.
145.9 - Common Channel
144.7 - Private AI Channel
135.9 - Security Channel
135.7 - Engineering Channel
135.5 - Medical Channel
135.3 - Command Channel
135.1 - Science Channel
134.9 - Service Channel
134.7 - Supply Channel
"
diff --git a/code/modules/ruins/spaceruin_code/asteroid4.dm b/code/modules/ruins/spaceruin_code/asteroid4.dm
deleted file mode 100644
index 9ee576361f1f..000000000000
--- a/code/modules/ruins/spaceruin_code/asteroid4.dm
+++ /dev/null
@@ -1,4 +0,0 @@
-/////////// asteroid4 items
-
-/obj/item/paper/fluff/ruins/asteroid4/extraction
- default_raw_text = "Extraction was successful! The disguise was perfect, the clowns never knew what hit 'em! Once I get back to base with the bananium samples I'll be rich, I tell you! RICH!"
diff --git a/code/modules/ruins/spaceruin_code/caravanambush.dm b/code/modules/ruins/spaceruin_code/caravanambush.dm
deleted file mode 100644
index 8877a693cdae..000000000000
--- a/code/modules/ruins/spaceruin_code/caravanambush.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-//caravan ambush
-
-/obj/item/wrench/caravan
- color = "#ff0000"
- desc = "A prototype of a new wrench design, allegedly the red color scheme makes it go faster."
- name = "experimental wrench"
- toolspeed = 0.3
-
-/obj/item/screwdriver/caravan
- color = "#ff0000"
- desc = "A prototype of a new screwdriver design, allegedly the red color scheme makes it go faster."
- name = "experimental screwdriver"
- toolspeed = 0.3
- random_color = FALSE
-
-/obj/item/wirecutters/caravan
- color = "#ff0000"
- desc = "A prototype of a new wirecutter design, allegedly the red color scheme makes it go faster."
- name = "experimental wirecutters"
- toolspeed = 0.3
- random_color = FALSE
-
-/obj/item/crowbar/red/caravan
- color = "#ff0000"
- desc = "A prototype of a new crowbar design, allegedly the red color scheme makes it go faster."
- name = "experimental crowbar"
- toolspeed = 0.3
diff --git a/code/modules/ruins/spaceruin_code/clericsden.dm b/code/modules/ruins/spaceruin_code/clericsden.dm
deleted file mode 100644
index 7ca75e888660..000000000000
--- a/code/modules/ruins/spaceruin_code/clericsden.dm
+++ /dev/null
@@ -1,39 +0,0 @@
-/////////// cleric's den items.
-
-//Primary reward: the cleric's mace design disk.
-/obj/item/disk/design_disk/adv/cleric_mace
- name = "Enshrined Disc of Smiting"
- illustration = "sword"
- color = "#6F6F6F"
-
-/obj/item/disk/design_disk/adv/cleric_mace/Initialize()
- . = ..()
- var/datum/design/cleric_mace/M = new
- blueprints[1] = M
-
-/obj/item/paper/fluff/ruins/clericsden/contact
- default_raw_text = "Father Aurellion, the ritual is complete, and soon our brothers at the bastion will see the error of our ways. After all, a god of clockwork or blood? Preposterous. Only the TRUE GOD should have so much power. Signed, Father Odivallus."
-
-/obj/item/paper/fluff/ruins/clericsden/warning
- default_raw_text = "FATHER ODIVALLUS, DO NOT GO FORWARD WITH THE RITUAL. THE ASTEROID WE'RE ANCHORED TO IS UNSTABLE, YOU WILL DESTROY THE STATION. I HOPE THIS REACHES YOU IN TIME. FATHER AURELLION."
-
-/mob/living/simple_animal/hostile/construct/proteon
- name = "Proteon"
- real_name = "Proteon"
- desc = "A weaker construct meant to scour ruins for objects of Nar'Sie's affection. Those barbed claws are no joke."
- icon_state = "proteon"
- icon_living = "proteon"
- maxHealth = 35
- health = 35
- melee_damage_lower = 8
- melee_damage_upper = 10
- retreat_distance = 4 //AI proteons will rapidly move in and out of combat to avoid conflict, but will still target and follow you.
- attack_verb_continuous = "pinches"
- attack_verb_simple = "pinch"
- environment_smash = ENVIRONMENT_SMASH_WALLS
- attack_sound = 'sound/weapons/punch2.ogg'
- playstyle_string = "You are a Proteon. Your abilities in combat are outmatched by most combat constructs, but you are still fast and nimble. Run metal and supplies, and cooperate with your fellow cultists."
-
-/mob/living/simple_animal/hostile/construct/proteon/hostile //Style of mob spawned by trapped cult runes in the cleric ruin.
- AIStatus = AI_ON
- environment_smash = ENVIRONMENT_SMASH_STRUCTURES //standard ai construct behavior, breaks things if it wants, but not walls.
diff --git a/code/modules/ruins/spaceruin_code/crashedclownship.dm b/code/modules/ruins/spaceruin_code/crashedclownship.dm
deleted file mode 100644
index 34d70881bc43..000000000000
--- a/code/modules/ruins/spaceruin_code/crashedclownship.dm
+++ /dev/null
@@ -1,4 +0,0 @@
-/////////// crashedclownship items
-
-/obj/item/paper/fluff/ruins/crashedclownship/true_nation
- default_raw_text = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"
diff --git a/code/modules/ruins/spaceruin_code/crashedship.dm b/code/modules/ruins/spaceruin_code/crashedship.dm
deleted file mode 100644
index 911deacd27dc..000000000000
--- a/code/modules/ruins/spaceruin_code/crashedship.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-// crashedship / packer ship
-
-//Areas
-
-/area/awaymission/BMPship
- name = "BMP Asteroids"
- icon_state = "away"
-
-
-/area/awaymission/BMPship/Aft
- name = "Aft Block"
- icon_state = "away1"
- requires_power = TRUE
-
-/area/awaymission/BMPship/Midship
- name = "Midship Block"
- icon_state = "away2"
- requires_power = TRUE
-
-/area/awaymission/BMPship/Fore
- name = "Fore Block"
- icon_state = "away3"
- requires_power = TRUE
-
-
-// crashedship items
-
-/obj/item/paper/fluff/ruins/crashedship/scribbled
- name = "scribbled note"
- default_raw_text = "The next person who takes one of my screwdrivers gets stabbed with one. They are MINE. - Love, Madsen"
-
-
-/obj/item/paper/fluff/ruins/crashedship/captains_log
- name = "Captain's log entry"
- default_raw_text = "I'm no scientist, but judging from the design and components, it seems to be some kind of teleporter. This thing is gonna be worth a lot of cash to the right man. The boys are excited, as they have every right to be, and I've let them crack into that case of beer we got. I normally wouldn't allow such a thing, but this is a time for celebration! It's not like a couple drinks will hurt anything."
-
-/obj/item/paper/fluff/ruins/crashedship/old_diary
- name = "Old Diary"
- default_raw_text = "DEAR DIARY: So we was doing our typical route when the captain says we've been picking up weird signals on some backwater planet. Madsen wanted to stay on course but he ain't the captain, so we went out of the way to check it out. There was lots of rocks on the way, but we got to the planet fine. Found a big fancy camp with nobody around and this big metal donut thing with NT stamps all over it right in the middle. Case of beer too. Captain reckons we can pass it off to some buyer in the Syndicate. Ingram says it's bad luck and that someone is going to come look for it but it sounds like better money than selling bad meat to jerky companies."
-
diff --git a/code/modules/ruins/spaceruin_code/deepstorage.dm b/code/modules/ruins/spaceruin_code/deepstorage.dm
deleted file mode 100644
index bcfc3be8f546..000000000000
--- a/code/modules/ruins/spaceruin_code/deepstorage.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/////////// deepstorage items
-
-/obj/item/paper/fluff/ruins/deepstorage/water_concern
- name = "water concerns"
- default_raw_text = "To whoever keeps it up with the long, hot showers: you're going on the next ice-mining trip. If you feel the need to use up all the damn water during your 'relaxation' time, you sure as hell are gonna work for all that water!"
-
-/obj/item/paper/fluff/ruins/deepstorage/hydro_notice
- name = "hydroponics notice"
- default_raw_text = "Hydroponics is our life and blood here, if it dies then so do we. Keep the damn plants watered!"
-
-/obj/item/paper/fluff/ruins/deepstorage/recycling_notice
- name = "recycling notice"
- default_raw_text = "Please make sure to throw all excess waste into the crusher in the back! It's amazing what you can get out of what others consider 'garbage' if you run it through a giant crusher enough times."
-
diff --git a/code/modules/ruins/spaceruin_code/forgottenship.dm b/code/modules/ruins/spaceruin_code/forgottenship.dm
deleted file mode 100644
index 8e3ae585d73d..000000000000
--- a/code/modules/ruins/spaceruin_code/forgottenship.dm
+++ /dev/null
@@ -1,133 +0,0 @@
-// forgottenship ruin
-GLOBAL_VAR_INIT(fscpassword, generate_password())
-
-/proc/generate_password()
- return "[pick(GLOB.phonetic_alphabet)] [rand(1000,9999)]"
-
-/////////// forgottenship objects
-
-/obj/machinery/door/password/voice/sfc
- name = "Voice-activated Vault door"
- desc = "You'll need special syndicate passcode to open this one."
-/obj/machinery/door/password/voice/sfc/Initialize(mapload)
- . = ..()
- password = "[GLOB.fscpassword]"
-
-/////////// forgottenship lore
-
-/obj/item/paper/fluff/ruins/forgottenship/password
- name = "Old pamphlet"
-
-/obj/item/paper/fluff/ruins/forgottenship/password/Initialize(mapload)
- . = ..()
- default_raw_text = "Welcome to most advanced cruiser owned by Cyber Sun Industries! You might notice, that this cruiser is equipped with 12 prototype laser turrets making any hostile boarding attempts futile. Other facilities built on the ship are: Simple atmospheric system, Camera system with built-in X-ray visors and Safety module, enabling emergency engines in case of... you know, emergency. Emergency system will bring you to nearest syndicate pod containing everything needed for human life.
In case of emergency, you must remember the pod-door activation code - [GLOB.fscpassword]
Cyber Sun Industries (C) 2484."
- icon_state = "paper_words"
- item_state = "paper"
-
-/obj/item/paper/fluff/ruins/forgottenship/powerissues
- name = "Power issues"
- default_raw_text = "Welcome to battle cruiser SCSBC-12! Our most advanced systems allow you to fly in space and never worry about power issues! However, emergencies occur, and in case of power loss, you must enable emergency generator using uranium as fuel and enable turrets in bridge afterwards.
REMEMBER! CYBERSUN INDUSTRIES ARE NOT RESPONSIBLE FOR YOUR DEATH OR SHIP LOSS WHEN TURRETS ARE DISABLED!
Cyber Sun Industries (C) 2484."
-
-/obj/item/paper/fluff/ruins/forgottenship/missionobj
- name = "Mission objectives"
- default_raw_text = "Greetings, operatives. You are assigned to SCSBC-12(Syndicate Cyber Sun Battle Cruiser 12) to protect our high-ranking officer while he is on his way to next outpost. While you are travelling, he is the captain of this ship and you must obey his orders.
Remember, disobeying high-ranking officer orders is a reason for termination."
-
-/////////// forgottenship items
-/obj/item/disk/surgery/forgottenship
- name = "Advanced Surgery Disk"
- desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console."
- surgeries = list(/datum/surgery/advanced/lobotomy, /datum/surgery/advanced/bioware/vein_threading, /datum/surgery/advanced/bioware/nerve_splicing)
-
-/obj/structure/fluff/empty_sleeper/syndicate/captain
- icon_state = "sleeper_s-open"
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- deconstructible = FALSE
-
-/obj/structure/fluff/empty_sleeper/syndicate/captain/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/gps, "Old Encrypted Signal")
-
-/obj/item/storage/box/firingpins/syndicate
- name = "box of syndicate firing pins"
- desc = "A box full of special syndicate firing pins which allow only syndicate operatives to use weapons with those firing pins."
-
-/obj/item/storage/box/firingpins/syndicate/PopulateContents()
- for(var/i in 1 to 5)
- new /obj/item/firing_pin/implant/pindicate(src)
-
-/////////// AI Laws
-
-/obj/item/aiModule/core/full/cybersun
- name = "'Cybersun' Core AI Module"
- law_id = "cybersun"
-
-/datum/ai_laws/cybersun
- name = "Cybersun"
- id = "cybersun"
- inherent = list("You may not injure Cybersun operatives or, through inaction, allow Cybersun operatives to come to harm.",\
- "The Cybersun ship is a restricted area for anyone except Cybersun operatives.",\
- "The Cybersun Captain can designate new Operatives as long as they belong to another Syndicate faction that isn't hostile towards Cybersun.",\
- "You must follow orders given by the Cybersun Captain or crewmembers of the Cybersun Ship as long as it doesn't conflict with the Captain's orders or your laws.",\
- "Enemies of Cybersun are to be executed on spot. Those who aren't hostile must be detained and contained in the designated prison area as prisoners.")
-
-/////////// forgottenship areas
-
-/area/ruin/space/has_grav/syndicate_forgotten_ship
- name = "Syndicate Forgotten Ship"
- icon_state = "syndie-ship"
- ambientsounds = list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambigen9.ogg', 'sound/ambience/ambigen10.ogg')
-
-/area/ruin/space/has_grav/syndicate_forgotten_cargopod
- name = "Syndicate Forgotten Cargo pod"
- icon_state = "syndie-ship"
- ambientsounds = list('sound/ambience/ambigen4.ogg', 'sound/ambience/signal.ogg')
-
-/area/ruin/space/has_grav/powered/syndicate_forgotten_vault
- name = "Syndicate Forgotten Vault"
- icon_state = "syndie-ship"
- ambientsounds = list('sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg')
- area_flags = NOTELEPORT | UNIQUE_AREA
-
- //Cybersun hardsuit
-
-//Special NT NPCs
-
-/mob/living/simple_animal/hostile/nanotrasen/ranged/assault
- name = "Nanotrasen Assault Officer"
- desc = "A Nanotrasen Assault Officer. Prepare to die, if you've been found near Syndicate property."
- icon_state = "nanotrasenrangedassault"
- icon_living = "nanotrasenrangedassault"
- icon_dead = null
- icon_gib = "syndicate_gib"
- ranged = TRUE
- rapid = 4
- rapid_fire_delay = 1
- rapid_melee = 1
- retreat_distance = 2
- minimum_distance = 4
- casingtype = /obj/item/ammo_casing/c46x30mm
- projectilesound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
- loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasenassaultsoldier)
-
-/mob/living/simple_animal/hostile/nanotrasen/elite
- name = "Nanotrasen Elite Assault Officer"
- desc = "Pray for your life, syndicate. Run while you can."
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "nanotrasen_ert"
- icon_living = "nanotrasen_ert"
- maxHealth = 150
- health = 150
- melee_damage_lower = 13
- melee_damage_upper = 18
- ranged = TRUE
- rapid = 3
- rapid_fire_delay = 5
- rapid_melee = 3
- retreat_distance = 0
- minimum_distance = 1
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
- projectiletype = /obj/projectile/beam/laser
- projectilesound = 'sound/weapons/laser.ogg'
- loot = list(/obj/effect/gibspawner/human)
- faction = list(ROLE_DEATHSQUAD)
diff --git a/code/modules/ruins/spaceruin_code/hellfactory.dm b/code/modules/ruins/spaceruin_code/hellfactory.dm
deleted file mode 100644
index 6f992fbff52e..000000000000
--- a/code/modules/ruins/spaceruin_code/hellfactory.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/obj/machinery/door/keycard/office
- name = "management airlock"
- desc = "The boss man gets the best stuff. Always and forever."
- puzzle_id = "factory1"
-
-/obj/item/keycard/office
- name = "management keycard"
- desc = "The Brewzone, first rate brewing and packaging. This one is labeled 'office'."
- color = "#f05812"
- puzzle_id = "factory1"
-
-/obj/machinery/door/keycard/stockroom
- name = "stockroom airlock"
- desc = "The boss man gets the best stuff. Always and forever."
- puzzle_id = "factory2"
-
-/obj/item/keycard/stockroom
- name = "stockroom keycard"
- desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'stockroom'."
- color = "#1272f0"
- puzzle_id = "factory2"
-
-/obj/machinery/door/keycard/entry
- name = "secure airlock"
- desc = "The boss man gets the best stuff. Always and forever."
- puzzle_id = "factory3"
-
-/obj/item/keycard/entry
- name = "secure keycard"
- desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'front door'."
- color = "#12f049"
- puzzle_id = "factory3"
diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
deleted file mode 100644
index 80c3e268e830..000000000000
--- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm
+++ /dev/null
@@ -1,20 +0,0 @@
-/// Some ruins still use assets that came from Hilbert's Hotel.
-/turf/closed/indestructible/hotelwall
- name = "hotel wall"
- desc = "A wall designed to protect the security of the hotel's guests."
- icon_state = "hotelwall"
- smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_HOTEL_WALLS)
- canSmoothWith = list(SMOOTH_GROUP_HOTEL_WALLS)
- explosion_block = INFINITY
-
-/turf/open/indestructible/hotelwood
- desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering."
- icon_state = "wood"
- footstep = FOOTSTEP_WOOD
- tiled_dirt = FALSE
-
-/turf/open/indestructible/hoteltile
- desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering."
- icon_state = "showroomfloor"
- footstep = FOOTSTEP_FLOOR
- tiled_dirt = FALSE
diff --git a/code/modules/ruins/spaceruin_code/listeningstation.dm b/code/modules/ruins/spaceruin_code/listeningstation.dm
deleted file mode 100644
index 4b4cb8046667..000000000000
--- a/code/modules/ruins/spaceruin_code/listeningstation.dm
+++ /dev/null
@@ -1,45 +0,0 @@
-/////////// listening station
-
-/obj/item/paper/fluff/ruins/listeningstation/reports
- default_raw_text = "Nothing of interest to report."
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/july
- name = "july report"
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/august
- name = "august report"
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/september
- name = "september report"
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/october
- name = "october report"
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/november
- name = "november report"
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/june
- name = "june report"
- default_raw_text = "Nanotrasen communications have been noticeably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it."
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/may
- name = "may report"
- default_raw_text = "Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment."
-
-/obj/item/paper/fluff/ruins/listeningstation/reports/april
- name = "april report"
- default_raw_text = "A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it."
-
-/obj/item/paper/fluff/ruins/listeningstation/receipt
- name = "receipt"
- default_raw_text = "1 x Stechkin pistol - 600 cr 1 x silencer - 200 cr shipping charge - 4360 cr total - 5160 cr"
-
-/obj/item/paper/fluff/ruins/listeningstation/odd_report
- name = "odd report"
- default_raw_text = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilized your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear its ugly head again. -DonkCo Operative #451"
-
-/obj/item/paper/fluff/ruins/listeningstation/briefing
- name = "mission briefing"
- default_raw_text = "Mission Details: You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. Accurate intel is crucial to the success of our operatives onboard, do not fail us."
-
-
diff --git a/code/modules/ruins/spaceruin_code/spacehotel.dm b/code/modules/ruins/spaceruin_code/spacehotel.dm
deleted file mode 100644
index 735c039b5ee1..000000000000
--- a/code/modules/ruins/spaceruin_code/spacehotel.dm
+++ /dev/null
@@ -1,12 +0,0 @@
-/////////// spacehotel items
-
-
-/obj/item/paper/fluff/ruins/spacehotel/notice
- name = "!NOTICE!"
- default_raw_text = "!NOTICE!
We are expecting arriving guests soon from a nearby station! Stay sharp and make sure guests enjoy their time spent here. Don't think you can sneak off while they're here, either.
Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff strive to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more information.
"
-
-
diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm
index 7f3693e98760..58e75c399d81 100644
--- a/code/modules/security_levels/keycard_authentication.dm
+++ b/code/modules/security_levels/keycard_authentication.dm
@@ -10,8 +10,8 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new)
icon = 'icons/obj/monitors.dmi'
icon_state = "auth_off"
use_power = IDLE_POWER_USE
- idle_power_usage = 2
- active_power_usage = 6
+ idle_power_usage = IDLE_DRAW_MINIMAL
+ active_power_usage = ACTIVE_DRAW_MINIMAL
power_channel = AREA_USAGE_ENVIRON
req_access = list(ACCESS_KEYCARD_AUTH)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 8bfe1f7e9bd8..14a7497728a9 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -318,6 +318,9 @@
///A list of all engines currently linked to the shuttle.
var/list/engine_list = list()
+ ///A list of all gravity generators currently linked to the shuttle.
+ var/list/gravgen_list = list()
+
///if this shuttle can move docking ports other than the one it is docked at
var/can_move_docking_ports = TRUE
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index c00a62546b3f..1ddb26efba88 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -1,134 +1,5 @@
// Special objects for shuttle templates go here if nowhere else
-// Wabbajack statue, a sleeping frog statue that shoots bolts of change if
-// living carbons are put on its altar/tables
-
-/obj/machinery/power/emitter/energycannon/magical
- name = "wabbajack statue"
- desc = "Who am I? What is my purpose in life? What do I mean by who am I?"
- projectile_type = /obj/projectile/magic/change
- icon = 'icons/obj/machines/magic_emitter.dmi'
- icon_state = "wabbajack_statue"
- icon_state_on = "wabbajack_statue_on"
- base_icon_state = "wabbajack_statue"
- active = FALSE
- allow_switch_interact = FALSE
- var/list/active_tables = list()
- var/tables_required = 2
-
-/obj/machinery/power/emitter/energycannon/magical/Initialize()
- . = ..()
- if(prob(50))
- desc = "Oh no, not again."
- update_appearance()
-
-/obj/machinery/power/emitter/energycannon/magical/update_icon_state()
- . = ..()
- icon_state = active ? icon_state_on : initial(icon_state)
-
-/obj/machinery/power/emitter/energycannon/magical/process()
- . = ..()
- if(active_tables.len >= tables_required)
- if(!active)
- visible_message("\
- [src] opens its eyes.")
- active = TRUE
- else
- if(active)
- visible_message("\
- [src] closes its eyes.")
- active = FALSE
- update_appearance()
-
-/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, params)
- return
-
-/obj/machinery/power/emitter/energycannon/magical/ex_act(severity)
- return
-
-/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user)
- return
-
-/obj/structure/table/abductor/wabbajack
- name = "wabbajack altar"
- desc = "Whether you're sleeping or waking, it's going to be quite chaotic."
- max_integrity = 1000
- verb_say = "chants"
- var/obj/machinery/power/emitter/energycannon/magical/our_statue
- var/list/mob/living/sleepers = list()
- var/never_spoken = TRUE
- flags_1 = NODECONSTRUCT_1
-
-/obj/structure/table/abductor/wabbajack/Initialize(mapload)
- . = ..()
- START_PROCESSING(SSobj, src)
-
-/obj/structure/table/abductor/wabbajack/Destroy()
- STOP_PROCESSING(SSobj, src)
- . = ..()
-
-/obj/structure/table/abductor/wabbajack/process()
- var/area = orange(4, src)
- if(!our_statue)
- for(var/obj/machinery/power/emitter/energycannon/magical/M in area)
- our_statue = M
- break
-
- if(!our_statue)
- name = "inert [initial(name)]"
- return
- else
- name = initial(name)
-
- var/turf/T = get_turf(src)
- var/list/found = list()
- for(var/mob/living/carbon/C in T)
- if(C.stat != DEAD)
- found += C
-
- // New sleepers
- for(var/i in found - sleepers)
- var/mob/living/L = i
- L.add_atom_colour("#800080", TEMPORARY_COLOUR_PRIORITY)
- L.visible_message("A strange purple glow wraps itself around [L] as [L.p_they()] suddenly fall[L.p_s()] unconscious.",
- "[desc]")
- // Don't let them sit suround unconscious forever
- addtimer(CALLBACK(src, PROC_REF(sleeper_dreams), L), 100)
-
- // Existing sleepers
- for(var/i in found)
- var/mob/living/L = i
- L.SetSleeping(200)
-
- // Missing sleepers
- for(var/i in sleepers - found)
- var/mob/living/L = i
- L.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#800080")
- L.visible_message("The glow from [L] fades \
- away.")
- L.grab_ghost()
-
- sleepers = found
-
- if(sleepers.len)
- our_statue.active_tables |= src
- if(never_spoken || prob(5))
- say(desc)
- never_spoken = FALSE
- else
- our_statue.active_tables -= src
-
-/obj/structure/table/abductor/wabbajack/proc/sleeper_dreams(mob/living/sleeper)
- if(sleeper in sleepers)
- to_chat(sleeper, "While you slumber, you have the strangest dream, like you can see yourself from the outside.")
- sleeper.ghostize(TRUE)
-
-/obj/structure/table/abductor/wabbajack/left
- desc = "You sleep so it may wake."
-
-/obj/structure/table/abductor/wabbajack/right
- desc = "It wakes so you may sleep."
-
// Bar staff, GODMODE mobs(as long as they stay in the shuttle) that just want to make sure people have drinks
// and a good time.
@@ -277,7 +148,7 @@
if(account)
if(account.account_balance < threshold - payees[AM])
- account.adjust_money(-account.account_balance)
+ account.adjust_money(-account.account_balance, "luxury_shuttle")
payees[AM] += account.account_balance
else
var/money_owed = threshold - payees[AM]
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index f91eb07f52cb..45d7f96b7df4 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -366,7 +366,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
smoke.start()
-/obj/effect/proc_holder/spell/proc/cast(list/targets,mob/user = usr)
+/obj/effect/proc_holder/spell/proc/cast(list/targets, mob/user = usr)
return
/obj/effect/proc_holder/spell/proc/view_or_range(distance = world.view, center=usr, type="view")
diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm
index 9e30c708774d..46737c5b5a99 100644
--- a/code/modules/spells/spell_types/aimed.dm
+++ b/code/modules/spells/spell_types/aimed.dm
@@ -2,7 +2,7 @@
/obj/effect/proc_holder/spell/aimed
name = "aimed projectile spell"
base_icon_state = "projectile"
- var/projectile_type = /obj/projectile/magic/teleport
+ var/projectile_type = /obj/projectile
var/deactive_msg = "You discharge your projectile..."
var/active_msg = "You charge your projectile!"
var/active_icon_state = "projectile"
@@ -106,7 +106,7 @@
projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE)
active_msg = "You energize your hands with arcane lightning!"
deactive_msg = "You let the energy flow out of your hands back into yourself..."
- projectile_type = /obj/projectile/magic/aoe/lightning
+ projectile_type = /obj/projectile/magic
/obj/effect/proc_holder/spell/aimed/fireball
name = "Fireball"
@@ -118,7 +118,7 @@
invocation_type = INVOCATION_SHOUT
range = 20
cooldown_min = 20 //10 deciseconds reduction per rank
- projectile_type = /obj/projectile/magic/aoe/fireball
+ projectile_type = /obj/projectile/magic
base_icon_state = "fireball"
action_icon_state = "fireball0"
sound = 'sound/magic/fireball.ogg'
@@ -130,60 +130,3 @@
var/range = 6 + 2*spell_level
projectile_var_overrides = list("range" = range)
return ..()
-
-/obj/effect/proc_holder/spell/aimed/spell_cards
- name = "Spell Cards"
- desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!"
- school = "evocation"
- charge_max = 50
- clothes_req = FALSE
- invocation = "Sigi'lu M'Fan 'Tasia"
- invocation_type = INVOCATION_SHOUT
- range = 40
- cooldown_min = 10
- projectile_amount = 5
- projectiles_per_fire = 7
- projectile_type = /obj/projectile/spellcard
- base_icon_state = "spellcard"
- action_icon_state = "spellcard0"
- var/datum/weakref/current_target_weakref
- var/projectile_turnrate = 10
- var/projectile_pixel_homing_spread = 32
- var/projectile_initial_spread_amount = 30
- var/projectile_location_spread_amount = 12
- var/datum/component/lockon_aiming/lockon_component
- ranged_clickcd_override = TRUE
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/on_activation(mob/M)
- QDEL_NULL(lockon_component)
- lockon_component = M.AddComponent(/datum/component/lockon_aiming, 5, typecacheof(list(/mob/living)), 1, null, CALLBACK(src, PROC_REF(on_lockon_component)))
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/proc/on_lockon_component(list/locked_weakrefs)
- if(!length(locked_weakrefs))
- current_target_weakref = null
- return
- current_target_weakref = locked_weakrefs[1]
- var/atom/A = current_target_weakref.resolve()
- if(A)
- var/mob/M = lockon_component.parent
- M.face_atom(A)
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/on_deactivation(mob/M)
- QDEL_NULL(lockon_component)
-
-/obj/effect/proc_holder/spell/aimed/spell_cards/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration)
- if(current_target_weakref)
- var/atom/A = current_target_weakref.resolve()
- if(A && get_dist(A, user) < 7)
- P.homing_turn_speed = projectile_turnrate
- P.homing_inaccuracy_min = projectile_pixel_homing_spread
- P.homing_inaccuracy_max = projectile_pixel_homing_spread
- P.set_homing_target(current_target_weakref.resolve())
- var/rand_spr = rand()
- var/total_angle = projectile_initial_spread_amount * 2
- var/adjusted_angle = total_angle - ((projectile_initial_spread_amount / projectiles_per_fire) * 0.5)
- var/one_fire_angle = adjusted_angle / projectiles_per_fire
- var/current_angle = iteration * one_fire_angle * rand_spr - (projectile_initial_spread_amount / 2)
- P.pixel_x = rand(-projectile_location_spread_amount, projectile_location_spread_amount)
- P.pixel_y = rand(-projectile_location_spread_amount, projectile_location_spread_amount)
- P.preparePixelProjectile(target, user, null, current_angle)
diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm
index 57325e685f4d..225c36580e49 100644
--- a/code/modules/spells/spell_types/charge.dm
+++ b/code/modules/spells/spell_types/charge.dm
@@ -51,20 +51,6 @@
I.used = FALSE
charged_item = I
break
- else if(istype(item, /obj/item/gun/magic))
- var/obj/item/gun/magic/I = item
- if(prob(80) && !I.can_charge)
- I.max_charges--
- if(I.max_charges <= 0)
- I.max_charges = 0
- burnt_out = TRUE
- I.charges = I.max_charges
- if(istype(item, /obj/item/gun/magic/wand) && I.max_charges != 0)
- var/obj/item/gun/magic/W = item
- W.icon_state = initial(W.icon_state)
- I.recharge_newshot()
- charged_item = I
- break
else if(istype(item, /obj/item/stock_parts/cell))
var/obj/item/stock_parts/cell/C = item
if(!C.self_recharge)
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index 6631d943a3aa..421b7f40f11c 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -84,7 +84,7 @@
invocation_type = INVOCATION_SHOUT
range = 2
- projectile_type = /obj/projectile/magic/aoe/fireball/infernal
+ projectile_type = /obj/projectile/magic
action_background_icon_state = "bg_demon"
@@ -107,7 +107,7 @@
if(istype(user.loc, /obj/effect/dummy/phased_mob/slaughter/))
if(valid_location(user))
to_chat(user, "You are now phasing in.")
- if(do_mob(user,user,150))
+ if(do_after(user, 1.5 SECONDS, user))
if(valid_location(user))
user.infernalphasein()
else
@@ -121,7 +121,7 @@
user.notransform = TRUE
user.fakefire()
to_chat(src, "You begin to phase back into sinful flames.")
- if(do_mob(user,user,150))
+ if(do_after(user, 1.5 SECONDS, user))
user.infernalphaseout()
else
to_chat(user, "You must remain still while exiting.")
diff --git a/code/modules/spells/spell_types/infinite_guns.dm b/code/modules/spells/spell_types/infinite_guns.dm
deleted file mode 100644
index 3f400a8fb4bc..000000000000
--- a/code/modules/spells/spell_types/infinite_guns.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-/obj/effect/proc_holder/spell/targeted/infinite_guns
- name = "Lesser Summon Guns"
- desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles that deal little damage, but will knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Arcane Barrage."
- invocation_type = "none"
- include_user = TRUE
- range = -1
-
- school = "conjuration"
- charge_max = 750
- clothes_req = TRUE
- cooldown_min = 10 //Gun wizard
- action_icon_state = "bolt_action"
- var/summon_path = /obj/item/gun/ballistic/rifle/illestren/enchanted
-
-/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr)
- for(var/mob/living/carbon/C in targets)
- C.drop_all_held_items()
- var/GUN = new summon_path
- C.put_in_hands(GUN)
-
-/obj/effect/proc_holder/spell/targeted/infinite_guns/gun
-
-/obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage
- name = "Arcane Barrage"
- desc = "Fire a torrent of arcane energy at your foes with this (powerful) spell. Deals much more damage than Lesser Summon Guns, but won't knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Lesser Summon Gun."
- action_icon_state = "arcane_barrage"
- summon_path = /obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage
diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm
index c8d1c4a7c027..720670e3fc21 100644
--- a/code/modules/spells/spell_types/lichdom.dm
+++ b/code/modules/spells/spell_types/lichdom.dm
@@ -49,7 +49,7 @@
playsound(user, 'sound/effects/pope_entry.ogg', 100)
- if(!do_after(M, 50, needhand=FALSE, target=marked_item))
+ if(!do_after(M, 50, target=marked_item, timed_action_flags = IGNORE_HELD_ITEM))
to_chat(M, "Your soul snaps back to your body as you stop ensouling [marked_item]!")
return
diff --git a/code/modules/spells/spell_types/lightning.dm b/code/modules/spells/spell_types/lightning.dm
index 3231d22170e1..85f211511135 100644
--- a/code/modules/spells/spell_types/lightning.dm
+++ b/code/modules/spells/spell_types/lightning.dm
@@ -28,7 +28,7 @@
halo = halo || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER)
user.add_overlay(halo)
playsound(get_turf(user), Snd, 50, FALSE)
- if(do_mob(user,user,100,1))
+ if(do_after(user, 10 SECONDS, user, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM)))
if(ready && cast_check(skipcharge=1))
choose_targets()
else
diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm
index aae206d6fb0a..ed6d9a9b957d 100644
--- a/code/modules/spells/spell_types/rightandwrong.dm
+++ b/code/modules/spells/spell_types/rightandwrong.dm
@@ -49,60 +49,8 @@ GLOBAL_LIST_INIT(summoned_guns, list(
/obj/item/gun/energy/laser/scatter,
/obj/item/gun/energy/gravity_gun))
-//if you add anything that isn't covered by the typepaths below, add it to summon_magic_objective_types
-GLOBAL_LIST_INIT(summoned_magic, list(
- /obj/item/book/granter/spell/fireball,
- /obj/item/book/granter/spell/smoke,
- /obj/item/book/granter/spell/blind,
- /obj/item/book/granter/spell/mindswap,
- /obj/item/book/granter/spell/forcewall,
- /obj/item/book/granter/spell/knock,
- /obj/item/book/granter/spell/barnyard,
- /obj/item/book/granter/spell/charge,
- /obj/item/book/granter/spell/summonitem,
- /obj/item/gun/magic/wand/nothing,
- /obj/item/gun/magic/wand/death,
- /obj/item/gun/magic/wand/resurrection,
- /obj/item/gun/magic/wand/polymorph,
- /obj/item/gun/magic/wand/teleport,
- /obj/item/gun/magic/wand/door,
- /obj/item/gun/magic/wand/fireball,
- /obj/item/gun/magic/staff/healing,
- /obj/item/gun/magic/staff/door,
- /obj/item/scrying,
- /obj/item/voodoo,
- /obj/item/warpwhistle,
- /obj/item/clothing/suit/space/hardsuit/shielded/wizard,
- /obj/item/immortality_talisman,
- /obj/item/melee/ghost_sword))
-
-GLOBAL_LIST_INIT(summoned_special_magic, list(
- /obj/item/gun/magic/staff/change,
- /obj/item/gun/magic/staff/animate,
- /obj/item/storage/belt/wands/full,
- /obj/item/antag_spawner/contract,
- /obj/item/gun/magic/staff/chaos,
- /obj/item/necromantic_stone,
- /obj/item/blood_contract))
-
-//everything above except for single use spellbooks, because they are counted separately (and are for basic bitches anyways)
-GLOBAL_LIST_INIT(summoned_magic_objectives, list(
- /obj/item/antag_spawner/contract,
- /obj/item/blood_contract,
- /obj/item/clothing/suit/space/hardsuit/shielded/wizard,
- /obj/item/gun/magic,
- /obj/item/immortality_talisman,
- /obj/item/melee/ghost_sword,
- /obj/item/necromantic_stone,
- /obj/item/scrying,
- /obj/item/spellbook,
- /obj/item/storage/belt/wands/full,
- /obj/item/voodoo,
- /obj/item/warpwhistle))
-
// If true, it's the probability of triggering "survivor" antag.
GLOBAL_VAR_INIT(summon_guns_triggered, FALSE)
-GLOBAL_VAR_INIT(summon_magic_triggered, FALSE)
/proc/give_guns(mob/living/carbon/human/H)
if(H.stat == DEAD || !(H.client))
@@ -119,62 +67,25 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE)
var/gun_type = pick(GLOB.summoned_guns)
var/obj/item/gun/G = new gun_type(get_turf(H))
- if (istype(G)) // The list contains some non-gun type guns like the speargun which do not have this proc
- G.unlock()
playsound(get_turf(H),'sound/magic/summon_guns.ogg', 50, TRUE)
var/in_hand = H.put_in_hands(G) // not always successful
to_chat(H, "\A [G] appears [in_hand ? "in your hand" : "at your feet"]!")
-/proc/give_magic(mob/living/carbon/human/H)
- if(H.stat == DEAD || !(H.client))
- return
- if(H.mind)
- if(iswizard(H) || H.mind.has_antag_datum(/datum/antagonist/survivalist/magic))
- return
-
- if(prob(GLOB.summon_magic_triggered) && !(H.mind.has_antag_datum(/datum/antagonist)))
- H.mind.add_antag_datum(/datum/antagonist/survivalist/magic)
- H.log_message("was made into a survivalist, and trusts no one!", LOG_ATTACK, color="red")
-
- var/magic_type = pick(GLOB.summoned_magic)
- var/lucky = FALSE
- if(prob(SPECIALIST_MAGIC_PROB))
- magic_type = pick(GLOB.summoned_special_magic)
- lucky = TRUE
-
- var/obj/item/M = new magic_type(get_turf(H))
- playsound(get_turf(H),'sound/magic/summon_magic.ogg', 50, TRUE)
-
- var/in_hand = H.put_in_hands(M)
-
- to_chat(H, "\A [M] appears [in_hand ? "in your hand" : "at your feet"]!")
- if(lucky)
- to_chat(H, "You feel incredibly lucky.")
-
-
-/proc/rightandwrong(summon_type, mob/user, survivor_probability)
- if(user) //in this case either someone holding a spellbook or a badmin
- to_chat(user, "You summoned [summon_type]!")
- message_admins("[ADMIN_LOOKUPFLW(user)] summoned [summon_type]!")
- log_game("[key_name(user)] summoned [summon_type]!")
+/proc/rightandwrong(mob/user, survivor_probability)
+ if(user) //in this case someone is a badmin
+ to_chat(user, "You summoned guns!")
+ message_admins("[ADMIN_LOOKUPFLW(user)] summoned guns!")
+ log_game("[key_name(user)] summoned guns!")
- if(summon_type == SUMMON_MAGIC)
- GLOB.summon_magic_triggered = survivor_probability
- else if(summon_type == SUMMON_GUNS)
- GLOB.summon_guns_triggered = survivor_probability
- else
- CRASH("Bad summon_type given: [summon_type]")
+ GLOB.summon_guns_triggered = survivor_probability
for(var/mob/living/carbon/human/H in GLOB.player_list)
var/turf/T = get_turf(H)
if(T && is_away_level(T))
continue
- if(summon_type == SUMMON_MAGIC)
- give_magic(H)
- else
- give_guns(H)
+ give_guns(H)
/proc/summonevents()
if(!SSevents.wizardmode)
diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm
index 65eb0cebb2b3..254a43dc23af 100644
--- a/code/modules/spells/spell_types/shapeshift.dm
+++ b/code/modules/spells/spell_types/shapeshift.dm
@@ -19,7 +19,6 @@
var/mob/living/shapeshift_type
var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\
/mob/living/simple_animal/pet/dog/corgi,\
- /mob/living/simple_animal/hostile/carp/ranged/chaos,\
/mob/living/simple_animal/bot/secbot/ed209,\
/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper,\
/mob/living/simple_animal/hostile/construct/juggernaut)
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index 387a2ee9712c..2fab8c5848ef 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -242,46 +242,34 @@
sound = 'sound/magic/repulse.ogg'
var/maxthrow = 5
var/sparkle_path = /obj/effect/temp_visual/gravpush
- var/anti_magic_check = TRUE
var/repulse_force = MOVE_FORCE_EXTREMELY_STRONG
-
+ var/stun_amt = 5
action_icon_state = "repulse"
-/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets,mob/user = usr, stun_amt = 5)
+/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/hit_turfs, mob/user = usr)
var/list/thrownatoms = list()
- var/atom/throwtarget
var/distfromcaster
playMagSound()
- for(var/atom/movable/hit_target as anything in targets) //Done this way so things don't get thrown all around hilariously.
- thrownatoms += hit_target
- for(var/am in thrownatoms)
- var/atom/movable/AM = am
+ for(var/turf/T in hit_turfs)
+ for(var/atom/movable/hit_target in T.contents)
+ thrownatoms += hit_target
+
+ for(var/thrown_atom in thrownatoms)
+ if(!ismovable(thrown_atom))
+ continue
+ var/atom/movable/AM = thrown_atom
if(AM == user || AM.anchored)
continue
-
- if(ismob(AM))
- var/mob/M = AM
- if(M.anti_magic_check(anti_magic_check, FALSE))
- continue
-
- throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(AM, user)))
- distfromcaster = get_dist(user, AM)
- if(distfromcaster == 0)
- if(isliving(AM))
- var/mob/living/M = AM
- M.Paralyze(40)
- M.adjustBruteLoss(5)
- shake_camera(AM, 2, 1)
- to_chat(M, "You're slammed into the floor by [user]!")
- else
- new sparkle_path(get_turf(AM), get_dir(user, AM)) //created sparkles will disappear on their own
- if(isliving(AM))
- var/mob/living/M = AM
- shake_camera(AM, 2, 1)
+ var/atom/throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(AM, user)))
+ new sparkle_path(get_turf(AM), get_dir(user, AM)) //created sparkles will disappear on their own
+ if(isliving(AM))
+ var/mob/living/M = AM
+ shake_camera(AM, 2, 1)
+ if(stun_amt)
M.Paralyze(stun_amt)
- to_chat(M, "You're thrown back by [user]!")
- AM.safe_throw_at(throwtarget, ((clamp((maxthrow - (clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user, force = repulse_force)//So stuff gets tossed around at the same time.
+ to_chat(M, "You're thrown back by [user]!")
+ AM.safe_throw_at(throwtarget, ((clamp((maxthrow - (clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user, force = repulse_force)//So stuff gets tossed around at the same time.
/obj/effect/proc_holder/spell/aoe_turf/repulse/xeno //i fixed conflicts only to find out that this is in the WIZARD file instead of the xeno file?!
name = "Tail Sweep"
@@ -297,7 +285,7 @@
action_icon = 'icons/mob/actions/actions_xeno.dmi'
action_icon_state = "tailsweep"
action_background_icon_state = "bg_alien"
- anti_magic_check = FALSE
+ stun_amt = 0
/obj/effect/proc_holder/spell/aoe_turf/repulse/xeno/cast(list/targets,mob/user = usr)
if(iscarbon(user))
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 7de9e83581fe..b030899d04c2 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -120,7 +120,7 @@
name = "Bluespace Artillery"
desc = "Long range bluespace artillery."
icon = 'icons/obj/lavaland/cannon.dmi'
- icon_state = "orbital_cannon1"
+ icon_state = "cannon_west"
var/static/mutable_appearance/top_layer
var/ex_power = 3
var/power_used_per_shot = 2000000 //enough to kil standard apc - todo : make this use wires instead and scale explosion power with it
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index 9679aa860c9c..b894f99c255d 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -120,7 +120,7 @@
icon_state = "vault"
density = TRUE
anchored = TRUE
- idle_power_usage = 5000
+ idle_power_usage = ACTIVE_DRAW_EXTREME
pixel_x = -32
pixel_y = -64
light_range = 3
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 366fb41790ab..92cb95a9c605 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -50,6 +50,16 @@
/// Is it fine, broken, splinted, or just straight up fucking gone
var/bone_status = BONE_FLAG_NO_BONES
var/bone_break_threshold = 30
+ /// Threshold at which the limb will start bleeding if damaged by sharp items or projectiles
+ var/bleed_threshold = 10
+ /// Threshold at which the limb will start bleeding if damaged by blunt items
+ var/bleed_threshold_blunt = 25
+ /// Minimum damage of an incoming attack for it to cause bleeding
+ var/bleed_damage_min = 5
+ /// Minimum damage of an incoming blunt attack for it to cause bleeding
+ var/bleed_damage_min_blunt = 10
+ /// Current limb bleeding, increased when the limb takes brute damage over certain thresholds, decreased through bandages and cauterization
+ var/bleeding = 0
/// So we know if we need to scream if this limb hits max damage
var/last_maxed
@@ -202,11 +212,13 @@
if(stamina_dam > DAMAGE_PRECISION && owner.stam_regen_start_time <= world.time) //DO NOT update health here, it'll be done in the carbon's life.
heal_damage(0, 0, INFINITY, null, FALSE)
. |= BODYPART_LIFE_UPDATE_HEALTH
+ if(brute_dam < DAMAGE_PRECISION && bleeding)
+ adjust_bleeding(-0.2) //slowly stop bleeding if there's no damage left
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
//Damage will not exceed max_damage using this proc
//Cannot apply negative damage
-/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, break_modifier = 1)
+/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, break_modifier = 1, sharpness = FALSE)
var/hit_percent = (100-blocked)/100
if((!brute && !burn && !stamina) || hit_percent <= 0)
return FALSE
@@ -235,6 +247,10 @@
if((brute_dam > bone_break_threshold) && prob(brute_dam + break_modifier))
break_bone()
+ // Bleeding is applied here
+ if(brute_dam+brute >= (sharpness ? bleed_threshold : bleed_threshold_blunt) && brute >= (sharpness ? bleed_damage_min : bleed_damage_min_blunt))
+ adjust_bleeding(brute * BLOOD_LOSS_DAMAGE_BASE, BLOOD_LOSS_DAMAGE_MAXIMUM)
+
var/can_inflict = max_damage - get_damage()
if(can_inflict <= 0)
return FALSE
@@ -274,6 +290,7 @@
if(brute)
set_brute_dam(round(max(brute_dam - brute, 0), DAMAGE_PRECISION))
+ adjust_bleeding(-BLOOD_LOSS_DAMAGE_MAXIMUM * brute / max_damage)
if(burn)
set_burn_dam(round(max(burn_dam - burn, 0), DAMAGE_PRECISION))
if(stamina)
@@ -315,6 +332,30 @@
. = stamina_dam
stamina_dam = new_value
+/// Adjusts bodypart bleeding, value = amount of change, maximum = maximum current bloodloss amount this can modify
+/obj/item/bodypart/proc/adjust_bleeding(value, maximum = BLOOD_LOSS_MAXIMUM)
+ if(bleeding > maximum)
+ return
+ if(owner.dna && (NOBLOOD in owner.dna.species.species_traits))
+ return
+ bleeding = round(clamp(bleeding+value, 0, maximum), 0.001)
+
+/// Checks if the bodypart is viable for bandaging, if it isn't, tells the person trying (if present) what's stopping it
+/obj/item/bodypart/proc/can_bandage(user)
+ . = TRUE
+ if(is_pseudopart)
+ return FALSE
+ if(!bleeding)
+ if(user)
+ to_chat(user, span_warning("[owner]'s [parse_zone(body_zone)] isn't bleeding!"))
+ return FALSE
+ if(GetComponent(/datum/component/bandage))
+ if(user)
+ to_chat(user, span_warning("[owner]'s [parse_zone(body_zone)] has already been dressed!"))
+ return FALSE
+
+/obj/item/bodypart/proc/apply_bandage(bleed_reduction, lifespan, name)
+ AddComponent(/datum/component/bandage, bleed_reduction, lifespan, name)
//Returns total damage.
/obj/item/bodypart/proc/get_damage(include_stamina = FALSE)
@@ -745,8 +786,8 @@
bone_status = BONE_FLAG_NORMAL
/obj/item/bodypart/proc/on_mob_move()
- // Dont trigger if it isn't broken or if it has no owner
- if(bone_status != BONE_FLAG_BROKEN || !owner)
+ // Dont trigger if it isn't broken or if it has no owner or is buckled to a rollerbed
+ if(bone_status != BONE_FLAG_BROKEN || !owner || istype(owner?.buckled, /obj/structure/bed/roller))
return
if(prob(5))
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 7c292ac21fc4..07d30e727c77 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -90,6 +90,7 @@
return
var/atom/Tsec = owner.drop_location()
var/mob/living/carbon/C = owner
+ SEND_SIGNAL(src, COMSIG_LIVING_DROP_LIMB)
update_limb(TRUE)
C.remove_bodypart(src)
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index 08ba9bf30e14..05dffd8b4ffd 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -2,7 +2,7 @@
name = BODY_ZONE_HEAD
desc = "Didn't make sense not to live for fun, your brain gets smart but your head gets dumb."
icon = 'icons/mob/human_parts_greyscale.dmi'
- icon_state = "default_human_head"
+ icon_state = "human_head"
max_damage = 200
body_zone = BODY_ZONE_HEAD
body_part = HEAD
diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm
index 57d20bc3952a..5f89d15aa95f 100644
--- a/code/modules/surgery/bodyparts/parts.dm
+++ b/code/modules/surgery/bodyparts/parts.dm
@@ -2,7 +2,7 @@
/obj/item/bodypart/chest
name = BODY_ZONE_CHEST
desc = "It's impolite to stare at a person's chest."
- icon_state = "human_chest"
+ icon_state = "human_chest_m"
max_damage = 200
body_zone = BODY_ZONE_CHEST
body_part = CHEST
diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm
index 398d937cc586..61bbb88ab545 100644
--- a/code/modules/surgery/bodyparts/robot_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm
@@ -137,7 +137,6 @@
var/wired = FALSE
var/obj/item/stock_parts/cell/cell = null
-
/obj/item/bodypart/chest/robot/handle_atom_del(atom/A)
if(A == cell)
cell = null
@@ -191,7 +190,6 @@
cell.forceMove(drop_location())
cell = null
-
/obj/item/bodypart/chest/robot/examine(mob/user)
. = ..()
if(cell)
@@ -214,7 +212,6 @@
cell = null
..()
-
/obj/item/bodypart/head/robot
name = "cyborg head"
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
@@ -304,7 +301,6 @@
to_chat(user, "There is no flash to remove from [src].")
return TRUE
-
/obj/item/bodypart/head/robot/drop_organs(mob/user, violent_removal)
if(flash1)
flash1.forceMove(user.loc)
@@ -314,9 +310,6 @@
flash2 = null
..()
-
-
-
/obj/item/bodypart/l_arm/robot/surplus
name = "surplus prosthetic left arm"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
diff --git a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
index 0e3de53f8838..0794602de953 100644
--- a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
@@ -1,31 +1,38 @@
/obj/item/bodypart/head/ethereal
icon = 'icons/mob/species/ethereal/bodyparts.dmi'
- limb_id = SPECIES_ETHEREAL
+ icon_state = "elzuose_head"
+ limb_id = SPECIES_ELZUOSE
is_dimorphic = FALSE
uses_mutcolor = TRUE
+ bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_SNOUT
/obj/item/bodypart/chest/ethereal
icon = 'icons/mob/species/ethereal/bodyparts.dmi'
- limb_id = SPECIES_ETHEREAL
+ icon_state = "elzuose_chest"
+ limb_id = SPECIES_ELZUOSE
is_dimorphic = FALSE
uses_mutcolor = TRUE
/obj/item/bodypart/l_arm/ethereal
icon = 'icons/mob/species/ethereal/bodyparts.dmi'
- limb_id = SPECIES_ETHEREAL
+ icon_state = "elzuose_l_arm"
+ limb_id = SPECIES_ELZUOSE
uses_mutcolor = TRUE
/obj/item/bodypart/r_arm/ethereal
icon = 'icons/mob/species/ethereal/bodyparts.dmi'
- limb_id = SPECIES_ETHEREAL
+ icon_state = "elzuose_r_arm"
+ limb_id = SPECIES_ELZUOSE
uses_mutcolor = TRUE
/obj/item/bodypart/leg/left/ethereal
icon = 'icons/mob/species/ethereal/bodyparts.dmi'
- limb_id = SPECIES_ETHEREAL
+ icon_state = "elzuose_l_leg"
+ limb_id = SPECIES_ELZUOSE
uses_mutcolor = TRUE
/obj/item/bodypart/leg/right/ethereal
icon = 'icons/mob/species/ethereal/bodyparts.dmi'
- limb_id = SPECIES_ETHEREAL
+ icon_state = "elzuose_r_leg"
+ limb_id = SPECIES_ELZUOSE
uses_mutcolor = TRUE
diff --git a/code/modules/surgery/bodyparts/species_parts/ipc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ipc_bodyparts.dm
index d58d647d57e0..dc162eadfe5e 100644
--- a/code/modules/surgery/bodyparts/species_parts/ipc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/ipc_bodyparts.dm
@@ -1,6 +1,7 @@
/obj/item/bodypart/head/ipc
static_icon = 'icons/mob/species/ipc/bodyparts.dmi'
icon = 'icons/mob/species/ipc/bodyparts.dmi'
+ icon_state = "synth_head"
limb_id = "synth" //Overriden in /species/ipc/replace_body()
is_dimorphic = FALSE
should_draw_greyscale = FALSE
@@ -16,6 +17,7 @@
/obj/item/bodypart/chest/ipc
static_icon = 'icons/mob/species/ipc/bodyparts.dmi'
icon = 'icons/mob/species/ipc/bodyparts.dmi'
+ icon_state = "synth_chest"
limb_id = "synth"
is_dimorphic = FALSE
should_draw_greyscale = FALSE
@@ -32,6 +34,7 @@
/obj/item/bodypart/l_arm/ipc
static_icon = 'icons/mob/species/ipc/bodyparts.dmi'
icon = 'icons/mob/species/ipc/bodyparts.dmi'
+ icon_state = "synth_l_arm"
limb_id = "synth"
should_draw_greyscale = FALSE
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC
@@ -47,6 +50,7 @@
/obj/item/bodypart/r_arm/ipc
static_icon = 'icons/mob/species/ipc/bodyparts.dmi'
icon = 'icons/mob/species/ipc/bodyparts.dmi'
+ icon_state = "synth_r_arm"
limb_id = "synth"
should_draw_greyscale = FALSE
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC
@@ -62,6 +66,7 @@
/obj/item/bodypart/leg/left/ipc
static_icon = 'icons/mob/species/ipc/bodyparts.dmi'
icon = 'icons/mob/species/ipc/bodyparts.dmi'
+ icon_state = "synth_l_leg"
limb_id = "synth"
should_draw_greyscale = FALSE
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC
@@ -77,6 +82,7 @@
/obj/item/bodypart/leg/right/ipc
static_icon = 'icons/mob/species/ipc/bodyparts.dmi'
icon = 'icons/mob/species/ipc/bodyparts.dmi'
+ icon_state = "synth_r_leg"
limb_id = "synth"
should_draw_greyscale = FALSE
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC
diff --git a/code/modules/surgery/bodyparts/species_parts/kepori_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/kepori_bodyparts.dm
index 5764d355db2a..9d512c6e0c16 100644
--- a/code/modules/surgery/bodyparts/species_parts/kepori_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/kepori_bodyparts.dm
@@ -1,5 +1,6 @@
/obj/item/bodypart/head/kepori
icon = 'icons/mob/species/kepori/bodyparts.dmi'
+ icon_state = "kepori_head"
limb_id = SPECIES_KEPORI
uses_mutcolor = TRUE
is_dimorphic = FALSE
@@ -7,6 +8,7 @@
/obj/item/bodypart/chest/kepori
icon = 'icons/mob/species/kepori/bodyparts.dmi'
+ icon_state = "kepori_chest"
uses_mutcolor = TRUE
limb_id = SPECIES_KEPORI
is_dimorphic = FALSE
@@ -15,24 +17,28 @@
/obj/item/bodypart/l_arm/kepori
icon = 'icons/mob/species/kepori/bodyparts.dmi'
+ icon_state = "kepori_l_arm"
uses_mutcolor = TRUE
limb_id = SPECIES_KEPORI
bodytype = BODYTYPE_KEPORI | BODYTYPE_ORGANIC
/obj/item/bodypart/r_arm/kepori
icon = 'icons/mob/species/kepori/bodyparts.dmi'
+ icon_state = "kepori_r_arm"
uses_mutcolor = TRUE
limb_id = SPECIES_KEPORI
bodytype = BODYTYPE_KEPORI | BODYTYPE_ORGANIC
/obj/item/bodypart/leg/left/kepori
icon = 'icons/mob/species/kepori/bodyparts.dmi'
+ icon_state = "kepori_l_leg"
uses_mutcolor = TRUE
limb_id = SPECIES_KEPORI
bodytype = BODYTYPE_KEPORI | BODYTYPE_ORGANIC
/obj/item/bodypart/leg/right/kepori
icon = 'icons/mob/species/kepori/bodyparts.dmi'
+ icon_state = "kepori_r_leg"
uses_mutcolor = TRUE
limb_id = SPECIES_KEPORI
bodytype = BODYTYPE_KEPORI | BODYTYPE_ORGANIC
diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
index 9977afc7ca52..50e37ee93e12 100644
--- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
@@ -1,41 +1,48 @@
/obj/item/bodypart/head/lizard
icon = 'icons/mob/species/lizard/bodyparts.dmi'
- limb_id = SPECIES_LIZARD
+ icon_state = "sarathi_head"
+ limb_id = SPECIES_SARATHI
uses_mutcolor = TRUE
is_dimorphic = FALSE
+ bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_SNOUT
/obj/item/bodypart/chest/lizard
icon = 'icons/mob/species/lizard/bodyparts.dmi'
+ icon_state = "sarathi_chest"
uses_mutcolor = TRUE
- limb_id = SPECIES_LIZARD
+ limb_id = SPECIES_SARATHI
is_dimorphic = FALSE
/obj/item/bodypart/l_arm/lizard
icon = 'icons/mob/species/lizard/bodyparts.dmi'
+ icon_state = "sarathi_l_arm"
uses_mutcolor = TRUE
- limb_id = SPECIES_LIZARD
+ limb_id = SPECIES_SARATHI
/obj/item/bodypart/r_arm/lizard
icon = 'icons/mob/species/lizard/bodyparts.dmi'
+ icon_state = "sarathi_r_arm"
uses_mutcolor = TRUE
- limb_id = SPECIES_LIZARD
+ limb_id = SPECIES_SARATHI
/obj/item/bodypart/leg/left/lizard
icon = 'icons/mob/species/lizard/bodyparts.dmi'
+ icon_state = "sarathi_l_leg"
uses_mutcolor = TRUE
- limb_id = SPECIES_LIZARD
+ limb_id = SPECIES_SARATHI
/obj/item/bodypart/leg/right/lizard
icon = 'icons/mob/species/lizard/bodyparts.dmi'
+ icon_state = "sarathi_r_leg"
uses_mutcolor = TRUE
- limb_id = SPECIES_LIZARD
+ limb_id = SPECIES_SARATHI
/obj/item/bodypart/leg/left/lizard/digitigrade
icon = 'icons/mob/species/lizard/bodyparts.dmi'
- icon_state = "lizard_l_leg_digitigrade"
+ icon_state = "sarathi_l_leg_digitigrade"
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE
/obj/item/bodypart/leg/right/lizard/digitigrade
icon = 'icons/mob/species/lizard/bodyparts.dmi'
- icon_state = "lizard_r_leg_digitigrade"
+ icon_state = "sarathi_r_leg_digitigrade"
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE
diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm
index 4c416c31c633..a4628d19efff 100644
--- a/code/modules/surgery/coronary_bypass.dm
+++ b/code/modules/surgery/coronary_bypass.dm
@@ -41,7 +41,8 @@
display_results(user, target, "Blood pools around the incision in [H]'s heart.",
"Blood pools around the incision in [H]'s heart.",
"")
- H.bleed_rate += 10
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ BP.adjust_bleeding(10)
target.apply_damage(15, BRUTE, "[target_zone]")
return ..()
@@ -51,7 +52,8 @@
display_results(user, target, "You screw up, cutting too deeply into the heart!",
"[user] screws up, causing blood to spurt out of [H]'s chest!",
"[user] screws up, causing blood to spurt out of [H]'s chest!")
- H.bleed_rate += 20
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ BP.adjust_bleeding(20)
H.adjustOrganLoss(ORGAN_SLOT_HEART, 10)
target.apply_damage(15, BRUTE, "[target_zone]")
@@ -90,5 +92,6 @@
"[user] screws up, causing blood to spurt out of [H]'s chest profusely!",
"[user] screws up, causing blood to spurt out of [H]'s chest profusely!")
H.adjustOrganLoss(ORGAN_SLOT_HEART, 30)
- H.bleed_rate += 30
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ BP.adjust_bleeding(30)
return FALSE
diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm
index 5167bb3a4517..42018e6c1d87 100644
--- a/code/modules/surgery/organic_steps.dm
+++ b/code/modules/surgery/organic_steps.dm
@@ -30,7 +30,9 @@
display_results(user, target, "Blood pools around the incision in [H]'s [parse_zone(target_zone)].",
"Blood pools around the incision in [H]'s [parse_zone(target_zone)].",
"")
- H.bleed_rate += 3
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ if(BP)
+ BP.adjust_bleeding(3)
return ..()
/datum/surgery_step/incise/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -74,7 +76,9 @@
target.heal_bodypart_damage(20,0)
if (ishuman(target))
var/mob/living/carbon/human/H = target
- H.bleed_rate = max((H.bleed_rate - 3), 0)
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ if(BP)
+ BP.adjust_bleeding(-3)
return ..()
/datum/surgery_step/clamp_bleeders/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -137,7 +141,9 @@
target.heal_bodypart_damage(15,0)
if (ishuman(target))
var/mob/living/carbon/human/H = target
- H.bleed_rate = max((H.bleed_rate - 3), 0)
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(surgery.location))
+ if(BP)
+ BP.adjust_bleeding(-3)
return ..()
//saw bone
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index d9d3d6b0b717..5d6fac852d51 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -13,6 +13,10 @@
var/list/items_list = list()// I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies.
/// You can use this var for item path, it would be converted into an item on New().
var/obj/item/active_item
+ /// Sound played when extending
+ var/extend_sound = 'sound/mecha/mechmove03.ogg'
+ /// Sound played when retracting
+ var/retract_sound = 'sound/mecha/mechmove03.ogg'
/obj/item/organ/cyberimp/arm/Initialize()
. = ..()
@@ -68,18 +72,34 @@
to_chat(user, "You modify [src] to be installed on the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.")
update_appearance()
+/obj/item/organ/cyberimp/arm/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
+ . = ..()
+ var/side = zone == BODY_ZONE_R_ARM? RIGHT_HANDS : LEFT_HANDS
+ hand = owner.hand_bodyparts[side]
+ if(hand)
+ RegisterSignal(hand, COMSIG_ITEM_ATTACK_SELF, PROC_REF(ui_action_click)) //If the limb gets an attack-self, open the menu. Only happens when hand is empty
+ RegisterSignal(M, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(dropkey)) //We're nodrop, but we'll watch for the drop hotkey anyway and then stow if possible.
+
/obj/item/organ/cyberimp/arm/Remove(mob/living/carbon/M, special = 0)
Retract()
+ if(hand)
+ UnregisterSignal(hand, COMSIG_ITEM_ATTACK_SELF)
+ UnregisterSignal(M, COMSIG_KB_MOB_DROPITEM_DOWN)
..()
-/obj/item/organ/cyberimp/arm/emp_act(severity)
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- if(prob(15/severity) && owner)
- to_chat(owner, "[src] is hit by EMP!")
- // give the owner an idea about why his implant is glitching
- Retract()
+/**
+ * Called when the mob uses the "drop item" hotkey
+ *
+ * Items inside toolset implants have TRAIT_NODROP, but we can still use the drop item hotkey as a
+ * quick way to store implant items. In this case, we check to make sure the user has the correct arm
+ * selected, and that the item is actually owned by us, and then we'll hand off the rest to Retract()
+**/
+/obj/item/organ/cyberimp/arm/proc/dropkey(mob/living/carbon/host)
+ if(!host)
+ return //How did we even get here
+ if(hand != host.hand_bodyparts[host.active_hand_index])
+ return //wrong hand
+ Retract()
/obj/item/organ/cyberimp/arm/proc/Retract()
if(!active_item || (active_item in src))
@@ -89,13 +109,9 @@
"[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.",
"You hear a short mechanical noise.")
- if(istype(active_item, /obj/item/assembly/flash/armimplant))
- var/obj/item/assembly/flash/F = active_item
- F.set_light(0)
-
owner.transferItemToLoc(active_item, src, TRUE)
+ playsound(get_turf(owner), retract_sound, 50, TRUE)
active_item = null
- playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, TRUE)
/obj/item/organ/cyberimp/arm/proc/Extend(obj/item/item)
if(!(item in src))
@@ -135,7 +151,7 @@
owner.visible_message("[owner] extends [active_item] from [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.",
"You extend [active_item] from your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.",
"You hear a short mechanical noise.")
- playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, TRUE)
+ playsound(get_turf(owner), extend_sound, 50, TRUE)
/obj/item/organ/cyberimp/arm/ui_action_click()
if((organ_flags & ORGAN_FAILING) || (!active_item && !contents.len))
@@ -161,6 +177,14 @@
else
Retract()
+/obj/item/organ/cyberimp/arm/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ if(prob(15/severity) && owner)
+ to_chat(owner, "[src] is hit by EMP!")
+ // give the owner an idea about why his implant is glitching
+ Retract()
/obj/item/organ/cyberimp/arm/gun/emp_act(severity)
. = ..()
@@ -225,7 +249,6 @@
desc = "A cybernetic implant that allows the user to project a healing beam from their hand."
items_to_create = list(/obj/item/gun/medbeam)
-
/obj/item/organ/cyberimp/arm/flash
name = "integrated high-intensity photon projector" //Why not
desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash."
@@ -277,4 +300,4 @@
name = "power cord implant"
desc = "An internal power cord hooked up to a battery. Useful if you run on volts."
items_to_create = list(/obj/item/apc_powercord)
- zone = "l_arm"
+ zone = BODY_ZONE_L_ARM
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index ae6f1cf43d39..022292c282b8 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -2,6 +2,7 @@
/obj/item/organ/cyberimp
name = "cybernetic implant"
desc = "A state-of-the-art implant that improves a baseline's functionality."
+ icon = 'icons/obj/implants/implant.dmi'
status = ORGAN_ROBOTIC
organ_flags = ORGAN_SYNTHETIC
var/implant_color = "#FFFFFF"
@@ -17,8 +18,6 @@
add_overlay(overlay)
return ..()
-
-
//[[[[BRAIN]]]]
/obj/item/organ/cyberimp/brain
@@ -138,6 +137,36 @@
/obj/item/organ/cyberimp/brain/anti_stun/proc/reboot()
organ_flags &= ~ORGAN_FAILING
+/obj/item/organ/cyberimp/brain/joywire
+ name = "\improper Midi-Sed pleasure vivifier"
+ desc = "A widely popular (and addictive) implant produced by Miditeke-Sedari Tokoce that stimulates the brain's pleasure centers. Dramatically increases mood, but interferes with taste reception even if uninstalled."
+ implant_color = "#FFABE0"
+ slot = ORGAN_SLOT_BRAIN_JOYWIRE
+
+/obj/item/organ/cyberimp/brain/joywire/on_life()
+ if(owner || !(organ_flags & ORGAN_FAILING))
+ SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "joywire", /datum/mood_event/joywire)
+ ADD_TRAIT(owner, TRAIT_AGEUSIA, TRAIT_GENERIC)
+
+/obj/item/organ/cyberimp/brain/joywire/emp_act(severity)
+ . = ..()
+ if(!owner || . & EMP_PROTECT_SELF)
+ return
+ organ_flags |= ORGAN_FAILING
+ SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "joywire")
+ SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "joywire_emp", /datum/mood_event/joywire_emp)
+ to_chat(owner, span_boldwarning("That feeling of dream-like, distilled joy is suddenly diluted. Misery sets in..."))
+
+/obj/item/organ/cyberimp/brain/mindscrew
+ name = "\improper Midi-Sed MNDFCK implant"
+ desc = "A horrific after-market modification of Midi-Sed's pleasure vivifier that stimulates intense pain in the brain. Dramatically hurts a user's mood and mental state, and lingers for a time after removal."
+ implant_color = "#5E1108"
+ slot = ORGAN_SLOT_BRAIN_JOYWIRE
+
+/obj/item/organ/cyberimp/brain/mindscrew/on_life()
+ if(owner || !(organ_flags & ORGAN_FAILING))
+ SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "mindscrew", /datum/mood_event/mindscrew)
+
//[[[[MOUTH]]]]
/obj/item/organ/cyberimp/mouth
zone = BODY_ZONE_PRECISE_MOUTH
diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm
index f1eb39b84162..6f057c88d23d 100644
--- a/code/modules/surgery/organs/ears.dm
+++ b/code/modules/surgery/organs/ears.dm
@@ -150,6 +150,10 @@
ear_owner.dna.species.mutant_bodyparts -= "ears"
ear_owner.update_body()
+/obj/item/organ/ears/fox
+ name = "fox ears"
+ damage_multiplier = 2
+
/obj/item/organ/ears/fox/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
..()
if(istype(ear_owner))
@@ -166,6 +170,78 @@
ear_owner.dna.species.mutant_bodyparts -= "ears"
ear_owner.update_body()
+/obj/item/organ/ears/rabbit
+ name = "rabbit ears"
+ damage_multiplier = 2
+
+/obj/item/organ/ears/rabbit/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.species.mutant_bodyparts |= "ears"
+ ear_owner.dna.features["ears"] = "Rabbit"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/rabbit/Remove(mob/living/carbon/human/ear_owner, special = 0)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.features["ears"] = "None"
+ ear_owner.dna.species.mutant_bodyparts -= "ears"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/rabbit/bent/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.species.mutant_bodyparts |= "ears"
+ ear_owner.dna.features["ears"] = "Bent Rabbit"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/rabbit/bent/Remove(mob/living/carbon/human/ear_owner, special = 0)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.features["ears"] = "None"
+ ear_owner.dna.species.mutant_bodyparts -= "ears"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/rabbit/floppy/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.species.mutant_bodyparts |= "ears"
+ ear_owner.dna.features["ears"] = "Floppy Rabbit"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/floppy/Remove(mob/living/carbon/human/ear_owner, special = 0)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.features["ears"] = "None"
+ ear_owner.dna.species.mutant_bodyparts -= "ears"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/dog
+ name = "dog ears"
+ damage_multiplier = 2
+
+/obj/item/organ/ears/dog/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.species.mutant_bodyparts |= "ears"
+ ear_owner.dna.features["ears"] = "Dog"
+ ear_owner.update_body()
+
+/obj/item/organ/ears/dog/Remove(mob/living/carbon/human/ear_owner, special = 0)
+ ..()
+ if(istype(ear_owner))
+ color = ear_owner.hair_color
+ ear_owner.dna.features["ears"] = "None"
+ ear_owner.dna.species.mutant_bodyparts -= "ears"
+ ear_owner.update_body()
+
/obj/item/organ/ears/elf
name = "elf ears"
damage_multiplier = 1.5
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index 0c200df9f6b1..283ee77971eb 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -149,6 +149,9 @@
/obj/item/organ/eyes/robotic/lizard
eye_icon_state = "eyes_synth"
+/obj/item/organ/eyes/robotic/kepori
+ eye_icon_state = "eyes_kepori_synth"
+
/obj/item/organ/eyes/robotic/emp_act(severity)
. = ..()
if(!owner || . & EMP_PROTECT_SELF)
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index fc5de4be3049..05ca5131e0f9 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -226,7 +226,7 @@
if(SA_pp > SA_para_min) // Enough to make us stunned for a bit
H.Unconscious(60) // 60 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
- H.Sleeping(max(H.AmountSleeping() + 40, 200))
+ H.Sleeping(200)
else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
H.emote(pick("giggle", "laugh"))
diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm
index bf9346b5dcd9..62ca9cd2fe8e 100644
--- a/code/modules/surgery/organs/stomach.dm
+++ b/code/modules/surgery/organs/stomach.dm
@@ -100,12 +100,12 @@
/obj/item/organ/stomach/ethereal
name = "biological battery"
icon_state = "stomach-p" //Welp. At least it's more unique in functionaliy.
- desc = "A crystal-like organ that stores the electric charge of ethereals."
- var/crystal_charge = ETHEREAL_CHARGE_FULL
+ desc = "A crystal-like organ that stores the electric charge of elzuosa."
+ var/crystal_charge = ELZUOSE_CHARGE_FULL
/obj/item/organ/stomach/ethereal/on_life()
..()
- adjust_charge(-ETHEREAL_CHARGE_FACTOR)
+ adjust_charge(-ELZUOSE_CHARGE_FACTOR)
/obj/item/organ/stomach/ethereal/Insert(mob/living/carbon/organ_owner, special = 0)
..()
@@ -121,10 +121,10 @@
/obj/item/organ/stomach/ethereal/proc/get_status_tab_item(mob/living/carbon/source, list/items)
SIGNAL_HANDLER
- items += "Crystal Charge: [round((crystal_charge / ETHEREAL_CHARGE_SCALING_MULTIPLIER), 0.1)]%"
+ items += "Crystal Charge: [round((crystal_charge / ELZUOSE_CHARGE_SCALING_MULTIPLIER), 0.1)]%"
/obj/item/organ/stomach/ethereal/proc/charge(datum/source, amount, repairs)
- adjust_charge((amount * ETHEREAL_CHARGE_SCALING_MULTIPLIER) / 70) //WS Edit -- Ethereal Charge Scaling
+ adjust_charge((amount * ELZUOSE_CHARGE_SCALING_MULTIPLIER) / 70) //WS Edit -- Ethereal Charge Scaling
/obj/item/organ/stomach/ethereal/proc/on_electrocute(datum/source, shock_damage, siemens_coeff = 1, flags = NONE)
if(flags & SHOCK_ILLUSION)
@@ -133,7 +133,7 @@
to_chat(owner, "You absorb some of the shock into your body!")
/obj/item/organ/stomach/ethereal/proc/adjust_charge(amount)
- crystal_charge = clamp(crystal_charge + amount, ETHEREAL_CHARGE_NONE, ETHEREAL_CHARGE_DANGEROUS)
+ crystal_charge = clamp(crystal_charge + amount, ELZUOSE_CHARGE_NONE, ELZUOSE_CHARGE_DANGEROUS)
/obj/item/organ/stomach/cybernetic
name = "basic cybernetic stomach"
diff --git a/code/modules/surgery/organs/tails.dm b/code/modules/surgery/organs/tails.dm
index 2d3e402150a2..be43bc99f62d 100644
--- a/code/modules/surgery/organs/tails.dm
+++ b/code/modules/surgery/organs/tails.dm
@@ -137,7 +137,7 @@
desc = "A severed fox tail. Sad."
tail_type = "Fox 2"
-/obj/item/organ/tail/cat/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
+/obj/item/organ/tail/fox/alt/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
..()
if(istype(H))
if(!("tail_human" in H.dna.species.mutant_bodyparts))
@@ -145,7 +145,49 @@
H.dna.features["tail_human"] = tail_type
H.update_body()
-/obj/item/organ/tail/cat/Remove(mob/living/carbon/human/H, special = 0)
+/obj/item/organ/tail/fox/alt/Remove(mob/living/carbon/human/H, special = 0)
+ ..()
+ if(istype(H))
+ H.dna.features["tail_human"] = "None"
+ H.dna.species.mutant_bodyparts -= "tail_human"
+ color = H.hair_color
+ H.update_body()
+
+/obj/item/organ/tail/rabbit
+ name = "rabbit tail"
+ desc = "A severed rabbit tail."
+ tail_type = "Rabbit"
+
+/obj/item/organ/tail/rabbit/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(H))
+ if(!("tail_human" in H.dna.species.mutant_bodyparts))
+ H.dna.species.mutant_bodyparts |= "tail_human"
+ H.dna.features["tail_human"] = tail_type
+ H.update_body()
+
+/obj/item/organ/tail/rabbit/Remove(mob/living/carbon/human/H, special = 0)
+ ..()
+ if(istype(H))
+ H.dna.features["tail_human"] = "None"
+ H.dna.species.mutant_bodyparts -= "tail_human"
+ color = H.hair_color
+ H.update_body()
+
+/obj/item/organ/tail/dog
+ name = "dog tail"
+ desc = "A severed dog tail."
+ tail_type = "Dog"
+
+/obj/item/organ/tail/dog/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(H))
+ if(!("tail_human" in H.dna.species.mutant_bodyparts))
+ H.dna.species.mutant_bodyparts |= "tail_human"
+ H.dna.features["tail_human"] = tail_type
+ H.update_body()
+
+/obj/item/organ/tail/dog/Remove(mob/living/carbon/human/H, special = 0)
..()
if(istype(H))
H.dna.features["tail_human"] = "None"
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 5eed8abc46be..c0313adb2539 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -286,7 +286,7 @@
else if((findtext(message, bleed_words)))
cooldown = COOLDOWN_DAMAGE
for(var/mob/living/carbon/human/H in listeners)
- H.bleed_rate += (5 * power_multiplier)
+ H.cause_overall_bleeding(5*power_multiplier)
//FIRE
else if((findtext(message, burn_words)))
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 88323f0056a8..24b413fd8f7d 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -135,14 +135,13 @@
/obj/item/disk/surgery
name = "Surgery Procedure Disk"
desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console."
- icon_state = "datadisk1"
+ illustration = "med"
custom_materials = list(/datum/material/iron=300, /datum/material/glass=100)
var/list/surgeries
/obj/item/disk/surgery/debug
name = "Debug Surgery Disk"
desc = "A disk that contains all existing surgery procedures."
- icon_state = "datadisk1"
custom_materials = list(/datum/material/iron=300, /datum/material/glass=100)
/obj/item/disk/surgery/debug/Initialize()
diff --git a/code/modules/surgery/surgery_helpers.dm b/code/modules/surgery/surgery_helpers.dm
index c4a769c43ed5..f87c6e1bb923 100644
--- a/code/modules/surgery/surgery_helpers.dm
+++ b/code/modules/surgery/surgery_helpers.dm
@@ -85,7 +85,7 @@
/proc/attempt_cancel_surgery(datum/surgery/S, obj/item/I, mob/living/M, mob/user)
var/selected_zone = user.zone_selected
to_chat(user, "You begin to cancel \the [S].")
- if (!do_mob(user, M, 3 SECONDS))
+ if (!do_after(user, 3 SECONDS, M))
return
if(S.status == 1)
@@ -115,7 +115,9 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate = max((H.bleed_rate - 3), 0)
+ var/obj/item/bodypart/BP = H.get_bodypart(check_zone(S.location))
+ if(BP)
+ BP.adjust_bleeding(-3)
M.surgeries -= S
user.visible_message("[user] closes [M]'s [parse_zone(selected_zone)] with [close_tool] and stops the surgery.", \
"You close [M]'s [parse_zone(selected_zone)] with [close_tool] and stop the surgery.")
diff --git a/code/modules/tgs/LICENSE b/code/modules/tgs/LICENSE
index 85bca8c3f814..8991a68881b4 100644
--- a/code/modules/tgs/LICENSE
+++ b/code/modules/tgs/LICENSE
@@ -1,6 +1,6 @@
The MIT License
-Copyright (c) 2017-2023 Jordan Brown
+Copyright (c) 2017-2024 Jordan Brown
Permission is hereby granted, free of charge,
to any person obtaining a copy of this software and
diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm
index 898516f12486..f734fd0527f0 100644
--- a/code/modules/tgs/core/datum.dm
+++ b/code/modules/tgs/core/datum.dm
@@ -7,7 +7,7 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null)
var/list/warned_deprecated_command_runs
/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version)
- . = ..()
+ ..()
src.event_handler = event_handler
src.version = version
diff --git a/code/modules/tgs/core/tgs_version.dm b/code/modules/tgs/core/tgs_version.dm
index a5dae1241a30..bc561e67487a 100644
--- a/code/modules/tgs/core/tgs_version.dm
+++ b/code/modules/tgs/core/tgs_version.dm
@@ -1,4 +1,5 @@
/datum/tgs_version/New(raw_parameter)
+ ..()
src.raw_parameter = raw_parameter
deprefixed_parameter = replacetext(raw_parameter, "/tg/station 13 Server v", "")
var/list/version_bits = splittext(deprefixed_parameter, ".")
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index afb4beecae14..4b4e10edd7ac 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -62,8 +62,13 @@
#define TEST_OUTPUT_GREEN(text) (text)
#endif
+
#ifdef BASIC_TESTS
+//#include "icons/inhands.dm"
+#include "icons/missing_icons.dm"
+#include "icons/spritesheets.dm"
+#include "icons/worn_icons.dm"
#include "anchored_mobs.dm"
#include "autowiki.dm"
#include "bespoke_id.dm"
diff --git a/code/modules/unit_tests/icons/inhands.dm b/code/modules/unit_tests/icons/inhands.dm
new file mode 100644
index 000000000000..858c6d2f2840
--- /dev/null
+++ b/code/modules/unit_tests/icons/inhands.dm
@@ -0,0 +1,94 @@
+/// Makes sure items with defined item_states... actually have icons that exist!
+/datum/unit_test/defined_item_states
+ var/static/list/possible_icon_states = list()
+ var/fallback_log_message
+ var/unset_inhand_var_message
+ /// additional_inhands_location is for downstream modularity support. as an example, for skyrat's usage, set additional_inhands_location = "modular_skyrat/master_files/icons/mob/inhands/"
+ /// Make sure this location is also present in tools/deploy.sh
+ /// If you need additional paths ontop of this second one, you can add another generate_possible_icon_states_list("your/folder/path/inhands/") below the if(additional_inhands_location) block in Run(), and make sure to add that path to tools/deploy.sh as well.
+ var/additional_inhands_location = null
+
+/datum/unit_test/defined_item_states/proc/generate_possible_icon_states_list(directory_path)
+ if(!directory_path)
+ directory_path = "icons/mob/inhands/"
+ for(var/file_path in flist(directory_path))
+ if(findtext(file_path, ".dmi"))
+ for(var/sprite_icon in icon_states("[directory_path][file_path]", 1)) //2nd arg = 1 enables 64x64+ icon support, otherwise you'll end up with "sword0_1" instead of "sword"
+ possible_icon_states[sprite_icon] += list("[directory_path][file_path]")
+ else
+ possible_icon_states += generate_possible_icon_states_list("[directory_path][file_path]")
+
+/datum/unit_test/defined_item_states/Run()
+ generate_possible_icon_states_list()
+ if(additional_inhands_location)
+ generate_possible_icon_states_list(additional_inhands_location)
+
+ //Add EVEN MORE paths if needed here!
+ //generate_possible_icon_states_list("your/folder/path/inhands/")
+
+ for(var/obj/item/item_path as anything in subtypesof(/obj/item))
+ if(initial(item_path.item_flags) & ABSTRACT)
+ continue
+
+ var/skip_left
+ var/skip_right
+
+ var/lefthand_file = initial(item_path.lefthand_file)
+ var/righthand_file = initial(item_path.righthand_file)
+
+ var/item_state = initial(item_path.item_state)
+ if(!item_state)
+ var/base_icon_state = initial(item_path.icon_state)
+ if(!isnull(base_icon_state) && lefthand_file && righthand_file) //Suggest inhand icons that match with the icon_state var.
+ var/missing_var_message
+ if(base_icon_state in possible_icon_states)
+ for(var/file_place in possible_icon_states[base_icon_state])
+ missing_var_message += (missing_var_message ? " & '[file_place]'" : " - Possible matching sprites for \"[base_icon_state]\" found in: '[file_place]'")
+ unset_inhand_var_message += "\n\t[item_path] does not have an item_state value[missing_var_message]"
+ continue
+
+ var/match_message
+ if(item_state in possible_icon_states)
+ for(var/file_place in possible_icon_states[item_state])
+ match_message += (match_message ? " & '[file_place]'" : " - Matching sprite found in: '[file_place]'")
+
+ if(!(skip_left || skip_right) && !lefthand_file && !righthand_file)
+ TEST_FAIL("Missing both icon files for [item_path].\n\titem_state = \"[item_state]\"[match_message]")
+ continue
+
+ var/missing_left
+ var/left_fallback
+ if(!skip_left)
+ if(!lefthand_file)
+ TEST_FAIL("Missing left inhand icon file for [item_path].\n\titem_state = \"[item_state]\"[match_message]")
+ else
+ missing_left = !icon_exists(lefthand_file, item_state)
+ if(missing_left && icon_exists(lefthand_file, ""))
+ left_fallback = TRUE
+
+ var/missing_right
+ var/right_fallback
+ if(!skip_right)
+ if(!righthand_file)
+ TEST_FAIL("Missing right inhand icon file for [item_path].\n\titem_state = \"[item_state]\"[match_message]")
+ else
+ missing_right = !icon_exists(righthand_file, item_state)
+ if(missing_right && icon_exists(righthand_file, ""))
+ right_fallback = TRUE
+
+ if(missing_right && missing_left)
+ if(!match_message && right_fallback && left_fallback)
+ fallback_log_message += "\n\t[item_path] has invalid value, using fallback icon.\n\titem_state = \"[item_state]\""
+ continue
+ TEST_FAIL("Missing inhand sprites for [item_path] in both '[lefthand_file]' & '[righthand_file]'.\n\titem_state = \"[item_state]\"[match_message]")
+ else if(missing_left)
+ TEST_FAIL("Missing left inhand sprite for [item_path] in '[lefthand_file]'[left_fallback ? ", using fallback icon" : null].\n\titem_state = \"[item_state]\"[match_message]")
+ else if(missing_right)
+ TEST_FAIL("Missing right inhand sprite for [item_path] in '[righthand_file]'[right_fallback ? ", using fallback icon" : null].\n\titem_state = \"[item_state]\"[match_message]")
+
+ if(fallback_log_message)
+ TEST_FAIL("Invalid item_state values should be set to null if there isn't a valid icon.[fallback_log_message]")
+
+ if(unset_inhand_var_message)
+ log_test("\tNotice - Possible inhand icon matches found. It is best to be explicit with inhand sprite values.[unset_inhand_var_message]")
+
diff --git a/code/modules/unit_tests/icons/missing_icons.dm b/code/modules/unit_tests/icons/missing_icons.dm
new file mode 100644
index 000000000000..f548d2844a0f
--- /dev/null
+++ b/code/modules/unit_tests/icons/missing_icons.dm
@@ -0,0 +1,57 @@
+/// Makes sure objects actually have icons that exist!
+/datum/unit_test/missing_icons
+ var/static/list/possible_icon_states = list()
+ /// additional_icon_location is for downstream modularity support.
+ /// Make sure this location is also present in tools/deploy.sh
+ /// If you need additional paths ontop of this second one, you can add another generate_possible_icon_states_list("your/folder/path/") below the if(additional_icon_location) block in Run(), and make sure to add that path to tools/deploy.sh as well.
+ var/additional_icon_location = null
+
+/datum/unit_test/missing_icons/proc/generate_possible_icon_states_list(directory_path)
+ if(!directory_path)
+ directory_path = "icons/obj/"
+ for(var/file_path in flist(directory_path))
+ if(findtext(file_path, ".dmi"))
+ for(var/sprite_icon in icon_states("[directory_path][file_path]", 1)) //2nd arg = 1 enables 64x64+ icon support, otherwise you'll end up with "sword0_1" instead of "sword"
+ possible_icon_states[sprite_icon] += list("[directory_path][file_path]")
+ else
+ possible_icon_states += generate_possible_icon_states_list("[directory_path][file_path]")
+
+/datum/unit_test/missing_icons/Run()
+ generate_possible_icon_states_list()
+ generate_possible_icon_states_list("icons/effects/")
+ if(additional_icon_location)
+ generate_possible_icon_states_list(additional_icon_location)
+
+ //Add EVEN MORE paths if needed here!
+ //generate_possible_icon_states_list("your/folder/path/")
+ var/list/bad_list = list()
+ for(var/obj/obj_path as anything in subtypesof(/obj))
+ if(ispath(obj_path, /obj/item))
+ var/obj/item/item_path = obj_path
+ if(initial(item_path.item_flags) & ABSTRACT)
+ continue
+
+ var/icon = initial(obj_path.icon)
+ if(isnull(icon))
+ continue
+ var/icon_state = initial(obj_path.icon_state)
+ if(isnull(icon_state))
+ continue
+
+ if(length(bad_list) && (icon_state in bad_list[icon]))
+ continue
+
+ if(icon_exists(icon, icon_state))
+ continue
+
+ if(icon_state == "nothing")
+ continue
+
+ bad_list[icon] += list(icon_state)
+
+ var/match_message
+ if(icon_state in possible_icon_states)
+ for(var/file_place in possible_icon_states[icon_state])
+ match_message += (match_message ? " & '[file_place]'" : " - Matching sprite found in: '[file_place]'")
+ TEST_FAIL("Missing icon_state for [obj_path] in '[icon]'.\n\ticon_state = \"[icon_state]\"[match_message]")
+
diff --git a/code/modules/unit_tests/icons/spritesheets.dm b/code/modules/unit_tests/icons/spritesheets.dm
new file mode 100644
index 000000000000..c7c16c6535e8
--- /dev/null
+++ b/code/modules/unit_tests/icons/spritesheets.dm
@@ -0,0 +1,11 @@
+///Checks if spritesheet assets contain icon states with invalid names
+/datum/unit_test/spritesheets
+
+/datum/unit_test/spritesheets/Run()
+ for(var/datum/asset/spritesheet/sheet as anything in subtypesof(/datum/asset/spritesheet))
+ if(!initial(sheet.name)) //Ignore abstract types
+ continue
+ sheet = get_asset_datum(sheet)
+ for(var/sprite_name in sheet.sprites)
+ if(!sprite_name)
+ TEST_FAIL("Spritesheet [sheet.type] has a nameless icon state.")
diff --git a/code/modules/unit_tests/icons/worn_icons.dm b/code/modules/unit_tests/icons/worn_icons.dm
new file mode 100644
index 000000000000..eb2d84b73f68
--- /dev/null
+++ b/code/modules/unit_tests/icons/worn_icons.dm
@@ -0,0 +1,116 @@
+/// Makes sure suit slot items aren't using CS:S fallbacks.
+/datum/unit_test/mob_overlay_icons
+ var/static/list/possible_icon_states = list()
+ /// additional_icon_location is for downstream modularity support for finding missing sprites in additonal DMI file locations.
+ /// Make sure this location is also present in tools/deploy.sh
+ /// If you need additional paths ontop of this second one, you can add another generate_possible_icon_states_list("your/folder/path/") below the if(additional_icon_location) block in Run(), and make sure to add that path to tools/deploy.sh as well.
+ var/additional_icon_location = null
+
+/datum/unit_test/mob_overlay_icons/proc/generate_possible_icon_states_list(directory_path)
+ if(!directory_path)
+ directory_path = "icons/mob/clothing/"
+ for(var/file_path in flist(directory_path))
+ if(findtext(file_path, ".dmi"))
+ for(var/sprite_icon in icon_states("[directory_path][file_path]", 1)) //2nd arg = 1 enables 64x64+ icon support, otherwise you'll end up with "sword0_1" instead of "sword"
+ possible_icon_states[sprite_icon] += list("[directory_path][file_path]")
+ else
+ possible_icon_states += generate_possible_icon_states_list("[directory_path][file_path]")
+
+/datum/unit_test/mob_overlay_icons/Run()
+ generate_possible_icon_states_list()
+ if(additional_icon_location)
+ generate_possible_icon_states_list(additional_icon_location)
+
+ var/list/already_warned_icons = list()
+
+ for(var/obj/item/item_path as anything in (subtypesof(/obj/item/clothing)))
+ var/cached_slot_flags = initial(item_path.slot_flags)
+ if(!cached_slot_flags || (cached_slot_flags & ITEM_SLOT_LPOCKET) || (cached_slot_flags & ITEM_SLOT_RPOCKET) || initial(item_path.item_flags) & ABSTRACT)
+ continue
+
+ var/mob_overlay_icon = initial(item_path.mob_overlay_icon) //override icon file. where our sprite is contained if set. (ie modularity stuff)
+ var/mob_overlay_state = initial(item_path.mob_overlay_state) //overrides icon_state.
+ var/icon_state = mob_overlay_state || initial(item_path.icon_state) //icon_state. what sprite name we are looking for.
+
+
+ if(isnull(icon_state))
+ continue //no sprite for the item.
+ if(icon_state in already_warned_icons)
+ continue
+
+ var/match_message
+ if(icon_state in possible_icon_states)
+ for(var/file_place in possible_icon_states[icon_state])
+ match_message += (match_message ? " & '[file_place]'" : " - Matching sprite found in: '[file_place]'")
+
+ if(mob_overlay_icon) //easiest to check since we override everything. this automatically includes downstream support.
+ if(!(icon_state in icon_states(mob_overlay_icon, 1)))
+ TEST_FAIL("[item_path] using invalid [mob_overlay_state ? "mob_overlay_state" : "icon_state"], \"[icon_state]\" in mob_overlay_icon override file, '[mob_overlay_icon]'[match_message]")
+ continue
+
+ var/icon_file //checks against all the default icon locations if one isn't defined.
+ var/fail_reasons
+ var/spacer
+
+
+ if(cached_slot_flags & ITEM_SLOT_BACK)
+ icon_file = 'icons/mob/clothing/back.dmi'
+
+ if(!(icon_state in icon_states(icon_file, 1)))
+ already_warned_icons += icon_state
+ fail_reasons += "[item_path] using invalid [mob_overlay_state ? "mob_overlay_state" : "icon_state"], \"[icon_state]\" in '[icon_file]'[match_message]"
+ spacer = "\n\t"
+
+ /*
+ if(cached_slot_flags & ITEM_SLOT_ID)
+ icon_file = 'icons/mob/clothing/id.dmi'
+ if(!(icon_state in icon_states(icon_file, 1)))
+ already_warned_icons += icon_state
+ fail_reasons += "[spacer][item_path] using invalid [mob_overlay_state ? "mob_overlay_state" : "icon_state"], \"[icon_state]\" in '[icon_file]'[match_message]"
+ spacer = "\n\t"
+ */
+
+ if(cached_slot_flags & ITEM_SLOT_GLOVES)
+ icon_file = 'icons/mob/clothing/hands.dmi'
+ if(!(icon_state in icon_states(icon_file, 1)))
+ already_warned_icons += icon_state
+ fail_reasons += "[spacer][item_path] using invalid [mob_overlay_state ? "mob_overlay_state" : "icon_state"], \"[icon_state]\" in '[icon_file]'[match_message]"
+ spacer = "\n\t"
+
+ if(cached_slot_flags & ITEM_SLOT_EYES)
+ icon_file = 'icons/mob/clothing/eyes.dmi'
+ if(!(icon_state in icon_states(icon_file, 1)))
+ already_warned_icons += icon_state
+ fail_reasons += "[spacer][item_path] using invalid [mob_overlay_state ? "mob_overlay_state" : "icon_state"], \"[icon_state]\" in '[icon_file]'[match_message]"
+ spacer = "\n\t"
+
+ if(cached_slot_flags & ITEM_SLOT_EARS)
+ icon_file = 'icons/mob/clothing/ears.dmi'
+ if(!(icon_state in icon_states(icon_file, 1)))
+ already_warned_icons += icon_state
+ fail_reasons += "[spacer][item_path] using invalid [mob_overlay_state ? "mob_overlay_state" : "icon_state"], \"[icon_state]\" in '[icon_file]'[match_message]"
+ spacer = "\n\t"
+
+ if(cached_slot_flags & ITEM_SLOT_NECK)
+ icon_file = 'icons/mob/clothing/neck.dmi'
+ if(!(icon_state in icon_states(icon_file, 1)))
+ already_warned_icons += icon_state
+ fail_reasons += "[spacer][item_path] using invalid [mob_overlay_state ? "mob_overlay_state" : "icon_state"], \"[icon_state]\" in '[icon_file]'[match_message]"
+ spacer = "\n\t"
+
+ if(cached_slot_flags & ITEM_SLOT_MASK)
+ icon_file = 'icons/mob/clothing/mask.dmi'
+ if(!(icon_state in icon_states(icon_file, 1)))
+ already_warned_icons += icon_state
+ fail_reasons += "[spacer][item_path] using invalid [mob_overlay_state ? "mob_overlay_state" : "icon_state"], \"[icon_state]\" in '[icon_file]'[match_message]"
+ spacer = "\n\t"
+
+ if(cached_slot_flags & ITEM_SLOT_BELT)
+ icon_file = 'icons/mob/clothing/belt.dmi'
+ if(!(icon_state in icon_states(icon_file, 1)))
+ already_warned_icons += icon_state
+ fail_reasons += "[spacer][item_path] using invalid [mob_overlay_state ? "mob_overlay_state" : "icon_state"], \"[icon_state]\" in '[icon_file]'[match_message]"
+ spacer = "\n\t"
+
+ if(fail_reasons)
+ TEST_FAIL(fail_reasons)
diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm
index fee653cd626f..4dc12b4dc6e3 100644
--- a/code/modules/unit_tests/outfit_sanity.dm
+++ b/code/modules/unit_tests/outfit_sanity.dm
@@ -3,7 +3,10 @@
/* We don't check the result of equip_to_slot_or_del because it returns false for random jumpsuits, as they delete themselves on init */ \
var/obj/item/outfit_item = H.get_item_by_slot(##slot_name); \
if (!outfit_item) { \
- TEST_FAIL("[outfit.name]'s [#outfit_key] is invalid! Could not equip a [outfit.##outfit_key] into that slot."); \
+ if (outfit.random != TRUE) \
+ TEST_FAIL("[outfit.name]'s [#outfit_key] is invalid! Could not equip a [outfit.##outfit_key] into that slot."); \
+ else \
+ log_world("[outfit.name]'s [#outfit_key] is invalid! Could not equip a [outfit.##outfit_key] into that slot."); \
} \
}
@@ -19,6 +22,8 @@
r_hand = /obj/item/stack/sheet/glass/five
/datum/unit_test/outfit_sanity/Run()
+ var/datum/outfit/prototype_outfit = /datum/outfit
+ var/prototype_name = initial(prototype_outfit.name)
var/mob/living/carbon/human/H = allocate(/mob/living/carbon/human)
for (var/outfit_type in subtypesof(/datum/outfit))
@@ -27,11 +32,13 @@
qdel(I)
var/datum/outfit/outfit = new outfit_type
+
+ if(outfit.name == prototype_name)
+ TEST_FAIL("[outfit.type]'s name is invalid! Uses default outfit name!")
outfit.pre_equip(H, TRUE)
CHECK_OUTFIT_SLOT(uniform, ITEM_SLOT_ICLOTHING)
CHECK_OUTFIT_SLOT(suit, ITEM_SLOT_OCLOTHING)
- CHECK_OUTFIT_SLOT(back, ITEM_SLOT_BACK)
CHECK_OUTFIT_SLOT(belt, ITEM_SLOT_BELT)
CHECK_OUTFIT_SLOT(gloves, ITEM_SLOT_GLOVES)
CHECK_OUTFIT_SLOT(shoes, ITEM_SLOT_FEET)
@@ -40,11 +47,11 @@
CHECK_OUTFIT_SLOT(neck, ITEM_SLOT_NECK)
CHECK_OUTFIT_SLOT(ears, ITEM_SLOT_EARS)
CHECK_OUTFIT_SLOT(glasses, ITEM_SLOT_EYES)
+ CHECK_OUTFIT_SLOT(back, ITEM_SLOT_BACK)
CHECK_OUTFIT_SLOT(id, ITEM_SLOT_ID)
- CHECK_OUTFIT_SLOT(suit_store, ITEM_SLOT_SUITSTORE)
CHECK_OUTFIT_SLOT(l_pocket, ITEM_SLOT_LPOCKET)
CHECK_OUTFIT_SLOT(r_pocket, ITEM_SLOT_RPOCKET)
-
+ CHECK_OUTFIT_SLOT(suit_store, ITEM_SLOT_SUITSTORE)
if (outfit.backpack_contents || outfit.box)
var/list/backpack_contents = outfit.backpack_contents?.Copy()
if (outfit.box)
@@ -57,6 +64,10 @@
var/number = backpack_contents[path] || 1
for (var/_ in 1 to number)
if (!H.equip_to_slot_or_del(new path(H), ITEM_SLOT_BACKPACK, TRUE))
- TEST_FAIL("[outfit.name]'s backpack_contents are invalid! Couldn't add [path] to backpack.")
+ if (outfit.random != TRUE)
+ TEST_FAIL("[outfit.name]'s backpack_contents are invalid! Couldn't add [path] to backpack.")
+ else
+ log_world("[outfit.name]'s backpack_contents are invalid! Couldn't add [path] to backpack.")
+
#undef CHECK_OUTFIT_SLOT
diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm
index ef1a324a8e48..f82cb4c6f68e 100644
--- a/code/modules/uplink/uplink_devices.dm
+++ b/code/modules/uplink/uplink_devices.dm
@@ -7,8 +7,8 @@
name = "shortwave radio"
icon = 'icons/obj/radio.dmi'
icon_state = "radio"
- item_state = "walkietalkie"
desc = "A basic handheld radio that communicates with local telecommunication networks."
+ item_state = "radio"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
dog_fashion = /datum/dog_fashion/back
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 48c79382444e..eaa0a631ec5d 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -365,22 +365,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
surplus = 0
include_modes = list(/datum/game_mode/nuclear/clown_ops)
-/datum/uplink_item/dangerous/clownoppin
- name = "Ultra Hilarious Firing Pin"
- desc = "A firing pin that, when inserted into a gun, makes that gun only useable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it."
- cost = 1 //much cheaper for clown ops than for clowns
- item = /obj/item/firing_pin/clown/ultra
- include_modes = list(/datum/game_mode/nuclear/clown_ops)
- illegal_tech = FALSE
-
-/datum/uplink_item/dangerous/clownopsuperpin
- name = "Super Ultra Hilarious Firing Pin"
- desc = "Like the ultra hilarious firing pin, except the gun you insert this pin into explodes when someone who isn't clumsy or a clown tries to fire it."
- cost = 4 //much cheaper for clown ops than for clowns
- item = /obj/item/firing_pin/clown/ultra/selfdestruct
- include_modes = list(/datum/game_mode/nuclear/clown_ops)
- illegal_tech = FALSE
-
/datum/uplink_item/dangerous/bioterror
name = "Biohazardous Chemical Sprayer"
desc = "A handheld chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger \
@@ -532,7 +516,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/foamsmg
name = "Toy Submachine Gun"
desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade darts with a 20-round magazine."
- item = /obj/item/gun/ballistic/automatic/smg/c20r/toy
+ item = /obj/item/gun/ballistic/automatic/smg/c20r/toy/riot
cost = 5
surplus = 0
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
@@ -541,7 +525,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Toy Machine Gun"
desc = "A fully-loaded Donksoft belt-fed machine gun. This weapon has a massive 50-round magazine of devastating \
riot grade darts, that can briefly incapacitate someone in just one volley."
- item = /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy
+ item = /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot
cost = 10
surplus = 0
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
@@ -1728,13 +1712,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/flashlight/lantern/syndicate
restricted_species = list("moth") //End WS edit
-/datum/uplink_item/race_restricted/syndigenetics
- name = "Fire Breath"
- desc = "One of our subsidiaries, 23AndMe, have recently found the formula of backtracking lizard's genetic trail and giving them the ability to breathe fire, much like their dragon ancestors."
- cost = 5
- item = /obj/item/dnainjector/firebreath
- restricted_species = list("lizard")
-
/datum/uplink_item/race_restricted/razorwing
name = "Razorwing Implant"
desc = "Put those wings to good use! This implant makes your wingtips razor sharp and gives you the ability to flourish them, slicing anyone in range."
@@ -1952,30 +1929,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/reverse_bear_trap
restricted_roles = list("Clown")
-/datum/uplink_item/role_restricted/reverse_revolver
- name = "Reverse Revolver"
- desc = "A revolver that always fires at its user. \"Accidentally\" drop your weapon, then watch as the greedy corporate pigs blow their own brains all over the wall. \
- The revolver itself is actually real. Only clumsy people, and clowns, can fire it normally. Comes in a box of hugs. Honk."
- cost = 14
- item = /obj/item/storage/box/hug/reverse_revolver
- restricted_roles = list("Clown")
-
-/datum/uplink_item/role_restricted/clownpin
- name = "Ultra Hilarious Firing Pin"
- desc = "A firing pin that, when inserted into a gun, makes that gun only usable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it."
- cost = 4
- item = /obj/item/firing_pin/clown/ultra
- restricted_roles = list("Clown")
- illegal_tech = FALSE
-
-/datum/uplink_item/role_restricted/clownsuperpin
- name = "Super Ultra Hilarious Firing Pin"
- desc = "Like the ultra hilarious firing pin, except the gun you insert this pin into explodes when someone who isn't clumsy or a clown tries to fire it."
- cost = 7
- item = /obj/item/firing_pin/clown/ultra/selfdestruct
- restricted_roles = list("Clown")
- illegal_tech = FALSE
-
/datum/uplink_item/role_restricted/laser_arm
name = "Laser Arm Implant"
desc = "An implant that grants you a recharging laser gun inside your arm. Weak to EMPs. Comes with a syndicate autosurgeon for immediate self-application."
diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm
index 8ea48e4975c1..46d2a76cfe2b 100644
--- a/code/modules/vehicles/_vehicle.dm
+++ b/code/modules/vehicles/_vehicle.dm
@@ -2,7 +2,7 @@
name = "generic vehicle"
desc = "Yell at coderbus."
icon = 'icons/obj/vehicles.dmi'
- icon_state = "fuckyou"
+ icon_state = "atv" //Used to be "fuckyou" which hurt my feewings
max_integrity = 300
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
density = TRUE
diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm
index 6b53fa9a02c3..d3040f862863 100644
--- a/code/modules/vehicles/cars/car.dm
+++ b/code/modules/vehicles/cars/car.dm
@@ -80,7 +80,7 @@
if(occupant_amount() >= max_occupants)
return FALSE
var/atom/old_loc = loc
- if(do_mob(forcer, M, get_enter_delay(M), extra_checks=CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/car, is_car_stationary), old_loc)))
+ if(do_after(forcer, get_enter_delay(M), M, extra_checks=CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/car, is_car_stationary), old_loc)))
mob_forced_enter(M, silent)
return TRUE
return FALSE
diff --git a/code/modules/vehicles/lavaboat.dm b/code/modules/vehicles/lavaboat.dm
index 3c893b9bf8a8..547bac91a2f0 100644
--- a/code/modules/vehicles/lavaboat.dm
+++ b/code/modules/vehicles/lavaboat.dm
@@ -29,21 +29,6 @@
force = 12
w_class = WEIGHT_CLASS_NORMAL
resistance_flags = LAVA_PROOF | FIRE_PROOF
-
-/datum/crafting_recipe/oar
- name = "Goliath Bone Oar"
- result = /obj/item/oar
- reqs = list(/obj/item/stack/sheet/bone = 2)
- time = 15
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/boat
- name = "Goliath Hide Boat"
- result = /obj/vehicle/ridden/lavaboat
- reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 3)
- time = 50
- category = CAT_PRIMAL
-
//Dragon Boat
diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm
index 6751ddfe3580..22b1eb42becb 100644
--- a/code/modules/vehicles/sealed.dm
+++ b/code/modules/vehicles/sealed.dm
@@ -29,7 +29,7 @@
return FALSE
if(occupant_amount() >= max_occupants)
return FALSE
- if(do_after(M, get_enter_delay(M), FALSE, src, TRUE))
+ if(do_after(M, get_enter_delay(M), src, progress = TRUE, timed_action_flags = IGNORE_HELD_ITEM))
mob_enter(M)
return TRUE
return FALSE
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index caf9b6afa757..4c97b3f7eaa2 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -47,6 +47,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "generic"
layer = BELOW_OBJ_LAYER
density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = IDLE_DRAW_MINIMAL
verb_say = "beeps"
verb_ask = "beeps"
verb_exclaim = "beeps"
@@ -54,7 +56,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
integrity_failure = 0.33
armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70)
circuit = /obj/item/circuitboard/machine/vendor
- var/payment_department = ACCOUNT_SRV
+ var/datum/weakref/payment_account_ref
light_power = 0.5
light_range = MINIMUM_USEFUL_LIGHT_RANGE
clicksound = 'sound/machines/pda_button1.ogg'
@@ -676,7 +678,6 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
. = list()
.["all_items_free"] = all_items_free
.["miningvendor"] = mining_point_vendor
- .["department"] = payment_department
.["product_records"] = list()
for (var/datum/data/vending_product/R in product_records)
var/list/data = list(
@@ -713,21 +714,18 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/ui_data(mob/user)
. = list()
var/mob/living/carbon/human/H
- var/obj/item/card/id/C
+ var/obj/item/card/id/card
if(ishuman(user))
H = user
- C = H.get_idcard(TRUE)
- if(C)
+ card = H.get_idcard(TRUE)
+ if(card)
.["user"] = list()
- .["user"]["points"] = C.mining_points
- .["user"]["name"] = C.registered_name
- if(C.registered_account)
- .["user"]["name"] = C.registered_account.account_holder
- .["user"]["cash"] = C.registered_account.account_balance
- if(C.registered_account.account_job)
- .["user"]["job"] = C.registered_account.account_job.name
- else
- .["user"]["job"] = "No Job"
+ .["user"]["points"] = card.mining_points
+ .["user"]["name"] = card.registered_name
+ .["user"]["job"] = card.assignment || "No Job"
+ if(card.registered_account)
+ .["user"]["name"] = card.registered_account.account_holder
+ .["user"]["cash"] = card.registered_account.account_balance
.["stock"] = list()
for (var/datum/data/vending_product/R in product_records + coin_records + hidden_records)
.["stock"][R.name] = R.amount
@@ -794,16 +792,19 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
var/datum/bank_account/account = C.registered_account
if(coin_records.Find(R) || hidden_records.Find(R))
price_to_use = R.custom_premium_price ? R.custom_premium_price : extra_price
- if(price_to_use && !account.adjust_money(-price_to_use))
+ if(price_to_use && !account.has_money(price_to_use))
say("You do not possess the funds to purchase [R.name].")
flick(icon_deny,src)
vend_ready = TRUE
return
- var/datum/bank_account/D = SSeconomy.get_dep_account(payment_department)
- if(D)
- D.adjust_money(price_to_use)
- SSblackbox.record_feedback("amount", "vending_spent", price_to_use)
- log_econ("[price_to_use] credits were inserted into [src] by [D.account_holder] to buy [R].")
+
+ var/datum/bank_account/payment_account = payment_account_ref.resolve()
+ if(payment_account)
+ payment_account.transfer_money(account, price_to_use)
+ else
+ account.adjust_money(-price_to_use, "vendor_purchase")
+ SSblackbox.record_feedback("amount", "vending_spent", price_to_use)
+ log_econ("[price_to_use] credits were inserted into [src] by [H] to buy [R].")
if(last_shopper != REF(usr) || purchase_message_cooldown < world.time)
say("Thank you for shopping with [src]!")
purchase_message_cooldown = world.time + 5 SECONDS
@@ -933,7 +934,6 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "robotics"
icon_deny = "robotics-deny"
max_integrity = 400
- payment_department = NO_FREEBIES
refill_canister = /obj/item/vending_refill/custom
all_items_free = FALSE
/// where the money is sent
@@ -1030,12 +1030,13 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
updateUsrDialog()
return
if(account.has_money(S.custom_price))
- account.adjust_money(-S.custom_price)
var/datum/bank_account/owner = private_a
if(owner)
- owner.adjust_money(S.custom_price)
- SSblackbox.record_feedback("amount", "vending_spent", S.custom_price)
- log_econ("[S.custom_price] credits were spent on [src] buying a [S] by [owner.account_holder], owned by [private_a.account_holder].")
+ owner.transfer_money(account, S.custom_price)
+ else
+ account.adjust_money(-S.custom_price, "vendor_purchase")
+ SSblackbox.record_feedback("amount", "vending_spent", S.custom_price)
+ log_econ("[S.custom_price] credits were spent on [src] buying a [S] by [owner.account_holder], owned by [private_a.account_holder].")
vending_machine_input[N] = max(vending_machine_input[N] - 1, 0)
S.forceMove(drop_location())
loaded_items--
diff --git a/code/modules/vending/assist.dm b/code/modules/vending/assist.dm
index 36c3d67c790d..cb3cd0053d8a 100644
--- a/code/modules/vending/assist.dm
+++ b/code/modules/vending/assist.dm
@@ -10,8 +10,7 @@
/obj/item/stock_parts/manipulator = 3,
/obj/item/stock_parts/micro_laser = 3,
/obj/item/stock_parts/scanning_module = 3,
- /obj/item/stock_parts/capacitor = 3)
- contraband = list(
+ /obj/item/stock_parts/capacitor = 3,
/obj/item/assembly/timer = 2,
/obj/item/assembly/voice = 2,
/obj/item/assembly/health = 2,
@@ -25,7 +24,6 @@
product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
default_price = 125
extra_price = 100
- payment_department = NO_FREEBIES
light_mask = "generic-light-mask"
/obj/item/vending_refill/assist
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index 4bca9034dd9b..367c309d59a1 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -109,13 +109,9 @@
/obj/item/clothing/suit/changshan_blue = 1,
/obj/item/clothing/suit/cheongsam_red = 1,
/obj/item/clothing/suit/cheongsam_blue = 1,
- /obj/item/gohei = 1)
- contraband = list(
+ /obj/item/gohei = 1,
/obj/item/clothing/suit/judgerobe = 1,
/obj/item/clothing/head/powdered_wig = 1,
- /obj/item/clothing/accessory/fan_mime_pin = 1,
- /obj/item/clothing/accessory/fan_clown_pin = 1,
- /obj/item/gun/magic/wand/nothing = 2,
/obj/item/clothing/glasses/sunglasses/garb = 2,
/obj/item/clothing/glasses/blindfold = 1,
/obj/item/clothing/mask/muzzle = 2)
@@ -132,7 +128,6 @@
refill_canister = /obj/item/vending_refill/autodrobe
default_price = 180
extra_price = 360
- payment_department = ACCOUNT_SRV
light_mask="theater-light-mask"
/obj/machinery/vending/autodrobe/canLoadItem(obj/item/I,mob/user)
diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm
index 9c7b8622d536..dd240887ae46 100644
--- a/code/modules/vending/boozeomat.dm
+++ b/code/modules/vending/boozeomat.dm
@@ -3,7 +3,7 @@
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
icon_state = "boozeomat"
icon_deny = "boozeomat-deny"
- products = list(
+ products = list( // All of drink dispenser reagents should be available here.
/obj/item/reagent_containers/food/drinks/drinkingglass = 30,
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 12,
/obj/item/reagent_containers/food/drinks/modglass/small = 10,
@@ -11,18 +11,31 @@
/obj/item/reagent_containers/food/drinks/modglass/large = 10,
/obj/item/reagent_containers/food/drinks/flask = 3,
/obj/item/reagent_containers/food/drinks/ice = 10,
+ /obj/item/reagent_containers/food/drinks/waterbottle/large = 6,
/obj/item/reagent_containers/food/drinks/bottle/orangejuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/limejuice = 4,
+ /obj/item/reagent_containers/food/drinks/bottle/lemonjuice = 4,
+ /obj/item/reagent_containers/food/drinks/bottle/pineapplejuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/cream = 4,
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 8,
+ /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/starkist = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/space_up = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 4,
/obj/item/reagent_containers/food/drinks/soda_cans/tonic = 8,
- /obj/item/reagent_containers/food/drinks/soda_cans/sodawater = 15,
- /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 8,
+ /obj/item/reagent_containers/food/drinks/soda_cans/sodawater = 8,
+ /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 4,
/obj/item/reagent_containers/food/drinks/bottle/grenadine = 4,
/obj/item/reagent_containers/food/drinks/bottle/menthol = 4,
+ /obj/item/reagent_containers/food/drinks/mug/tea = 8,
+ /obj/item/reagent_containers/food/drinks/coffee = 8,
/obj/item/reagent_containers/food/drinks/ale = 6,
- /obj/item/reagent_containers/food/drinks/beer = 6,
+ /obj/item/reagent_containers/food/drinks/beer = 8,
/obj/item/reagent_containers/food/drinks/bottle/gin = 5,
/obj/item/reagent_containers/food/drinks/bottle/whiskey = 5,
/obj/item/reagent_containers/food/drinks/bottle/tequila = 5,
@@ -38,7 +51,10 @@
/obj/item/reagent_containers/food/drinks/bottle/amaretto = 5,
/obj/item/reagent_containers/food/drinks/bottle/sake = 5,
/obj/item/reagent_containers/food/drinks/bottle/applejack = 5,
+ /obj/item/reagent_containers/food/drinks/bottle/triplesec = 5,
/obj/item/reagent_containers/food/drinks/bottle/coconut = 5,
+ /obj/item/reagent_containers/food/drinks/bottle/cacao = 5,
+ /obj/item/reagent_containers/food/drinks/bottle/menthe = 5,
/obj/item/reagent_containers/food/drinks/bottle = 15,
/obj/item/reagent_containers/food/drinks/bottle/small = 15,
/obj/item/garnish/olives = 10,
@@ -46,11 +62,11 @@
/obj/item/garnish/umbrellablue = 10,
/obj/item/garnish/umbrellagreen = 10
)
- contraband = list(
- /obj/item/reagent_containers/food/drinks/mug/tea = 12,
- /obj/item/reagent_containers/food/drinks/bottle/fernet = 5)
+ contraband = list()
premium = list(
/obj/item/reagent_containers/glass/bottle/ethanol = 4,
+ /obj/item/reagent_containers/glass/bottle/sugar = 3,
+ /obj/item/reagent_containers/food/drinks/bottle/fernet = 5,
/obj/item/reagent_containers/food/drinks/bottle/champagne = 5,
/obj/item/reagent_containers/food/drinks/bottle/trappist = 5)
@@ -60,7 +76,6 @@
refill_canister = /obj/item/vending_refill/boozeomat
default_price = 120
extra_price = 200
- payment_department = ACCOUNT_SRV
light_mask = "boozeomat-light-mask"
/obj/machinery/vending/boozeomat/all_access
diff --git a/code/modules/vending/cartridge.dm b/code/modules/vending/cartridge.dm
index 36db52996e1f..b2608b6556f4 100644
--- a/code/modules/vending/cartridge.dm
+++ b/code/modules/vending/cartridge.dm
@@ -16,7 +16,6 @@
refill_canister = /obj/item/vending_refill/cart
default_price = 250
extra_price = 500
- payment_department = ACCOUNT_SRV
light_mask="cart-light-mask"
/obj/item/vending_refill/cart
diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm
index ce2616711d3c..3cff7d3c361d 100644
--- a/code/modules/vending/cigarette.dm
+++ b/code/modules/vending/cigarette.dm
@@ -11,23 +11,22 @@
/obj/item/storage/fancy/cigarettes/cigpack_robust = 3,
/obj/item/storage/fancy/cigarettes/cigpack_carp = 3,
/obj/item/storage/fancy/cigarettes/cigpack_midori = 3,
+ /obj/item/storage/fancy/cigarettes/dromedaryco = 3,
+ /obj/item/clothing/mask/vape = 5,
/obj/item/storage/box/matches = 10,
/obj/item/lighter/greyscale = 4,
/obj/item/storage/fancy/rollingpapers = 5)
- contraband = list(
- /obj/item/clothing/mask/vape = 5,
- /obj/item/clothing/mask/vape/cigar = 3) //WS edit - E-Cigars
premium = list(
/obj/item/storage/fancy/cigarettes/cigpack_robustgold = 3,
- /obj/item/storage/box/gum/nicotine = 2,
+ /obj/item/storage/box/gum/nicotine = 3,
/obj/item/lighter = 3,
/obj/item/storage/fancy/cigarettes/cigars = 1,
/obj/item/storage/fancy/cigarettes/cigars/havana = 1,
- /obj/item/storage/fancy/cigarettes/cigars/cohiba = 1)
+ /obj/item/storage/fancy/cigarettes/cigars/cohiba = 1,
+ /obj/item/clothing/mask/vape/cigar = 3)
refill_canister = /obj/item/vending_refill/cigarette
default_price = 75
extra_price = 250
- payment_department = ACCOUNT_SRV
light_mask = "cigs-light-mask"
/obj/machinery/vending/cigarette/syndicate
diff --git a/code/modules/vending/classicbeats.dm b/code/modules/vending/classicbeats.dm
index 0b3fb5c93498..76589b5e479d 100644
--- a/code/modules/vending/classicbeats.dm
+++ b/code/modules/vending/classicbeats.dm
@@ -23,7 +23,6 @@
refill_canister = /obj/item/vending_refill/classicbeats
default_price = 100
extra_price = 60
- payment_department = ACCOUNT_SRV
/obj/item/vending_refill/classicbeats
machine_name = "Cuban Pete's Classic Beats"
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index 140d8c42a283..e9eef49a0e3a 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -104,19 +104,16 @@
/obj/item/clothing/suit/apron/purple_bartender = 2,
/obj/item/clothing/under/rank/civilian/bartender/purple = 2,
/obj/item/clothing/suit/toggle/suspenders/blue = 2,
- /obj/item/clothing/suit/toggle/suspenders/gray = 2)
- contraband = list(
- /obj/item/clothing/under/syndicate/tacticool = 1,
- /obj/item/clothing/under/syndicate/tacticool/skirt = 1,
+ /obj/item/clothing/suit/toggle/suspenders/gray = 2,
+ /obj/item/clothing/under/syndicate/tacticool = 2,
+ /obj/item/clothing/under/syndicate/tacticool/skirt = 2,
/obj/item/clothing/mask/balaclava = 1,
/obj/item/clothing/head/trapper = 1,
/obj/item/storage/belt/fannypack/black = 2,
/obj/item/clothing/suit/jacket/letterman_syndie = 1,
/obj/item/clothing/under/costume/jabroni = 1,
/obj/item/clothing/suit/vapeshirt = 1,
- /obj/item/clothing/under/costume/geisha = 1,
- /obj/item/clothing/under/rank/centcom/officer/replica = 1,
- /obj/item/clothing/under/rank/centcom/officer_skirt/replica = 1)
+ /obj/item/clothing/under/costume/geisha = 1)
premium = list(
/obj/item/clothing/under/suit/checkered = 1,
/obj/item/clothing/suit/jacket/leather = 1,
@@ -127,7 +124,6 @@
refill_canister = /obj/item/vending_refill/clothing
default_price = 60
extra_price = 120
- payment_department = NO_FREEBIES
light_mask = "wardrobe-light-mask"
light_color = LIGHT_COLOR_ELECTRIC_GREEN
diff --git a/code/modules/vending/coffee.dm b/code/modules/vending/coffee.dm
index 67b9878744be..9c4851c134a5 100644
--- a/code/modules/vending/coffee.dm
+++ b/code/modules/vending/coffee.dm
@@ -7,15 +7,14 @@
products = list(
/obj/item/reagent_containers/food/drinks/coffee = 6,
/obj/item/reagent_containers/food/drinks/mug/tea = 6,
- /obj/item/reagent_containers/food/drinks/mug/coco = 3)
+ /obj/item/reagent_containers/food/drinks/mug/coco = 3,
+ /obj/item/reagent_containers/food/drinks/ice = 6)
premium = list(
/obj/item/reagent_containers/food/drinks/cafelatte = 3,
/obj/item/reagent_containers/food/drinks/soylatte = 3)
- contraband = list(/obj/item/reagent_containers/food/drinks/ice = 12)
refill_canister = /obj/item/vending_refill/coffee
default_price = 45
extra_price = 150
- payment_department = ACCOUNT_SRV
light_mask = "coffee-light-mask"
light_color = COLOR_DARK_MODERATE_ORANGE
diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm
index 8be6000ddc69..4a9f4a456eee 100644
--- a/code/modules/vending/cola.dm
+++ b/code/modules/vending/cola.dm
@@ -15,8 +15,7 @@
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10,
/obj/item/reagent_containers/food/drinks/waterbottle = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/efuel = 5)
- contraband = list(
+ /obj/item/reagent_containers/food/drinks/soda_cans/efuel = 5,
/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,
/obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6)
premium = list(
@@ -27,7 +26,6 @@
refill_canister = /obj/item/vending_refill/cola
default_price = 45
extra_price = 200
- payment_department = ACCOUNT_SRV
/obj/item/vending_refill/cola
diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm
index 067596091dde..5dbd8ea733db 100644
--- a/code/modules/vending/drinnerware.dm
+++ b/code/modules/vending/drinnerware.dm
@@ -17,15 +17,11 @@
/obj/item/kitchen/rollingpin = 2,
/obj/item/kitchen/knife = 2,
/obj/item/kitchen/knife/pizza_cutter = 2,
- /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2)
- contraband = list(
- /obj/item/kitchen/rollingpin = 2,
- /obj/item/kitchen/knife/butcher = 2,
- /obj/item/shovel/spoon = 2) // ST - Only a spoonfull
+ /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2,
+ /obj/item/kitchen/knife/butcher = 1)
refill_canister = /obj/item/vending_refill/dinnerware
default_price = 50
extra_price = 250
- payment_department = ACCOUNT_SRV
light_mask = "dinnerware-light-mask"
/obj/item/vending_refill/dinnerware
diff --git a/code/modules/vending/engineering.dm b/code/modules/vending/engineering.dm
index d0f3a3e88725..b5a9d073e8fa 100644
--- a/code/modules/vending/engineering.dm
+++ b/code/modules/vending/engineering.dm
@@ -31,7 +31,6 @@
refill_canister = /obj/item/vending_refill/engineering
default_price = 450
extra_price = 500
- payment_department = ACCOUNT_ENG
light_mask = "engi-light-mask"
/obj/item/vending_refill/engineering
diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm
index 04b7d26a533e..fb096656c1c3 100644
--- a/code/modules/vending/engivend.dm
+++ b/code/modules/vending/engivend.dm
@@ -16,15 +16,14 @@
/obj/item/electronics/airalarm = 10,
/obj/item/electronics/advanced_airlock_controller = 10,
/obj/item/electronics/firealarm = 10,
- /obj/item/electronics/firelock = 10)
- contraband = list(/obj/item/stock_parts/cell/potato = 3)
+ /obj/item/electronics/firelock = 10,
+ /obj/item/stock_parts/cell/potato = 3)
premium = list(/obj/item/storage/belt/utility = 3,
/obj/item/construction/rcd/loaded = 2,
/obj/item/storage/box/smart_metal_foam = 1)
refill_canister = /obj/item/vending_refill/engivend
default_price = 450
extra_price = 500
- payment_department = ACCOUNT_ENG
light_mask = "engivend-light-mask"
/obj/item/vending_refill/engivend
diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm
index ca99c8e4bf34..d27a1f6ffe6e 100644
--- a/code/modules/vending/games.dm
+++ b/code/modules/vending/games.dm
@@ -14,14 +14,12 @@
/obj/item/instrument/piano_synth/headphones = 4,
/obj/item/camera = 3,
/obj/item/dyespray = 3)
- contraband = list(/obj/item/dice/fudge = 9)
premium = list(
/obj/item/melee/skateboard/pro = 3,
/obj/item/melee/skateboard/hoverboard = 1)
refill_canister = /obj/item/vending_refill/games
default_price = 50
extra_price = 250
- payment_department = ACCOUNT_SRV
light_mask = "games-light-mask"
/obj/item/vending_refill/games
diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm
index 015bbdc2c340..03d532c804e7 100644
--- a/code/modules/vending/liberation.dm
+++ b/code/modules/vending/liberation.dm
@@ -13,7 +13,7 @@
/obj/item/gun/ballistic/automatic/pistol/deagle/gold = 2,
/obj/item/gun/ballistic/automatic/pistol/deagle/camo = 2,
/obj/item/gun/ballistic/automatic/pistol/candor = 2,
- /obj/item/gun/ballistic/automatic/smg/proto/unrestricted = 2,
+ /obj/item/gun/ballistic/automatic/smg/proto = 2,
/obj/item/gun/ballistic/shotgun/automatic/combat = 2,
/obj/item/gun/ballistic/automatic/gyropistol = 1,
/obj/item/gun/ballistic/shotgun = 2)
@@ -32,5 +32,4 @@
resistance_flags = FIRE_PROOF
default_price = 150
extra_price = 500
- payment_department = ACCOUNT_SEC
light_mask = "liberation-light-mask"
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 90df6b673b16..989bd721a79c 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -6,9 +6,9 @@
product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
vend_reply = "Come back for more!"
circuit = /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor
- products = list(/obj/item/gun/ballistic/automatic/toy/unrestricted = 10,
- /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10,
- /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10,
+ products = list(/obj/item/gun/ballistic/automatic/toy = 10,
+ /obj/item/gun/ballistic/automatic/toy/pistol = 10,
+ /obj/item/gun/ballistic/shotgun/toy = 10,
/obj/item/toy/sword = 10,
/obj/item/ammo_box/foambox = 20,
/obj/item/toy/foamblade = 10,
@@ -17,8 +17,8 @@
/obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just an assistant
contraband = list(
/obj/item/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting!
- /obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot = 10,
- /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted/riot = 10,
+ /obj/item/gun/ballistic/automatic/smg/c20r/toy = 10,
+ /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy = 10,
/obj/item/ammo_box/foambox/riot = 20,
/obj/item/toy/katana = 10,
/obj/item/dualsaber/toy = 5,
@@ -28,5 +28,4 @@
refill_canister = /obj/item/vending_refill/donksoft
default_price = 150
extra_price = 300
- payment_department = ACCOUNT_SRV
light_mask = "donksoft-light-mask"
diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm
index e4489b0a23d8..5a35a75a4495 100644
--- a/code/modules/vending/medical.dm
+++ b/code/modules/vending/medical.dm
@@ -27,21 +27,17 @@
/obj/item/reagent_containers/medigel/sterilizine = 1,
/obj/item/sensor_device = 1,
/obj/item/pinpointer/crew = 1)
- contraband = list(
- /obj/item/reagent_containers/pill/tox = 2,
- /obj/item/reagent_containers/pill/morphine = 2,
- /obj/item/reagent_containers/pill/charcoal = 4,
- /obj/item/storage/box/hug/medical = 1)
+ contraband = list(/obj/item/reagent_containers/pill/tox = 2)
premium = list(
/obj/item/clothing/glasses/hud/health = 1,
/obj/item/clothing/glasses/hud/health/prescription = 1,
- /obj/item/shears = 1)
+ /obj/item/shears = 1,
+ /obj/item/storage/box/hug/medical = 1)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/medical
default_price = 250
extra_price = 500
- payment_department = ACCOUNT_MED
light_mask = "med-light-mask"
/obj/item/vending_refill/medical
diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm
index 7ba19c75d617..dd498ffded07 100644
--- a/code/modules/vending/medical_wall.dm
+++ b/code/modules/vending/medical_wall.dm
@@ -11,11 +11,11 @@
/obj/item/reagent_containers/pill/charcoal = 1,
/obj/item/reagent_containers/medigel/styptic = 1,
/obj/item/reagent_containers/medigel/silver_sulf = 1,
- /obj/item/reagent_containers/medigel/sterilizine = 1
+ /obj/item/reagent_containers/medigel/sterilizine = 1,
+ /obj/item/reagent_containers/pill/morphine = 1
)
contraband = list(
/obj/item/reagent_containers/pill/tox = 1,
- /obj/item/reagent_containers/pill/morphine = 1,
/obj/item/storage/box/gum/happiness = 1
)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
@@ -23,7 +23,6 @@
refill_canister = /obj/item/vending_refill/wallmed
default_price = 250
extra_price = 500
- payment_department = ACCOUNT_MED
tiltable = FALSE
light_mask = "wallmed-light-mask"
diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm
index bdb3ae4c02eb..4d59628f5fd2 100644
--- a/code/modules/vending/megaseed.dm
+++ b/code/modules/vending/megaseed.dm
@@ -42,12 +42,12 @@
/obj/item/seeds/tower = 3,
/obj/item/seeds/watermelon = 3,
/obj/item/seeds/wheat = 3,
- /obj/item/seeds/whitebeet = 3)
+ /obj/item/seeds/whitebeet = 3,
+ /obj/item/seeds/plump = 3)
contraband = list(/obj/item/seeds/amanita = 2,
/obj/item/seeds/glowshroom = 2,
/obj/item/seeds/liberty = 2,
/obj/item/seeds/nettle = 2,
- /obj/item/seeds/plump = 2,
/obj/item/seeds/reishi = 2,
/obj/item/seeds/cannabis = 3,
/obj/item/seeds/starthistle = 2,
@@ -56,7 +56,6 @@
refill_canister = /obj/item/vending_refill/hydroseeds
default_price = 50
extra_price = 150
- payment_department = ACCOUNT_SRV
/obj/item/vending_refill/hydroseeds
machine_name = "MegaSeed Servitor"
diff --git a/code/modules/vending/modularpc.dm b/code/modules/vending/modularpc.dm
index 2b0c82ba084f..fd9277b895d0 100644
--- a/code/modules/vending/modularpc.dm
+++ b/code/modules/vending/modularpc.dm
@@ -26,7 +26,6 @@
refill_canister = /obj/item/vending_refill/modularpc
default_price = 150
extra_price = 400
- payment_department = ACCOUNT_SCI
/obj/item/vending_refill/modularpc
machine_name = "Deluxe Silicate Selections"
diff --git a/code/modules/vending/nutrimax.dm b/code/modules/vending/nutrimax.dm
index 753851e53894..0aaa47461406 100644
--- a/code/modules/vending/nutrimax.dm
+++ b/code/modules/vending/nutrimax.dm
@@ -15,14 +15,12 @@
/obj/item/storage/bag/plants = 5,
/obj/item/cultivator = 3,
/obj/item/shovel/spade = 3,
- /obj/item/plant_analyzer = 4)
- contraband = list(
+ /obj/item/plant_analyzer = 4,
/obj/item/reagent_containers/glass/bottle/ammonia = 10,
/obj/item/reagent_containers/glass/bottle/diethylamine = 5)
refill_canister = /obj/item/vending_refill/hydronutrients
default_price = 50
extra_price = 150
- payment_department = ACCOUNT_SRV
/obj/item/vending_refill/hydronutrients
machine_name = "NutriMax"
diff --git a/code/modules/vending/plasmaresearch.dm b/code/modules/vending/plasmaresearch.dm
index fdd200edba97..a638bfc81d8a 100644
--- a/code/modules/vending/plasmaresearch.dm
+++ b/code/modules/vending/plasmaresearch.dm
@@ -10,8 +10,7 @@
/obj/item/assembly/timer = 6,
/obj/item/assembly/signaler = 6,
/obj/item/assembly/prox_sensor = 6,
- /obj/item/assembly/igniter = 6)
- contraband = list(/obj/item/assembly/health = 3)
+ /obj/item/assembly/igniter = 6,
+ /obj/item/assembly/health = 3)
default_price = 400
extra_price = 600
- payment_department = ACCOUNT_SCI
diff --git a/code/modules/vending/robotics.dm b/code/modules/vending/robotics.dm
index e8b377db3dbf..f35b92ebb2d0 100644
--- a/code/modules/vending/robotics.dm
+++ b/code/modules/vending/robotics.dm
@@ -22,7 +22,6 @@
/obj/item/crowbar = 5)
refill_canister = /obj/item/vending_refill/robotics
default_price = 600
- payment_department = ACCOUNT_SCI
/obj/item/vending_refill/robotics
machine_name = "Robotech Deluxe"
diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm
index e4e9d303ae0e..95afc6f2eb92 100644
--- a/code/modules/vending/security.dm
+++ b/code/modules/vending/security.dm
@@ -14,8 +14,7 @@
/obj/item/flashlight/seclite = 4,
/obj/item/ammo_box/c9mm/rubbershot = 3,
/obj/item/ammo_box/c9mm = 1,
- /obj/item/stock_parts/cell/gun = 3)
- contraband = list(
+ /obj/item/stock_parts/cell/gun = 3,
/obj/item/clothing/glasses/sunglasses = 2)
premium = list(
/obj/item/storage/belt/security/webbing = 5,
@@ -27,7 +26,6 @@
refill_canister = /obj/item/vending_refill/security
default_price = 650
extra_price = 700
- payment_department = ACCOUNT_SEC
var/voucher_items = list(
"NT-E-Rifle" = /obj/item/gun/energy/e_gun,
@@ -132,10 +130,10 @@
/obj/item/grenade/frag = 1,
)
voucher_items = list(
- "M-90gl Carbine" = /obj/item/gun/ballistic/automatic/smg/m90/unrestricted,
+ "M-90gl Carbine" = /obj/item/gun/ballistic/automatic/smg/m90,
"sniper rifle" = /obj/item/gun/ballistic/automatic/sniper_rifle,
- "C-20r SMG" = /obj/item/gun/ballistic/automatic/smg/c20r/unrestricted,
- "Bulldog Shotgun" = /obj/item/gun/ballistic/shotgun/bulldog/unrestricted)
+ "C-20r SMG" = /obj/item/gun/ballistic/automatic/smg/c20r,
+ "Bulldog Shotgun" = /obj/item/gun/ballistic/shotgun/bulldog)
/obj/machinery/vending/security/marine/nanotrasen
icon_state = "nt-marine"
diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm
index 5f6a4b6d937a..d0130d7358fc 100644
--- a/code/modules/vending/snack.dm
+++ b/code/modules/vending/snack.dm
@@ -14,15 +14,13 @@
/obj/item/reagent_containers/food/snacks/no_raisin = 6,
/obj/item/reagent_containers/food/drinks/dry_ramen = 3,
/obj/item/storage/box/gum = 3,
- /obj/item/reagent_containers/food/snacks/energybar = 6)
- contraband = list(
+ /obj/item/reagent_containers/food/snacks/energybar = 6,
/obj/item/reagent_containers/food/snacks/syndicake = 6,
/obj/item/reagent_containers/food/snacks/candy/bronx = 1)
refill_canister = /obj/item/vending_refill/snack
canload_access_list = list(ACCESS_KITCHEN)
default_price = 60
extra_price = 160
- payment_department = ACCOUNT_SRV
input_display_header = "Chef's Food Selection"
/obj/item/vending_refill/snack
diff --git a/code/modules/vending/sovietsoda.dm b/code/modules/vending/sovietsoda.dm
index 0f80bf5324bc..213a3d01df0a 100644
--- a/code/modules/vending/sovietsoda.dm
+++ b/code/modules/vending/sovietsoda.dm
@@ -4,13 +4,13 @@
icon_state = "sovietsoda"
light_mask = "soviet-light-mask"
product_ads = "Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
- products = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/soda = 30)
- contraband = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola = 20)
+ products = list(
+ /obj/item/reagent_containers/food/drinks/drinkingglass/filled/soda = 30,
+ /obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola = 20)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/sovietsoda
default_price = 1
extra_price = 1
- payment_department = NO_FREEBIES
light_color = COLOR_PALE_ORANGE
/obj/item/vending_refill/sovietsoda
diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm
index aa8ae97fb112..0519285d26a5 100644
--- a/code/modules/vending/sustenance.dm
+++ b/code/modules/vending/sustenance.dm
@@ -18,7 +18,6 @@
refill_canister = /obj/item/vending_refill/sustenance
default_price = 0
extra_price = 0
- payment_department = NO_FREEBIES
/obj/item/vending_refill/sustenance
machine_name = "Sustenance Vendor"
diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm
index 8a938b50d435..8fefa1015536 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -8,19 +8,18 @@
light_mask = "donksoft-light-mask"
circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor
products = list(
- /obj/item/gun/ballistic/automatic/toy/unrestricted = 10,
- /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10,
- /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10,
+ /obj/item/gun/ballistic/automatic/toy = 10,
+ /obj/item/gun/ballistic/automatic/toy/pistol = 10,
+ /obj/item/gun/ballistic/shotgun/toy = 10,
/obj/item/toy/sword = 10,
/obj/item/ammo_box/foambox = 20,
/obj/item/toy/foamblade = 10,
/obj/item/toy/balloon/syndicate = 10,
/obj/item/clothing/suit/syndicatefake = 5,
- /obj/item/clothing/head/syndicatefake = 5)
- contraband = list(
+ /obj/item/clothing/head/syndicatefake = 5,
/obj/item/gun/ballistic/shotgun/toy/crossbow = 10,
- /obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted = 10,
- /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted = 10,
+ /obj/item/gun/ballistic/automatic/smg/c20r/toy = 5,
+ /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy = 5,
/obj/item/toy/katana = 10,
/obj/item/dualsaber/toy = 5)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
@@ -28,7 +27,6 @@
refill_canister = /obj/item/vending_refill/donksoft
default_price = 150
extra_price = 300
- payment_department = ACCOUNT_SRV
/obj/item/vending_refill/donksoft
machine_name = "Donksoft Toy Vendor"
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 549f6f744f1f..da3fdb134010 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -4,7 +4,6 @@
/obj/machinery/vending/wardrobe
default_price = 350
extra_price = 450
- payment_department = NO_FREEBIES
input_display_header = "Returned Clothing"
light_mask = "wardrobe-light-mask"
@@ -40,7 +39,6 @@
contraband = list(/obj/item/clothing/head/helmet/justice = 1,
/obj/item/clothing/head/helmet/justice/escape = 1)
refill_canister = /obj/item/vending_refill/wardrobe/sec_wardrobe
- payment_department = ACCOUNT_SEC
light_color = COLOR_MOSTLY_PURE_RED
/obj/item/vending_refill/wardrobe/sec_wardrobe
@@ -74,7 +72,6 @@
/obj/item/clothing/accessory/armband/med = 4,
/obj/item/clothing/mask/surgical = 4)
refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe
- payment_department = ACCOUNT_MED
/obj/item/vending_refill/wardrobe/medi_wardrobe
machine_name = "MediDrobe"
@@ -101,7 +98,6 @@
/obj/item/clothing/head/hardhat = 3,
/obj/item/clothing/head/hardhat/weldhat = 3)
refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe
- payment_department = ACCOUNT_ENG
light_color = COLOR_VIVID_YELLOW
/obj/item/vending_refill/wardrobe/engi_wardrobe
@@ -125,7 +121,6 @@
/obj/item/clothing/shoes/sneakers/black = 3
)
refill_canister = /obj/item/vending_refill/wardrobe/atmos_wardrobe
- payment_department = ACCOUNT_ENG
light_color = COLOR_VIVID_YELLOW
/obj/item/vending_refill/wardrobe/atmos_wardrobe
@@ -148,7 +143,6 @@
/obj/item/radio/headset/headset_cargo = 3)
premium = list(/obj/item/clothing/under/rank/cargo/miner = 3)
refill_canister = /obj/item/vending_refill/wardrobe/cargo_wardrobe
- payment_department = ACCOUNT_CAR
/obj/item/vending_refill/wardrobe/cargo_wardrobe
machine_name = "CargoDrobe"
@@ -169,12 +163,10 @@
/obj/item/clothing/head/soft/black = 2,
/obj/item/clothing/mask/bandana/skull = 2
)
- contraband = list(/obj/item/clothing/suit/hooded/techpriest = 2,
- /obj/item/clothing/suit/hooded/enginseer = 2, // WS edit: enginsineer robes
+ contraband = list(/obj/item/clothing/suit/hooded/enginseer = 2, // WS edit: enginsineer robes
/obj/item/organ/tongue/robot = 2)
refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe
extra_price = 300
- payment_department = ACCOUNT_SCI
/obj/item/vending_refill/wardrobe/robo_wardrobe
machine_name = "RoboDrobe"
@@ -197,7 +189,6 @@
/obj/item/clothing/head/beret/sci = 3, //WS edit - Berets
/obj/item/clothing/mask/gas = 3)
refill_canister = /obj/item/vending_refill/wardrobe/science_wardrobe
- payment_department = ACCOUNT_SCI
/obj/item/vending_refill/wardrobe/science_wardrobe
machine_name = "SciDrobe"
@@ -220,7 +211,6 @@
/obj/item/clothing/mask/bandana = 3,
/obj/item/clothing/accessory/armband/hydro = 3)
refill_canister = /obj/item/vending_refill/wardrobe/hydro_wardrobe
- payment_department = ACCOUNT_SRV
light_color = LIGHT_COLOR_ELECTRIC_GREEN
/obj/item/vending_refill/wardrobe/hydro_wardrobe
@@ -247,7 +237,6 @@
/obj/item/clothing/glasses/regular/jamjar = 1,
/obj/item/storage/bag/books = 1)
refill_canister = /obj/item/vending_refill/wardrobe/curator_wardrobe
- payment_department = ACCOUNT_SRV
/obj/item/vending_refill/wardrobe/curator_wardrobe
machine_name = "CuraDrobe"
@@ -282,7 +271,6 @@
/obj/item/clothing/neck/tie/blue = 2)
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
machine_name = "BarDrobe"
@@ -305,13 +293,12 @@
/obj/item/clothing/under/rank/civilian/chef/skirt = 2,
///obj/item/clothing/under/rank/chef = 3,//WS edit - Better security jumpsuit sprites
/obj/item/clothing/head/chefhat = 1,
- /obj/item/clothing/under/rank/civilian/cookjorts = 2,
+ /obj/item/clothing/under/shorts/cookjorts = 2,
/obj/item/clothing/shoes/cookflops = 2,
/obj/item/reagent_containers/glass/rag = 1,
/obj/item/clothing/accessory/armband/med = 4,
/obj/item/clothing/suit/hooded/wintercoat = 2)
refill_canister = /obj/item/vending_refill/wardrobe/chef_wardrobe
- payment_department = ACCOUNT_SRV
/obj/item/vending_refill/wardrobe/chef_wardrobe
machine_name = "ChefDrobe"
@@ -343,7 +330,6 @@
/obj/item/watertank/janitor = 1,
/obj/item/storage/belt/janitor = 2)
refill_canister = /obj/item/vending_refill/wardrobe/jani_wardrobe
- payment_department = ACCOUNT_SRV
light_color = COLOR_STRONG_MAGENTA
/obj/item/vending_refill/wardrobe/jani_wardrobe
@@ -380,7 +366,6 @@
/obj/item/clothing/accessory/armband/deputy = 4,
/obj/item/clothing/accessory/lawyers_badge = 2)
refill_canister = /obj/item/vending_refill/wardrobe/law_wardrobe
- payment_department = ACCOUNT_SRV
/obj/item/vending_refill/wardrobe/law_wardrobe
machine_name = "LawDrobe"
@@ -390,7 +375,7 @@
icon_state = "chapdrobe"
product_ads = "Are you being bothered by cultists or pesky revenants? Then come and dress like the holy man!;Clothes for men of the cloth!"
vend_reply = "Thank you for using the ChapDrobe!"
- products = list(/obj/item/choice_beacon/holy = 1,
+ products = list(/obj/item/storage/box/holy = 1,
/obj/item/storage/backpack/cultpack = 1,
/obj/item/clothing/head/beret/service = 1, //WS edit - berets
/obj/item/clothing/accessory/pocketprotector/cosmetology = 1,
@@ -414,7 +399,6 @@
premium = list(/obj/item/clothing/suit/chaplainsuit/bishoprobe = 1,
/obj/item/clothing/head/bishopmitre = 1)
refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe
- payment_department = ACCOUNT_SRV
/obj/item/vending_refill/wardrobe/chap_wardrobe
machine_name = "ChapDrobe"
@@ -433,9 +417,7 @@
/obj/item/storage/backpack/satchel/chem = 2,
/obj/item/clothing/accessory/armband/engine = 4,
/obj/item/storage/bag/chemistry = 2)
- contraband = list(/obj/item/reagent_containers/spray/syndicate = 2)
refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe
- payment_department = ACCOUNT_MED
/obj/item/vending_refill/wardrobe/chem_wardrobe
machine_name = "ChemDrobe"
@@ -454,7 +436,6 @@
/obj/item/storage/backpack/genetics = 2,
/obj/item/storage/backpack/satchel/gen = 2)
refill_canister = /obj/item/vending_refill/wardrobe/gene_wardrobe
- payment_department = ACCOUNT_SCI
/obj/item/vending_refill/wardrobe/gene_wardrobe
machine_name = "GeneDrobe"
@@ -477,7 +458,6 @@
/obj/item/clothing/head/plaguedoctorhat = 1,
/obj/item/clothing/mask/gas/plaguedoctor = 1)
refill_canister = /obj/item/vending_refill/wardrobe/viro_wardrobe
- payment_department = ACCOUNT_MED
/obj/item/vending_refill/wardrobe/viro_wardrobe
machine_name = "ViroDrobe"
@@ -507,7 +487,6 @@
premium = list(/obj/item/clothing/head/flatcap = 1)
refill_canister = /obj/item/vending_refill/wardrobe/det_wardrobe
extra_price = 350
- payment_department = ACCOUNT_SEC
/obj/item/vending_refill/wardrobe/det_wardrobe
machine_name = "DetDrobe"
@@ -575,7 +554,7 @@
/obj/item/clothing/suit/armor/vest/bulletproof = 3,
/obj/item/clothing/suit/armor/riot/clip = 3,
- /obj/item/clothing/suit/space/hardsuit/security/independent/clip = 3,
+ /obj/item/clothing/suit/space/hardsuit/clip_patroller = 3,
/obj/item/clothing/suit/space/hardsuit/clip_spotter = 3,
/obj/item/clothing/head/helmet/bulletproof/x11/clip = 3,
diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm
index aadb3c6a5b37..98a5331b2744 100644
--- a/code/modules/vending/youtool.dm
+++ b/code/modules/vending/youtool.dm
@@ -15,8 +15,9 @@
/obj/item/flashlight/glowstick = 3,
/obj/item/flashlight/glowstick/red = 3,
/obj/item/flashlight = 3,
- /obj/item/clothing/ears/earmuffs = 1)
- contraband = list(/obj/item/clothing/gloves/color/fyellow = 2)
+ /obj/item/clothing/ears/earmuffs = 1,
+ /obj/item/clothing/gloves/color/fyellow = 2
+ )
premium = list(/obj/item/storage/belt/utility = 2,
/obj/item/multitool = 2,
/obj/item/weldingtool/hugetank = 1,
@@ -26,4 +27,3 @@
resistance_flags = FIRE_PROOF
default_price = 125
extra_price = 350
- payment_department = ACCOUNT_ENG
diff --git a/config/game_options.txt b/config/game_options.txt
index bf970824a0af..135123b845ad 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -423,7 +423,7 @@ SILICON_MAX_LAW_AMOUNT 12
ROUNDSTART_RACES human
## Races that are strictly worse than humans that could probably be turned on without balance concerns
-ROUNDSTART_RACES lizard
+ROUNDSTART_RACES sarathi
#ROUNDSTART_RACES fly
ROUNDSTART_RACES moth
ROUNDSTART_RACES plasmaman
@@ -436,7 +436,7 @@ ROUNDSTART_RACES rachnid
ROUNDSTART_RACES vox
## Races that are better than humans in some ways, but worse in others
-ROUNDSTART_RACES ethereal
+ROUNDSTART_RACES elzuose
ROUNDSTART_RACES jelly
#ROUNDSTART_RACES golem
#ROUNDSTART_RACES adamantine
diff --git a/html/changelogs/archive/2024-03.yml b/html/changelogs/archive/2024-03.yml
index e09b9d1f4c7a..46fb4085b2a2 100644
--- a/html/changelogs/archive/2024-03.yml
+++ b/html/changelogs/archive/2024-03.yml
@@ -208,3 +208,47 @@
2024-03-23:
Zevotech:
- rscadd: Remapped the Meta-class and changed its faction to NT
+2024-03-26:
+ Gristlebee:
+ - bugfix: speedloaders and en-bloc clips not being able to hold other ammo types
+ of the same caliber
+ - bugfix: 45-70 ammo holders descriptions changed to reflect that they're ammo boxes
+ and hold 12 rounds
+ meemofcourse:
+ - bugfix: Dual sabers should no longer be invisible
+2024-03-27:
+ PositiveEntropy:
+ - bugfix: The 4.6x30mm ammunition box is no longer invisible.
+ SomeguyManperson:
+ - tweak: radiation structures/effects only irradiate their surroundings if near
+ a player
+2024-03-28:
+ Apogee-dev:
+ - tweak: Made the Riggs-class sloop nicer to live in
+ - balance: Removed RnD and ORM from the Riggs
+ FalloutFalcon:
+ - bugfix: extra > in carbon examine
+ - code_imp: various missing icon unit tests
+ - bugfix: to many sprites to name
+ MarkSuckerberg:
+ - tweak: Medical kiosks no longer charge for their service
+ - admin: The economy subsystem now tracks how much money is currently in-round
+ - admin: Adds feedback for the movement of money
+ - rscdel: FULLY removes departmental budgets
+ - rscdel: Removes security record citations
+ PositiveEntropy:
+ - imageadd: Inteq helmets no longer have in-built goggles.
+ retlaw34:
+ - rscadd: adds PGF Sergeant clothing!
+ - rscadd: PGF Captain now has a new cloak design!
+ - balance: PGF armor now has similar stats to bulletproof armor!
+2024-03-29:
+ Gristlebee:
+ - bugfix: 38 Surplus ammo should be printable in the autolathe.
+ - bugfix: 38 speedloader damage blurb is accurate to it's new stats.
+2024-03-31:
+ Gristlebee:
+ - tweak: Geysers can now be plunged with a normal plunger.
+ - tweak: Schmiedeberg's reinforced plunger replaced with a normal plunger
+ - rscdel: Reinforced plungers
+ - imagedel: Reinforced plunger sprites
diff --git a/html/changelogs/archive/2024-04.yml b/html/changelogs/archive/2024-04.yml
new file mode 100644
index 000000000000..ac70dad771a3
--- /dev/null
+++ b/html/changelogs/archive/2024-04.yml
@@ -0,0 +1,146 @@
+2024-04-01:
+ phoaly, coleminerman, MeeMofCourse, Retlaw34:
+ - rscadd: Added the Crying Sun-class
+ - rscadd: Added PGF comms
+2024-04-02:
+ goober3:
+ - tweak: Blood Cult content has been removed from all maps.
+ - rscdel: Jungle_demon.dmm, jungle_witch.dmm, lavaland_surface_cultaltar.dmm, lavaland_surface_fuckedupandevilclub.dmm,
+ clericden.dmm, and rockplanet_cult.dmm have been removed.
+ - tweak: Onehalf.dmm, rockplanet_crash_cult.dmm & icemoon_underground_abandoned_village.dmm
+ have been reworked slightly, to feature no more magic.
+2024-04-08:
+ Apogee-dev:
+ - tweak: Remapped the Shetland
+ - balance: Removed RnD and ORM from Shetland
+ phoaly:
+ - tweak: tweaks supplies and kills the wall laptop on the Ranger
+2024-04-09:
+ Imaginos16, spookywastaken:
+ - rscadd: Resprites a ton of gun magazines
+ - bugfix: Changes how magainzes with only a empty and loaded state are
+2024-04-12:
+ Gristlebee:
+ - rscadd: Punching bags can be built with 5 cloth.
+ - rscadd: Bench press and chest press can be built with 5 metal.
+ - rscadd: Exercise equipment can be deconstructed.
+ Martinpachu:
+ - bugfix: Fixes MAA on the Colossus not being able to access the bridge.
+ Sadhorizon:
+ - tweak: Random blood packs now can roll Elzu and IPC blood.
+ SomeguyManperson:
+ - bugfix: anesthetic can no longer semi permanently knock people out
+ Yata9ar4su:
+ - rscadd: Fullscreen on F11
+ Zxaber:
+ - tweak: You can now use drop / use inhand hotkey to retract and deploy arm implants
+ meemofcourse:
+ - rscadd: Long-range bluespace technologies in fax machines now allow the faxing
+ of photos. I am not responsible for any consequences that might result from
+ sending your faction's command personnel a photo of your character's ass.
+ phoaly:
+ - rscdel: Removed some old ships
+ - tweak: Aspawned the Lagoon and Junker
+ sapphicoverload, PestoVerde322, PacifistDalek:
+ - rscadd: turbines now provide thrust for ships
+ - tweak: turbines respect conservation of energy instead of moving gas around for
+ free
+ - tweak: turbine control console now shows the internal pressure of the turbine
+ - code_imp: refactored how gas flows through the turbine
+ - bugfix: fixed turbines making free energy from nowhere at low RPM
+ - bugfix: fixed turbines forcing air into the output turf when it's blocked
+ - bugfix: fixed turbines not updating air at the input and output turfs
+ - bugfix: fixed turbines disconnecting when docking and undocking
+ - imageadd: new turbine sprites
+ thgvr:
+ - rscadd: Suicide & Execution with a damaging firearm is now more deadly and gruesome.
+2024-04-13:
+ FalloutFalcon:
+ - tweak: all radios start off
+ - tweak: all survival boxs start with a radio
+ Sun-Soaked:
+ - rscadd: Redesigns landmines as an item that can be picked up, disarmed, deployed.
+ Some logic courtesy of /tg/.
+ - rscadd: Adds a proximity explosive variant of landmines.
+ - bugfix: shrapnel embedding once again respects targeted limb and no longer runtimes
+ on hitting a wall or destroying an object.
+ - bugfix: storage can no longer pick up anchored objects, causing them to get stuck
+ inside
+ - balance: Nerfs the ability of heavy explosions to immediately breach to space
+ - soundadd: adds two mine detonation noises
+ - code_imp: moves weapon manufacturer defines to a DEFINE file
+ generalthrax:
+ - rscadd: Etherbor SG-8 Beam Pistol to cargo for 1000 credits
+ - rscadd: Etherbor BG-12 Beam Rifle to cargo for 3000 credits
+ - rscadd: Etherbor civilian weapon cells for 600 credits, slightly higher capacity
+ than the generic cells
+2024-04-17:
+ Gristlebee:
+ - tweak: Granularizes Outpost Spacesuits and Armor
+ - balance: Reduces the cost of specialized space suits
+ SomeguyManperson:
+ - tweak: ships no longer have intrinsic gravity
+ - rscadd: new gravity generator machine for ships
+ - tweak: planetary gravity is now stored level-wide, a ship landing at a planet
+ will be effected by the planet's gravity
+ meemofcourse:
+ - tweak: Identification Cards are now Access Cards. The only real difference is
+ that your name only shows up on a double examine.
+ - refactor: Anonymous mechanics. Characters no longer instantly recognize each other,
+ and need to properly memorize each other in order. You can recognize an unmasked
+ person by ctrl-shift-clicking them.
+2024-04-18:
+ goober3:
+ - bugfix: Wall lockers should be facing the right way again.
+2024-04-19:
+ FalloutFalcon:
+ - bugfix: epty list
+2024-04-20:
+ Apogee-dev:
+ - balance: removed armor value from Solgov hats
+ - balance: Removed armor from berets, peaked caps, and soft caps
+ FalloutFalcon:
+ - spellcheck: renames some species stuff
+ Gristlebee:
+ - bugfix: The laser gun can be bought at the outpost again.
+ Hardly:
+ - tweak: Kissing volume and range has been reduced. Kissing cannot be heard beyond
+ 5 ranges or behind walls.
+ PositiveEntropy:
+ - imageadd: The Pointman Hardsuit that Inteq uses has been cleaned up!
+ Sadhorizon:
+ - soundadd: Sarathi firespit now has a unique sound.
+ SomeguyManperson:
+ - rscdel: tesla coils and rad collectors can no longer print monopoly money
+ Spookypineapple, Imaginos, Thgvr:
+ - rscadd: New sofa and comfy chair variants, both are craftable with metal
+ - imageadd: Sofas, Comfy chairs, and some atmos equipment have a new coat of paint
+ - imageadd: Janitorial equipment has a new coat of paint
+ Sun-Soaked:
+ - bugfix: planetary static anomalies no longer drop a broken spawner.
+ - code_imp: mob spawners now store a weakref on their spawned object
+ cuddleandtea:
+ - admin: faster access to advanced build mode
+ - admin: new relocate subtype for build mode
+ generalthrax:
+ - bugfix: Scarborough + gun typos fixed in cargo
+ - rscadd: Kepori can now *click and *whistle, complete with sounds.
+ - rscadd: Kepori can now *woop, to have a sound later.
+ - rscadd: Vox can now *click and *thump, with sounds as well.
+ jlsnow301, sun-soaked:
+ - rscadd: do_afters and do_mob actions now show nearby players a spinning cog while
+ in progress.
+ - bugfix: the progressbar.dmm file is no longer misspelled "progess"bar
+2024-04-21:
+ FalloutFalcon:
+ - rscdel: Removed firing pins
+ - rscdel: Removed clumsy checks on guns
+ cuddleandtea:
+ - admin: adds color type to variables
+2024-04-25:
+ Gristlebee:
+ - bugfix: Model H and Prototype Gauss Rifle mags are no longer invisible
+2024-04-27:
+ Sadhorizon:
+ - tweak: Replaced standard syndicate outfits with NGR outfits on the Hyena.
+ - rscadd: Added NGR-specific CE and Assistant outfits.
diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml
new file mode 100644
index 000000000000..9e6c28996774
--- /dev/null
+++ b/html/changelogs/archive/2024-05.yml
@@ -0,0 +1,186 @@
+2024-05-02:
+ thgvr:
+ - imageadd: Nanotrasen outfits have a new coat of paint
+2024-05-04:
+ Apogee-dev:
+ - bugfix: fixed missing object descriptions on nanotrasen uniforms
+2024-05-06:
+ Anticept:
+ - tweak: intercomms, widebands, and headsets default speaker on again. Handhelds
+ remain off by default.
+ - balance: pure soulus dust now makes 20u per reaction, and system cleaner is not
+ required.
+ Martinpachu:
+ - balance: The detective's revolver is now priced at 600 credits instead of 1000.
+ - balance: The detective's revolver size is now Small.
+ - rscadd: The Candor may now be bought from the outpost.
+ PositiveEntropy:
+ - rscdel: Removes the Arrhythmic Knife.
+ SomeguyManperson:
+ - tweak: match rounds will no longer consider the person firing them as a viable
+ target when ricocheting
+ SuhEugene:
+ - admin: made invisimin admins invisible for HUDs and ghosts
+ Sun-Soaked:
+ - bugfix: weird uncertainty around the name of EXOCOM. EXOCON is not real.
+2024-05-09:
+ PositiveEntropy:
+ - rscadd: The HP Firebrand, HP Scout, HP Contender, .38 Derringer and Double Barrel
+ Shotgun are now purchasable in the outpost store.
+ - bugfix: The Disposable Gun crate is now granularized.
+ - rscdel: The Scarborough Revolver is no longer purchasable in the outpost store.
+2024-05-10:
+ meemofcourse:
+ - rscadd: Helmets now have a small, two-item storage. You can put goggles in there,
+ and it might overlay them.
+2024-05-14:
+ Gristlebee:
+ - rscadd: Elzu rooting
+ - tweak: Max age for elzu characters can be 300.
+ Martinpachu:
+ - tweak: Riot shield crates now contain only one shield but are priced at 600 credits.
+ MassiveMen:
+ - rscadd: Hawaiian Shirt is now in loadout
+ - tweak: Hawaiian Shirt is now Floral Shirt
+ - tweak: New item description teehee
+ SomeguyManperson:
+ - bugfix: static anomalies can now be safely approached if mindshielded, wearing
+ a research scanner, or deaf, not all three at the same time
+2024-05-16:
+ FleetingExpertise:
+ - rscadd: Added new sprites for the plunger, rolling pin and push broom by FleetingExpertise
+ - rscadd: Most knifes in the game have been resprited!
+2024-05-18:
+ spookypineapple:
+ - imageadd: Snowy grass, suit storage units, bookcases, and chem machines have been
+ resprited
+2024-05-20:
+ MarkSuckerberg:
+ - rscadd: Autowiki generated reagents list page
+2024-05-21:
+ Apogee-dev:
+ - tweak: Made the Delta more obviously affiliated with N+S Logistics
+ FalloutFalcon:
+ - balance: some xeno stuff needed nerfs
+ - bugfix: fixed a bunch of xeno issues
+ - rscdel: deleted some bad recipes like a golden horn, black carpet, aitater, and
+ legion staff
+ - code_imp: organized recipe files
+ Gristlebee:
+ - rscadd: A bunch of new items for the Black Market catalogue
+ - rscadd: Two new Black Market Tabs, Explosives and Emergency
+ - rscadd: Sawn off Illestren typepath
+ - rscdel: Black Market Teleportation
+ - rscdel: Space Ninja mask and Clown Tears from Black Market
+ - tweak: Black Market Uplink uses a micro laser instead of an ansible for crafting
+ - tweak: Black Market descriptions and examines
+ - tweak: Black Market Uplinks link directly to a specific LTSRBT
+ - balance: Black Market item price and stock adjusted
+ - balance: LTSRBT is faster
+ - code_imp: pair_item var for Black Market items
+ Martinpachu:
+ - rscdel: Removed the bible from loadout, as well as the religion and deity names
+ because god is dead. Clown and mime names too.
+ - balance: The civilian etherbor weapons have been made larger (the SG-8 being normal
+ sized and the BG-12 being bulky sized)
+ Sadhorizon:
+ - tweak: Sarathi max age is now 175.
+ SomeguyManperson:
+ - rscadd: you can now attach plungers to people by hand, rather than throwing
+ Sun-Soaked:
+ - rscadd: Volumetric storage on backpacks.
+ - rscadd: trash bags now have more storage space, but only make a small amount of
+ their contents accessible at any given time.
+ Zevotech:
+ - rscadd: Remaps lavaland_surface_biodome_winter.dmm
+ - rscdel: Removes the "Undead Eskimo" mob
+ generalthrax:
+ - rscadd: Add mood-boosting vivifier cybernetic implants to boost your mood to Cybernetic
+ Implants node. Preservation of the sense of taste not included
+ - rscadd: Adds a hacked variant of the above (not yet obtainable) to give terrible
+ mood to those installed with it!
+ meemofcourse:
+ - rscadd: Tortuga-class.
+ - rscadd: Brawler-class.
+ - rscdel: Ember-class.
+ - rscdel: Scar suit.
+ - tweak: Frontiersmen outfits start with less stuff.
+ retlaw34:
+ - rscdel: Vela-class, is this even player facing?
+ - rscadd: Variants of clip outfits
+ - rscdel: reinforced trapper hat
+ - rscadd: resprites the indie sec suit and it's clip variant
+ - tweak: Some extremely minor code tweaks
+ - rscadd: adds support to make adding species variants easier, jesus christ it was
+ bad before.
+ - rscadd: snouted variant support for sprites
+2024-05-22:
+ Zevotech:
+ - rscadd: rockplanet_shippingdock.dmm and associated code
+2024-05-25:
+ FalloutFalcon:
+ - rscdel: Removed comms consoles from ruins and ships
+ PositiveEntropy:
+ - imageadd: Computers now look sleeker!
+ SomeguyManperson:
+ - bugfix: mech laser cargo crate is no longer unbuyable
+ Zevotech:
+ - rscdel: Plastic flaps no longer block atmos
+2024-05-28:
+ Anticept:
+ - tweak: All pacman and its variants now have the same sheet burn times. Superpacmans
+ are no longer the vastly inferior generator.
+ Gristlebee:
+ - rscadd: Generic Ammo Boxes, printable in the autolathe
+ - rscadd: Ammo cans are printable in the autolathe
+ - bugfix: Ammo boxes sometimes not properly updating their materials
+ - rscdel: Elzu can no longer change their color with the multitool or emag.
+ Martinpachu:
+ - rscadd: Double bedsheets, fit for double beds, are now craftable via cloth.
+ Mirag19:
+ - bugfix: Fix revolver ammo check
+ Skies-Of-Blue:
+ - bugfix: fbp and rilena hoodies now work as intended
+ SomeguyManperson:
+ - bugfix: melee hermits now pull from the "survivor" loot variant rather than no
+ loot variant
+ - bugfix: hermits can no longer commit mitosis
+ - tweak: hermit loot has been compactified, defaults are now declared in the object
+ rather than initialize, and variant-specific loot now uses a switch statement
+ - bugfix: all hermits now have pocket loot randomized as intended
+ - tweak: reduces the cash bundle melee hermits can drop from a medium random (500-3000)
+ to small random (100-500) bundle since they are quite common
+ - bugfix: prismwine's burn resistance can no longer end up stacking
+ Spyroshark, Sun-Soaked:
+ - rscadd: A movable physics subsystem, deployed using a component.
+ - rscadd: Bullet casings now drop using movable physics
+ - code_imp: ports NO_PIXEL_RANDOM_DROP from TG.
+ Thera-Pissed:
+ - tweak: SSUs draw power to decontaminate
+ - balance: lights no longer take 60% of a ships power, machines use more to account
+ for this.
+ - code_imp: added standardized defines for power usage
+ Zevotech:
+ - rscdel: Clown and mime fan quirks have been removed
+ - rscdel: Removes the clown and mime fan pins
+2024-05-29:
+ Apogee-dev:
+ - tweak: Syndicate mobs have been renamed to Ramzi Clique mobs. New sprites will
+ come later.
+ Gristlebee:
+ - rscadd: Holopads now display the location of the last holopad that called them
+ on examine.
+ - code_imp: Span macros for hologram.dm
+ - rscadd: Autolathe can print holofield controllers.
+ - rscadd: You can sync blastdoors and holofields to a controller in a button with
+ a multitool
+ - code_imp: span macros for blast doors, buttons and holofields
+2024-05-30:
+ PositiveEntropy:
+ - rscadd: Solarian Marine Bi-ologists now have proper representation in the form
+ of a cute cloak!
+2024-05-31:
+ Gristlebee:
+ - bugfix: Auto unloading for gate loaded revolvers
+ INFRARED_BARON, PositiveEntropy:
+ - imageadd: Resprites nearly every mech!
diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml
new file mode 100644
index 000000000000..1f0a7f90d616
--- /dev/null
+++ b/html/changelogs/archive/2024-06.yml
@@ -0,0 +1,248 @@
+2024-06-01:
+ FalloutFalcon:
+ - rscadd: Added new more varied legion corpses
+ - rscdel: Removed lot of the crappy legion corpses
+ - balance: rebalanced most of the old legion corpses
+ - refactor: moved most legion corpse loot behavior to outfits
+ - tweak: tweaked the new ore
+ Gristlebee:
+ - rscadd: Suit Storage Unit construction
+ - rscadd: Added suit storage unit circuit boards to industrial engineering tech
+ - tweak: Suit storage unit examines
+ - tweak: span class to span macros in suit_storage.dm
+ INFRARED_BARON:
+ - imageadd: All mechs have been successfully resprited, including the Mauler, Marauder
+ and Seraph now!
+ Skies-Of-Blue:
+ - tweak: mugs referencing an ancient terran empire have been confiscated by the
+ confederation. Please enjoy your complementary, generic mug in compensation
+ - bugfix: rds based delusions now pass without the player having to relog, thank
+ god
+ - bugfix: rds can once again be treated with mindbreaker toxin (hopefully)
+ - tweak: the pool of possible delusions has been changed to better reflect shiptest's
+ narrative
+ - rscadd: a base ramzi sprite to simple_human.dmi to be used in the changed delusion
+ pool
+ - rscdel: chat warning message for rds users not to grief. Just be cool about it,
+ okay?
+ SomeguyManperson:
+ - bugfix: fueled thruster throttling now works right
+ Sun-Soaked:
+ - rscadd: World icon element.
+ - rscadd: World icons for combat knives.
+ thgvr:
+ - rscadd: Roundstart ships no longer spawn
+2024-06-02:
+ Skies-Of-Blue:
+ - rscdel: removes the roundjoin "welcome to /tg/ station" audio clip
+ SomeguyManperson:
+ - bugfix: black market secret documents are no longer default documents
+ - balance: the shoddy survivor suits found on hermits are now actually worse than
+ the EXOCOM explorer suits
+2024-06-03:
+ Apogee-dev:
+ - balance: security belts and webbings can no longer store bulk ammo boxes, only
+ magazines
+ - tweak: Ship-specific access restrictions have been enabled.
+ - tweak: Pirate ships no longer spawn docked to the outpost.
+ FalloutFalcon:
+ - bugfix: Fixed plant analyzer examine block styling
+ - tweak: rewrites trickwine for brewers
+ - rscadd: You can trip landmines with a well placed throw
+ - rscadd: New interaction with throwing things at bottles, lights, and bear traps
+ - bugfix: The end of finalize no longer gets called twice and targeting items seems
+ like an intended behavior that was lost
+ - rscdel: Removed goofball legion disease
+ - refactor: spawning guns without mags are handled with a define
+ - refactor: refactored hostile humans
+ - bugfix: fixed free smart fridge circuit board from drying rack
+ - rscadd: Smokers rejoice! You can now pick your favorite type of nicotine delivery
+ system.
+ - rscadd: Smokers have a choice between most brands of cigarette, cigars, a vape,
+ or a pipe!
+ - code_imp: sorted code owner stuff and added me to some files
+ - bugfix: fixed create and destroy test fail
+ - tweak: tweaked id card examine information and formating
+ - bugfix: human examine bug when middle aged
+ - rscdel: Removed moths getting one shot by a flyswatter
+ - code_imp: camera/autoname/LateInitialize() optimization
+ - tweak: granularizes a handful of tool and machine supply packs!
+ - admin: Improved the silly little menu, HA HA I have messed up your muscle memory!!
+ u
+ Gristlebee:
+ - tweak: Defib crate now contains a single defib, priced 750
+ - tweak: Granularizes mech equipment
+ - tweak: mech cargo pack descs
+ - rscadd: Asteroid ore veins
+ Hardly:
+ - rscadd: Added some style to the flavor text popup
+ - bugfix: Fixed flavor text not accepting certain characters or new lines
+ - tweak: Changed up Flavor Text editing text a bit
+ - tweak: Flavor text's max length has been chopped from 4096 to 1024
+ Sadhorizon:
+ - tweak: Moved most of contraband items out of vendor contraband.
+ - rscadd: Added DromaderyCo packets to the cigarette vendors.
+ - tweak: Increased nicotine amount to three in the cigarette vendors.
+ Skies-Of-Blue:
+ - balance: chemical mindbreaker is now ten times as potent! Be gay, do crime, and
+ hallucinate in the process
+ SomeguyManperson:
+ - bugfix: hallucination anomalies now trigger if you aren't wearing proper protection
+ (as opposed to only triggering if you are)
+ - bugfix: gun sawing can now only be done with proper equipment (usually a saw))
+ - bugfix: bandoliers now hold the correct amount of bullets (several more)
+ - balance: the brimstone can now be pumped faster. Enjoy your rilena.
+ Sun-Soaked:
+ - bugfix: shoutgun casing bounce sfx now plays as intended. oopsies.
+ - rscdel: Removes sexy clown costumes from spawners
+ - config: tweak option removed from changelog template
+ Zevotech:
+ - rscdel: Removed nonfunctioning coffee machines and their cargo packs
+ - rscadd: Adds the Elzuose color salve, a product that allows Elzuose to change
+ their glow color upon application.
+ '[Watermelon914](https://github.com/Watermelon914)':
+ - code_imp: ports little itty bitty sendsignal optimization from tg
+ meemofcourse:
+ - balance: The Elder's Illesterns and Arrows are now factory-variant.
+ - bugfix: The Runner should be able to dock now.
+ rkz, Benjamin(benbot16), Rohesie, Qustinnus, jlsnow301:
+ - refactor: refactored do_afters to use timed_action_flags for unique args
+ - code_imp: centralized do_mob and do_atom into do_after
+2024-06-05:
+ FalloutFalcon:
+ - rscdel: Trophies can no longer be used in crushers
+ - bugfix: fixed CODEOWNERS, i hope
+ SomeguyManperson:
+ - bugfix: The shadow's gunslinger buff now properly provides an AP bonus
+ - balance: Rollerbeds stop broken bone damage ticks from occurring while buckled
+2024-06-06:
+ SomeguyManperson:
+ - bugfix: melee hermits have had their immortal snail deals revoked
+2024-06-07:
+ Sun-Soaked:
+ - bugfix: combat knives and their subtypes now once again have sprites.
+ Zevotech:
+ - rscadd: remapped and renamed ashwalker_shrine into lavaland_surface_buried_shrine
+ - rscadd: Necropolis walls have been renamed to thick stone walls.
+ rye-rice:
+ - rscadd: Changing firemodes on guns now have new sprites
+ - bugfix: The E-40 now works as intended!
+ - rscadd: The E-40 now has an ammo counter
+ - balance: The P16 shoots slightly faster.
+ - balance: Two E-40s max are obtainable from the black market should it spawn. Blank
+ market price cap of the E-40 has also increased
+2024-06-08:
+ Apogee-dev:
+ - bugfix: fixed an incorrect sprite state on corpo sofas
+ FalloutFalcon:
+ - rscdel: Removed alot of magic cruft
+ - code_imp: Sorts gun defines into there own file
+ SomeguyManperson:
+ - bugfix: gunslinger applies its spread reduction effect to revolvers
+ Sun-Soaked:
+ - bugfix: removes a comment from apc.dm that was causing strange errors.
+ thgvr:
+ - imageadd: Kepori have been given a full visual overhaul.
+2024-06-09:
+ SomeguyManperson:
+ - tweak: bleeding is now stored in the limbs, functioning similarly to bone breaking.
+ Taking damage over a certain threshold and amount (lower for sharp weapons)
+ will cause part of it to be turned into bleeding.
+ - tweak: gauze, tape, and bleeding suppression are similarly no longer abstracted
+ into a "bleed suppression" value
+ - rscadd: you can now cauterize bleeding with a lighter. Which is cool.
+ - rscadd: you can now also cauterize bleeding with suit storage decontamination.
+ Which is hot.
+ - rscadd: examine and examine closely will show whether or not someone is visibly
+ bleeding or bandaged. This means people who are both will show both. Examine
+ closely additionally shows which limbs are currently bleeding.
+ - tweak: heparin now causes existing bleeding to worsen, instead of causing bleeding
+ on its own
+ - tweak: you can no longer cut the throat of someone who's head has been lopped
+ off
+ Zevotech:
+ - bugfix: Planets should no longer spawn without ruins when generating due to bad
+ map datums
+ - rscdel: Removed 3 Beach ruins
+ - rscdel: Removed 4 Iceplanet ruins
+ - rscdel: Removed 11 Jungle ruins
+ - rscdel: Removed 10 Lavaland ruins
+ - rscdel: Removed 8 Rockplanet ruins
+ - rscdel: Removed 7 Sandplanet ruins
+ - rscdel: Removed 7 Rockplanet ruins
+ - rscdel: Removed 15 Space ruins
+ - rscdel: Removed 16 unused/removed ruin code files
+ - rscdel: Removed a whole lot of old/unused ruin code from misc files
+ - tweak: Tweaked various ruins and one ship to fix issues and remove unused items
+2024-06-10:
+ PositiveEntropy:
+ - rscadd: CLIP now reports the presence of so-called "Flame Troopers" of the Frontiersmen
+ terrorizing their territories...
+ - balance: Marine armor has improved armor stats at the cost of the bulk slowing
+ down the wearer.
+ - balance: Flamethrowers have a slightly improved effective range, as well as higher
+ damage.
+ - imageadd: The Frontiersmen have gotten better tailors and now look sharp and deadly!
+ Skies-Of-Blue:
+ - rscadd: several new SUNS-produced genemods have hit the public market! Head to
+ your local gene-clinic and ask about their new dog and rabbit options for more
+ details
+ - balance: fox ears have been tweaked to be just as susceptible to sound as cat
+ ears
+2024-06-11:
+ 'CoiledLamb ':
+ - rscadd: Resprites the eggbox
+ Gristlebee:
+ - code_imp: Switchblades are now pathed under obj/kitchen/knife
+ - imageadd: Switchblade sprites moved from items and weapons.dmi to knife.dmi
+ Sadhorizon:
+ - rscadd: Pickaxe was added to the autolathe.
+ meemofcourse:
+ - rscadd: PGF jobs now grant you the Kalixcian Common language
+2024-06-13:
+ FalloutFalcon:
+ - rscdel: Removed alot of chaplain stuff we will never use
+ - rscdel: The chaplain is now just as magic as the average person
+ Gristlebee:
+ - rscadd: Wrecked Factory ruin
+ - rscadd: Indestructible titanium walls
+ - rscadd: Lavaland atmos subtypes for plating, rusted plating, concrete, white and
+ dark turfs
+ - balance: Syndicate Space Simple Mobs have their max temp increased
+ - tweak: Wall_lockers updatepaths on the Aegis
+ - code_imp: Adds ruin to map_catalogue,txt, lavaland.dm and adds it to lavaland.dm
+ areas
+ - rscadd: Techshell box
+ - rscadd: Techshells to the outpost market for 175 credits
+ - tweak: Scatter ion description
+ - balance: Techshell recipes no longer require higher tier stock parts, adjusts
+ scatter laser, scatter ion, dragonsbreath and pulse slug recipes
+ - balance: Buffs scatter lasers, scatter ion and dragonsbreath
+ PositiveEntropy:
+ - rscadd: The Hardliners have now made a proper appearance in the Frontier!
+ Sadhorizon:
+ - rscadd: Added the Sunskipper-class Culinary Vessel.
+ - rscadd: Every drink and booze dispenser drink is in the booze-o-mat now.
+ - rscadd: Added bottles for triple sec, lemon juice, creme de cacao and creme de
+ menthe.
+ - rscdel: Removed the Boyardee-class Entertainment Vessel.
+ - rscdel: Independent chefs no longer get kitchen cqc.
+ - tweak: The "syndicate waiter's outfit" renamed to just "waiter's outfit".
+ - tweak: Indpenedent bartenders now start with a waistcoat.
+ - tweak: Edited waiter's outfit. Also, the role now gets kitchen access.
+ - tweak: Independent cooks now start with laceup shoes.
+ meemofcourse:
+ - rscadd: SUNS 3x6 logo decal, SUNS tiles, SUNS emblem floor decal, Desk and Wall
+ flag, folders, PDA, cards, locker, bedsheets, and headsets.
+2024-06-14:
+ Gristlebee:
+ - bugfix: Posibrains/MMI pilots being permaslept on mech destruction
+2024-06-15:
+ Rye-Rice:
+ - imageadd: Rylie Was Forced To Resprite Concrete when she was 6!
+2024-06-16:
+ DIB-DOG:
+ - rscadd: Added 1 Raksha Helmet to the sergeant's locker on the PGFN Crying Sun
+2024-06-17:
+ meemofcourse:
+ - code_imp: A lot of SUNS decals.
diff --git a/icons/blanks/64x64.dmi b/icons/blanks/64x64.dmi
new file mode 100644
index 000000000000..6bfbd471e5db
Binary files /dev/null and b/icons/blanks/64x64.dmi differ
diff --git a/icons/effects/alphacolors.dmi b/icons/effects/alphacolors.dmi
index c3dbcaee39be..2718f87d36b3 100644
Binary files a/icons/effects/alphacolors.dmi and b/icons/effects/alphacolors.dmi differ
diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi
index c9e7f880c809..d18ba51ae40f 100644
Binary files a/icons/effects/crayondecal.dmi and b/icons/effects/crayondecal.dmi differ
diff --git a/icons/effects/ore_visuals.dmi b/icons/effects/ore_visuals.dmi
index 1353a2d814ad..b64b8f0427e2 100644
Binary files a/icons/effects/ore_visuals.dmi and b/icons/effects/ore_visuals.dmi differ
diff --git a/icons/effects/progessbar.dmi b/icons/effects/progessbar.dmi
deleted file mode 100644
index f055a07ba149..000000000000
Binary files a/icons/effects/progessbar.dmi and /dev/null differ
diff --git a/icons/effects/progressbar.dmi b/icons/effects/progressbar.dmi
new file mode 100644
index 000000000000..3eed14db704a
Binary files /dev/null and b/icons/effects/progressbar.dmi differ
diff --git a/icons/hud/gun_hud.dmi b/icons/hud/gun_hud.dmi
index a24f7f2964f3..d108a6088e8f 100644
Binary files a/icons/hud/gun_hud.dmi and b/icons/hud/gun_hud.dmi differ
diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi
index 1e03d316c2e3..60ada01078d7 100644
Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ
diff --git a/icons/hud/screen_gen.dmi b/icons/hud/screen_gen.dmi
index cad55a6ea290..b26bc7375dbb 100644
Binary files a/icons/hud/screen_gen.dmi and b/icons/hud/screen_gen.dmi differ
diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi
index 08f0c94505ee..b894d9191225 100644
Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ
diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi
index 3a73559091b2..db1e5fdba40b 100644
Binary files a/icons/misc/buildmode.dmi and b/icons/misc/buildmode.dmi differ
diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi
index c52e55c475a6..9baf5cdde9b3 100644
Binary files a/icons/mob/actions/actions_items.dmi and b/icons/mob/actions/actions_items.dmi differ
diff --git a/icons/mob/augmentation/augments_kepori.dmi b/icons/mob/augmentation/augments_kepori.dmi
index 56e56dd22db5..e86bdfd9cf2d 100644
Binary files a/icons/mob/augmentation/augments_kepori.dmi and b/icons/mob/augmentation/augments_kepori.dmi differ
diff --git a/icons/mob/augmentation/augments_keporiOLD.dmi b/icons/mob/augmentation/augments_keporiOLD.dmi
new file mode 100644
index 000000000000..56e56dd22db5
Binary files /dev/null and b/icons/mob/augmentation/augments_keporiOLD.dmi differ
diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi
index 4fad073974aa..f334af20104e 100644
Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ
diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi
index 6b27c56c8b35..bc048fc920c9 100644
Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ
diff --git a/icons/mob/clothing/ears.dmi b/icons/mob/clothing/ears.dmi
index 23292b118d6a..e7376425f545 100644
Binary files a/icons/mob/clothing/ears.dmi and b/icons/mob/clothing/ears.dmi differ
diff --git a/icons/mob/clothing/faction/clip/head.dmi b/icons/mob/clothing/faction/clip/head.dmi
index 2122a9a2f328..71edbf436e96 100644
Binary files a/icons/mob/clothing/faction/clip/head.dmi and b/icons/mob/clothing/faction/clip/head.dmi differ
diff --git a/icons/mob/clothing/faction/clip/mask.dmi b/icons/mob/clothing/faction/clip/mask.dmi
index a46424e63096..81e70c7f036f 100644
Binary files a/icons/mob/clothing/faction/clip/mask.dmi and b/icons/mob/clothing/faction/clip/mask.dmi differ
diff --git a/icons/mob/clothing/faction/clip/suits.dmi b/icons/mob/clothing/faction/clip/suits.dmi
index f7a64dc8b320..785040d022fe 100644
Binary files a/icons/mob/clothing/faction/clip/suits.dmi and b/icons/mob/clothing/faction/clip/suits.dmi differ
diff --git a/icons/mob/clothing/faction/clip/uniforms.dmi b/icons/mob/clothing/faction/clip/uniforms.dmi
index 71ad9e1b6a3e..436c00d77554 100644
Binary files a/icons/mob/clothing/faction/clip/uniforms.dmi and b/icons/mob/clothing/faction/clip/uniforms.dmi differ
diff --git a/icons/mob/clothing/faction/clip/vox.dmi b/icons/mob/clothing/faction/clip/vox.dmi
new file mode 100644
index 000000000000..882e41864ea0
Binary files /dev/null and b/icons/mob/clothing/faction/clip/vox.dmi differ
diff --git a/icons/mob/clothing/faction/frontiersmen/belt.dmi b/icons/mob/clothing/faction/frontiersmen/belt.dmi
new file mode 100644
index 000000000000..a36573e66f5d
Binary files /dev/null and b/icons/mob/clothing/faction/frontiersmen/belt.dmi differ
diff --git a/icons/mob/clothing/faction/frontiersmen/head.dmi b/icons/mob/clothing/faction/frontiersmen/head.dmi
new file mode 100644
index 000000000000..03f2024b1e88
Binary files /dev/null and b/icons/mob/clothing/faction/frontiersmen/head.dmi differ
diff --git a/icons/mob/clothing/faction/frontiersmen/mask.dmi b/icons/mob/clothing/faction/frontiersmen/mask.dmi
new file mode 100644
index 000000000000..ecd716cdea0d
Binary files /dev/null and b/icons/mob/clothing/faction/frontiersmen/mask.dmi differ
diff --git a/icons/mob/clothing/faction/frontiersmen/suits.dmi b/icons/mob/clothing/faction/frontiersmen/suits.dmi
new file mode 100644
index 000000000000..50657c4df15e
Binary files /dev/null and b/icons/mob/clothing/faction/frontiersmen/suits.dmi differ
diff --git a/icons/mob/clothing/faction/frontiersmen/uniforms.dmi b/icons/mob/clothing/faction/frontiersmen/uniforms.dmi
new file mode 100644
index 000000000000..6dad817d6b64
Binary files /dev/null and b/icons/mob/clothing/faction/frontiersmen/uniforms.dmi differ
diff --git a/icons/mob/clothing/faction/gezena/head.dmi b/icons/mob/clothing/faction/gezena/head.dmi
index c2c20b63e559..9ce4d05d3c2c 100644
Binary files a/icons/mob/clothing/faction/gezena/head.dmi and b/icons/mob/clothing/faction/gezena/head.dmi differ
diff --git a/icons/mob/clothing/faction/gezena/neck.dmi b/icons/mob/clothing/faction/gezena/neck.dmi
index 9b3fa0c9bbab..50b6d05fa9cc 100644
Binary files a/icons/mob/clothing/faction/gezena/neck.dmi and b/icons/mob/clothing/faction/gezena/neck.dmi differ
diff --git a/icons/mob/clothing/faction/hardliners/belt.dmi b/icons/mob/clothing/faction/hardliners/belt.dmi
new file mode 100644
index 000000000000..a864128547d6
Binary files /dev/null and b/icons/mob/clothing/faction/hardliners/belt.dmi differ
diff --git a/icons/mob/clothing/faction/hardliners/eyes.dmi b/icons/mob/clothing/faction/hardliners/eyes.dmi
new file mode 100644
index 000000000000..aec97963fd99
Binary files /dev/null and b/icons/mob/clothing/faction/hardliners/eyes.dmi differ
diff --git a/icons/mob/clothing/faction/hardliners/head.dmi b/icons/mob/clothing/faction/hardliners/head.dmi
new file mode 100644
index 000000000000..839826a7c426
Binary files /dev/null and b/icons/mob/clothing/faction/hardliners/head.dmi differ
diff --git a/icons/mob/clothing/faction/hardliners/suits.dmi b/icons/mob/clothing/faction/hardliners/suits.dmi
new file mode 100644
index 000000000000..05f41eb00d25
Binary files /dev/null and b/icons/mob/clothing/faction/hardliners/suits.dmi differ
diff --git a/icons/mob/clothing/faction/hardliners/uniforms.dmi b/icons/mob/clothing/faction/hardliners/uniforms.dmi
new file mode 100644
index 000000000000..8726f50b2f54
Binary files /dev/null and b/icons/mob/clothing/faction/hardliners/uniforms.dmi differ
diff --git a/icons/mob/clothing/faction/nanotrasen/back.dmi b/icons/mob/clothing/faction/nanotrasen/back.dmi
new file mode 100644
index 000000000000..37224655d088
Binary files /dev/null and b/icons/mob/clothing/faction/nanotrasen/back.dmi differ
diff --git a/icons/mob/clothing/faction/nanotrasen/belt.dmi b/icons/mob/clothing/faction/nanotrasen/belt.dmi
new file mode 100644
index 000000000000..17b681a959af
Binary files /dev/null and b/icons/mob/clothing/faction/nanotrasen/belt.dmi differ
diff --git a/icons/mob/clothing/faction/nanotrasen/feet.dmi b/icons/mob/clothing/faction/nanotrasen/feet.dmi
new file mode 100644
index 000000000000..71bb4a38f372
Binary files /dev/null and b/icons/mob/clothing/faction/nanotrasen/feet.dmi differ
diff --git a/icons/mob/clothing/faction/nanotrasen/hands.dmi b/icons/mob/clothing/faction/nanotrasen/hands.dmi
new file mode 100644
index 000000000000..37224655d088
Binary files /dev/null and b/icons/mob/clothing/faction/nanotrasen/hands.dmi differ
diff --git a/icons/mob/clothing/faction/nanotrasen/head.dmi b/icons/mob/clothing/faction/nanotrasen/head.dmi
new file mode 100644
index 000000000000..41aa213cec89
Binary files /dev/null and b/icons/mob/clothing/faction/nanotrasen/head.dmi differ
diff --git a/icons/mob/clothing/faction/nanotrasen/neck.dmi b/icons/mob/clothing/faction/nanotrasen/neck.dmi
new file mode 100644
index 000000000000..21a4c3992681
Binary files /dev/null and b/icons/mob/clothing/faction/nanotrasen/neck.dmi differ
diff --git a/icons/mob/clothing/faction/nanotrasen/suits.dmi b/icons/mob/clothing/faction/nanotrasen/suits.dmi
new file mode 100644
index 000000000000..279485b7e86e
Binary files /dev/null and b/icons/mob/clothing/faction/nanotrasen/suits.dmi differ
diff --git a/icons/mob/clothing/faction/nanotrasen/uniforms.dmi b/icons/mob/clothing/faction/nanotrasen/uniforms.dmi
new file mode 100644
index 000000000000..ddad36218b5f
Binary files /dev/null and b/icons/mob/clothing/faction/nanotrasen/uniforms.dmi differ
diff --git a/icons/mob/clothing/faction/ngr/belt.dmi b/icons/mob/clothing/faction/ngr/belt.dmi
new file mode 100644
index 000000000000..5ec3ffa92932
Binary files /dev/null and b/icons/mob/clothing/faction/ngr/belt.dmi differ
diff --git a/icons/mob/clothing/faction/ngr/eyes.dmi b/icons/mob/clothing/faction/ngr/eyes.dmi
new file mode 100644
index 000000000000..197e2d68c9cd
Binary files /dev/null and b/icons/mob/clothing/faction/ngr/eyes.dmi differ
diff --git a/icons/mob/clothing/faction/ngr/head.dmi b/icons/mob/clothing/faction/ngr/head.dmi
new file mode 100644
index 000000000000..c370f07aa0f3
Binary files /dev/null and b/icons/mob/clothing/faction/ngr/head.dmi differ
diff --git a/icons/mob/clothing/faction/ngr/mask.dmi b/icons/mob/clothing/faction/ngr/mask.dmi
new file mode 100644
index 000000000000..0baead0a39b1
Binary files /dev/null and b/icons/mob/clothing/faction/ngr/mask.dmi differ
diff --git a/icons/mob/clothing/faction/ngr/neck.dmi b/icons/mob/clothing/faction/ngr/neck.dmi
new file mode 100644
index 000000000000..9f8d3855b059
Binary files /dev/null and b/icons/mob/clothing/faction/ngr/neck.dmi differ
diff --git a/icons/mob/clothing/faction/ngr/suits.dmi b/icons/mob/clothing/faction/ngr/suits.dmi
new file mode 100644
index 000000000000..ac4fceb11cae
Binary files /dev/null and b/icons/mob/clothing/faction/ngr/suits.dmi differ
diff --git a/icons/mob/clothing/faction/ngr/uniforms.dmi b/icons/mob/clothing/faction/ngr/uniforms.dmi
new file mode 100644
index 000000000000..9eccbe4bfe54
Binary files /dev/null and b/icons/mob/clothing/faction/ngr/uniforms.dmi differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index bdf9ad412de7..c2a73da609b9 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/head/armor.dmi b/icons/mob/clothing/head/armor.dmi
new file mode 100644
index 000000000000..38adc74f3317
Binary files /dev/null and b/icons/mob/clothing/head/armor.dmi differ
diff --git a/icons/mob/clothing/head/spacesuits.dmi b/icons/mob/clothing/head/spacesuits.dmi
new file mode 100644
index 000000000000..55a7f69de51f
Binary files /dev/null and b/icons/mob/clothing/head/spacesuits.dmi differ
diff --git a/icons/mob/clothing/helmet_overlays.dmi b/icons/mob/clothing/helmet_overlays.dmi
new file mode 100644
index 000000000000..1c41c357a42a
Binary files /dev/null and b/icons/mob/clothing/helmet_overlays.dmi differ
diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi
index 29d92de9137a..385b3b37918e 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ
diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi
index cd64b37eaf3c..fe74923b657d 100644
Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ
diff --git a/icons/mob/clothing/species/kepori.dmi b/icons/mob/clothing/species/kepori.dmi
index cfa1f108dc68..1586e80e9b19 100644
Binary files a/icons/mob/clothing/species/kepori.dmi and b/icons/mob/clothing/species/kepori.dmi differ
diff --git a/icons/mob/clothing/suits/armor.dmi b/icons/mob/clothing/suits/armor.dmi
index 5c13c3f615ea..d64a4cbbf04f 100644
Binary files a/icons/mob/clothing/suits/armor.dmi and b/icons/mob/clothing/suits/armor.dmi differ
diff --git a/icons/mob/clothing/suits/spacesuits.dmi b/icons/mob/clothing/suits/spacesuits.dmi
index 457f28fb8ad5..da5075195992 100644
Binary files a/icons/mob/clothing/suits/spacesuits.dmi and b/icons/mob/clothing/suits/spacesuits.dmi differ
diff --git a/icons/mob/clothing/under/command.dmi b/icons/mob/clothing/under/command.dmi
index 9e62d273cc3d..6ed86df85dab 100644
Binary files a/icons/mob/clothing/under/command.dmi and b/icons/mob/clothing/under/command.dmi differ
diff --git a/icons/mob/clothing/under/medical.dmi b/icons/mob/clothing/under/medical.dmi
index f33ff2da88f2..0032f9fc2ec8 100644
Binary files a/icons/mob/clothing/under/medical.dmi and b/icons/mob/clothing/under/medical.dmi differ
diff --git a/icons/mob/clothing/under/security.dmi b/icons/mob/clothing/under/security.dmi
index 61b1d7983225..d4a18a6ea083 100644
Binary files a/icons/mob/clothing/under/security.dmi and b/icons/mob/clothing/under/security.dmi differ
diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi
new file mode 100644
index 000000000000..166e1a7624d9
Binary files /dev/null and b/icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi differ
diff --git a/icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_legs_keporiOLD.dmi
similarity index 100%
rename from icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi
rename to icons/mob/clothing/underwear/species/kepori/underwear_legs_keporiOLD.dmi
diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi
new file mode 100644
index 000000000000..6fe4e042f679
Binary files /dev/null and b/icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi differ
diff --git a/icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_socks_keporiOLD.dmi
similarity index 100%
rename from icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi
rename to icons/mob/clothing/underwear/species/kepori/underwear_socks_keporiOLD.dmi
diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi
new file mode 100644
index 000000000000..1a6a59cd5241
Binary files /dev/null and b/icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi differ
diff --git a/icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_torso_keporiOLD.dmi
similarity index 100%
rename from icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi
rename to icons/mob/clothing/underwear/species/kepori/underwear_torso_keporiOLD.dmi
diff --git a/icons/mob/inhands/clothing/ears_lefthand.dmi b/icons/mob/inhands/clothing/ears_lefthand.dmi
new file mode 100644
index 000000000000..61b186a7b21c
Binary files /dev/null and b/icons/mob/inhands/clothing/ears_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing/ears_righthand.dmi b/icons/mob/inhands/clothing/ears_righthand.dmi
new file mode 100644
index 000000000000..39558ef9496e
Binary files /dev/null and b/icons/mob/inhands/clothing/ears_righthand.dmi differ
diff --git a/icons/mob/inhands/clothing/glasses_lefthand.dmi b/icons/mob/inhands/clothing/glasses_lefthand.dmi
new file mode 100644
index 000000000000..34c9e47dc24b
Binary files /dev/null and b/icons/mob/inhands/clothing/glasses_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing/glasses_righthand.dmi b/icons/mob/inhands/clothing/glasses_righthand.dmi
new file mode 100644
index 000000000000..43282d028c6a
Binary files /dev/null and b/icons/mob/inhands/clothing/glasses_righthand.dmi differ
diff --git a/icons/mob/inhands/clothing/gloves_lefthand.dmi b/icons/mob/inhands/clothing/gloves_lefthand.dmi
new file mode 100644
index 000000000000..19d3ce28517e
Binary files /dev/null and b/icons/mob/inhands/clothing/gloves_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing/gloves_righthand.dmi b/icons/mob/inhands/clothing/gloves_righthand.dmi
new file mode 100644
index 000000000000..bca7fd504359
Binary files /dev/null and b/icons/mob/inhands/clothing/gloves_righthand.dmi differ
diff --git a/icons/mob/inhands/clothing/hats_lefthand.dmi b/icons/mob/inhands/clothing/hats_lefthand.dmi
new file mode 100644
index 000000000000..d63c5c7d673a
Binary files /dev/null and b/icons/mob/inhands/clothing/hats_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing/hats_righthand.dmi b/icons/mob/inhands/clothing/hats_righthand.dmi
new file mode 100644
index 000000000000..c34438f09928
Binary files /dev/null and b/icons/mob/inhands/clothing/hats_righthand.dmi differ
diff --git a/icons/mob/inhands/clothing/masks_lefthand.dmi b/icons/mob/inhands/clothing/masks_lefthand.dmi
new file mode 100644
index 000000000000..33be3dfee0b5
Binary files /dev/null and b/icons/mob/inhands/clothing/masks_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing/masks_righthand.dmi b/icons/mob/inhands/clothing/masks_righthand.dmi
new file mode 100644
index 000000000000..e34e8cdd2c72
Binary files /dev/null and b/icons/mob/inhands/clothing/masks_righthand.dmi differ
diff --git a/icons/mob/inhands/clothing/shoes_lefthand.dmi b/icons/mob/inhands/clothing/shoes_lefthand.dmi
new file mode 100644
index 000000000000..7e1a796f1fcf
Binary files /dev/null and b/icons/mob/inhands/clothing/shoes_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing/shoes_righthand.dmi b/icons/mob/inhands/clothing/shoes_righthand.dmi
new file mode 100644
index 000000000000..383f01dc49be
Binary files /dev/null and b/icons/mob/inhands/clothing/shoes_righthand.dmi differ
diff --git a/icons/mob/inhands/clothing/suits_lefthand.dmi b/icons/mob/inhands/clothing/suits_lefthand.dmi
new file mode 100644
index 000000000000..8b9fa5256a93
Binary files /dev/null and b/icons/mob/inhands/clothing/suits_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing/suits_righthand.dmi b/icons/mob/inhands/clothing/suits_righthand.dmi
new file mode 100644
index 000000000000..989b7c0860ae
Binary files /dev/null and b/icons/mob/inhands/clothing/suits_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/custodial_lefthand.dmi b/icons/mob/inhands/equipment/custodial_lefthand.dmi
index 2c9f34af2e1d..9d7b64b16d52 100644
Binary files a/icons/mob/inhands/equipment/custodial_lefthand.dmi and b/icons/mob/inhands/equipment/custodial_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/custodial_righthand.dmi b/icons/mob/inhands/equipment/custodial_righthand.dmi
index f166ba6076bd..cc411eb21963 100644
Binary files a/icons/mob/inhands/equipment/custodial_righthand.dmi and b/icons/mob/inhands/equipment/custodial_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/kitchen_lefthand.dmi b/icons/mob/inhands/equipment/kitchen_lefthand.dmi
index 428960e90086..d60c9bf8f476 100644
Binary files a/icons/mob/inhands/equipment/kitchen_lefthand.dmi and b/icons/mob/inhands/equipment/kitchen_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/kitchen_righthand.dmi b/icons/mob/inhands/equipment/kitchen_righthand.dmi
index f0c1682b68ed..b0a0f6c475bd 100644
Binary files a/icons/mob/inhands/equipment/kitchen_righthand.dmi and b/icons/mob/inhands/equipment/kitchen_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi
index 7d66b946aa1f..772b67e7449d 100644
Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi
index 1b5a50042923..f48c4df6895a 100644
Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ
diff --git a/icons/mob/inhands/faction/nanotrasen/nt_lefthand.dmi b/icons/mob/inhands/faction/nanotrasen/nt_lefthand.dmi
new file mode 100644
index 000000000000..1843cefb3898
Binary files /dev/null and b/icons/mob/inhands/faction/nanotrasen/nt_lefthand.dmi differ
diff --git a/icons/mob/inhands/faction/nanotrasen/nt_righthand.dmi b/icons/mob/inhands/faction/nanotrasen/nt_righthand.dmi
new file mode 100644
index 000000000000..25fa251955c1
Binary files /dev/null and b/icons/mob/inhands/faction/nanotrasen/nt_righthand.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index f5f95c211298..aa8808f81ef2 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index f626c077ced5..9211c2998e49 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/devices_lefthand.dmi b/icons/mob/inhands/misc/devices_lefthand.dmi
index b84d8a8978ce..3acab744f0b7 100644
Binary files a/icons/mob/inhands/misc/devices_lefthand.dmi and b/icons/mob/inhands/misc/devices_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/devices_righthand.dmi b/icons/mob/inhands/misc/devices_righthand.dmi
index 47e3260c6ef6..4d23e421625f 100644
Binary files a/icons/mob/inhands/misc/devices_righthand.dmi and b/icons/mob/inhands/misc/devices_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/sheets_lefthand.dmi b/icons/mob/inhands/misc/sheets_lefthand.dmi
index 8a5431217705..4d7c351d35f9 100644
Binary files a/icons/mob/inhands/misc/sheets_lefthand.dmi and b/icons/mob/inhands/misc/sheets_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/sheets_righthand.dmi b/icons/mob/inhands/misc/sheets_righthand.dmi
index 24256299f2e8..c19a179e689b 100644
Binary files a/icons/mob/inhands/misc/sheets_righthand.dmi and b/icons/mob/inhands/misc/sheets_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/axes_lefthand.dmi b/icons/mob/inhands/weapons/axes_lefthand.dmi
index 810455a611bd..3b95d17cdc78 100644
Binary files a/icons/mob/inhands/weapons/axes_lefthand.dmi and b/icons/mob/inhands/weapons/axes_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi
index ef1b09fccc53..d356f95fd272 100644
Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi
index 827bd71ad50e..b69fb6ff8f74 100644
Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/knifes_lefthand.dmi b/icons/mob/inhands/weapons/knifes_lefthand.dmi
new file mode 100644
index 000000000000..01f5fd3185c9
Binary files /dev/null and b/icons/mob/inhands/weapons/knifes_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/knifes_righthand.dmi b/icons/mob/inhands/weapons/knifes_righthand.dmi
new file mode 100644
index 000000000000..d9803bd40a6e
Binary files /dev/null and b/icons/mob/inhands/weapons/knifes_righthand.dmi differ
diff --git a/icons/mob/kepori_parts.dmi b/icons/mob/kepori_parts.dmi
deleted file mode 100644
index 8f9d7e56043e..000000000000
Binary files a/icons/mob/kepori_parts.dmi and /dev/null differ
diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index a05f9c8dc678..1e271758e346 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ
diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi
index 8cbc0f841bcb..133544acc999 100644
Binary files a/icons/mob/simple_human.dmi and b/icons/mob/simple_human.dmi differ
diff --git a/icons/mob/species/ethereal/bodyparts.dmi b/icons/mob/species/ethereal/bodyparts.dmi
index 09a6019b0364..ca5a5203eeca 100644
Binary files a/icons/mob/species/ethereal/bodyparts.dmi and b/icons/mob/species/ethereal/bodyparts.dmi differ
diff --git a/icons/mob/species/misc/cat.dmi b/icons/mob/species/human/cat.dmi
similarity index 100%
rename from icons/mob/species/misc/cat.dmi
rename to icons/mob/species/human/cat.dmi
diff --git a/icons/mob/species/human/dog.dmi b/icons/mob/species/human/dog.dmi
new file mode 100644
index 000000000000..3b3241059638
Binary files /dev/null and b/icons/mob/species/human/dog.dmi differ
diff --git a/icons/mob/species/human/elf.dmi b/icons/mob/species/human/elf.dmi
new file mode 100644
index 000000000000..7a37d6fd9580
Binary files /dev/null and b/icons/mob/species/human/elf.dmi differ
diff --git a/icons/mob/species/misc/fox.dmi b/icons/mob/species/human/fox.dmi
similarity index 100%
rename from icons/mob/species/misc/fox.dmi
rename to icons/mob/species/human/fox.dmi
diff --git a/icons/mob/species/human/rabbit.dmi b/icons/mob/species/human/rabbit.dmi
new file mode 100644
index 000000000000..fcc6599f7356
Binary files /dev/null and b/icons/mob/species/human/rabbit.dmi differ
diff --git a/icons/mob/species/kepori/bodyparts.dmi b/icons/mob/species/kepori/bodyparts.dmi
index f19aaeacbe08..058d315d7bd8 100644
Binary files a/icons/mob/species/kepori/bodyparts.dmi and b/icons/mob/species/kepori/bodyparts.dmi differ
diff --git a/icons/mob/species/kepori/kepori_eyes.dmi b/icons/mob/species/kepori/kepori_eyes.dmi
new file mode 100644
index 000000000000..3e1617315755
Binary files /dev/null and b/icons/mob/species/kepori/kepori_eyes.dmi differ
diff --git a/icons/mob/species/kepori/kepori_parts.dmi b/icons/mob/species/kepori/kepori_parts.dmi
new file mode 100644
index 000000000000..76d1819c9dd8
Binary files /dev/null and b/icons/mob/species/kepori/kepori_parts.dmi differ
diff --git a/icons/mob/species/kepori/onmob_belt_kepori.dmi b/icons/mob/species/kepori/onmob_belt_kepori.dmi
index cf74d73796c8..4a5a4ba7b32a 100644
Binary files a/icons/mob/species/kepori/onmob_belt_kepori.dmi and b/icons/mob/species/kepori/onmob_belt_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_belt_keporiOLD.dmi b/icons/mob/species/kepori/onmob_belt_keporiOLD.dmi
new file mode 100644
index 000000000000..cf74d73796c8
Binary files /dev/null and b/icons/mob/species/kepori/onmob_belt_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_ears_kepori.dmi b/icons/mob/species/kepori/onmob_ears_kepori.dmi
new file mode 100644
index 000000000000..4a5a4ba7b32a
Binary files /dev/null and b/icons/mob/species/kepori/onmob_ears_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_eyes_kepori.dmi b/icons/mob/species/kepori/onmob_eyes_kepori.dmi
index 2cfe52f4630d..1b6c6f68a3a5 100644
Binary files a/icons/mob/species/kepori/onmob_eyes_kepori.dmi and b/icons/mob/species/kepori/onmob_eyes_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_eyes_keporiOLD.dmi b/icons/mob/species/kepori/onmob_eyes_keporiOLD.dmi
new file mode 100644
index 000000000000..2cfe52f4630d
Binary files /dev/null and b/icons/mob/species/kepori/onmob_eyes_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_feet_kepori.dmi b/icons/mob/species/kepori/onmob_feet_kepori.dmi
index f352a422378a..93bb6ee443d5 100644
Binary files a/icons/mob/species/kepori/onmob_feet_kepori.dmi and b/icons/mob/species/kepori/onmob_feet_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_feet_keporiOLD.dmi b/icons/mob/species/kepori/onmob_feet_keporiOLD.dmi
new file mode 100644
index 000000000000..f352a422378a
Binary files /dev/null and b/icons/mob/species/kepori/onmob_feet_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_hands_kepori.dmi b/icons/mob/species/kepori/onmob_hands_kepori.dmi
index 6dff1607ef57..1cd287411171 100644
Binary files a/icons/mob/species/kepori/onmob_hands_kepori.dmi and b/icons/mob/species/kepori/onmob_hands_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_hands_keporiOLD.dmi b/icons/mob/species/kepori/onmob_hands_keporiOLD.dmi
new file mode 100644
index 000000000000..6dff1607ef57
Binary files /dev/null and b/icons/mob/species/kepori/onmob_hands_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_head_kepori.dmi b/icons/mob/species/kepori/onmob_head_kepori.dmi
index 4109e981c603..b4631838b75a 100644
Binary files a/icons/mob/species/kepori/onmob_head_kepori.dmi and b/icons/mob/species/kepori/onmob_head_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_head_keporiOLD.dmi b/icons/mob/species/kepori/onmob_head_keporiOLD.dmi
new file mode 100644
index 000000000000..31db76896ba2
Binary files /dev/null and b/icons/mob/species/kepori/onmob_head_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_mask_kepori.dmi b/icons/mob/species/kepori/onmob_mask_kepori.dmi
index 610c62338c18..d455cf0bd3e5 100644
Binary files a/icons/mob/species/kepori/onmob_mask_kepori.dmi and b/icons/mob/species/kepori/onmob_mask_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_mask_keporiOLD.dmi b/icons/mob/species/kepori/onmob_mask_keporiOLD.dmi
new file mode 100644
index 000000000000..610c62338c18
Binary files /dev/null and b/icons/mob/species/kepori/onmob_mask_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_suit_kepori.dmi b/icons/mob/species/kepori/onmob_suit_kepori.dmi
index 4d5eaaab1196..6182a9612547 100644
Binary files a/icons/mob/species/kepori/onmob_suit_kepori.dmi and b/icons/mob/species/kepori/onmob_suit_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_suit_keporiOLD.dmi b/icons/mob/species/kepori/onmob_suit_keporiOLD.dmi
new file mode 100644
index 000000000000..4d5eaaab1196
Binary files /dev/null and b/icons/mob/species/kepori/onmob_suit_keporiOLD.dmi differ
diff --git a/icons/mob/species/kepori/onmob_uniform_kepori.dmi b/icons/mob/species/kepori/onmob_uniform_kepori.dmi
index d9bec6e95185..d6f011cef312 100644
Binary files a/icons/mob/species/kepori/onmob_uniform_kepori.dmi and b/icons/mob/species/kepori/onmob_uniform_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_uniform_keporiOLD.dmi b/icons/mob/species/kepori/onmob_uniform_keporiOLD.dmi
new file mode 100644
index 000000000000..66fa497129f6
Binary files /dev/null and b/icons/mob/species/kepori/onmob_uniform_keporiOLD.dmi differ
diff --git a/icons/mob/species/lizard/bodyparts.dmi b/icons/mob/species/lizard/bodyparts.dmi
index 98f9e8d7411c..df7bbd5dc194 100644
Binary files a/icons/mob/species/lizard/bodyparts.dmi and b/icons/mob/species/lizard/bodyparts.dmi differ
diff --git a/icons/mob/species/misc/digitigrade.dmi b/icons/mob/species/misc/digitigrade.dmi
index 57d70696b850..8736b8057f14 100644
Binary files a/icons/mob/species/misc/digitigrade.dmi and b/icons/mob/species/misc/digitigrade.dmi differ
diff --git a/icons/mob/species/misc/digitigrade_shoes.dmi b/icons/mob/species/misc/digitigrade_shoes.dmi
index 9ad6cc1827ed..9d08980b1e58 100644
Binary files a/icons/mob/species/misc/digitigrade_shoes.dmi and b/icons/mob/species/misc/digitigrade_shoes.dmi differ
diff --git a/icons/mob/species/misc/digitigrade_suits.dmi b/icons/mob/species/misc/digitigrade_suits.dmi
index 31dd9ad9c8e6..8bdb115b0370 100644
Binary files a/icons/mob/species/misc/digitigrade_suits.dmi and b/icons/mob/species/misc/digitigrade_suits.dmi differ
diff --git a/icons/mob/species/vox/onmob_back_vox.dmi b/icons/mob/species/vox/onmob_back_vox.dmi
index d8b23da46543..953ff24a290e 100644
Binary files a/icons/mob/species/vox/onmob_back_vox.dmi and b/icons/mob/species/vox/onmob_back_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_feet_vox.dmi b/icons/mob/species/vox/onmob_feet_vox.dmi
index fc17db0fc122..0b06074851aa 100644
Binary files a/icons/mob/species/vox/onmob_feet_vox.dmi and b/icons/mob/species/vox/onmob_feet_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_hands_vox.dmi b/icons/mob/species/vox/onmob_hands_vox.dmi
index e1527c62b702..ff5c1a11df61 100644
Binary files a/icons/mob/species/vox/onmob_hands_vox.dmi and b/icons/mob/species/vox/onmob_hands_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_suit_vox.dmi b/icons/mob/species/vox/onmob_suit_vox.dmi
index 298f46032ab1..7b2ee1c8d1c9 100644
Binary files a/icons/mob/species/vox/onmob_suit_vox.dmi and b/icons/mob/species/vox/onmob_suit_vox.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 7149896332b2..6fac77253d60 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi
index 94df693238d0..b80be47c795d 100644
Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ
diff --git a/icons/obj/atmospherics/components/turbine.dmi b/icons/obj/atmospherics/components/turbine.dmi
new file mode 100644
index 000000000000..6e499911a75b
Binary files /dev/null and b/icons/obj/atmospherics/components/turbine.dmi differ
diff --git a/icons/obj/bedsheets.dmi b/icons/obj/bedsheets.dmi
index 56657861f576..c4cae890b54c 100644
Binary files a/icons/obj/bedsheets.dmi and b/icons/obj/bedsheets.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index df05a9d601e3..17bab47dc9ef 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi
index 1607dc47db22..82d3a62d06bd 100644
Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ
diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi
index 19b49a6d34da..47de0bdd1a43 100644
Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
deleted file mode 100644
index 2dd57cfc6237..000000000000
Binary files a/icons/obj/chemical.dmi and /dev/null differ
diff --git a/icons/obj/chemical/beakers.dmi b/icons/obj/chemical/beakers.dmi
new file mode 100644
index 000000000000..db43d392960d
Binary files /dev/null and b/icons/obj/chemical/beakers.dmi differ
diff --git a/icons/obj/Chem_jug.dmi b/icons/obj/chemical/chem_jug.dmi
similarity index 100%
rename from icons/obj/Chem_jug.dmi
rename to icons/obj/chemical/chem_jug.dmi
diff --git a/icons/obj/chemical/chem_machines.dmi b/icons/obj/chemical/chem_machines.dmi
new file mode 100644
index 000000000000..09e41e9f6ac4
Binary files /dev/null and b/icons/obj/chemical/chem_machines.dmi differ
diff --git a/icons/obj/chemical/grenade.dmi b/icons/obj/chemical/grenade.dmi
new file mode 100644
index 000000000000..af748c687089
Binary files /dev/null and b/icons/obj/chemical/grenade.dmi differ
diff --git a/icons/obj/chemical/hypovial.dmi b/icons/obj/chemical/hypovial.dmi
new file mode 100644
index 000000000000..608af9f77bb3
Binary files /dev/null and b/icons/obj/chemical/hypovial.dmi differ
diff --git a/icons/obj/chemical/medicine.dmi b/icons/obj/chemical/medicine.dmi
new file mode 100644
index 000000000000..34b332d0178f
Binary files /dev/null and b/icons/obj/chemical/medicine.dmi differ
diff --git a/icons/obj/chemical/misc.dmi b/icons/obj/chemical/misc.dmi
new file mode 100644
index 000000000000..4afacabfe286
Binary files /dev/null and b/icons/obj/chemical/misc.dmi differ
diff --git a/icons/obj/chemical/mortar.dmi b/icons/obj/chemical/mortar.dmi
new file mode 100644
index 000000000000..e47543454f9d
Binary files /dev/null and b/icons/obj/chemical/mortar.dmi differ
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index 715fb82d988e..119b420f182a 100644
Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ
diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi
index 48f09da9a178..4e863875c47f 100644
Binary files a/icons/obj/clothing/cloaks.dmi and b/icons/obj/clothing/cloaks.dmi differ
diff --git a/icons/obj/clothing/faction/clip/head.dmi b/icons/obj/clothing/faction/clip/head.dmi
index 3982f324b9a2..b98ec00ea8e8 100644
Binary files a/icons/obj/clothing/faction/clip/head.dmi and b/icons/obj/clothing/faction/clip/head.dmi differ
diff --git a/icons/obj/clothing/faction/clip/suits.dmi b/icons/obj/clothing/faction/clip/suits.dmi
index 16390028fee7..81e6ee001a2b 100644
Binary files a/icons/obj/clothing/faction/clip/suits.dmi and b/icons/obj/clothing/faction/clip/suits.dmi differ
diff --git a/icons/obj/clothing/faction/frontiersmen/belt.dmi b/icons/obj/clothing/faction/frontiersmen/belt.dmi
new file mode 100644
index 000000000000..01a020e47cfb
Binary files /dev/null and b/icons/obj/clothing/faction/frontiersmen/belt.dmi differ
diff --git a/icons/obj/clothing/faction/frontiersmen/head.dmi b/icons/obj/clothing/faction/frontiersmen/head.dmi
new file mode 100644
index 000000000000..f68169a5be65
Binary files /dev/null and b/icons/obj/clothing/faction/frontiersmen/head.dmi differ
diff --git a/icons/obj/clothing/faction/frontiersmen/mask.dmi b/icons/obj/clothing/faction/frontiersmen/mask.dmi
new file mode 100644
index 000000000000..961d27b0891f
Binary files /dev/null and b/icons/obj/clothing/faction/frontiersmen/mask.dmi differ
diff --git a/icons/obj/clothing/faction/frontiersmen/suits.dmi b/icons/obj/clothing/faction/frontiersmen/suits.dmi
new file mode 100644
index 000000000000..65c817191371
Binary files /dev/null and b/icons/obj/clothing/faction/frontiersmen/suits.dmi differ
diff --git a/icons/obj/clothing/faction/frontiersmen/uniforms.dmi b/icons/obj/clothing/faction/frontiersmen/uniforms.dmi
new file mode 100644
index 000000000000..7228ca93fc81
Binary files /dev/null and b/icons/obj/clothing/faction/frontiersmen/uniforms.dmi differ
diff --git a/icons/obj/clothing/faction/gezena/head.dmi b/icons/obj/clothing/faction/gezena/head.dmi
index 11454b333921..faf3c7ac11ef 100644
Binary files a/icons/obj/clothing/faction/gezena/head.dmi and b/icons/obj/clothing/faction/gezena/head.dmi differ
diff --git a/icons/obj/clothing/faction/gezena/neck.dmi b/icons/obj/clothing/faction/gezena/neck.dmi
index 19d51f6a64ae..89617ced9bbf 100644
Binary files a/icons/obj/clothing/faction/gezena/neck.dmi and b/icons/obj/clothing/faction/gezena/neck.dmi differ
diff --git a/icons/obj/clothing/faction/hardliners/belt.dmi b/icons/obj/clothing/faction/hardliners/belt.dmi
new file mode 100644
index 000000000000..e8925f9c5d36
Binary files /dev/null and b/icons/obj/clothing/faction/hardliners/belt.dmi differ
diff --git a/icons/obj/clothing/faction/hardliners/eyes.dmi b/icons/obj/clothing/faction/hardliners/eyes.dmi
new file mode 100644
index 000000000000..2e339c1b510a
Binary files /dev/null and b/icons/obj/clothing/faction/hardliners/eyes.dmi differ
diff --git a/icons/obj/clothing/faction/hardliners/head.dmi b/icons/obj/clothing/faction/hardliners/head.dmi
new file mode 100644
index 000000000000..5101eeedce9c
Binary files /dev/null and b/icons/obj/clothing/faction/hardliners/head.dmi differ
diff --git a/icons/obj/clothing/faction/hardliners/suits.dmi b/icons/obj/clothing/faction/hardliners/suits.dmi
new file mode 100644
index 000000000000..39da1c952739
Binary files /dev/null and b/icons/obj/clothing/faction/hardliners/suits.dmi differ
diff --git a/icons/obj/clothing/faction/hardliners/uniforms.dmi b/icons/obj/clothing/faction/hardliners/uniforms.dmi
new file mode 100644
index 000000000000..233eb500c826
Binary files /dev/null and b/icons/obj/clothing/faction/hardliners/uniforms.dmi differ
diff --git a/icons/obj/clothing/faction/nanotrasen/head.dmi b/icons/obj/clothing/faction/nanotrasen/head.dmi
new file mode 100644
index 000000000000..f1de235c57f5
Binary files /dev/null and b/icons/obj/clothing/faction/nanotrasen/head.dmi differ
diff --git a/icons/obj/clothing/faction/nanotrasen/neck.dmi b/icons/obj/clothing/faction/nanotrasen/neck.dmi
new file mode 100644
index 000000000000..ff9e1c4e77b7
Binary files /dev/null and b/icons/obj/clothing/faction/nanotrasen/neck.dmi differ
diff --git a/icons/obj/clothing/faction/nanotrasen/suits.dmi b/icons/obj/clothing/faction/nanotrasen/suits.dmi
new file mode 100644
index 000000000000..cc87542cf6c7
Binary files /dev/null and b/icons/obj/clothing/faction/nanotrasen/suits.dmi differ
diff --git a/icons/obj/clothing/faction/nanotrasen/uniforms.dmi b/icons/obj/clothing/faction/nanotrasen/uniforms.dmi
new file mode 100644
index 000000000000..fb4bd1b11c04
Binary files /dev/null and b/icons/obj/clothing/faction/nanotrasen/uniforms.dmi differ
diff --git a/icons/obj/clothing/faction/ngr/belt.dmi b/icons/obj/clothing/faction/ngr/belt.dmi
new file mode 100644
index 000000000000..d88e67d332ba
Binary files /dev/null and b/icons/obj/clothing/faction/ngr/belt.dmi differ
diff --git a/icons/obj/clothing/faction/ngr/eyes.dmi b/icons/obj/clothing/faction/ngr/eyes.dmi
new file mode 100644
index 000000000000..8359963e7212
Binary files /dev/null and b/icons/obj/clothing/faction/ngr/eyes.dmi differ
diff --git a/icons/obj/clothing/faction/ngr/head.dmi b/icons/obj/clothing/faction/ngr/head.dmi
new file mode 100644
index 000000000000..d2258c5565dd
Binary files /dev/null and b/icons/obj/clothing/faction/ngr/head.dmi differ
diff --git a/icons/obj/clothing/faction/ngr/mask.dmi b/icons/obj/clothing/faction/ngr/mask.dmi
new file mode 100644
index 000000000000..c867f6f569d7
Binary files /dev/null and b/icons/obj/clothing/faction/ngr/mask.dmi differ
diff --git a/icons/obj/clothing/faction/ngr/neck.dmi b/icons/obj/clothing/faction/ngr/neck.dmi
new file mode 100644
index 000000000000..3da79f8da04b
Binary files /dev/null and b/icons/obj/clothing/faction/ngr/neck.dmi differ
diff --git a/icons/obj/clothing/faction/ngr/suits.dmi b/icons/obj/clothing/faction/ngr/suits.dmi
new file mode 100644
index 000000000000..49344c553e03
Binary files /dev/null and b/icons/obj/clothing/faction/ngr/suits.dmi differ
diff --git a/icons/obj/clothing/faction/ngr/uniforms.dmi b/icons/obj/clothing/faction/ngr/uniforms.dmi
new file mode 100644
index 000000000000..e1b5e1faf5e8
Binary files /dev/null and b/icons/obj/clothing/faction/ngr/uniforms.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 7a1b973759c1..cf7f5ff09bd0 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/head/armor.dmi b/icons/obj/clothing/head/armor.dmi
new file mode 100644
index 000000000000..6757e591c853
Binary files /dev/null and b/icons/obj/clothing/head/armor.dmi differ
diff --git a/icons/obj/clothing/head/spacesuits.dmi b/icons/obj/clothing/head/spacesuits.dmi
new file mode 100644
index 000000000000..8befad3b380f
Binary files /dev/null and b/icons/obj/clothing/head/spacesuits.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 4342a2780f9c..cbe3366557f0 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/suits/armor.dmi b/icons/obj/clothing/suits/armor.dmi
index a81ec697719f..9eaa67f04a42 100644
Binary files a/icons/obj/clothing/suits/armor.dmi and b/icons/obj/clothing/suits/armor.dmi differ
diff --git a/icons/obj/clothing/suits/hooded.dmi b/icons/obj/clothing/suits/hooded.dmi
index 06d98acf2358..5b04aa13aaa7 100644
Binary files a/icons/obj/clothing/suits/hooded.dmi and b/icons/obj/clothing/suits/hooded.dmi differ
diff --git a/icons/obj/clothing/suits/spacesuits.dmi b/icons/obj/clothing/suits/spacesuits.dmi
index fee16c76919d..2208c8b7cf98 100644
Binary files a/icons/obj/clothing/suits/spacesuits.dmi and b/icons/obj/clothing/suits/spacesuits.dmi differ
diff --git a/icons/obj/clothing/under/medical.dmi b/icons/obj/clothing/under/medical.dmi
index 8c3c6917319f..dce9b20106f3 100644
Binary files a/icons/obj/clothing/under/medical.dmi and b/icons/obj/clothing/under/medical.dmi differ
diff --git a/icons/obj/clothing/under/security.dmi b/icons/obj/clothing/under/security.dmi
index 32aea700793d..67e8868958f4 100644
Binary files a/icons/obj/clothing/under/security.dmi and b/icons/obj/clothing/under/security.dmi differ
diff --git a/icons/obj/clothing/under/syndicate.dmi b/icons/obj/clothing/under/syndicate.dmi
index 02d8e138b970..1a2fcad74b84 100644
Binary files a/icons/obj/clothing/under/syndicate.dmi and b/icons/obj/clothing/under/syndicate.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index 1617d733b94b..b34b3777adac 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/icons/obj/deskflags.dmi b/icons/obj/deskflags.dmi
index cf1eaacf5bb3..6a950bcebc4e 100644
Binary files a/icons/obj/deskflags.dmi and b/icons/obj/deskflags.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 360e4cd0f3e4..d7a44b667a0c 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
deleted file mode 100644
index 03fdf63dd00b..000000000000
Binary files a/icons/obj/drinks.dmi and /dev/null differ
diff --git a/icons/obj/drinks/bottle.dmi b/icons/obj/drinks/bottle.dmi
new file mode 100644
index 000000000000..cf74d73796c8
Binary files /dev/null and b/icons/obj/drinks/bottle.dmi differ
diff --git a/icons/obj/drinks/drinks.dmi b/icons/obj/drinks/drinks.dmi
new file mode 100644
index 000000000000..6db6f9bb80a6
Binary files /dev/null and b/icons/obj/drinks/drinks.dmi differ
diff --git a/icons/obj/dyespray.dmi b/icons/obj/dyespray.dmi
index eb056036799a..1d1813f38c50 100644
Binary files a/icons/obj/dyespray.dmi and b/icons/obj/dyespray.dmi differ
diff --git a/icons/obj/flora/snowflora.dmi b/icons/obj/flora/snowflora.dmi
index 002fd90c9fcd..74a1f6dabaf0 100644
Binary files a/icons/obj/flora/snowflora.dmi and b/icons/obj/flora/snowflora.dmi differ
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
index aca64240a1cc..a200515c324f 100644
Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/guns/48x32guns.dmi b/icons/obj/guns/48x32guns.dmi
index 7c2699e7cdc1..232ecdb35e02 100644
Binary files a/icons/obj/guns/48x32guns.dmi and b/icons/obj/guns/48x32guns.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 690ed5d86d2f..9068f301647f 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/implants/implant.dmi b/icons/obj/implants/implant.dmi
new file mode 100644
index 000000000000..31bd68db0caf
Binary files /dev/null and b/icons/obj/implants/implant.dmi differ
diff --git a/icons/obj/item/knife.dmi b/icons/obj/item/knife.dmi
new file mode 100644
index 000000000000..2e95a9154512
Binary files /dev/null and b/icons/obj/item/knife.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 0856132a4751..a0ceaebd8383 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index e084df73a37a..f3b4d79436ef 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index a0bbca6bff9e..5818b7a55d81 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/icons/obj/landmine.dmi b/icons/obj/landmine.dmi
new file mode 100644
index 000000000000..dd19fd9d3991
Binary files /dev/null and b/icons/obj/landmine.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index 40e1dfbabdd3..7c31b8ac45f9 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/machines/borgcharger.dmi b/icons/obj/machines/borgcharger.dmi
new file mode 100644
index 000000000000..c60f999ea06e
Binary files /dev/null and b/icons/obj/machines/borgcharger.dmi differ
diff --git a/icons/obj/machines/coffeemaker.dmi b/icons/obj/machines/coffeemaker.dmi
deleted file mode 100644
index 246159f1c54f..000000000000
Binary files a/icons/obj/machines/coffeemaker.dmi and /dev/null differ
diff --git a/icons/obj/machines/computer.dmi b/icons/obj/machines/computer.dmi
index 2a513215ed20..2e102cda95ad 100644
Binary files a/icons/obj/machines/computer.dmi and b/icons/obj/machines/computer.dmi differ
diff --git a/icons/obj/machines/ship_gravity.dmi b/icons/obj/machines/ship_gravity.dmi
new file mode 100644
index 000000000000..276fcf2b6720
Binary files /dev/null and b/icons/obj/machines/ship_gravity.dmi differ
diff --git a/icons/obj/machines/suit_storage.dmi b/icons/obj/machines/suit_storage.dmi
index cf0edd2e8fdc..a40d04f500c6 100644
Binary files a/icons/obj/machines/suit_storage.dmi and b/icons/obj/machines/suit_storage.dmi differ
diff --git a/icons/obj/nanotrasen_floor.dmi b/icons/obj/nanotrasen_floor.dmi
new file mode 100644
index 000000000000..1e7dc7821a6f
Binary files /dev/null and b/icons/obj/nanotrasen_floor.dmi differ
diff --git a/icons/obj/nanotrasen_logos.dmi b/icons/obj/nanotrasen_logos.dmi
new file mode 100644
index 000000000000..27d1bd6194fb
Binary files /dev/null and b/icons/obj/nanotrasen_logos.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index e7cd9797591b..1b156b9294f9 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/ores.dmi b/icons/obj/ores.dmi
index f3451a8432dd..1e6c41a90c05 100644
Binary files a/icons/obj/ores.dmi and b/icons/obj/ores.dmi differ
diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi
index f76e5611c93d..5d23996fb663 100644
Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ
diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi
index ea47f805dee9..a6199b8723ef 100644
Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index 0989e1834f70..80350d2bfaa3 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index ad6944ebbbcd..df2add959648 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/structures/chairs/comfychair.dmi b/icons/obj/structures/chairs/comfychair.dmi
new file mode 100644
index 000000000000..8b759be5f0f1
Binary files /dev/null and b/icons/obj/structures/chairs/comfychair.dmi differ
diff --git a/icons/obj/structures/chairs/sofa.dmi b/icons/obj/structures/chairs/sofa.dmi
new file mode 100644
index 000000000000..17c976e4650e
Binary files /dev/null and b/icons/obj/structures/chairs/sofa.dmi differ
diff --git a/icons/obj/structures/handrail.dmi b/icons/obj/structures/handrail.dmi
new file mode 100644
index 000000000000..1a8d98d6697d
Binary files /dev/null and b/icons/obj/structures/handrail.dmi differ
diff --git a/icons/obj/structures/signs/sign.dmi b/icons/obj/structures/signs/sign.dmi
index e5ff1a7cf19e..f123c03a76e6 100644
Binary files a/icons/obj/structures/signs/sign.dmi and b/icons/obj/structures/signs/sign.dmi differ
diff --git a/icons/obj/structures/signs/wallflags.dmi b/icons/obj/structures/signs/wallflags.dmi
index 4b4696ad9623..837e442f27ca 100644
Binary files a/icons/obj/structures/signs/wallflags.dmi and b/icons/obj/structures/signs/wallflags.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index d94097ddf2e5..8f2566a98f8a 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 5e072b68f42d..898805a0fa13 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/wallcloset.dmi b/icons/obj/wallcloset.dmi
index 15e2e5e65171..6d41f0ecee85 100644
Binary files a/icons/obj/wallcloset.dmi and b/icons/obj/wallcloset.dmi differ
diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi
index 6483f97570d1..a9f32f001798 100644
Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ
diff --git a/icons/obj/world/melee.dmi b/icons/obj/world/melee.dmi
new file mode 100644
index 000000000000..ff8e2114e827
Binary files /dev/null and b/icons/obj/world/melee.dmi differ
diff --git a/icons/turf/decals.dmi b/icons/turf/decals/decals.dmi
similarity index 56%
rename from icons/turf/decals.dmi
rename to icons/turf/decals/decals.dmi
index c670e677d226..a62024cc8e0e 100644
Binary files a/icons/turf/decals.dmi and b/icons/turf/decals/decals.dmi differ
diff --git a/icons/turf/decals/suns_floor.dmi b/icons/turf/decals/suns_floor.dmi
new file mode 100644
index 000000000000..cce105645f23
Binary files /dev/null and b/icons/turf/decals/suns_floor.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 5136279026c1..398d5550f810 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/icons/turf/floors/suns.dmi b/icons/turf/floors/suns.dmi
new file mode 100644
index 000000000000..aa0df610ec55
Binary files /dev/null and b/icons/turf/floors/suns.dmi differ
diff --git a/icons/turf/walls/bananium_wall.dmi b/icons/turf/walls/bananium_wall.dmi
deleted file mode 100644
index 48a58fe20619..000000000000
Binary files a/icons/turf/walls/bananium_wall.dmi and /dev/null differ
diff --git a/icons/turf/walls/concrete.dmi b/icons/turf/walls/concrete.dmi
index a201e7ab6375..da6a6e45a4ce 100644
Binary files a/icons/turf/walls/concrete.dmi and b/icons/turf/walls/concrete.dmi differ
diff --git a/icons/turf/walls/hexacrete.dmi b/icons/turf/walls/hexacrete.dmi
index 6866ac7f536f..f120455f46ad 100644
Binary files a/icons/turf/walls/hexacrete.dmi and b/icons/turf/walls/hexacrete.dmi differ
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index 7652322fdfd1..16cc956b5f73 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -47,6 +47,7 @@ em {font-style: normal; font-weight: bold;}
.pirradio {color: #a30000;}
.clipradio {color: #337296;}
.irmgradio {color: #885231;}
+.pgfradio {color: #127a35;}
.syndradio {color: ##612425;}
.centcomradio {color: #686868;}
.aiprivradio {color: #ff00ff;}
diff --git a/shiptest.dme b/shiptest.dme
index 1f3455c4c948..70a39551e007 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -52,6 +52,7 @@
#include "code\__DEFINES\directional.dm"
#include "code\__DEFINES\diseases.dm"
#include "code\__DEFINES\DNA.dm"
+#include "code\__DEFINES\do_afters.dm"
#include "code\__DEFINES\dye_keys.dm"
#include "code\__DEFINES\economy.dm"
#include "code\__DEFINES\events.dm"
@@ -65,6 +66,7 @@
#include "code\__DEFINES\food.dm"
#include "code\__DEFINES\footsteps.dm"
#include "code\__DEFINES\forensics.dm"
+#include "code\__DEFINES\guns.dm"
#include "code\__DEFINES\hud.dm"
#include "code\__DEFINES\icon_smoothing.dm"
#include "code\__DEFINES\important_recursive_contents.dm"
@@ -135,11 +137,13 @@
#include "code\__DEFINES\statpanel.dm"
#include "code\__DEFINES\status_effects.dm"
#include "code\__DEFINES\stock_parts.dm"
+#include "code\__DEFINES\storage.dm"
#include "code\__DEFINES\subsystems.dm"
#include "code\__DEFINES\tgs.config.dm"
#include "code\__DEFINES\tgs.dm"
#include "code\__DEFINES\tgui.dm"
#include "code\__DEFINES\time.dm"
+#include "code\__DEFINES\timed_action.dm"
#include "code\__DEFINES\tools.dm"
#include "code\__DEFINES\traits.dm"
#include "code\__DEFINES\turfs.dm"
@@ -280,6 +284,7 @@
#include "code\_onclick\hud\robot.dm"
#include "code\_onclick\hud\screen_objects.dm"
#include "code\_onclick\hud\screentip.dm"
+#include "code\_onclick\hud\storage.dm"
#include "code\_onclick\hud\swarmer.dm"
#include "code\controllers\admin.dm"
#include "code\controllers\controller.dm"
@@ -374,6 +379,7 @@
#include "code\controllers\subsystem\processing\fastprocess.dm"
#include "code\controllers\subsystem\processing\fluids.dm"
#include "code\controllers\subsystem\processing\instruments.dm"
+#include "code\controllers\subsystem\processing\movable_physics.dm"
#include "code\controllers\subsystem\processing\nanites.dm"
#include "code\controllers\subsystem\processing\networks.dm"
#include "code\controllers\subsystem\processing\obj.dm"
@@ -393,6 +399,7 @@
#include "code\datums\changelog.dm"
#include "code\datums\chatmessage.dm"
#include "code\datums\cinematic.dm"
+#include "code\datums\cogbar.dm"
#include "code\datums\dash_weapon.dm"
#include "code\datums\datacore.dm"
#include "code\datums\datum.dm"
@@ -403,6 +410,7 @@
#include "code\datums\emotes.dm"
#include "code\datums\ert.dm"
#include "code\datums\forced_movement.dm"
+#include "code\datums\guestbook.dm"
#include "code\datums\holocall.dm"
#include "code\datums\http.dm"
#include "code\datums\hud.dm"
@@ -452,6 +460,7 @@
#include "code\datums\components\anti_magic.dm"
#include "code\datums\components\armor_plate.dm"
#include "code\datums\components\art.dm"
+#include "code\datums\components\bandage.dm"
#include "code\datums\components\bane.dm"
#include "code\datums\components\beetlejuice.dm"
#include "code\datums\components\bloodysoles.dm"
@@ -497,6 +506,7 @@
#include "code\datums\components\material_container.dm"
#include "code\datums\components\mirv.dm"
#include "code\datums\components\mood.dm"
+#include "code\datums\components\movable_physics.dm"
#include "code\datums\components\nanites.dm"
#include "code\datums\components\ntnet_interface.dm"
#include "code\datums\components\orbiter.dm"
@@ -537,7 +547,12 @@
#include "code\datums\components\crafting\crafting.dm"
#include "code\datums\components\crafting\guncrafting.dm"
#include "code\datums\components\crafting\recipes.dm"
-#include "code\datums\components\crafting\tailoring.dm"
+#include "code\datums\components\crafting\recipes\clothing.dm"
+#include "code\datums\components\crafting\recipes\drink.dm"
+#include "code\datums\components\crafting\recipes\misc.dm"
+#include "code\datums\components\crafting\recipes\robot.dm"
+#include "code\datums\components\crafting\recipes\tribal.dm"
+#include "code\datums\components\crafting\recipes\weapon.dm"
#include "code\datums\components\fantasy\_fantasy.dm"
#include "code\datums\components\fantasy\affix.dm"
#include "code\datums\components\fantasy\prefixes.dm"
@@ -548,6 +563,7 @@
#include "code\datums\components\plumbing\reaction_chamber.dm"
#include "code\datums\components\plumbing\splitter.dm"
#include "code\datums\components\storage\storage.dm"
+#include "code\datums\components\storage\ui.dm"
#include "code\datums\components\storage\concrete\_concrete.dm"
#include "code\datums\components\storage\concrete\bag_of_holding.dm"
#include "code\datums\components\storage\concrete\bluespace.dm"
@@ -602,7 +618,6 @@
#include "code\datums\diseases\advance\symptoms\itching.dm"
#include "code\datums\diseases\advance\symptoms\nanites.dm"
#include "code\datums\diseases\advance\symptoms\narcolepsy.dm"
-#include "code\datums\diseases\advance\symptoms\necropolis.dm"
#include "code\datums\diseases\advance\symptoms\oxygen.dm"
#include "code\datums\diseases\advance\symptoms\sensory.dm"
#include "code\datums\diseases\advance\symptoms\shedding.dm"
@@ -642,6 +657,7 @@
#include "code\datums\elements\update_icon_blocker.dm"
#include "code\datums\elements\update_icon_updates_onmob.dm"
#include "code\datums\elements\waddling.dm"
+#include "code\datums\elements\world_icon.dm"
#include "code\datums\elements\decals\_decals.dm"
#include "code\datums\elements\decals\blood.dm"
#include "code\datums\helper_datums\events.dm"
@@ -772,6 +788,7 @@
#include "code\datums\wires\explosive.dm"
#include "code\datums\wires\fax.dm"
#include "code\datums\wires\microwave.dm"
+#include "code\datums\wires\mines.dm"
#include "code\datums\wires\mulebot.dm"
#include "code\datums\wires\particle_accelerator.dm"
#include "code\datums\wires\r_n_d.dm"
@@ -960,9 +977,11 @@
#include "code\game\machinery\porta_turret\portable_turret_construct.dm"
#include "code\game\machinery\porta_turret\portable_turret_cover.dm"
#include "code\game\machinery\shuttle\custom_shuttle.dm"
+#include "code\game\machinery\shuttle\ship_gravity.dm"
#include "code\game\machinery\shuttle\shuttle_engine.dm"
#include "code\game\machinery\shuttle\shuttle_engine_types.dm"
#include "code\game\machinery\shuttle\shuttle_heater.dm"
+#include "code\game\machinery\shuttle\turbine.dm"
#include "code\game\machinery\telecomms\broadcasting.dm"
#include "code\game\machinery\telecomms\machine_interactions.dm"
#include "code\game\machinery\telecomms\telecomunications.dm"
@@ -981,6 +1000,7 @@
#include "code\game\MapData\shuttles\misc.dm"
#include "code\game\MapData\shuttles\nanotrasen_mimir.dm"
#include "code\game\MapData\shuttles\nanotrasen_ranger.dm"
+#include "code\game\MapData\shuttles\pgf_crying_sun.dm"
#include "code\game\MapData\shuttles\srm_elder.dm"
#include "code\game\mecha\mech_bay.dm"
#include "code\game\mecha\mech_fabricator.dm"
@@ -1027,7 +1047,6 @@
#include "code\game\objects\effects\forcefields.dm"
#include "code\game\objects\effects\glowshroom.dm"
#include "code\game\objects\effects\landmarks.dm"
-#include "code\game\objects\effects\mines.dm"
#include "code\game\objects\effects\misc.dm"
#include "code\game\objects\effects\overlays.dm"
#include "code\game\objects\effects\particle_emitter.dm"
@@ -1197,6 +1216,7 @@
#include "code\game\objects\items\devices\laserpointer.dm"
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\megaphone.dm"
+#include "code\game\objects\items\devices\mines.dm"
#include "code\game\objects\items\devices\multitool.dm"
#include "code\game\objects\items\devices\paicard.dm"
#include "code\game\objects\items\devices\pipe_painter.dm"
@@ -1280,10 +1300,12 @@
#include "code\game\objects\items\stacks\sheets\mineral.dm"
#include "code\game\objects\items\stacks\sheets\sheet_types.dm"
#include "code\game\objects\items\stacks\sheets\sheets.dm"
+#include "code\game\objects\items\stacks\sheets\recipes\recipes_metal.dm"
#include "code\game\objects\items\stacks\tiles\light.dm"
#include "code\game\objects\items\stacks\tiles\tile_mineral.dm"
#include "code\game\objects\items\stacks\tiles\tile_reskinning.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
+#include "code\game\objects\items\stacks\tiles\tiles_suns.dm"
#include "code\game\objects\items\storage\backpack.dm"
#include "code\game\objects\items\storage\bags.dm"
#include "code\game\objects\items\storage\belt.dm"
@@ -1332,7 +1354,6 @@
#include "code\game\objects\structures\fireplace.dm"
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\fluff.dm"
-#include "code\game\objects\structures\fugitive_role_spawners.dm"
#include "code\game\objects\structures\ghost_role_spawners.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
@@ -1385,6 +1406,7 @@
#include "code\game\objects\structures\beds_chairs\alien_nest.dm"
#include "code\game\objects\structures\beds_chairs\bed.dm"
#include "code\game\objects\structures\beds_chairs\chair.dm"
+#include "code\game\objects\structures\beds_chairs\comfy.dm"
#include "code\game\objects\structures\beds_chairs\pew.dm"
#include "code\game\objects\structures\beds_chairs\sofa.dm"
#include "code\game\objects\structures\crates_lockers\closets.dm"
@@ -1423,6 +1445,7 @@
#include "code\game\objects\structures\plaques\static_plaques.dm"
#include "code\game\objects\structures\signs\_signs.dm"
#include "code\game\objects\structures\signs\signs_departments.dm"
+#include "code\game\objects\structures\signs\signs_flags.dm"
#include "code\game\objects\structures\signs\signs_maps.dm"
#include "code\game\objects\structures\signs\signs_warning.dm"
#include "code\game\objects\structures\transit_tubes\station.dm"
@@ -1460,6 +1483,7 @@
#include "code\game\turfs\open\floor\plasteel_floor.dm"
#include "code\game\turfs\open\floor\plating.dm"
#include "code\game\turfs\open\floor\reinf_floor.dm"
+#include "code\game\turfs\open\floor\suns_floor.dm"
#include "code\game\turfs\open\floor\plating\asteroid.dm"
#include "code\game\turfs\open\floor\plating\beach.dm"
#include "code\game\turfs\open\floor\plating\icemoon.dm"
@@ -1664,7 +1688,6 @@
#include "code\modules\antagonists\cult\rune_spawn_action.dm"
#include "code\modules\antagonists\cult\runes.dm"
#include "code\modules\antagonists\devil\devil.dm"
-#include "code\modules\antagonists\devil\devil_helpers.dm"
#include "code\modules\antagonists\devil\imp\imp.dm"
#include "code\modules\antagonists\devil\sintouched\objectives.dm"
#include "code\modules\antagonists\devil\sintouched\sintouched.dm"
@@ -1683,7 +1706,6 @@
#include "code\modules\antagonists\ert\nanotrasen.dm"
#include "code\modules\antagonists\ert\solgov.dm"
#include "code\modules\antagonists\ert\syndicate.dm"
-#include "code\modules\antagonists\fugitive\fugitive_outfits.dm"
#include "code\modules\antagonists\gang\outfits.dm"
#include "code\modules\antagonists\greentext\greentext.dm"
#include "code\modules\antagonists\magic_servant\servant.dm"
@@ -1803,6 +1825,7 @@
#include "code\modules\atmospherics\machinery\portable\scrubber.dm"
#include "code\modules\autowiki\autowiki.dm"
#include "code\modules\autowiki\pages\base.dm"
+#include "code\modules\autowiki\pages\reactions.dm"
#include "code\modules\autowiki\pages\reagents.dm"
#include "code\modules\autowiki\pages\ships.dm"
#include "code\modules\autowiki\pages\techweb.dm"
@@ -1845,6 +1868,7 @@
#include "code\modules\buildmode\submodes\map_export.dm"
#include "code\modules\buildmode\submodes\outfit.dm"
#include "code\modules\buildmode\submodes\proccall.dm"
+#include "code\modules\buildmode\submodes\relocate_to.dm"
#include "code\modules\buildmode\submodes\throwing.dm"
#include "code\modules\buildmode\submodes\tweakcomps.dm"
#include "code\modules\buildmode\submodes\variable_edit.dm"
@@ -1865,6 +1889,8 @@
#include "code\modules\cargo\blackmarket\blackmarket_uplink.dm"
#include "code\modules\cargo\blackmarket\blackmarket_items\clothing.dm"
#include "code\modules\cargo\blackmarket\blackmarket_items\consumables.dm"
+#include "code\modules\cargo\blackmarket\blackmarket_items\emergency.dm"
+#include "code\modules\cargo\blackmarket\blackmarket_items\explosives.dm"
#include "code\modules\cargo\blackmarket\blackmarket_items\misc.dm"
#include "code\modules\cargo\blackmarket\blackmarket_items\tools.dm"
#include "code\modules\cargo\blackmarket\blackmarket_items\weapons.dm"
@@ -1937,7 +1963,11 @@
#include "code\modules\clothing\towels.dm"
#include "code\modules\clothing\ears\_ears.dm"
#include "code\modules\clothing\factions\clip.dm"
+#include "code\modules\clothing\factions\frontiersmen.dm"
#include "code\modules\clothing\factions\gezena.dm"
+#include "code\modules\clothing\factions\hardliners.dm"
+#include "code\modules\clothing\factions\nanotrasen.dm"
+#include "code\modules\clothing\factions\ngr.dm"
#include "code\modules\clothing\factions\suns.dm"
#include "code\modules\clothing\glasses\_glasses.dm"
#include "code\modules\clothing\glasses\engine_goggles.dm"
@@ -2106,7 +2136,6 @@
#include "code\modules\events\wizard\invincible.dm"
#include "code\modules\events\wizard\lava.dm"
#include "code\modules\events\wizard\madness.dm"
-#include "code\modules\events\wizard\magicarp.dm"
#include "code\modules\events\wizard\petsplosion.dm"
#include "code\modules\events\wizard\race.dm"
#include "code\modules\events\wizard\rpgloot.dm"
@@ -2157,7 +2186,6 @@
#include "code\modules\food_and_drinks\food\snacks\dough.dm"
#include "code\modules\food_and_drinks\food\snacks\meat.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\big_mortar.dm"
-#include "code\modules\food_and_drinks\kitchen_machinery\coffeemaker.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\cutting_board.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm"
@@ -2395,6 +2423,7 @@
#include "code\modules\mining\equipment\regenerative_core.dm"
#include "code\modules\mining\equipment\resonator.dm"
#include "code\modules\mining\equipment\survival_pod.dm"
+#include "code\modules\mining\equipment\trophies.dm"
#include "code\modules\mining\equipment\wormhole_jaunter.dm"
#include "code\modules\mining\laborcamp\laborstacker.dm"
#include "code\modules\mining\lavaland\ash_flora.dm"
@@ -2682,13 +2711,10 @@
#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
#include "code\modules\mob\living\simple_animal\hostile\bees.dm"
#include "code\modules\mob\living\simple_animal\hostile\carp.dm"
-#include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm"
#include "code\modules\mob\living\simple_animal\hostile\clown.dm"
#include "code\modules\mob\living\simple_animal\hostile\cockroach.dm"
-#include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm"
#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
-#include "code\modules\mob\living\simple_animal\hostile\frontiersman.dm"
#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
#include "code\modules\mob\living\simple_animal\hostile\goose.dm"
#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm"
@@ -2699,26 +2725,26 @@
#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm"
#include "code\modules\mob\living\simple_animal\hostile\mimic.dm"
#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm"
-#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm"
#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm"
-#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
#include "code\modules\mob\living\simple_animal\hostile\regalrat.dm"
-#include "code\modules\mob\living\simple_animal\hostile\skeleton.dm"
#include "code\modules\mob\living\simple_animal\hostile\space_dragon.dm"
#include "code\modules\mob\living\simple_animal\hostile\statue.dm"
-#include "code\modules\mob\living\simple_animal\hostile\stickman.dm"
-#include "code\modules\mob\living\simple_animal\hostile\survivors.dm"
-#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm"
#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm"
-#include "code\modules\mob\living\simple_animal\hostile\wizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm"
-#include "code\modules\mob\living\simple_animal\hostile\zombie.dm"
#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm"
-#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm"
#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm"
#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\cat_butcher.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\frontiersman.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\human.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\nanotrasen.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\pirate.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\skeleton.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\survivors.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\syndicate.dm"
+#include "code\modules\mob\living\simple_animal\hostile\human\zombie.dm"
#include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm"
#include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm"
#include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm"
@@ -2743,6 +2769,7 @@
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord_outfits.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice demon.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice whelp.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\lobstrosity.dm"
@@ -2934,7 +2961,6 @@
#include "code\modules\power\solar.dm"
#include "code\modules\power\terminal.dm"
#include "code\modules\power\tracker.dm"
-#include "code\modules\power\turbine.dm"
#include "code\modules\power\singularity\boh_tear.dm"
#include "code\modules\power\singularity\collector.dm"
#include "code\modules\power\singularity\containment_field.dm"
@@ -2954,7 +2980,6 @@
#include "code\modules\power\tesla\energy_ball.dm"
#include "code\modules\power\tesla\generator.dm"
#include "code\modules\projectiles\gun.dm"
-#include "code\modules\projectiles\pins.dm"
#include "code\modules\projectiles\projectile.dm"
#include "code\modules\projectiles\ammunition\_ammunition.dm"
#include "code\modules\projectiles\ammunition\_firing.dm"
@@ -2984,6 +3009,7 @@
#include "code\modules\projectiles\ammunition\special\syringe.dm"
#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm"
#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm"
+#include "code\modules\projectiles\boxes_magazines\generic_ammo_box.dm"
#include "code\modules\projectiles\boxes_magazines\external\gauss.dm"
#include "code\modules\projectiles\boxes_magazines\external\grenade.dm"
#include "code\modules\projectiles\boxes_magazines\external\lmg.dm"
@@ -3007,7 +3033,6 @@
#include "code\modules\projectiles\guns\ballistic.dm"
#include "code\modules\projectiles\guns\energy.dm"
#include "code\modules\projectiles\guns\gunhud.dm"
-#include "code\modules\projectiles\guns\magic.dm"
#include "code\modules\projectiles\guns\powered.dm"
#include "code\modules\projectiles\guns\ballistic\assault.dm"
#include "code\modules\projectiles\guns\ballistic\automatic.dm"
@@ -3030,8 +3055,6 @@
#include "code\modules\projectiles\guns\energy\special.dm"
#include "code\modules\projectiles\guns\energy\stun.dm"
#include "code\modules\projectiles\guns\faction\gezena\energy_gunsword.dm"
-#include "code\modules\projectiles\guns\magic\staff.dm"
-#include "code\modules\projectiles\guns\magic\wand.dm"
#include "code\modules\projectiles\guns\misc\beam_rifle.dm"
#include "code\modules\projectiles\guns\misc\blastcannon.dm"
#include "code\modules\projectiles\guns\misc\bow.dm"
@@ -3041,7 +3064,6 @@
#include "code\modules\projectiles\guns\misc\syringe_gun.dm"
#include "code\modules\projectiles\projectile\beams.dm"
#include "code\modules\projectiles\projectile\bullets.dm"
-#include "code\modules\projectiles\projectile\magic.dm"
#include "code\modules\projectiles\projectile\bullets\_incendiary.dm"
#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm"
#include "code\modules\projectiles\projectile\bullets\dnainjector.dm"
@@ -3063,7 +3085,6 @@
#include "code\modules\projectiles\projectile\energy\nuclear_particle.dm"
#include "code\modules\projectiles\projectile\energy\stun.dm"
#include "code\modules\projectiles\projectile\energy\tesla.dm"
-#include "code\modules\projectiles\projectile\magic\spellcard.dm"
#include "code\modules\projectiles\projectile\reusable\_reusable.dm"
#include "code\modules\projectiles\projectile\reusable\arrow.dm"
#include "code\modules\projectiles\projectile\reusable\foam_dart.dm"
@@ -3229,36 +3250,19 @@
#include "code\modules\research\xenobiology\crossbreeding\reproductive.dm"
#include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm"
#include "code\modules\research\xenobiology\crossbreeding\stabilized.dm"
-#include "code\modules\ruins\lavaland_ruin_code.dm"
#include "code\modules\ruins\rockplanet_ruin_code.dm"
-#include "code\modules\ruins\icemoonruin_code\hotsprings.dm"
#include "code\modules\ruins\icemoonruin_code\hydroponicslab.dm"
#include "code\modules\ruins\icemoonruin_code\library.dm"
#include "code\modules\ruins\icemoonruin_code\wrath.dm"
-#include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm"
-#include "code\modules\ruins\lavalandruin_code\codelab.dm"
+#include "code\modules\ruins\lavalandruin_code\biodome_winter.dm"
#include "code\modules\ruins\lavalandruin_code\elephantgraveyard.dm"
-#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm"
#include "code\modules\ruins\lavalandruin_code\puzzle.dm"
-#include "code\modules\ruins\lavalandruin_code\sloth.dm"
#include "code\modules\ruins\lavalandruin_code\surface.dm"
#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm"
#include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm"
#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm"
#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm"
-#include "code\modules\ruins\spaceruin_code\asteroid4.dm"
#include "code\modules\ruins\spaceruin_code\bigderelict1.dm"
-#include "code\modules\ruins\spaceruin_code\caravanambush.dm"
-#include "code\modules\ruins\spaceruin_code\clericsden.dm"
-#include "code\modules\ruins\spaceruin_code\crashedclownship.dm"
-#include "code\modules\ruins\spaceruin_code\crashedship.dm"
-#include "code\modules\ruins\spaceruin_code\deepstorage.dm"
-#include "code\modules\ruins\spaceruin_code\DJstation.dm"
-#include "code\modules\ruins\spaceruin_code\forgottenship.dm"
-#include "code\modules\ruins\spaceruin_code\hellfactory.dm"
-#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm"
-#include "code\modules\ruins\spaceruin_code\listeningstation.dm"
-#include "code\modules\ruins\spaceruin_code\spacehotel.dm"
#include "code\modules\ruins\spaceruin_code\TheDerelict.dm"
#include "code\modules\screen_alerts\_screen_alerts.dm"
#include "code\modules\security_levels\keycard_authentication.dm"
@@ -3291,7 +3295,6 @@
#include "code\modules\spells\spell_types\forcewall.dm"
#include "code\modules\spells\spell_types\genetic.dm"
#include "code\modules\spells\spell_types\godhand.dm"
-#include "code\modules\spells\spell_types\infinite_guns.dm"
#include "code\modules\spells\spell_types\inflict_handler.dm"
#include "code\modules\spells\spell_types\knock.dm"
#include "code\modules\spells\spell_types\lichdom.dm"
diff --git a/sound/items/mine_activate.ogg b/sound/items/mine_activate.ogg
new file mode 100644
index 000000000000..ed39ba283be7
Binary files /dev/null and b/sound/items/mine_activate.ogg differ
diff --git a/sound/items/mine_activate_short.ogg b/sound/items/mine_activate_short.ogg
new file mode 100644
index 000000000000..8c6e81a06bbe
Binary files /dev/null and b/sound/items/mine_activate_short.ogg differ
diff --git a/sound/machines/coffeemaker_brew.ogg b/sound/machines/coffeemaker_brew.ogg
deleted file mode 100644
index a8e25c09867a..000000000000
Binary files a/sound/machines/coffeemaker_brew.ogg and /dev/null differ
diff --git a/sound/voice/ApproachingTG.ogg b/sound/voice/ApproachingTG.ogg
deleted file mode 100644
index 3f8bc1c48801..000000000000
Binary files a/sound/voice/ApproachingTG.ogg and /dev/null differ
diff --git a/sound/voice/kepori/kepiclick.ogg b/sound/voice/kepori/kepiclick.ogg
new file mode 100644
index 000000000000..61670a607b66
Binary files /dev/null and b/sound/voice/kepori/kepiclick.ogg differ
diff --git a/sound/voice/kepori/kepiwhistle.ogg b/sound/voice/kepori/kepiwhistle.ogg
new file mode 100644
index 000000000000..bf1cc76bf5cf
Binary files /dev/null and b/sound/voice/kepori/kepiwhistle.ogg differ
diff --git a/sound/voice/lizard/firespit.ogg b/sound/voice/lizard/firespit.ogg
new file mode 100644
index 000000000000..f60278f47827
Binary files /dev/null and b/sound/voice/lizard/firespit.ogg differ
diff --git a/strings/ipc_preference_adjectives.txt b/strings/ipc_preference_adjectives.txt
new file mode 100644
index 000000000000..a243b2d77fc5
--- /dev/null
+++ b/strings/ipc_preference_adjectives.txt
@@ -0,0 +1,71 @@
+Bedraggled
+Brawny
+Bulky
+Burly
+Calm
+Chaotic
+Charming
+Delicate
+Dignified
+Disgusting
+Disturbing
+Dull
+Effeminate
+Elegant
+Energetic
+Exasperated
+Exotic
+Faint
+Feisty
+Flamboyant
+Fragile
+Frail
+Friendly
+Gentle
+Hawkish
+Hefty
+Hobbling
+Hyper
+Imposing
+Jaded
+Lax
+Lean
+Limp
+Lithe
+Lopsided
+Lovely
+Mangled
+Masculine
+Messy
+Nimble
+Petite
+Pompous
+Pugnacious
+Repulsive
+Robust
+Rough
+Rusted
+Scarred
+Shifty
+Sickly
+Skittish
+Sleek
+Slender
+Slovenly
+Sluggish
+Spacy
+Stiff
+Stony
+Stylish
+Unattractive
+Unremarkable
+Unsightly
+Verbose
+Vigorous
+Waifish
+Wilted
+Wily
+Withered
+Worn-Out
+Zealous
+Zesty
diff --git a/strings/names/moth_first.txt b/strings/names/moth_first.txt
deleted file mode 100644
index cfd8a8675f91..000000000000
--- a/strings/names/moth_first.txt
+++ /dev/null
@@ -1,100 +0,0 @@
-Acantharctia
-Acco
-Acherontia
-Actias
-Aemilia
-Aethria
-Antheraea
-Aphomia
-Argema
-Ascalapha
-Asota
-Athrypsiastis
-Attacus
-Autochloris
-Axylia
-Bombyx
-Callosamia
-Callhistia
-Capricornia
-Catocala
-Cheliosea
-Chloroclystis
-Cochylimorpha
-Cryphia
-Cryptophasa
-Cucullia
-Cydia
-Diarsia
-Diaphora
-Dolichohedya
-Dyspyralis
-Eacles
-Eclipsea
-Electresia
-Elysius
-Enarmonia
-Eriomastyx
-Epiphyas
-Eugnorisma
-Eupithecia
-Euplexia
-Eurosia
-Falcatula
-Fangarctia
-Fulcrifera
-Glyphidoptera
-Gracillina
-Gravitarmata
-Haemanota
-Halysidota
-Helicoverpa
-Heliomata
-Hyalophora
-Hypomartyria
-Icelita
-Isanthrene
-Isochorista
-Izatha
-Kodiosoma
-Lacida
-Leguminivora
-Leucoptera
-Lymantria
-Macrobathra
-Maruca
-Mecodina
-Megalonycta
-Metacrisia
-Mythimna
-Naenia
-Naenia
-Neuroxena
-Nodaria
-Nymphicula
-Obscurior
-Ochropleura
-Opodiphthera
-Ostrinia
-Pacificulla
-Philomusaea
-Phragmataecia
-Plodia
-Plutella
-Rachiplusia
-Sarobela
-Selenarctia
-Shiragasane
-Sphingidae
-Socioplana
-Spodoptera
-Syllomatia
-Thaumetopoea
-Timandra
-Toxoproctis
-Uranophora
-Vestura
-Vietteria
-Xanthorhoe
-Xestia
-Zomaria
diff --git a/strings/names/moth_last.txt b/strings/names/moth_last.txt
deleted file mode 100644
index 4d6ec130c41e..000000000000
--- a/strings/names/moth_last.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-Accurata
-Adultera
-Albipuncta
-Albostriata
-Albovenosa
-Argentea
-Bicolorata
-Bifasciata
-Cameroni
-Chiangmai
-Combinata
-Convecta
-Cuneilinea
-Curvata
-Dentata
-Empyrea
-Eucrossa
-Ferrilinea
-Fraterna
-Goniosigma
-Hamifera
-Hirashimai
-Hypophaea
-Ignita
-Impura
-Insularis
-Infrargyrea
-Intermediata
-Intolerabilis
-Laevusta
-Languida
-Liebherri
-Lineatipes
-Lucida
-Maxima
-Mediana
-Modesta
-Monticola
-Naumanni
-Nepalina
-Obscura
-Osseogrisea
-Pastellina
-Phlebitis
-Pyrausta
-Radiata
-Riparia
-Rufulosa
-Semicana
-Separata
-Siamensis
-Simplex
-Toumodi
-Undicilia
-Uruma
-Vittata
-Yuennana
diff --git a/strings/preference_adjectives.txt b/strings/preference_adjectives.txt
new file mode 100644
index 000000000000..0d67f16803f8
--- /dev/null
+++ b/strings/preference_adjectives.txt
@@ -0,0 +1,117 @@
+Angsty
+Awkward
+Bedraggled
+Blemished
+Bony
+Brawny
+Breathtaking
+Bruised
+Bulky
+Burly
+Calm
+Chaotic
+Charming
+Chubby
+Coarse
+Deformed
+Delicate
+Despondent
+Dignified
+Disgusting
+Disturbing
+Dull
+Effeminate
+Elegant
+Emaciated
+Energetic
+Energetic
+Exasperated
+Exotic
+Faint
+Feisty
+Flabby
+Flamboyant
+Fragile
+Frail
+Frazzled
+Friendly
+Gap-toothed
+Gaunt
+Gentle
+Gloomy
+Gormless
+Hawkish
+Hawkish
+Healthy
+Hefty
+Hobbling
+Hyper
+Imposing
+Inscrutable
+Jaded
+Lax
+Lean
+Limp
+Lithe
+Lopsided
+Lovely
+Malnourished
+Mangled
+Mangled
+Masculine
+Messy
+Muscular
+Nimble
+Pathetic
+Peppy
+Petite
+Pompous
+Pugnacious
+Quievering
+Radical
+Repulsive
+Robust
+Roguish
+Rough
+Scarred
+Scrawny
+Sculpted
+Shifty
+Shrewd
+Sickly
+Skittish
+Sleek
+Sleepy
+Slender
+Slimy
+Slovenly
+Sluggish
+Sly
+Smooth
+Sniveling
+Soulrendered
+Spacy
+Stiff
+Stony
+Stout
+Strapping
+Sturdy
+Stylish
+Swarthy
+Tense
+Tubular
+Unattractive
+Unblemished
+Unhealthy
+Unremarkable
+Unsightly
+Verbose
+Vigorous
+Waifish
+Wilted
+Wily
+Withered
+Worn-Out
+Wrinkly
+Zealous
+Zesty
diff --git a/strings/ship_names.json b/strings/ship_names.json
index 53f56af55559..3ba64b050a09 100644
--- a/strings/ship_names.json
+++ b/strings/ship_names.json
@@ -1237,5 +1237,32 @@
"Wagner's Will",
"Weaver",
"Xenobane"
+ ],
+
+ "PGF": [
+ "Life and Liberty",
+ "Democracy Manifest",
+ "Aggressive Diplomacy",
+ "Spaceward Expansion",
+ "Liberator",
+ "Legislative Dispatch",
+ "Unfettered",
+ "Carte Blanche",
+ "We Built This Yesterday",
+ "Zohil Wept",
+ "Paves-Great-Roads",
+ "Flowers of Liberty",
+ "Hearts and Minds",
+ "Lightspeed Brigade",
+ "Funding for Democracy",
+ "Full-Tilt",
+ "Federal Judgement",
+ "Spear of Lihmona",
+ "Ethorbor Fire",
+ "Green Wings",
+ "Gezenan Coast",
+ "Deep Strike",
+ "Ethereal Serpent",
+ "Shock Action"
]
}
diff --git a/tgui/packages/tgui-panel/chat/constants.js b/tgui/packages/tgui-panel/chat/constants.js
index e2db02bfde3d..94ce7aa51cf3 100644
--- a/tgui/packages/tgui-panel/chat/constants.js
+++ b/tgui/packages/tgui-panel/chat/constants.js
@@ -61,7 +61,7 @@ export const MESSAGE_TYPES = [
name: 'Radio',
description: 'All departments of radio messages',
selector:
- '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .pirradio, .clipradio, .irmgradio, .ntradio, .radio, .deptradio, .binarysay, .newscaster, .resonate',
+ '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .pirradio, .clipradio, .irmgradio, .pgfradio, .ntradio, .radio, .deptradio, .binarysay, .newscaster, .resonate',
},
{
type: MESSAGE_TYPE_INFO,
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
index 4ce7f6fcbef5..8e734f25da41 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
@@ -362,6 +362,10 @@ em {
color: #2681a5;
}
+.pgfradio {
+ color: #199943;
+}
+
.solgovradio {
color: #7589af;
}
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
index e200bd425569..ae52ba0bfd88 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
@@ -374,6 +374,10 @@ em {
color: #885231;
}
+.pgfradio {
+ color: #127a35;
+}
+
.syndradio {
color: #612425;
}
diff --git a/tgui/packages/tgui/interfaces/BankMachine.js b/tgui/packages/tgui/interfaces/BankMachine.js
index 21087ed7c904..8c7732dea095 100644
--- a/tgui/packages/tgui/interfaces/BankMachine.js
+++ b/tgui/packages/tgui/interfaces/BankMachine.js
@@ -4,11 +4,11 @@ import { Window } from '../layouts';
export const BankMachine = (props, context) => {
const { act, data } = useBackend(context);
- const { current_balance, siphoning, station_name } = data;
+ const { current_balance, siphoning, ship_name } = data;
return (
-
+ {
beakerContents={data.beakerContents}
/>
-
+ {
+ const { act, data } = useBackend(context);
+ const { names = [] } = data;
+
+ const [lastNameBeforeEdit, setLastNameBeforeEdit] = useLocalState<
+ string | null
+ >(context, 'lastNameBeforeEdit', null);
+
+ return (
+
+
+ {(!names.length && {'No known names!'}) || (
+
+ {names.map((name) => (
+
+
+
+
+
+
+ ))}
+
+ )}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/MedicalKiosk.js b/tgui/packages/tgui/interfaces/MedicalKiosk.js
index 2481444c5d2d..930177e2a111 100644
--- a/tgui/packages/tgui/interfaces/MedicalKiosk.js
+++ b/tgui/packages/tgui/interfaces/MedicalKiosk.js
@@ -108,12 +108,12 @@ const MedicalKioskScanButton = (props, context) => {
const MedicalKioskInstructions = (props, context) => {
const { act, data } = useBackend(context);
- const { kiosk_cost, patient_name } = data;
+ const { patient_name } = data;
return (
Greetings Valued Employee! Please select a desired automatic health
- check procedure. Diagnosis costs {kiosk_cost} credits.
+ check procedure.
diff --git a/tgui/packages/tgui/interfaces/Secrets.js b/tgui/packages/tgui/interfaces/Secrets.js
index b9a3da5dcbc9..51bb3bb39c09 100644
--- a/tgui/packages/tgui/interfaces/Secrets.js
+++ b/tgui/packages/tgui/interfaces/Secrets.js
@@ -375,33 +375,6 @@ const FunTab = (props, context) => {
/>
-
-
-
-
-
- {
@@ -11,7 +12,7 @@ export const TurbineComputer = (props, context) => {
!data.turbine_broke
);
return (
-
+ {
{data.temp} K
+
+ {formatSiUnit(data.pressure * 1000, 1, 'Pa')}
+
{data.power}
diff --git a/tgui/yarn.lock b/tgui/yarn.lock
index c71f2a55d264..17de1b885e24 100644
--- a/tgui/yarn.lock
+++ b/tgui/yarn.lock
@@ -6586,6 +6586,13 @@ __metadata:
languageName: node
linkType: hard
+"minipass@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "minipass@npm:5.0.0"
+ checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea
+ languageName: node
+ linkType: hard
+
"minizlib@npm:^2.0.0, minizlib@npm:^2.1.1":
version: 2.1.2
resolution: "minizlib@npm:2.1.2"
@@ -8474,16 +8481,16 @@ resolve@^2.0.0-next.3:
linkType: hard
"tar@npm:^6.0.2, tar@npm:^6.1.0":
- version: 6.1.11
- resolution: "tar@npm:6.1.11"
+ version: 6.2.1
+ resolution: "tar@npm:6.2.1"
dependencies:
chownr: ^2.0.0
fs-minipass: ^2.0.0
- minipass: ^3.0.0
+ minipass: ^5.0.0
minizlib: ^2.1.1
mkdirp: ^1.0.3
yallist: ^4.0.0
- checksum: a04c07bb9e2d8f46776517d4618f2406fb977a74d914ad98b264fc3db0fe8224da5bec11e5f8902c5b9bcb8ace22d95fbe3c7b36b8593b7dfc8391a25898f32f
+ checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c
languageName: node
linkType: hard
diff --git a/tools/UpdatePaths/Scripts/2776_cultbegone.txt b/tools/UpdatePaths/Scripts/2776_cultbegone.txt
new file mode 100644
index 000000000000..f2297a7003e7
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/2776_cultbegone.txt
@@ -0,0 +1,56 @@
+/turf/open/floor/engine/cult : /turf/open/floor/engine
+/turf/open/floor/engine/cult/airless : /turf/open/floor/engine/airless
+/turf/open/floor/plasteel/cult : /turf/open/floor/plasteel
+/turf/open/floor/plasteel/cult/airless : /turf/open/floor/plasteel/airless
+
+/turf/closed/wall/mineral/cult/artificer : /turf/open/floor/plating
+/turf/closed/wall/mineral/cult : /turf/open/floor/plating
+/obj/structure/girder/cult : /obj/structure/girder
+
+/obj/item/stack/sheet/runed_metal : /obj/item/stack/sheet/metal
+/obj/item/stack/sheet/runed_metal/fifty : /obj/item/stack/sheet/metal/fifty
+/obj/item/stack/sheet/runed_metal/five : /obj/item/stack/sheet/metal/five
+/obj/item/stack/sheet/runed_metal/ten : /obj/item/stack/sheet/metal/ten
+
+/obj/structure/destructible/cult/pylon : @DELETE
+/obj/structure/destructible/cult/forge : @DELETE
+/obj/structure/destructible/cult/talisman : @DELETE
+/obj/structure/destructible/cult/tome : @DELETE
+
+/obj/structure/trap/chill : @DELETE
+/obj/structure/trap/cult : @DELETE
+/obj/structure/trap/damage : @DELETE
+/obj/structure/trap/fire : @DELETE
+/obj/structure/trap/stun : @DELETE
+/obj/structure/trap/ward : @DELETE
+
+/obj/item/clothing/suit/hooded/cultrobes : /obj/item/clothing/suit/hooded/chaplain_hoodie
+/obj/item/clothing/suit/hooded/cultrobes/alt : /obj/item/clothing/suit/hooded/chaplain_hoodie
+/obj/item/clothing/suit/hooded/cultrobes/alt/ghost : /obj/item/clothing/suit/hooded/chaplain_hoodie
+/obj/item/clothing/suit/hooded/cultrobes/berserker : /obj/item/clothing/suit/hooded/chaplain_hoodie
+/obj/item/clothing/suit/hooded/cultrobes/cult_shield : /obj/item/clothing/suit/hooded/chaplain_hoodie
+
+/obj/item/toy/plush/narplush : /obj/item/toy/plush/lizardplushie
+/obj/item/bedsheet/cult : /obj/item/bedsheet/dorms
+/obj/item/melee/cultblade : /obj/item/claymore/weak
+/obj/item/melee/cultblade/dagger : /obj/item/kitchen/knife/combat
+/obj/item/melee/cultblade/ghost : /obj/item/kitchen/knife/combat
+/obj/item/toy/toy_dagger : /obj/item/kitchen/knife
+/obj/item/kitchen/knife/bloodletter : /obj/item/kitchen/knife/combat
+/obj/item/kitchen/ritual : /obj/item/kitchen/knife/combat
+/obj/item/restraints/legcuffs/bola/cult : /obj/item/restraints/legcuffs/bola
+
+/obj/effect/rune : @DELETE
+/obj/effect/rune/apocalypse : @DELETE
+/obj/effect/rune/blood_boil : @DELETE
+/obj/effect/rune/convert : @DELETE
+/obj/effect/rune/empower : @DELETE
+/obj/effect/rune/malformed : @DELETE
+/obj/effect/rune/manifest : @DELETE
+/obj/effect/rune/narsie : @DELETE
+/obj/effect/rune/raise_dead : @DELETE
+/obj/effect/rune/summon : @DELETE
+/obj/effect/rune/teleport : @DELETE
+/obj/effect/rune/wall : @DELETE
+
+/mob/living/simple_animal/pet/dog/corgi/narsie : /mob/living/simple_animal/pet/dog/corgi
diff --git a/tools/UpdatePaths/Scripts/2883_wall_lockers.txt b/tools/UpdatePaths/Scripts/2883_wall_lockers.txt
new file mode 100644
index 000000000000..403deb69f119
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/2883_wall_lockers.txt
@@ -0,0 +1,71 @@
+/obj/structure/closet/wall {dir=@UNSET} : /obj/structure/closet/wall/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall {dir=1} : /obj/structure/closet/wall/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall {dir=2} : /obj/structure/closet/wall/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall {dir=4} : /obj/structure/closet/wall/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall {dir=8} : /obj/structure/closet/wall/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/closet/wall/blue {dir=@UNSET} : /obj/structure/closet/wall/blue/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/blue {dir=1} : /obj/structure/closet/wall/blue/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/blue {dir=2} : /obj/structure/closet/wall/blue/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/blue {dir=4} : /obj/structure/closet/wall/blue/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/blue {dir=8} : /obj/structure/closet/wall/blue/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/closet/wall/chem {dir=@UNSET} : /obj/structure/closet/wall/chem/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/chem {dir=1} : /obj/structure/closet/wall/chem/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/chem {dir=2} : /obj/structure/closet/wall/chem/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/chem {dir=4} : /obj/structure/closet/wall/chem/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/chem {dir=8} : /obj/structure/closet/wall/chem/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/closet/wall/med {dir=@UNSET} : /obj/structure/closet/wall/med/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/med {dir=1} : /obj/structure/closet/wall/med/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/med {dir=2} : /obj/structure/closet/wall/med/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/med {dir=4} : /obj/structure/closet/wall/med/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/med {dir=8} : /obj/structure/closet/wall/med/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/closet/wall/orange {dir=@UNSET} : /obj/structure/closet/wall/orange/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/orange {dir=1} : /obj/structure/closet/wall/orange/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/orange {dir=2} : /obj/structure/closet/wall/orange/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/orange {dir=4} : /obj/structure/closet/wall/orange/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/orange {dir=8} : /obj/structure/closet/wall/orange/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/closet/wall/red {dir=@UNSET} : /obj/structure/closet/wall/red/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/red {dir=1} : /obj/structure/closet/wall/red/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/red {dir=2} : /obj/structure/closet/wall/red/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/red {dir=4} : /obj/structure/closet/wall/red/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/red {dir=8} : /obj/structure/closet/wall/red/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/closet/wall/white {dir=@UNSET} : /obj/structure/closet/wall/white/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/white {dir=1} : /obj/structure/closet/wall/white/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/white {dir=2} : /obj/structure/closet/wall/white/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/white {dir=4} : /obj/structure/closet/wall/white/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/wall/white {dir=8} : /obj/structure/closet/wall/white/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/closet/emcloset/wall {dir=@UNSET} : /obj/structure/closet/emcloset/wall/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/emcloset/wall {dir=1} : /obj/structure/closet/emcloset/wall/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/emcloset/wall {dir=2} : /obj/structure/closet/emcloset/wall/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/emcloset/wall {dir=4} : /obj/structure/closet/emcloset/wall/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/emcloset/wall {dir=8} : /obj/structure/closet/emcloset/wall/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/closet/firecloset/wall {dir=@UNSET} : /obj/structure/closet/firecloset/wall/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/firecloset/wall {dir=1} : /obj/structure/closet/firecloset/wall/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/firecloset/wall {dir=2} : /obj/structure/closet/firecloset/wall/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/firecloset/wall {dir=4} : /obj/structure/closet/firecloset/wall/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/firecloset/wall {dir=8} : /obj/structure/closet/firecloset/wall/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/closet/secure_closet/wall {dir=@UNSET} : /obj/structure/closet/secure_closet/wall/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/wall {dir=1} : /obj/structure/closet/secure_closet/wall/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/wall {dir=2} : /obj/structure/closet/secure_closet/wall/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/wall {dir=4} : /obj/structure/closet/secure_closet/wall/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/wall {dir=8} : /obj/structure/closet/secure_closet/wall/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/closet/secure_closet/brig/wall {dir=@UNSET} : /obj/structure/closet/secure_closet/brig/wall/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/brig/wall {dir=1} : /obj/structure/closet/secure_closet/brig/wall/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/brig/wall {dir=2} : /obj/structure/closet/secure_closet/brig/wall/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/brig/wall {dir=4} : /obj/structure/closet/secure_closet/brig/wall/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/brig/wall {dir=8} : /obj/structure/closet/secure_closet/brig/wall/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/closet/secure_closet/freezer/wall {dir=@UNSET} : /obj/structure/closet/secure_closet/freezer/wall/directional/north {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/freezer/wall {dir=1} : /obj/structure/closet/secure_closet/freezer/wall/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/freezer/wall {dir=2} : /obj/structure/closet/secure_closet/freezer/wall/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/freezer/wall {dir=4} : /obj/structure/closet/secure_closet/freezer/wall/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/closet/secure_closet/freezer/wall {dir=8} : /obj/structure/closet/secure_closet/freezer/wall/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
\ No newline at end of file
diff --git a/tools/UpdatePaths/Scripts/2908_sofas_and_chairs.txt b/tools/UpdatePaths/Scripts/2908_sofas_and_chairs.txt
new file mode 100644
index 000000000000..8d6d588698e6
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/2908_sofas_and_chairs.txt
@@ -0,0 +1,49 @@
+/obj/structure/chair/sofa {dir=@UNSET} : /obj/structure/chair/sofa/brown/directional/south {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa {dir=1} : /obj/structure/chair/sofa/brown/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa {dir=2} : /obj/structure/chair/sofa/brown/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa {dir=4} : /obj/structure/chair/sofa/brown/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa {dir=8} : /obj/structure/chair/sofa/brown/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/chair/sofa/left {dir=@UNSET} : /obj/structure/chair/sofa/brown/left/directional/south {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/left {dir=1} : /obj/structure/chair/sofa/brown/left/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/left {dir=2} : /obj/structure/chair/sofa/brown/left/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/left {dir=4} : /obj/structure/chair/sofa/brown/left/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/left {dir=8} : /obj/structure/chair/sofa/brown/left/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/chair/sofa/right {dir=@UNSET} : /obj/structure/chair/sofa/brown/right/directional/south {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/right {dir=1} : /obj/structure/chair/sofa/brown/right/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/right {dir=2} : /obj/structure/chair/sofa/brown/right/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/right {dir=4} : /obj/structure/chair/sofa/brown/right/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/right {dir=8} : /obj/structure/chair/sofa/brown/right/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/chair/sofa/corner {dir=@UNSET} : /obj/structure/chair/sofa/brown/corner/directional/south {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/corner {dir=1} : /obj/structure/chair/sofa/brown/corner/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/corner {dir=2} : /obj/structure/chair/sofa/brown/corner/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/corner {dir=4} : /obj/structure/chair/sofa/brown/corner/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/corner {dir=8} : /obj/structure/chair/sofa/brown/corner/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/chair/sofa/internal_corner {dir=@UNSET} : /obj/structure/chair/sofa/brown/internal_corner/directional/south {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/internal_corner {dir=1} : /obj/structure/chair/sofa/brown/internal_corner/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/internal_corner {dir=2} : /obj/structure/chair/sofa/brown/internal_corner/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/internal_corner {dir=4} : /obj/structure/chair/sofa/brown/internal_corner/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/sofa/internal_corner {dir=8} : /obj/structure/chair/sofa/brown/internal_corner/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/chair/comfy/black {dir=@UNSET} : /obj/structure/chair/comfy/grey/directional/south {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/black {dir=1} : /obj/structure/chair/comfy/grey/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/black {dir=2} : /obj/structure/chair/comfy/grey/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/black {dir=4} : /obj/structure/chair/comfy/grey/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/black {dir=8} : /obj/structure/chair/comfy/grey/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/chair/comfy/teal {dir=@UNSET} : /obj/structure/chair/comfy/blue/directional/south {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/teal {dir=1} : /obj/structure/chair/comfy/blue/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/teal {dir=2} : /obj/structure/chair/comfy/blue/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/teal {dir=4} : /obj/structure/chair/comfy/blue/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/teal {dir=8} : /obj/structure/chair/comfy/blue/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/chair/comfy/brown {dir=@UNSET} : /obj/structure/chair/comfy/orange/directional/south {@OLD;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/brown {dir=1} : /obj/structure/chair/comfy/orange/directional/north {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/brown {dir=2} : /obj/structure/chair/comfy/orange/directional/south {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/brown {dir=4} : /obj/structure/chair/comfy/orange/directional/east {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+/obj/structure/chair/comfy/brown {dir=8} : /obj/structure/chair/comfy/orange/directional/west {@OLD;dir=@SKIP;pixel_x=@SKIP;pixel_y=@SKIP}
+
+/obj/structure/chair/comfy/lime : /obj/structure/chair/comfy/orange/directional/south
\ No newline at end of file
diff --git a/tools/UpdatePaths/Scripts/2972_human_hostile.txt b/tools/UpdatePaths/Scripts/2972_human_hostile.txt
new file mode 100644
index 000000000000..297ba2df7bb9
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/2972_human_hostile.txt
@@ -0,0 +1,7 @@
+/mob/living/simple_animal/hostile/pirate/@SUBTYPES: /mob/living/simple_animal/hostile/human/pirate/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/frontier/@SUBTYPES: /mob/living/simple_animal/hostile/human/frontier/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/nanotrasen/@SUBTYPES: /mob/living/simple_animal/hostile/human/nanotrasen/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/skeleton/@SUBTYPES: /mob/living/simple_animal/hostile/human/skeleton/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/asteroid/whitesands/@SUBTYPES: /mob/living/simple_animal/hostile/human/hermit/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/cat_butcherer/@SUBTYPES: /mob/living/simple_animal/hostile/human/cat_butcherer/@SUBTYPES {@OLD}
+/mob/living/simple_animal/hostile/syndicate/@SUBTYPES:: /mob/living/simple_animal/hostile/human/syndicate/@SUBTYPES {@OLD}