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"