diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm
index c9c5afdb73..fd40815957 100644
--- a/_maps/map_files/Snaxi/Snaxi.dmm
+++ b/_maps/map_files/Snaxi/Snaxi.dmm
@@ -1640,8 +1640,8 @@
"aiS" = (
/obj/structure/closet/secure_closet/CMO,
/obj/machinery/keycard_auth{
- pixel_y = 4;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -3147,8 +3147,8 @@
dir = 4
},
/obj/machinery/conveyor{
- id = "packageSort2";
- dir = 1
+ dir = 1;
+ id = "packageSort2"
},
/obj/machinery/disposal/deliveryChute,
/obj/structure/window/reinforced{
@@ -4061,9 +4061,9 @@
/area/crew_quarters/dorms)
"aNS" = (
/obj/machinery/turnstile{
+ dir = 4;
name = "Genpop Entrance Turnstile";
- req_access_txt = "69";
- dir = 4
+ req_access_txt = "69"
},
/obj/machinery/door/poddoor/preopen{
id = "permacell1";
@@ -4554,9 +4554,9 @@
/area/maintenance/solars/port/fore)
"bcc" = (
/obj/machinery/door/window/brigdoor/security/cell{
+ dir = 1;
id = "Cell 2";
- name = "Cell 2";
- dir = 1
+ name = "Cell 2"
},
/obj/effect/turf_decal/vg_decals/numbers/two,
/obj/machinery/door/poddoor/preopen{
@@ -5031,9 +5031,9 @@
"brE" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/machinery/door/window/southleft{
+ dir = 1;
name = "Court Cell";
- req_access_txt = "2";
- dir = 1
+ req_access_txt = "2"
},
/obj/structure/window/reinforced{
dir = 8
@@ -5284,9 +5284,9 @@
dir = 1
},
/obj/machinery/turnstile{
+ dir = 4;
name = "Genpop Entrance Turnstile";
- req_access_txt = "69";
- dir = 4
+ req_access_txt = "69"
},
/turf/open/floor/plasteel/dark,
/area/security/brig)
@@ -7072,9 +7072,9 @@
dir = 4
},
/obj/machinery/door/window/brigdoor{
+ dir = 1;
name = "Reception Desk";
- req_access_txt = "63";
- dir = 1
+ req_access_txt = "63"
},
/obj/machinery/door/window/brigdoor{
dir = 8;
@@ -7475,8 +7475,8 @@
},
/obj/structure/table/wood,
/obj/machinery/recharger{
- pixel_y = 4;
- pixel_x = -7
+ pixel_x = -7;
+ pixel_y = 4
},
/obj/item/book/manual/wiki/security_space_law{
pixel_x = 6;
@@ -9296,8 +9296,8 @@
},
/obj/machinery/camera{
c_tag = "Medbay West";
- network = list("ss13","medbay");
- dir = 4
+ dir = 4;
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
@@ -9414,9 +9414,9 @@
req_access_txt = "10"
},
/obj/machinery/door/window/northright{
+ dir = 4;
name = "Engineering Delivery";
- req_access_txt = "10";
- dir = 4
+ req_access_txt = "10"
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel/dark,
@@ -10387,8 +10387,8 @@
dir = 4
},
/obj/machinery/shower{
- pixel_y = 20;
- pixel_x = 11
+ pixel_x = 11;
+ pixel_y = 20
},
/obj/structure/disposalpipe/segment{
dir = 4
@@ -10758,8 +10758,8 @@
/obj/structure/table/wood,
/obj/item/book/manual/wiki/security_space_law,
/obj/item/flashlight/lamp/green{
- pixel_y = 1;
- pixel_x = -7
+ pixel_x = -7;
+ pixel_y = 1
},
/turf/open/floor/wood,
/area/security/courtroom)
@@ -11205,9 +11205,9 @@
dir = 4
},
/obj/machinery/turnstile{
+ dir = 8;
name = "Genpop Exit Turnstile";
- req_access_txt = "70";
- dir = 8
+ req_access_txt = "70"
},
/turf/open/floor/plasteel/dark,
/area/security/brig)
@@ -12171,8 +12171,8 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/button/flasher{
id = "PCell 1";
- pixel_y = 9;
- pixel_x = -37
+ pixel_x = -37;
+ pixel_y = 9
},
/turf/open/floor/plasteel/dark,
/area/security/brig)
@@ -12354,9 +12354,9 @@
dir = 4
},
/obj/machinery/turnstile{
+ dir = 8;
name = "Genpop Exit Turnstile";
- req_access_txt = "70";
- dir = 8
+ req_access_txt = "70"
},
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -13508,9 +13508,9 @@
icon_state = "1-4"
},
/obj/machinery/door/window/brigdoor/security/cell{
+ dir = 8;
id = "Cell 1";
- name = "Cell 1";
- dir = 8
+ name = "Cell 1"
},
/obj/effect/turf_decal/vg_decals/numbers/one,
/obj/machinery/door/poddoor/preopen{
@@ -14343,8 +14343,8 @@
name = "Door Bolt Control";
normaldoorcontrol = 1;
pixel_x = 24;
- specialfunctions = 4;
- pixel_y = -5
+ pixel_y = -5;
+ specialfunctions = 4
},
/obj/machinery/light/small{
dir = 8
@@ -14834,8 +14834,8 @@
/obj/structure/table/wood,
/obj/item/book/manual/wiki/security_space_law,
/obj/item/flashlight/lamp/green{
- pixel_y = 1;
- pixel_x = -7
+ pixel_x = -7;
+ pixel_y = 1
},
/turf/open/floor/wood,
/area/security/courtroom)
@@ -15536,9 +15536,9 @@
/obj/machinery/button/door{
id = "Secure Gate";
name = "Cell Shutters";
+ pixel_x = 3;
pixel_y = 24;
- req_access_txt = "2";
- pixel_x = 3
+ req_access_txt = "2"
},
/turf/open/floor/plasteel/dark,
/area/security/brig)
@@ -16833,9 +16833,9 @@
/obj/machinery/button/door{
id = "kitchen";
name = "Kitchen Shutters Control";
- req_access_txt = "28";
pixel_x = 24;
- pixel_y = -4
+ pixel_y = -4;
+ req_access_txt = "28"
},
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
@@ -17094,8 +17094,8 @@
dir = 8
},
/obj/machinery/computer/monitor{
- name = "bridge power monitoring console";
- dir = 1
+ dir = 1;
+ name = "bridge power monitoring console"
},
/obj/structure/cable{
icon_state = "0-2"
@@ -17233,8 +17233,8 @@
/obj/item/folder/blue,
/obj/item/stamp/law,
/obj/item/flashlight/lamp/green{
- pixel_y = 1;
- pixel_x = -7
+ pixel_x = -7;
+ pixel_y = 1
},
/turf/open/floor/plasteel/cult,
/area/lawoffice)
@@ -18424,9 +18424,9 @@
/area/engine/engineering)
"hVH" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
+ dir = 1;
external_pressure_bound = 120;
- name = "killroom vent";
- dir = 1
+ name = "killroom vent"
},
/turf/open/floor/circuit/telecomms,
/area/science/xenobiology)
@@ -18464,8 +18464,8 @@
},
/obj/machinery/camera{
c_tag = "Surgery Observation";
- network = list("ss13","medbay");
- dir = 8
+ dir = 8;
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/dark,
/area/medical/surgery)
@@ -18614,8 +18614,8 @@
/area/security/main)
"iam" = (
/obj/machinery/computer/slot_machine{
- pixel_y = 2;
- pixel_x = -7
+ pixel_x = -7;
+ pixel_y = 2
},
/turf/open/floor/wood,
/area/maintenance/bar)
@@ -19809,8 +19809,8 @@
/obj/machinery/button/door{
id = "hos";
name = "HoS Office Shutters";
- pixel_y = -26;
- pixel_x = -6
+ pixel_x = -6;
+ pixel_y = -26
},
/turf/open/floor/carpet,
/area/crew_quarters/heads/hos)
@@ -21385,8 +21385,8 @@
pixel_y = -22
},
/obj/machinery/button/door/incinerator_vent_toxmix{
- pixel_y = -22;
- pixel_x = 9
+ pixel_x = 9;
+ pixel_y = -22
},
/obj/machinery/meter,
/turf/open/floor/plasteel/white,
@@ -24583,8 +24583,8 @@
"lMF" = (
/obj/machinery/camera{
c_tag = "Virology Module";
- network = list("ss13","medbay");
- dir = 1
+ dir = 1;
+ network = list("ss13","medbay")
},
/obj/structure/disposalpipe/segment{
dir = 4
@@ -26018,8 +26018,8 @@
/obj/machinery/button/door{
id = "engsm";
name = "Radiation Shutters Control";
- req_access_txt = "10";
- pixel_y = 25
+ pixel_y = 25;
+ req_access_txt = "10"
},
/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
/obj/effect/turf_decal/stripes/line{
@@ -26165,9 +26165,9 @@
dir = 4
},
/obj/machinery/turnstile{
+ dir = 8;
name = "Genpop Exit Turnstile";
- req_access_txt = "70";
- dir = 8
+ req_access_txt = "70"
},
/obj/structure/cable{
icon_state = "4-8"
@@ -27622,8 +27622,8 @@
/area/bridge)
"nFM" = (
/obj/machinery/atmospherics/components/binary/pump{
- name = "Port Mix to Engine";
- dir = 1
+ dir = 1;
+ name = "Port Mix to Engine"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -27744,9 +27744,9 @@
"nJI" = (
/obj/structure/table/reinforced,
/obj/machinery/door/window/southleft{
+ dir = 4;
name = "Reception Desk";
- req_access_txt = "63";
- dir = 4
+ req_access_txt = "63"
},
/obj/structure/cable{
icon_state = "1-2"
@@ -30851,10 +30851,10 @@
/area/ai_monitored/security/armory)
"pvY" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1;
external_pressure_bound = 140;
name = "killroom vent";
- pressure_checks = 0;
- dir = 1
+ pressure_checks = 0
},
/turf/open/floor/circuit/telecomms,
/area/science/xenobiology)
@@ -31391,9 +31391,9 @@
dir = 4
},
/obj/machinery/turnstile{
+ dir = 8;
name = "Genpop Exit Turnstile";
- req_access_txt = "70";
- dir = 8
+ req_access_txt = "70"
},
/obj/machinery/door/firedoor/border_only{
dir = 8;
@@ -32571,8 +32571,8 @@
},
/obj/machinery/button/ignition{
id = "testigniter";
- pixel_y = -30;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = -30
},
/obj/structure/disposalpipe/trunk{
dir = 1
@@ -32756,9 +32756,9 @@
/area/maintenance/bar)
"qEz" = (
/obj/machinery/door/window/brigdoor/security/cell{
+ dir = 1;
id = "Cell 3";
- name = "Cell 3";
- dir = 1
+ name = "Cell 3"
},
/obj/effect/turf_decal/vg_decals/numbers/three,
/obj/machinery/door/poddoor/preopen{
@@ -33690,8 +33690,8 @@
"rgQ" = (
/obj/machinery/camera{
c_tag = "Xenobiology Test Chamber";
- network = list("xeno","rd");
- dir = 4
+ dir = 4;
+ network = list("xeno","rd")
},
/turf/open/floor/engine,
/area/science/xenobiology)
@@ -34457,8 +34457,8 @@
},
/obj/machinery/camera{
c_tag = "AI Chamber - Core";
- network = list("aicore");
- dir = 4
+ dir = 4;
+ network = list("aicore")
},
/turf/open/floor/circuit/off,
/area/ai_monitored/turret_protected/ai)
@@ -34548,9 +34548,9 @@
dir = 4
},
/obj/machinery/turnstile{
+ dir = 8;
name = "Genpop Exit Turnstile";
- req_access_txt = "70";
- dir = 8
+ req_access_txt = "70"
},
/obj/machinery/door/firedoor/border_only{
dir = 4;
@@ -37776,8 +37776,8 @@
},
/obj/machinery/camera{
c_tag = "Genetics Research";
- network = list("ss13","medbay");
- dir = 8
+ dir = 8;
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/white,
/area/medical/genetics)
@@ -37938,9 +37938,9 @@
/obj/machinery/button/door{
id = "Secure Brig Control";
name = "Brig Control Shutters";
+ pixel_x = -6;
pixel_y = -3;
- req_access_txt = "2";
- pixel_x = -6
+ req_access_txt = "2"
},
/turf/open/floor/plasteel/dark,
/area/security/warden)
@@ -39020,8 +39020,8 @@
"uuY" = (
/obj/machinery/camera{
c_tag = "Toxins Lab West";
- network = list("ss13","rd");
- dir = 4
+ dir = 4;
+ network = list("ss13","rd")
},
/obj/structure/table/reinforced,
/obj/item/assembly/prox_sensor{
@@ -39412,9 +39412,9 @@
pixel_y = 23
},
/obj/machinery/door/window/southright{
+ dir = 8;
name = "Bar Door";
- req_one_access_txt = "25;28";
- dir = 8
+ req_one_access_txt = "25;28"
},
/obj/machinery/door/firedoor/border_only{
dir = 8;
@@ -39566,8 +39566,8 @@
dir = 4
},
/obj/machinery/computer/security/telescreen/prison{
- pixel_x = 29;
- dir = 8
+ dir = 8;
+ pixel_x = 29
},
/turf/open/floor/plasteel/cult,
/area/lawoffice)
@@ -39974,8 +39974,8 @@
dir = 8
},
/obj/structure/chair{
- name = "Judge";
- dir = 4
+ dir = 4;
+ name = "Judge"
},
/turf/open/floor/wood,
/area/security/courtroom)
@@ -40689,8 +40689,8 @@
},
/obj/machinery/button/ignition{
id = "Incinerator";
- pixel_y = 35;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 35
},
/turf/open/floor/plasteel,
/area/engine/atmospherics_engine)
@@ -42597,8 +42597,8 @@
"wtt" = (
/obj/structure/table/wood,
/obj/item/flashlight/lamp/green{
- pixel_y = 13;
- pixel_x = -7
+ pixel_x = -7;
+ pixel_y = 13
},
/obj/item/camera/detective,
/obj/item/hand_labeler{
@@ -42606,8 +42606,8 @@
},
/obj/item/storage/briefcase,
/obj/item/storage/secure/safe{
- pixel_y = 36;
- pixel_x = 6
+ pixel_x = 6;
+ pixel_y = 36
},
/turf/open/floor/carpet,
/area/security/detectives_office)
@@ -44653,8 +44653,8 @@
areastring = "/area/engine/engineering";
dir = 8;
name = "Engineering APC";
- pixel_y = -1;
- pixel_x = -27
+ pixel_x = -27;
+ pixel_y = -1
},
/obj/machinery/firealarm{
dir = 1;
@@ -100077,11 +100077,11 @@ xUL
xUL
xUL
xUL
-xUL
-xUL
-xUL
rGc
jls
+rGc
+cly
+jls
odg
ucC
gUL
@@ -100333,12 +100333,12 @@ bum
bum
bum
bum
-bum
-bum
-bum
rGc
tdX
tdX
+tdX
+cly
+tdX
jPj
ucC
gUL
@@ -100590,12 +100590,12 @@ bum
bum
bum
bum
-bum
-bum
-bum
dQW
tdX
tdX
+tdX
+cly
+tdX
jls
ucC
gUL
@@ -100847,12 +100847,12 @@ bum
bum
bum
bum
-bum
-bum
-bum
rGc
tdX
tdX
+tdX
+cly
+tdX
jPj
ucC
cfs
@@ -101104,12 +101104,12 @@ bum
bum
bum
bum
-bum
-bum
-bum
dQW
tdX
tdX
+tdX
+cly
+tdX
jls
ucC
cfs
@@ -101361,11 +101361,11 @@ bum
bum
bum
bum
-bum
-bum
-bum
-xUL
+rGc
+jPj
dQW
+jPj
+rGc
flw
flw
lFN
@@ -101618,11 +101618,11 @@ bum
bum
bum
bum
-bum
-bum
-bum
-xUL
-xUL
+dQW
+cly
+cly
+cly
+jPj
dQW
jPj
bnU
@@ -101875,9 +101875,9 @@ bum
bum
bum
bum
-bum
-bum
-bum
+xUL
+xUL
+xUL
bDA
bYY
bYY
@@ -102132,9 +102132,9 @@ bum
bum
bum
bum
-bum
-bum
-bum
+xUL
+xUL
+xUL
gjW
xUL
xUL
@@ -102389,9 +102389,9 @@ bum
bum
bum
bum
-bum
-bum
-bum
+xUL
+xUL
+xUL
xUL
xUL
bum
@@ -102646,9 +102646,9 @@ bum
bum
bum
bum
-bum
-bum
-bum
+xUL
+xUL
+xUL
xUL
xUL
sTq
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index a25381f266..7c2ebc5f0c 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -231,4 +231,10 @@ GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitt
GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc))
-
+//locked parts are those that your picked species requires to have
+//unlocked parts are those that anyone can choose on customisation regardless
+//parts not in unlocked, but in all, are thus locked
+GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "body_markings" = "Body Markings", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns"))
+GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
+//parts in either of the above two lists that require a second option that allows them to be coloured
+GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color"))
diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm
index 0cb0547978..5ab844cef0 100644
--- a/code/datums/components/crafting/recipes/recipes_misc.dm
+++ b/code/datums/components/crafting/recipes/recipes_misc.dm
@@ -188,7 +188,7 @@
result = /obj/item/screwdriver/bronze
reqs = list(/obj/item/screwdriver = 1,
/obj/item/stack/cable_coil = 10,
- /obj/item/stack/tile/bronze = 1,
+ /obj/item/stack/sheet/bronze = 1,
/datum/reagent/water = 15)
time = 40
subcategory = CAT_TOOL
@@ -200,7 +200,7 @@
result = /obj/item/weldingtool/bronze
reqs = list(/obj/item/weldingtool = 1,
/obj/item/stack/cable_coil = 10,
- /obj/item/stack/tile/bronze = 1,
+ /obj/item/stack/sheet/bronze = 1,
/datum/reagent/water = 15)
time = 40
subcategory = CAT_TOOL
@@ -212,7 +212,7 @@
result = /obj/item/wirecutters/bronze
reqs = list(/obj/item/wirecutters = 1,
/obj/item/stack/cable_coil = 10,
- /obj/item/stack/tile/bronze = 1,
+ /obj/item/stack/sheet/bronze = 1,
/datum/reagent/water = 15)
time = 40
subcategory = CAT_TOOL
@@ -224,7 +224,7 @@
result = /obj/item/crowbar/bronze
reqs = list(/obj/item/crowbar = 1,
/obj/item/stack/cable_coil = 10,
- /obj/item/stack/tile/bronze = 1,
+ /obj/item/stack/sheet/bronze = 1,
/datum/reagent/water = 15)
time = 40
subcategory = CAT_TOOL
@@ -236,7 +236,7 @@
result = /obj/item/wrench/bronze
reqs = list(/obj/item/wrench = 1,
/obj/item/stack/cable_coil = 10,
- /obj/item/stack/tile/bronze = 1,
+ /obj/item/stack/sheet/bronze = 1,
/datum/reagent/water = 15)
time = 40
subcategory = CAT_TOOL
diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm
index 721af65449..1469965b57 100644
--- a/code/datums/materials/basemats.dm
+++ b/code/datums/materials/basemats.dm
@@ -287,7 +287,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
desc = "Clock Cult? Never heard of it."
color = "#92661A"
categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
- sheet_type = /obj/item/stack/tile/bronze
+ sheet_type = /obj/item/stack/sheet/bronze
value_per_unit = 0.025
armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5)
beauty_modifier = 0.2
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 530a287134..b34e97d374 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -310,6 +310,17 @@
opacity = 0
glass = TRUE
+/obj/machinery/door/airlock/bronze
+ name = "bronze airlock"
+ icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/clockwork/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_bronze
+
+/obj/machinery/door/airlock/bronze/seethru
+ assemblytype = /obj/structure/door_assembly/door_assembly_bronze/seethru
+ opacity = 0
+ glass = TRUE
+
//////////////////////////////////
/*
Station2 Airlocks
diff --git a/code/game/objects/effects/spawners/bundle.dm b/code/game/objects/effects/spawners/bundle.dm
index 3f2701c03f..b75df644eb 100644
--- a/code/game/objects/effects/spawners/bundle.dm
+++ b/code/game/objects/effects/spawners/bundle.dm
@@ -168,3 +168,26 @@
items = list(
/obj/item/clothing/mask/gas/sexymime,
/obj/item/clothing/under/rank/civilian/mime/sexy)
+
+/obj/effect/spawner/bundle/crate/Initialize(mapload)
+ if(items && items.len)
+ var/turf/T = get_turf(src)
+ var/obj/structure/closet/LC = locate(/obj/structure/closet) in T
+ if(LC)
+ for(var/path in items)
+ new path(LC)
+ return INITIALIZE_HINT_QDEL
+
+/obj/effect/spawner/bundle/crate/mosin
+ name = "Mosin-Nagant spawner"
+ items = list(
+ /obj/item/gun/ballistic/shotgun/boltaction,
+ /obj/item/ammo_box/a762
+ )
+
+/obj/effect/spawner/bundle/crate/surplusrifle
+ name = "surplus rifle spawner"
+ items = list(
+ /obj/item/gun/ballistic/automatic/surplus,
+ /obj/item/ammo_box/magazine/m10mm/rifle
+ )
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 7bc66e8deb..dd609753b4 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -675,6 +675,10 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
GLOBAL_LIST_INIT(bronze_recipes, list ( \
new/datum/stack_recipe("wall gear", /obj/structure/girder/bronze, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
null,
+ new/datum/stack_recipe("directional bronze window", /obj/structure/window/bronze/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
+ new/datum/stack_recipe("fulltile bronze window", /obj/structure/window/bronze/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
+ new/datum/stack_recipe("pinion airlock assembly", /obj/structure/door_assembly/door_assembly_bronze, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("bronze pinion airlock assembly", /obj/structure/door_assembly/door_assembly_bronze/seethru, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("bronze hat", /obj/item/clothing/head/bronze), \
new/datum/stack_recipe("bronze suit", /obj/item/clothing/suit/bronze), \
new/datum/stack_recipe("bronze boots", /obj/item/clothing/shoes/bronze), \
@@ -682,9 +686,10 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \
new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("bronze bar stool", /obj/structure/chair/stool/bar/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("bronze stool", /obj/structure/chair/stool/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
+ new /datum/stack_recipe("bronze floor tiles", /obj/item/stack/tile/bronze, 1, 4, 20), \
))
-/obj/item/stack/tile/bronze
+/obj/item/stack/sheet/bronze
name = "brass"
desc = "On closer inspection, what appears to be wholly-unsuitable-for-building brass is actually more structurally stable bronze."
singular_name = "bronze sheet"
@@ -693,27 +698,21 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \
icon = 'icons/obj/stack_objects.dmi'
custom_materials = list(/datum/material/bronze = MINERAL_MATERIAL_AMOUNT)
resistance_flags = FIRE_PROOF | ACID_PROOF
- throwforce = 10
- max_amount = 50
- throw_speed = 1
- throw_range = 3
- turf_type = /turf/open/floor/bronze
- novariants = FALSE
grind_results = list(/datum/reagent/iron = 5, /datum/reagent/copper = 3) //we have no "tin" reagent so this is the closest thing
- merge_type = /obj/item/stack/tile/bronze
+ merge_type = /obj/item/stack/sheet/bronze
tableVariant = /obj/structure/table/bronze
material_type = /datum/material/bronze
-/obj/item/stack/tile/bronze/attack_self(mob/living/user)
+/obj/item/stack/sheet/bronze/attack_self(mob/living/user)
if(is_servant_of_ratvar(user)) //still lets them build with it, just gives a message
to_chat(user, "Wha... what is this cheap imitation crap? This isn't brass at all!")
..()
-/obj/item/stack/tile/bronze/get_main_recipes()
+/obj/item/stack/sheet/bronze/get_main_recipes()
. = ..()
. += GLOB.bronze_recipes
-/obj/item/stack/tile/bronze/thirty
+/obj/item/stack/sheet/bronze/thirty
amount = 30
/*
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 13fca1e8fe..0d85e897d2 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -513,3 +513,12 @@
icon_state = "material_tile"
turf_type = /turf/open/floor/material
material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+
+/obj/item/stack/tile/bronze
+ name = "bronze tile"
+ singular_name = "bronze floor tile"
+ desc = "A tile made out of bronze. Looks like clockwork."
+ icon_state = "material_tile"
+ color = "#92661A"
+ turf_type = /turf/open/floor/bronze
+ custom_materials = list(/datum/material/bronze = 250)
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index ed0ee8ad07..a6b34c59e3 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -245,19 +245,20 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
new /obj/item/stack/cable_coil/white(src)
/obj/item/storage/toolbox/ammo
- name = "ammo box"
- desc = "It contains a few clips."
+ name = "ammunition case (7.62mm stripper clips)"
+ desc = "It contains a few 7.62 stripper clips."
icon_state = "ammobox"
item_state = "ammobox"
+ var/ammotype = /obj/item/ammo_box/a762 // make sure this is a typepath thanks
/obj/item/storage/toolbox/ammo/PopulateContents()
- new /obj/item/ammo_box/a762(src)
- new /obj/item/ammo_box/a762(src)
- new /obj/item/ammo_box/a762(src)
- new /obj/item/ammo_box/a762(src)
- new /obj/item/ammo_box/a762(src)
- new /obj/item/ammo_box/a762(src)
- new /obj/item/ammo_box/a762(src)
+ for (var/i = 0, i < 7, i++)
+ new ammotype(src)
+
+/obj/item/storage/toolbox/ammo/surplus
+ name = "ammunition case (10mm rifle magazines)"
+ desc = "It contains a few 10mm rifle magazines."
+ ammotype = /obj/item/ammo_box/magazine/m10mm/rifle
/obj/item/storage/toolbox/infiltrator
name = "insidious case"
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 1316f45530..39bef1a9c0 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -487,7 +487,7 @@
desc = "A bronze bar stool with red silk for a pillow."
icon_state = "barbrass"
item_chair = /obj/item/chair/stool/bar/bronze
- buildstacktype = /obj/item/stack/tile/bronze
+ buildstacktype = /obj/item/stack/sheet/bronze
buildstackamount = 1
/obj/structure/chair/stool/brass
@@ -503,7 +503,7 @@
desc = "A bronze stool with a silk top for comfort."
icon_state = "stoolbrass"
item_chair = /obj/item/chair/stool/bronze
- buildstacktype = /obj/item/stack/tile/bronze
+ buildstacktype = /obj/item/stack/sheet/bronze
buildstackamount = 1
/obj/item/chair/stool/brass
@@ -603,7 +603,7 @@
desc = "A spinny chair made of bronze. It has little cogs for wheels!"
anchored = FALSE
icon_state = "brass_chair"
- buildstacktype = /obj/item/stack/tile/bronze
+ buildstacktype = /obj/item/stack/sheet/bronze
buildstackamount = 1
item_chair = null
diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm
index fe9c4e7bbc..5fb454b5bc 100644
--- a/code/game/objects/structures/door_assembly_types.dm
+++ b/code/game/objects/structures/door_assembly_types.dm
@@ -240,3 +240,14 @@
airlock_type = /obj/machinery/door/airlock/wood
mineral = "wood"
glass_type = /obj/machinery/door/airlock/wood/glass
+
+/obj/structure/door_assembly/door_assembly_bronze
+ name = "bronze airlock assembly"
+ icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi'
+ base_name = "bronze airlock"
+ airlock_type = /obj/machinery/door/airlock/bronze
+ noglass = TRUE
+ material_type = /obj/item/stack/tile/bronze
+
+/obj/structure/door_assembly/door_assembly_bronze/seethru
+ airlock_type = /obj/machinery/door/airlock/bronze/seethru
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index ff62b9cc48..87cfbb56e0 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -442,19 +442,19 @@
to_chat(user, "You start slicing apart [src]...")
if(W.use_tool(src, user, 40, volume=50))
to_chat(user, "You slice apart [src].")
- var/obj/item/stack/tile/bronze/B = new(drop_location(), 2)
+ var/obj/item/stack/sheet/bronze/B = new(drop_location(), 2)
transfer_fingerprints_to(B)
qdel(src)
else if(istype(W, /obj/item/pickaxe/drill/jackhammer))
to_chat(user, "Your jackhammer smashes through the girder!")
- var/obj/item/stack/tile/bronze/B = new(drop_location(), 2)
+ var/obj/item/stack/sheet/bronze/B = new(drop_location(), 2)
transfer_fingerprints_to(B)
W.play_tool_sound(src)
qdel(src)
- else if(istype(W, /obj/item/stack/tile/bronze))
- var/obj/item/stack/tile/bronze/B = W
+ else if(istype(W, /obj/item/stack/sheet/bronze))
+ var/obj/item/stack/sheet/bronze/B = W
if(B.get_amount() < 2)
to_chat(user, "You need at least two bronze sheets to build a bronze wall!")
return 0
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index c9cc0d574c..6c7e01a63f 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -597,7 +597,7 @@
icon = 'icons/obj/smooth_structures/brass_table.dmi'
icon_state = "brass_table"
resistance_flags = FIRE_PROOF | ACID_PROOF
- buildstack = /obj/item/stack/tile/bronze
+ buildstack = /obj/item/stack/sheet/bronze
canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze)
/obj/structure/table/bronze/tablelimbsmash(mob/living/user, mob/living/pushed_mob)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 3373278c0c..74f006296f 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -875,3 +875,26 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
return
..()
update_icon()
+
+/obj/structure/window/bronze
+ name = "brass window"
+ desc = "A paper-thin pane of translucent yet reinforced brass. Nevermind, this is just weak bronze!"
+ icon = 'icons/obj/smooth_structures/clockwork_window.dmi'
+ icon_state = "clockwork_window_single"
+ glass_type = /obj/item/stack/tile/bronze
+
+/obj/structure/window/bronze/unanchored
+ anchored = FALSE
+
+/obj/structure/window/bronze/fulltile
+ icon_state = "clockwork_window"
+ canSmoothWith = null
+ smooth = SMOOTH_TRUE
+ fulltile = TRUE
+ flags_1 = PREVENT_CLICK_UNDER_1
+ dir = FULLTILE_WINDOW_DIR
+ max_integrity = 50
+ glass_amount = 2
+
+/obj/structure/window/bronze/fulltile/unanchored
+ anchored = FALSE
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index f6e70f8ef5..5075bb613e 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -259,7 +259,7 @@
desc = "Some heavy bronze tiles."
icon = 'icons/obj/clockwork_objects.dmi'
icon_state = "clockwork_floor"
- floor_tile = /obj/item/stack/tile/bronze
+ floor_tile = /obj/item/stack/sheet/bronze
/turf/open/floor/padded
name = "padded floor"
diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm
index d445be91cb..7938d9bf4d 100644
--- a/code/game/turfs/simulated/wall/misc_walls.dm
+++ b/code/game/turfs/simulated/wall/misc_walls.dm
@@ -199,6 +199,6 @@
desc = "A huge chunk of bronze, decorated like gears and cogs."
icon = 'icons/turf/walls/clockwork_wall.dmi'
icon_state = "clockwork_wall"
- sheet_type = /obj/item/stack/tile/bronze
+ sheet_type = /obj/item/stack/sheet/bronze
sheet_amount = 2
girder_type = /obj/structure/girder/bronze
diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm
index a562210164..b0676fbde2 100644
--- a/code/modules/cargo/exports/sheets.dm
+++ b/code/modules/cargo/exports/sheets.dm
@@ -138,11 +138,11 @@
message = "of bones"
export_types = list(/obj/item/stack/sheet/bone)
-/datum/export/stack/bronze
+/datum/export/stack/sheet/bronze
unit_name = "tiles"
cost = 5
message = "of brozne"
- export_types = list(/obj/item/stack/tile/bronze)
+ export_types = list(/obj/item/stack/sheet/bronze)
/datum/export/stack/brass
unit_name = "tiles"
diff --git a/code/modules/cargo/packs/armory.dm b/code/modules/cargo/packs/armory.dm
index 2ef0abb000..9f8bb2f25f 100644
--- a/code/modules/cargo/packs/armory.dm
+++ b/code/modules/cargo/packs/armory.dm
@@ -158,11 +158,10 @@
/datum/supply_pack/security/armory/russian
name = "Russian Surplus Crate"
- desc = "Hello Comrade, we have the most modern russian military equipment the black market can offer, for the right price of course. Sadly we couldnt remove the lock so it requires Armory access to open."
+ desc = "Hello Comrade, we have the most modern Russian military equipment the black market can offer, for the right price of course. Sadly we couldn't remove the lock so it requires Armory access to open."
cost = 7500
contraband = TRUE
contains = list(/obj/item/reagent_containers/food/snacks/rationpack,
- /obj/item/ammo_box/magazine/m10mm/rifle,
/obj/item/clothing/suit/armor/vest/russian,
/obj/item/clothing/head/helmet/rus_helmet,
/obj/item/clothing/shoes/russian,
@@ -172,7 +171,10 @@
/obj/item/clothing/mask/russian_balaclava,
/obj/item/clothing/head/helmet/rus_ushanka,
/obj/item/clothing/suit/armor/vest/russian_coat,
- /obj/item/gun/ballistic/automatic/surplus)
+ /obj/effect/spawner/bundle/crate/mosin,
+ /obj/item/storage/toolbox/ammo,
+ /obj/effect/spawner/bundle/crate/surplusrifle,
+ /obj/item/storage/toolbox/ammo/surplus)
crate_name = "surplus military crate"
/datum/supply_pack/security/armory/russian/fill(obj/structure/closet/crate/C)
diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm
index 738eb03fbf..cf9cc5e0d1 100644
--- a/code/modules/cargo/packs/security.dm
+++ b/code/modules/cargo/packs/security.dm
@@ -100,7 +100,7 @@
crate_name = "surplus russian clothing"
crate_type = /obj/structure/closet/crate/internals
-/datum/supply_pack/security/russianmosin
+/datum/supply_pack/security/russian_partisan
name = "Russian Partisan Gear"
desc = "An old russian partisan equipment crate, comes with a full russian outfit, a loaded surplus rifle and a second magazine."
contraband = TRUE
@@ -112,12 +112,17 @@
/obj/item/clothing/suit/armor/bulletproof,
/obj/item/clothing/head/helmet/alt,
/obj/item/clothing/gloves/tackler/combat/insulated,
- /obj/item/clothing/mask/gas,
- /obj/item/ammo_box/magazine/m10mm/rifle,
- /obj/item/gun/ballistic/automatic/surplus)
+ /obj/item/clothing/mask/gas)
crate_name = "surplus russian gear"
crate_type = /obj/structure/closet/crate/internals
+/datum/supply_pack/security/russian_partisan/fill(obj/structure/closet/crate/C)
+ ..()
+ if(prob(20))
+ new /obj/effect/spawner/bundle/crate/mosin(C)
+ else
+ new /obj/effect/spawner/bundle/crate/surplusrifle(C)
+
/datum/supply_pack/security/sechardsuit
name = "Sec Hardsuit"
desc = "One Sec Hardsuit with a small air tank and mask."
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index d42b795d72..db86f2ef9f 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -993,3 +993,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
screen -= S
qdel(S)
char_render_holders = null
+
+/client/proc/can_have_part(part_name)
+ return prefs.pref_species.mutant_bodyparts[part_name] || (part_name in GLOB.unlocked_mutant_parts)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 1b048c9a2e..9bdcd518d3 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -394,7 +394,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[name] "
dat += ""
- dat += "
"
+ dat += ""
dat += "Flavor Text"
dat += "Set Examine Text " //skyrat - moved one line down //stupid choice you guys
if(length(features["flavor_text"]) <= 40)
@@ -542,311 +542,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += " | "
mutant_category = 0
- if(pref_species.mutant_bodyparts["tail_lizard"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Tail"
-
- dat += "[features["tail_lizard"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
- if(pref_species.mutant_bodyparts["mam_tail"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Tail"
-
- dat += "[features["mam_tail"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["tail_human"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Tail"
-
- dat += "[features["tail_human"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
- if(pref_species.mutant_bodyparts["meat_type"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Meat Type"
-
- dat += "[features["meat_type"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["snout"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Snout"
-
- dat += "[features["snout"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["horns"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Horns"
-
- dat += "[features["horns"]]"
- dat += " Change "
-
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- if(pref_species.mutant_bodyparts["frills"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Frills"
-
- dat += "[features["frills"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
- if(pref_species.mutant_bodyparts["spines"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Spines"
-
- dat += "[features["spines"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
- if(pref_species.mutant_bodyparts["body_markings"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Body Markings"
-
- dat += "[features["body_markings"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["mam_body_markings"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Species Markings"
-
- dat += "[features["mam_body_markings"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
- if(pref_species.mutant_bodyparts["mam_ears"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Ears"
-
- dat += "[features["mam_ears"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
- if(pref_species.mutant_bodyparts["ears"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Ears"
-
- dat += "[features["ears"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
- if(pref_species.mutant_bodyparts["mam_snouts"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Snout"
-
- dat += "[features["mam_snouts"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["legs"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Legs"
-
- dat += "[features["legs"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["deco_wings"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Decorative wings"
-
- dat += "[features["deco_wings"]]"
- dat += " Change "
-
- if(pref_species.mutant_bodyparts["insect_wings"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Insect wings"
-
- dat += "[features["insect_wings"]]"
- dat += " Change "
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["insect_fluff"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Insect Fluff"
-
- dat += "[features["insect_fluff"]]"
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["taur"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Tauric Body"
-
- dat += "[features["taur"]]"
-
- if(pref_species.mutant_bodyparts["insect_markings"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Insect markings"
-
- dat += "[features["insect_markings"]] "
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["wings"] && GLOB.r_wings_list.len >1)
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Wings"
-
- dat += "[features["wings"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["xenohead"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Caste Head"
-
- dat += "[features["xenohead"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["xenotail"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Tail"
-
- dat += "[features["xenotail"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["xenodorsal"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Dorsal Spines"
-
- dat += "[features["xenodorsal"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["ipc_screen"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Screen"
-
- dat += "[features["ipc_screen"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- if(pref_species.mutant_bodyparts["ipc_antenna"])
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Antenna"
-
- dat += "[features["ipc_antenna"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
+ for(var/mutant_part in GLOB.all_mutant_parts)
+ if(parent.can_have_part(mutant_part))
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "[GLOB.all_mutant_parts[mutant_part]]"
+ dat += "[features[mutant_part]]"
+ var/color_type = GLOB.colored_mutant_parts[mutant_part] //if it can be coloured, show the appropriate button
+ if(color_type)
+ dat += " Change "
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
if(mutant_category)
dat += ""
@@ -892,7 +600,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/tauric_shape = FALSE
if(features["cock_taur"])
var/datum/sprite_accessory/penis/P = GLOB.cock_shapes_list[features["cock_shape"]]
- if(P.taur_icon && pref_species.mutant_bodyparts["taur"])
+ if(P.taur_icon && parent.can_have_part("taur"))
var/datum/sprite_accessory/taur/T = GLOB.taur_list[features["taur"]]
if(T.taur_mode & P.accepted_taurs)
tauric_shape = TRUE
@@ -1923,14 +1631,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
pref_species = new newtype()
//let's ensure that no weird shit happens on species swapping.
custom_species = null
- if(!pref_species.mutant_bodyparts["body_markings"])
+ if(!parent.can_have_part("body_markings"))
features["body_markings"] = "None"
- if(!pref_species.mutant_bodyparts["mam_body_markings"])
+ if(!parent.can_have_part("mam_body_markings"))
features["mam_body_markings"] = "None"
- if(pref_species.mutant_bodyparts["mam_body_markings"])
+ if(parent.can_have_part("mam_body_markings"))
if(features["mam_body_markings"] == "None")
features["mam_body_markings"] = "Plain"
- if(pref_species.mutant_bodyparts["tail_lizard"])
+ if(parent.can_have_part("tail_lizard"))
features["tail_lizard"] = "Smooth"
if(pref_species.id == "felinid")
features["mam_tail"] = "Cat"
@@ -2058,7 +1766,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["tail_human"] = "None"
features["tail_lizard"] = "None"
- if("meats")
+ if("meat_type")
var/new_meat
new_meat = input(user, "Choose your character's meat type:", "Character Preference") as null|anything in GLOB.meat_types
if(new_meat)
@@ -2163,7 +1871,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_deco_wings)
features["deco_wings"] = new_deco_wings
- if("insect_fluffs")
+ if("insect_fluff")
var/new_insect_fluff
new_insect_fluff = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_fluffs_list
if(new_insect_fluff)
@@ -2311,7 +2019,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("cock_shape")
var/new_shape
var/list/hockeys = list()
- if(pref_species.mutant_bodyparts["taur"])
+ if(parent.can_have_part("taur"))
var/datum/sprite_accessory/taur/T = GLOB.taur_list[features["taur"]]
for(var/A in GLOB.cock_shapes_list)
var/datum/sprite_accessory/penis/P = GLOB.cock_shapes_list[A]
@@ -2992,10 +2700,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.dna.nameless = character.nameless
character.dna.custom_species = character.custom_species
- if(pref_species.mutant_bodyparts["meat_type"])
+ if((parent && parent.can_have_part("meat_type")) || pref_species.mutant_bodyparts["meat_type"])
character.type_of_meat = GLOB.meat_types[features["meat_type"]]
- if(character.dna.species.mutant_bodyparts["legs"] && (character.dna.features["legs"] == "Digitigrade" || character.dna.features["legs"] == "Avian"))
+ if(((parent && parent.can_have_part("legs")) || pref_species.mutant_bodyparts["legs"]) && (character.dna.features["legs"] == "Digitigrade" || character.dna.features["legs"] == "Avian"))
pref_species.species_traits |= DIGITIGRADE
else
pref_species.species_traits -= DIGITIGRADE
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 7d68fe89e0..5bd4f53ac5 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 33
+#define SAVEFILE_VERSION_MAX 34
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 293960fd43..940fa6e1d6 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -126,6 +126,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
limbs_id = id
..()
+ //update our mutant bodyparts to include unlocked ones
+ mutant_bodyparts += GLOB.unlocked_mutant_parts
+
/proc/generate_selectable_species(clear = FALSE)
if(clear)
GLOB.roundstart_races = list()
diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm
index 729e7d3d7a..2493509e16 100644
--- a/code/modules/mob/living/living_active_block.dm
+++ b/code/modules/mob/living/living_active_block.dm
@@ -13,7 +13,7 @@
DelayNextAction(data.block_end_click_cd_add)
return TRUE
-/mob/living/proc/ACTIVE_BLOCK_START(obj/item/I)
+/mob/living/proc/active_block_start(obj/item/I)
if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING))
return FALSE
if(!(I in held_items))
@@ -109,7 +109,7 @@
animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_IN, ANIMATION_END_NOW)
return
combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING)
- ACTIVE_BLOCK_START(I)
+ active_block_start(I)
/**
* Gets the first item we can that can block, but if that fails, default to active held item.COMSIG_ENABLE_COMBAT_MODE
@@ -180,6 +180,12 @@
/// Apply the stamina damage to our user, notice how damage argument is stamina_amount.
/obj/item/proc/active_block_do_stamina_damage(mob/living/owner, atom/object, stamina_amount, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+ if(istype(object, /obj/item/projectile))
+ var/obj/item/projectile/P = object
+ if(P.stamina)
+ var/blocked = active_block_calculate_final_damage(owner, object, P.stamina, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return)
+ var/stam = active_block_stamina_cost(owner, object, blocked, attack_text, ATTACK_TYPE_PROJECTILE, armour_penetration, attacker, def_zone, final_block_chance, block_return)
+ stamina_amount += stam
var/datum/block_parry_data/data = get_block_parry_data()
if(iscarbon(owner))
var/mob/living/carbon/C = owner
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index c6d850ceac..d04671f1e4 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -883,7 +883,7 @@
if(istype(O, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = O
reac_volume = min(reac_volume, M.amount)
- new/obj/item/stack/tile/bronze(get_turf(M), reac_volume)
+ new/obj/item/stack/sheet/bronze(get_turf(M), reac_volume)
M.use(reac_volume)
/datum/reagent/nitrogen
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index 45b6939f42..e572f1ee02 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -93,7 +93,7 @@
/obj/item/stack/sheet/mineral/adamantine = /datum/species/golem/adamantine,
/obj/item/stack/sheet/plastic = /datum/species/golem/plastic,
/obj/item/stack/tile/brass = /datum/species/golem/clockwork,
- /obj/item/stack/tile/bronze = /datum/species/golem/bronze,
+ /obj/item/stack/sheet/bronze = /datum/species/golem/bronze,
/obj/item/stack/sheet/cardboard = /datum/species/golem/cardboard,
/obj/item/stack/sheet/leather = /datum/species/golem/leather,
/obj/item/stack/sheet/bone = /datum/species/golem/bone,
diff --git a/html/changelogs/AutoChangeLog-pr-13037.yml b/html/changelogs/AutoChangeLog-pr-13037.yml
new file mode 100644
index 0000000000..83dba115e9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13037.yml
@@ -0,0 +1,5 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - refactor: "snowflake code for mutant bodypart selection has been rewritten to be ~14x shorter"
+ - tweak: "meat type and horns can now be selected by any species"
diff --git a/html/changelogs/AutoChangeLog-pr-13045.yml b/html/changelogs/AutoChangeLog-pr-13045.yml
new file mode 100644
index 0000000000..ea813fe8c4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13045.yml
@@ -0,0 +1,5 @@
+author: "ported from tg"
+delete-after: True
+changes:
+ - rscadd: "bronze airlocks and windows can now be built"
+ - balance: "i also tweaked bronze flooring to be cheaper."
diff --git a/html/changelogs/AutoChangeLog-pr-13067.yml b/html/changelogs/AutoChangeLog-pr-13067.yml
new file mode 100644
index 0000000000..48e760b002
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13067.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - balance: "The funny blyat men have stumbled upon another surplus of Mosin-Nagants and are starting to pack them into crates again."
diff --git a/html/changelogs/AutoChangeLog-pr-13092.yml b/html/changelogs/AutoChangeLog-pr-13092.yml
new file mode 100644
index 0000000000..fd8e39800f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13092.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - tweak: "stamina draining projectiles without stamina for their primary damage type now has their stamina damage taken into account for shield blocking, rather than the block being done for free for that."
|