diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index f02a4f4a31..cefc0eb1a5 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -114276,11 +114276,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/stripes/line{
dir = 2
@@ -114288,6 +114283,10 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Chapel Maintenance";
+ req_access_txt = "27"
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"dKE" = (
@@ -118987,7 +118986,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -119332,7 +119330,6 @@
/turf/closed/wall,
/area/chapel/office)
"dTx" = (
-/obj/structure/bodycontainer/morgue,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -119343,6 +119340,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/closet/crate/coffin,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"dTy" = (
@@ -121768,7 +121766,6 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"dYv" = (
-/obj/structure/bodycontainer/morgue,
/obj/structure/sign/poster/official/ian{
pixel_y = -32
},
@@ -121782,6 +121779,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/closet/crate/coffin,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"dYw" = (
@@ -126476,6 +126474,7 @@
name = "Mass Driver"
},
/obj/machinery/mass_driver{
+ id = "chapelgun";
name = "Holy Driver"
},
/turf/open/floor/plating,
@@ -126706,7 +126705,7 @@
/area/science/mixing)
"iyd" = (
/turf/open/space,
-/area/space/nearstation)
+/area/space)
"iQh" = (
/obj/structure/bodycontainer/morgue{
dir = 1
@@ -126946,19 +126945,6 @@
},
/turf/open/floor/plasteel,
/area/maintenance/port)
-"kzR" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Chapel Maintenance";
- req_access_txt = "27"
- },
-/turf/open/floor/plasteel,
-/area/chapel/office)
"kLu" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -160100,7 +160086,7 @@ dYu
dZg
jhK
jhK
-kzR
+dZN
owr
mXJ
gJj
diff --git a/code/__DEFINES/donator_groupings.dm b/code/__DEFINES/donator_groupings.dm
new file mode 100644
index 0000000000..4b210609f2
--- /dev/null
+++ b/code/__DEFINES/donator_groupings.dm
@@ -0,0 +1,18 @@
+#define DONATOR_GROUP_TIER_1_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_1_donators
+#define DONATOR_GROUP_TIER_2_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_2_donators
+#define DONATOR_GROUP_TIER_3_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_3_donators
+
+#define DONATOR_GROUP_TIER_1_CONFIG_SUBPATH keyed_list/donator_group/tier_1_donators
+#define DONATOR_GROUP_TIER_2_CONFIG_SUBPATH keyed_list/donator_group/tier_2_donators
+#define DONATOR_GROUP_TIER_3_CONFIG_SUBPATH keyed_list/donator_group/tier_3_donators
+
+#define TIER_1_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_1_CONFIG_SUBPATH)
+#define TIER_2_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_2_CONFIG_SUBPATH)
+#define TIER_3_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_3_CONFIG_SUBPATH)
+
+//flags
+#define DONATOR_GROUP_TIER_1 "T1"
+#define DONATOR_GROUP_TIER_2 "T2"
+#define DONATOR_GROUP_TIER_3 "T3"
+
+#define IS_CKEY_DONATOR_GROUP(ckey, groupid) is_donator_group(ckey, groupid)
diff --git a/code/__HELPERS/donator_groupings.dm b/code/__HELPERS/donator_groupings.dm
new file mode 100644
index 0000000000..bdff20553a
--- /dev/null
+++ b/code/__HELPERS/donator_groupings.dm
@@ -0,0 +1,25 @@
+/*
+Current specifications:
+
+Donator groups in __DEFINES/donator_groupings.dm, config entries in controllers/configuration/entries/donator.dm
+
+3 groups, Tier 1/2/3
+Each tier includes the one before it (ascending)
+For fast lookups, this is generated using regenerate_donator_grouping_list()
+
+*/
+
+/proc/is_donator_group(ckey, group)
+ ckey = ckey(ckey) //make sure it's ckey'd.
+ var/list/L = GLOB.donators_by_group[group]
+ return L && L.Find(ckey)
+
+/proc/regenerate_donator_grouping_list()
+ GLOB.donators_by_group = list() //reinit everything
+ var/list/donator_list = GLOB.donators_by_group //cache
+ var/list/tier_1 = TIER_1_DONATORS
+ donator_list[DONATOR_GROUP_TIER_1] = tier_1.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list.
+ var/list/tier_2 = tier_1 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy().
+ donator_list[DONATOR_GROUP_TIER_2] = tier_2
+ var/list/tier_3 = tier_2 + TIER_3_DONATORS
+ donator_list[DONATOR_GROUP_TIER_3] = tier_3
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 7e078184b7..3c8d62ce3a 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1487,6 +1487,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/obj/item/reagent_containers/food/snacks/grown/nettle, // base type
/obj/item/reagent_containers/food/snacks/deepfryholder,
/obj/item/reagent_containers/food/snacks/grown/shell,
+ /obj/item/reagent_containers/food/snacks/clothing,
/obj/item/reagent_containers/food/snacks/store/bread
)
blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
new file mode 100644
index 0000000000..1dcde53a72
--- /dev/null
+++ b/code/_globalvars/lists/misc.dm
@@ -0,0 +1 @@
+GLOBAL_LIST_EMPTY(donators_by_group) //group id = donator list of ckeys
diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm
index 49ff1c8d49..3ac103affc 100644
--- a/code/controllers/configuration/config_entry.dm
+++ b/code/controllers/configuration/config_entry.dm
@@ -19,6 +19,7 @@
var/abstract_type = /datum/config_entry //do not instantiate if type matches this
var/vv_VAS = TRUE //Force validate and set on VV. VAS proccall guard will run regardless.
+ var/postload_required = FALSE //requires running OnPostload()
var/dupes_allowed = FALSE
@@ -72,6 +73,9 @@
/datum/config_entry/proc/DeprecationUpdate(value)
return
+/datum/config_entry/proc/OnPostload()
+ return
+
/datum/config_entry/string
config_entry_value = ""
abstract_type = /datum/config_entry/string
@@ -80,7 +84,7 @@
/datum/config_entry/string/vv_edit_var(var_name, var_value)
return var_name != "auto_trim" && ..()
-/datum/config_entry/string/ValidateAndSet(str_val)
+/datum/config_entry/string/ValidateAndSet(str_val, during_load)
if(!VASProcCallGuard(str_val))
return FALSE
config_entry_value = auto_trim ? trim(str_val) : str_val
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index 0232081c1a..ea2919f342 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -101,6 +101,7 @@
log_config("Loading config file [filename]...")
var/list/lines = world.file2list("[directory]/[filename]")
var/list/_entries = entries
+ var/list/postload_required = list()
for(var/L in lines)
L = trim(L)
if(!L)
@@ -157,18 +158,24 @@
else
warning("[new_ver.type] is deprecated but gave no proper return for DeprecationUpdate()")
- var/validated = E.ValidateAndSet(value)
+ var/validated = E.ValidateAndSet(value, TRUE)
if(!validated)
log_config("Failed to validate setting \"[value]\" for [entry]")
else
if(E.modified && !E.dupes_allowed)
log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.")
+ if(E.postload_required)
+ postload_required[E] = TRUE
E.resident_file = filename
if(validated)
E.modified = TRUE
+ for(var/i in postload_required)
+ var/datum/config_entry/E = i
+ E.OnPostload()
+
++.
/datum/controller/configuration/can_vv_get(var_name)
diff --git a/code/controllers/configuration/entries/donator.dm b/code/controllers/configuration/entries/donator.dm
new file mode 100644
index 0000000000..b74d5f5839
--- /dev/null
+++ b/code/controllers/configuration/entries/donator.dm
@@ -0,0 +1,22 @@
+/datum/config_entry/keyed_list/donator_group
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_FLAG
+ abstract_type = /datum/config_entry/keyed_list/donator_group
+
+//If we're in the middle of a config load, only do the regeneration afterwards to prevent this from wasting a massive amount of CPU for list regenerations.
+/datum/config_entry/keyed_list/donator_group/ValidateAndSet(str_val, during_load)
+ . = ..()
+ if(. && during_load)
+ regenerate_donator_grouping_list()
+
+/datum/config_entry/keyed_list/donator_group/OnPostload()
+ . = ..()
+ regenerate_donator_grouping_list()
+
+//This is kinda weird in that the config entries are defined here but all the handling/calculations are in __HELPERS/donator_groupings.dm
+
+/datum/config_entry/keyed_list/donator_group/tier_1_donators
+
+/datum/config_entry/keyed_list/donator_group/tier_2_donators
+
+/datum/config_entry/keyed_list/donator_group/tier_3_donators
diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm
index 221d04dad5..cc09ca816e 100644
--- a/code/controllers/subsystem/input.dm
+++ b/code/controllers/subsystem/input.dm
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(input)
// This is for when macro sets are eventualy datumized
/datum/controller/subsystem/input/proc/setup_default_macro_sets()
var/list/static/default_macro_sets
-
+
if(default_macro_sets)
macro_sets = default_macro_sets
return
@@ -49,6 +49,7 @@ SUBSYSTEM_DEF(input)
"old_hotkeys" = list(
"Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"",
"O" = "ooc",
+ "L" = "looc",
"T" = "say",
"M" = "me",
"Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index 41e0dac3dd..cb5790e45f 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -61,7 +61,7 @@
/obj/item/storage/wallet/update_icon()
var/new_state = "wallet"
if(front_id)
- new_state = "wallet_[front_id.icon_state]"
+ new_state = "wallet_id"
if(new_state != icon_state) //avoid so many icon state changes.
icon_state = new_state
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 560731edfd..f2d9f328a1 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -229,7 +229,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/katana/cursed
slot_flags = null
-/obj/item/katana/Initialize()
+/obj/item/katana/cursed/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 4550ba0ecf..0cdb7fddbb 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -917,11 +917,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "
Description | "
for(var/j in GLOB.loadout_items[gear_tab])
var/datum/gear/gear = GLOB.loadout_items[gear_tab][j]
- var/donoritem
- if(gear.ckeywhitelist && gear.ckeywhitelist.len)
- donoritem = TRUE
- if(!(user.ckey in gear.ckeywhitelist))
- continue
+ var/donoritem = gear.donoritem
+ if(donoritem && !gear.donator_ckey_check(user.ckey))
+ continue
var/class_link = ""
if(gear.type in chosen_gear)
class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(j)];toggle_gear=0'"
@@ -2241,7 +2239,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(!is_loadout_slot_available(G.category))
to_chat(user, "You cannot take this loadout, as you've already chosen too many of the same category!")
return
- if(G.ckeywhitelist && G.ckeywhitelist.len && !(user.ckey in G.ckeywhitelist))
+ if(G.donoritem && !G.donator_ckey_check(user.ckey))
to_chat(user, "This is an item intended for donator use only. You are not authorized to use this item.")
return
if(gear_points >= initial(G.cost))
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 85503c720a..2694497579 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -624,19 +624,19 @@
desc = "The Multi-Augmented Severe Operations Networked Resource Integration Gear is an man-portable tank designed for extreme environmental situations. It is excessively bulky, but rated for all but the most atomic of hazards. The specialized armor is surprisingly weak to conventional weaponry. The exo slot can attach most storge bags on to the suit."
icon_state = "hardsuit-ancient"
item_state = "anc_hardsuit"
- armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
+ armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
slowdown = 6 //Slow
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
name = "M.A.S.O.N RIG helmet"
desc = "The M.A.S.O.N RIG helmet is complimentary to the rest of the armor. It features a very large, high powered flood lamp and robust flash protection."
icon_state = "hardsuit0-ancient"
item_state = "anc_helm"
- armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
+ armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
item_color = "ancient"
brightness_on = 16
scan_reagents = TRUE
@@ -644,7 +644,7 @@
tint = 1
var/obj/machinery/doppler_array/integrated/bomb_radar
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Initialize()
. = ..()
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 17ddacb32f..616c00b6c1 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -703,14 +703,6 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
-/obj/item/clothing/under/durathread
- name = "durathread jumpsuit"
- desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer."
- icon_state = "durathread"
- item_state = "durathread"
- item_color = "durathread"
- can_adjust = FALSE
- armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
/obj/item/clothing/under/gear_harness
name = "gear harness"
@@ -725,5 +717,15 @@
icon_state = "durathread"
item_state = "durathread"
item_color = "durathread"
+ can_adjust = TRUE
+ armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
+
+/obj/item/clothing/under/duraskirt
+ name = "durathread jumpskirt"
+ desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer. Being a short skirt, it naturally doesn't protect the legs."
+ icon_state = "duraskirt"
+ item_state = "duraskirt"
+ item_color = "durathread"
can_adjust = FALSE
+ body_parts_covered = CHEST|GROIN|ARMS
armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm
index e9ad49eedd..ef019387e8 100644
--- a/code/modules/hydroponics/grown/berries.dm
+++ b/code/modules/hydroponics/grown/berries.dm
@@ -224,6 +224,10 @@
species = "strawberry"
plantname = "Strawberry Vine"
product = /obj/item/reagent_containers/food/snacks/grown/strawberry
+ growthstages = 6
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "strawberry-grow"
+ icon_dead = "berry-dead"
reagents_add = list("vitamin" = 0.07, "nutriment" = 0.1, "sugar" = 0.2)
mutatelist = list()
diff --git a/code/modules/hydroponics/grown/peach.dm b/code/modules/hydroponics/grown/peach.dm
new file mode 100644
index 0000000000..6fbf933bd1
--- /dev/null
+++ b/code/modules/hydroponics/grown/peach.dm
@@ -0,0 +1,27 @@
+// Peach
+/obj/item/seeds/peach
+ name = "pack of peach seeds"
+ desc = "These seeds grow into peach trees."
+ icon_state = "seed-peach"
+ species = "peach"
+ plantname = "Peach Tree"
+ product = /obj/item/reagent_containers/food/snacks/grown/peach
+ lifespan = 65
+ endurance = 40
+ yield = 3
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "peach-grow"
+ icon_dead = "peach-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1)
+
+/obj/item/reagent_containers/food/snacks/grown/peach
+ seed = /obj/item/seeds/peach
+ name = "peach"
+ desc = "It's fuzzy!"
+ icon_state = "peach"
+ filling_color = "#FF4500"
+ bitesize = 25
+ foodtype = FRUIT
+ juice_results = list("peachjuice" = 0)
+ tastes = list("peach" = 1)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 7add723a06..5990c70813 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -787,30 +787,30 @@
/obj/item/melee/ghost_sword/process()
ghost_check()
-/obj/item/melee/ghost_sword/proc/ghost_check()
- var/ghost_counter = 0
- var/turf/T = get_turf(src)
- var/list/contents = T.GetAllContents()
- var/mob/dead/observer/current_spirits = list()
- for(var/thing in contents)
- var/atom/A = thing
- A.transfer_observers_to(src)
-
- for(var/i in orbiters?.orbiters)
- if(!isobserver(i))
+/obj/item/melee/ghost_sword/proc/recursive_orbit_collect(atom/A, list/L)
+ for(var/i in A.orbiters?.orbiters)
+ if(!isobserver(i) || (i in L))
continue
+ L |= i
+ recursive_orbit_collect(i, L)
+
+/obj/item/melee/ghost_sword/proc/ghost_check()
+ var/list/mob/dead/observer/current_spirits = list()
+
+ recursive_orbit_collect(src, current_spirits)
+ recursive_orbit_collect(loc, current_spirits) //anything holding us
+
+ for(var/i in spirits - current_spirits)
var/mob/dead/observer/G = i
- ghost_counter++
- G.invisibility = 0
- current_spirits |= G
-
- for(var/mob/dead/observer/G in spirits - current_spirits)
G.invisibility = GLOB.observer_default_invisibility
-
+
+ for(var/i in current_spirits)
+ var/mob/dead/observer/G = i
+ G.invisibility = 0
+
spirits = current_spirits
-
- return ghost_counter
-
+ return length(spirits)
+
/obj/item/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user)
force = 0
var/ghost_counter = ghost_check()
@@ -1335,4 +1335,4 @@
if(2)
new /obj/item/wisp_lantern(src)
if(3)
- new /obj/item/prisoncube(src)
\ No newline at end of file
+ new /obj/item/prisoncube(src)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index b53655ca7c..9acecea545 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -702,7 +702,7 @@
clear_fullscreen("critvision")
//Oxygen damage overlay
- var/windedup = getOxyLoss() + getStaminaLoss() * 0.2 + stamdamageoverlaytemp
+ var/windedup = getOxyLoss() + getStaminaLoss() * 0.2
if(windedup)
var/severity = 0
switch(windedup)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index a067be798f..794194b3a1 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -61,6 +61,5 @@
var/next_hallucination = 0
var/cpr_time = 1 //CPR cooldown.
var/damageoverlaytemp = 0
- var/stamdamageoverlaytemp = 0
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 7a0a2d8ad8..35b0384145 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -25,11 +25,11 @@
var/age = 30 //Player's age
var/underwear = "Nude" //Which underwear the player wants
- var/undie_color = "#FFFFFF"
+ var/undie_color = "FFFFFF"
var/undershirt = "Nude" //Which undershirt the player wants
- var/shirt_color = "#FFFFFF"
+ var/shirt_color = "FFFFFF"
var/socks = "Nude" //Which socks the player wants
- var/socks_color = "#FFFFFF"
+ var/socks_color = "FFFFFF"
var/backbag = DBACKPACK //Which backpack type the player has chosen.
var/jumpsuit_style = PREF_SUIT //suit/skirt
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 92d1328f73..0f83e675fc 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -529,7 +529,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/digilegs = (DIGITIGRADE in species_traits) ? "_d" : ""
var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER)
if(UNDIE_COLORABLE(S))
- MA.color = "[H.socks_color]"
+ MA.color = "#[H.socks_color]"
standing += MA
if(standing.len)
@@ -1781,7 +1781,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(CLONE)
H.adjustCloneLoss(damage * hit_percent * H.physiology.clone_mod)
if(STAMINA)
- H.stamdamageoverlaytemp = 20
if(BP)
if(damage > 0 ? BP.receive_damage(0, 0, damage * hit_percent * H.physiology.stamina_mod) : BP.heal_damage(0, 0, abs(damage * hit_percent * H.physiology.stamina_mod), only_robotic = FALSE, only_organic = FALSE))
H.update_stamina()
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index f0144e022d..36e4e18817 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -4,9 +4,8 @@
if(notransform)
return
- if(damageoverlaytemp || stamdamageoverlaytemp)
+ if(damageoverlaytemp)
damageoverlaytemp = 0
- stamdamageoverlaytemp = 0
update_damage_hud()
if(stat != DEAD) //Reagent processing needs to come before breathing, to prevent edge cases.
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index 07985215d8..29b4689317 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -69,7 +69,7 @@
if(Target.Adjacent(src))
Target.attack_slime(src)
- return
+ break
if(!Target.lying && prob(80))
if(Target.client && Target.health >= 20)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index c64702f9ef..f1602f429c 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -457,13 +457,17 @@
set name = ".click"
set hidden = TRUE
set category = null
- return
+ var/msg = "[key_name_admin(src)]([ADMIN_KICK(src)]) attempted to use the .click macro!"
+ log_admin(msg)
+ message_admins(msg)
/mob/verb/DisDblClick(argu = null as anything, sec = "" as text, number1 = 0 as num , number2 = 0 as num)
set name = ".dblclick"
set hidden = TRUE
set category = null
- return
+ var/msg = "[key_name_admin(src)]([ADMIN_KICK(src)]) attempted to use the .dblclick macro!"
+ log_admin(msg)
+ message_admins(msg)
/mob/Topic(href, href_list)
if(href_list["mach_close"])
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index f6356dce99..12006440d2 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -127,15 +127,14 @@
/obj/item/gun/ballistic/rocketlauncher/attackby(obj/item/A, mob/user, params)
if(magazine && istype(A, /obj/item/ammo_casing))
- if(user.temporarilyRemoveItemFromInventory(A))
- if(!chambered)
- to_chat(user, "You load a new [A] into \the [src].")
- playsound(src, "gun_insert_full_magazine", 70, 1)
- chamber_round()
- update_icon()
- return TRUE
- else
- to_chat(user, "You cannot seem to get \the [A] out of your hands!")
+ if(chambered)
+ to_chat(user, "[src] already has a [magazine_wording] chambered.")
+ return
+ if(magazine.attackby(A, user, silent = TRUE))
+ to_chat(user, "You load a new [A] into \the [src].")
+ playsound(src, "gun_insert_full_magazine", 70, 1)
+ chamber_round()
+ update_icon()
/obj/item/gun/ballistic/rocketlauncher/update_icon()
icon_state = "[initial(icon_state)]-[chambered ? "1" : "0"]"
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 856dfed78b..7d71a9acdd 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -40,7 +40,7 @@
if(istype(user) && user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return//CIT CHANGE - ditto
- pump(user)
+ pump(user, TRUE)
recentpump = world.time + 10
if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina.
user.adjustStaminaLossBuffered(2) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added
@@ -52,7 +52,9 @@
process_fire(user, user, FALSE)
. = 1
-/obj/item/gun/ballistic/shotgun/proc/pump(mob/M)
+/obj/item/gun/ballistic/shotgun/proc/pump(mob/M, visible = TRUE)
+ if(visible)
+ M.visible_message("[M] racks [src].", "You rack [src].")
playsound(M, 'sound/weapons/shotgunpump.ogg', 60, 1)
pump_unload(M)
pump_reload(M)
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 9c3a1a4f36..99397897c6 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -447,15 +447,6 @@
"portadrive_basic", "portadrive_advanced", "portadrive_super", "cardslot", "aislot", "miniprinter", "APClink", "bat_control", "bat_normal", "bat_advanced",
"bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small")
-/datum/techweb_node/computer_board_gaming
- id = "computer_board_gaming"
- display_name = "Arcade Games"
- description = "For the slackers on the station."
- prereq_ids = list("comptech")
- design_ids = list("arcade_battle", "arcade_orion", "slotmachine") // Magic money
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
- export_price = 2000
-
/datum/techweb_node/comp_recordkeeping
id = "comp_recordkeeping"
display_name = "Computerized Recordkeeping"
diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm
index b1b69a8cd2..d230f40af0 100644
--- a/code/modules/vending/megaseed.dm
+++ b/code/modules/vending/megaseed.dm
@@ -24,6 +24,7 @@
/obj/item/seeds/lime = 3,
/obj/item/seeds/onion = 3,
/obj/item/seeds/orange = 3,
+ /obj/item/seeds/peach = 3,
/obj/item/seeds/peanutseed = 3,
/obj/item/seeds/pineapple = 3,
/obj/item/seeds/potato = 3,
diff --git a/config/config.txt b/config/config.txt
index 3bc9f873a9..a01f5424da 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -4,6 +4,7 @@ $include game_options.txt
$include dbconfig.txt
$include comms.txt
$include antag_rep.txt
+$include donator_groupings.txt
# You can use the @ character at the beginning of a config option to lock it from being edited in-game
# Example usage:
diff --git a/config/donator_groupings.txt b/config/donator_groupings.txt
new file mode 100644
index 0000000000..b26d1efe22
--- /dev/null
+++ b/config/donator_groupings.txt
@@ -0,0 +1,8 @@
+#this is a bad system but I'm lazy so it piggybacks off config loader system.
+#Specify group followed by ckey for each ckey.
+
+#TIER_1_DONATORS test_ckey
+
+#TIER_2_DONATORS test_ckey
+
+#TIER_3_DONATORS test_ckey
diff --git a/html/changelogs/AutoChangeLog-pr-9080.yml b/html/changelogs/AutoChangeLog-pr-9080.yml
new file mode 100644
index 0000000000..1ae1e3e2aa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9080.yml
@@ -0,0 +1,4 @@
+author: "Fermis"
+delete-after: True
+changes:
+ - rscadd: "Adds 3 new music tracks."
diff --git a/html/changelogs/AutoChangeLog-pr-9132.yml b/html/changelogs/AutoChangeLog-pr-9132.yml
new file mode 100644
index 0000000000..f9dee17687
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9132.yml
@@ -0,0 +1,4 @@
+author: "Toriate"
+delete-after: True
+changes:
+ - imageadd: "Updated the sprites of all the regular crates"
diff --git a/html/changelogs/AutoChangeLog-pr-9168.yml b/html/changelogs/AutoChangeLog-pr-9168.yml
new file mode 100644
index 0000000000..2375f6a28a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9168.yml
@@ -0,0 +1,4 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - rscadd: "Added looc hotkey"
diff --git a/html/changelogs/AutoChangeLog-pr-9172.yml b/html/changelogs/AutoChangeLog-pr-9172.yml
new file mode 100644
index 0000000000..751cfa6d26
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9172.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "Racking shotguns is now more threatening."
diff --git a/html/changelogs/AutoChangeLog-pr-9175.yml b/html/changelogs/AutoChangeLog-pr-9175.yml
new file mode 100644
index 0000000000..d3aa92d42d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9175.yml
@@ -0,0 +1,5 @@
+author: "lolman360"
+delete-after: True
+changes:
+ - rscadd: "Added durathread jumpskirt"
+ - imageadd: "Duraskirt sprites and rolled down jumpsuit sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-9178.yml b/html/changelogs/AutoChangeLog-pr-9178.yml
new file mode 100644
index 0000000000..2a6de13f5e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9178.yml
@@ -0,0 +1,4 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - bugfix: "the `!tgs poly` command now actually works"
diff --git a/html/changelogs/AutoChangeLog-pr-9184.yml b/html/changelogs/AutoChangeLog-pr-9184.yml
new file mode 100644
index 0000000000..d0b4d1fa7e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9184.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscdel: "Removes an obnoxious temporary overlay var."
diff --git a/html/changelogs/AutoChangeLog-pr-9200.yml b/html/changelogs/AutoChangeLog-pr-9200.yml
new file mode 100644
index 0000000000..d1be09ee4a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9200.yml
@@ -0,0 +1,4 @@
+author: "Owai-Seek"
+delete-after: True
+changes:
+ - bugfix: "fixed them strawberries"
diff --git a/html/changelogs/AutoChangeLog-pr-9204.yml b/html/changelogs/AutoChangeLog-pr-9204.yml
new file mode 100644
index 0000000000..3b70354fd9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9204.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "/cursed from a item path"
diff --git a/html/changelogs/AutoChangeLog-pr-9208.yml b/html/changelogs/AutoChangeLog-pr-9208.yml
new file mode 100644
index 0000000000..1645164266
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9208.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "colorable socks can be colored again."
diff --git a/html/changelogs/AutoChangeLog-pr-9210.yml b/html/changelogs/AutoChangeLog-pr-9210.yml
new file mode 100644
index 0000000000..b02811e7a8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9210.yml
@@ -0,0 +1,7 @@
+author: "EmeraldSundisk"
+delete-after: True
+changes:
+ - tweak: "CentCom has noticed the lack of coffins in Delta Station's chapel and provided some, but in exchange for reducing the chapel morgue's capacity."
+ - tweak: "Fixed a maintenance door the chaplain should have been able to open."
+ - bugfix: "Fixes space areas outside the driver
+removal: CentCom Defense Analysts have ordered the maintenance hatch to the Mass Driver room be removed citing \"security concerns\"."
diff --git a/html/changelogs/AutoChangeLog-pr-9216.yml b/html/changelogs/AutoChangeLog-pr-9216.yml
new file mode 100644
index 0000000000..0be9314dbc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9216.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "oops not being blacklisted"
diff --git a/html/changelogs/AutoChangeLog-pr-9219.yml b/html/changelogs/AutoChangeLog-pr-9219.yml
new file mode 100644
index 0000000000..138991e507
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9219.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "ports a fix"
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 43d35d5df5..f783331c19 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 25c9b0eb06..40844c9a29 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi
index 4165719a3c..3ab7f4b510 100644
Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ
diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi
index 9b0bc9816b..029d49e196 100644
Binary files a/icons/obj/hydroponics/growing_fruits.dmi and b/icons/obj/hydroponics/growing_fruits.dmi differ
diff --git a/modular_citadel/code/controllers/subsystem/job.dm b/modular_citadel/code/controllers/subsystem/job.dm
index c433042ae6..46aef6f529 100644
--- a/modular_citadel/code/controllers/subsystem/job.dm
+++ b/modular_citadel/code/controllers/subsystem/job.dm
@@ -13,7 +13,7 @@
var/permitted = TRUE
if(G.restricted_roles && G.restricted_roles.len && !(M.mind.assigned_role in G.restricted_roles))
permitted = FALSE
- if(G.ckeywhitelist && G.ckeywhitelist.len && !(the_mob.client.ckey in G.ckeywhitelist))
+ if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey))
permitted = FALSE
if(!equipbackpackstuff && G.category == SLOT_IN_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs
permitted = FALSE
diff --git a/modular_citadel/code/modules/admin/chat_commands.dm b/modular_citadel/code/modules/admin/chat_commands.dm
index 39f4158646..501e0fa25a 100644
--- a/modular_citadel/code/modules/admin/chat_commands.dm
+++ b/modular_citadel/code/modules/admin/chat_commands.dm
@@ -27,19 +27,13 @@
var/list/speech_buffer
/datum/tgs_chat_command/poly/Run()
- GenerateSayList() //Has a check in here, but we're gunna sanity it after
- if(!speech_buffer)
- return "**BAWWWWWK!** LEAVE THE HEADSET! ***BAWKKKKK!!***"
-
-
-/datum/tgs_chat_command/poly/proc/GenerateSayList()
LAZYINITLIST(speech_buffer) //I figure this is just safe to do for everything at this point
if(length(speech_buffer)) //Let's not look up the whole json EVERY TIME, just the first time.
return "[pick(speech_buffer)]"
else
var/json_file = file("data/npc_saves/Poly.json")
if(!fexists(json_file))
- return
+ return "**BAWWWWWK!** LEAVE THE HEADSET! ***BAWKKKKK!!***"
var/list/json = json_decode(file2text(json_file))
speech_buffer = json["phrases"]
- return "[pick(speech_buffer)]"
\ No newline at end of file
+ return "[pick(speech_buffer)]"
diff --git a/modular_citadel/code/modules/client/loadout/loadout.dm b/modular_citadel/code/modules/client/loadout/_loadout.dm
similarity index 79%
rename from modular_citadel/code/modules/client/loadout/loadout.dm
rename to modular_citadel/code/modules/client/loadout/_loadout.dm
index 2e11519d0b..d48da1b863 100644
--- a/modular_citadel/code/modules/client/loadout/loadout.dm
+++ b/modular_citadel/code/modules/client/loadout/_loadout.dm
@@ -50,12 +50,32 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids)
var/path //item-to-spawn path
var/cost = 1 //normally, each loadout costs a single point.
var/geargroupID //defines the ID that the gear inherits from the config
+
+ //NEW DONATOR SYTSEM STUFF
+ var/donoritem //autoset on new if null
+ var/donator_group_id //New donator group ID system.
+ //END
+
var/list/restricted_roles
+
+ //Old donator system/snowflake ckey whitelist, used for single ckeys/exceptions
var/list/ckeywhitelist
+ //END
+
var/restricted_desc
/datum/gear/New()
- ..()
+ if(isnull(donoritem))
+ if(donator_group_id || ckeywhitelist)
+ donoritem = TRUE
if(!description && path)
var/obj/O = path
description = initial(O.desc)
+
+//a comprehensive donator check proc is intentionally not implemented due to the fact that we (((might))) have job-whitelists for donator items in the future and I like to stay on the safe side.
+
+//ckey only check
+/datum/gear/proc/donator_ckey_check(key)
+ if(ckeywhitelist && ckeywhitelist.Find(key))
+ return TRUE
+ return IS_CKEY_DONATOR_GROUP(key, donator_group_id)
diff --git a/modular_citadel/icons/obj/clothing/hats.dmi b/modular_citadel/icons/obj/clothing/hats.dmi
new file mode 100644
index 0000000000..ba9b4b5f8e
Binary files /dev/null and b/modular_citadel/icons/obj/clothing/hats.dmi differ
diff --git a/sound/music/flyinghigh.ogg b/sound/music/flyinghigh.ogg
new file mode 100644
index 0000000000..4f1aa1458a
Binary files /dev/null and b/sound/music/flyinghigh.ogg differ
diff --git a/sound/music/samsara.ogg b/sound/music/samsara.ogg
new file mode 100644
index 0000000000..4842aab3e5
Binary files /dev/null and b/sound/music/samsara.ogg differ
diff --git a/sound/music/theend.ogg b/sound/music/theend.ogg
new file mode 100644
index 0000000000..52255eee2a
Binary files /dev/null and b/sound/music/theend.ogg differ
diff --git a/strings/round_start_sounds.txt b/strings/round_start_sounds.txt
index a8409188fc..c67bf6b4a6 100644
--- a/strings/round_start_sounds.txt
+++ b/strings/round_start_sounds.txt
@@ -22,3 +22,6 @@ sound/music/goodbyemoonmen.ogg
sound/music/flytothemoon_otomatone.ogg
sound/music/milkyway.ogg
sound/music/rocketridersprayer.ogg
+sound/music/theend.ogg
+sound/music/flyinghigh.ogg
+sound/music/samsara.ogg
diff --git a/tgstation.dme b/tgstation.dme
index eb31ed8802..4cd910ea0f 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -41,6 +41,7 @@
#include "code\__DEFINES\cult.dm"
#include "code\__DEFINES\diseases.dm"
#include "code\__DEFINES\DNA.dm"
+#include "code\__DEFINES\donator_groupings.dm"
#include "code\__DEFINES\events.dm"
#include "code\__DEFINES\exports.dm"
#include "code\__DEFINES\flags.dm"
@@ -115,6 +116,7 @@
#include "code\__HELPERS\AStar.dm"
#include "code\__HELPERS\cmp.dm"
#include "code\__HELPERS\dates.dm"
+#include "code\__HELPERS\donator_groupings.dm"
#include "code\__HELPERS\files.dm"
#include "code\__HELPERS\game.dm"
#include "code\__HELPERS\global_lists.dm"
@@ -159,6 +161,7 @@
#include "code\_globalvars\lists\maintenance_loot.dm"
#include "code\_globalvars\lists\mapping.dm"
#include "code\_globalvars\lists\medals.dm"
+#include "code\_globalvars\lists\misc.dm"
#include "code\_globalvars\lists\mobs.dm"
#include "code\_globalvars\lists\names.dm"
#include "code\_globalvars\lists\objects.dm"
@@ -218,6 +221,7 @@
#include "code\controllers\configuration\configuration.dm"
#include "code\controllers\configuration\entries\comms.dm"
#include "code\controllers\configuration\entries\dbconfig.dm"
+#include "code\controllers\configuration\entries\donator.dm"
#include "code\controllers\configuration\entries\game_options.dm"
#include "code\controllers\configuration\entries\general.dm"
#include "code\controllers\subsystem\acid.dm"
@@ -1729,6 +1733,7 @@
#include "code\modules\hydroponics\grown\mushrooms.dm"
#include "code\modules\hydroponics\grown\nettle.dm"
#include "code\modules\hydroponics\grown\onion.dm"
+#include "code\modules\hydroponics\grown\peach.dm"
#include "code\modules\hydroponics\grown\peanuts.dm"
#include "code\modules\hydroponics\grown\pineapple.dm"
#include "code\modules\hydroponics\grown\potato.dm"
@@ -2938,6 +2943,7 @@
#include "modular_citadel\code\modules\client\preferences_savefile.dm"
#include "modular_citadel\code\modules\client\preferences_toggles.dm"
#include "modular_citadel\code\modules\client\loadout\__donator.dm"
+#include "modular_citadel\code\modules\client\loadout\_loadout.dm"
#include "modular_citadel\code\modules\client\loadout\_medical.dm"
#include "modular_citadel\code\modules\client\loadout\_security.dm"
#include "modular_citadel\code\modules\client\loadout\_service.dm"
@@ -2946,7 +2952,6 @@
#include "modular_citadel\code\modules\client\loadout\gloves.dm"
#include "modular_citadel\code\modules\client\loadout\hands.dm"
#include "modular_citadel\code\modules\client\loadout\head.dm"
-#include "modular_citadel\code\modules\client\loadout\loadout.dm"
#include "modular_citadel\code\modules\client\loadout\mask.dm"
#include "modular_citadel\code\modules\client\loadout\neck.dm"
#include "modular_citadel\code\modules\client\loadout\shoes.dm"