Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/Fluffy-Frontier/FluffySTG
Browse files Browse the repository at this point in the history
…into upstream-mirror-1209
  • Loading branch information
Iajret committed Mar 1, 2024
2 parents 75c8fc2 + dff75c0 commit f53c481
Show file tree
Hide file tree
Showing 126 changed files with 1,730 additions and 388 deletions.
38 changes: 20 additions & 18 deletions code/__DEFINES/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -78,38 +78,40 @@
#define ALIEN_BODYPART "alien"
#define LARVA_BODYPART "larva"

//Bodytype defines for how things can be worn, surgery, and other misc things.
//Bodytype defines for surgery, and other misc things.
///The limb is organic.
#define BODYTYPE_ORGANIC (1<<0)
///The limb is robotic.
#define BODYTYPE_ROBOTIC (1<<1)
///The limb fits the human mold. This is not meant to be literal, if the sprite "fits" on a human, it is "humanoid", regardless of origin.
#define BODYTYPE_HUMANOID (1<<2)
///The limb fits the monkey mold.
#define BODYTYPE_MONKEY (1<<3)
///The limb is digitigrade.
#define BODYTYPE_DIGITIGRADE (1<<4)
///The limb is snouted.
#define BODYTYPE_SNOUTED (1<<5)
///A placeholder bodytype for xeno larva, so their limbs cannot be attached to anything.
#define BODYTYPE_LARVA_PLACEHOLDER (1<<6)
#define BODYTYPE_LARVA_PLACEHOLDER (1<<2)
///The limb is from a xenomorph.
#define BODYTYPE_ALIEN (1<<7)
#define BODYTYPE_ALIEN (1<<3)
///The limb is from a golem
#define BODYTYPE_GOLEM (1<<8)
#define BODYTYPE_GOLEM (1<<4)
// NOVA EDIT ADDITION
///The limb fits a modular custom shape
#define BODYTYPE_CUSTOM (1<<9)
#define BODYSHAPE_CUSTOM (1<<9)
///The limb fits a taur body
#define BODYTYPE_TAUR (1<<10)
#define BODYSHAPE_TAUR (1<<10)
///The limb causes shoes to no longer be displayed, useful for taurs.
#define BODYTYPE_HIDE_SHOES (1<<11)
#define BODYSHAPE_HIDE_SHOES (1<<11)
///The limb causes glasses and hats to be drawn on layers 5 and 4 respectively. Currently used for snouts with the (Top) suffix, which are drawn on layer 6 and would normally cover facewear
#define BODYTYPE_ALT_FACEWEAR_LAYER (1<<12)
#define BODYSHAPE_ALT_FACEWEAR_LAYER (1<<12)
// NOVA EDIT END

#define BODYTYPE_BIOSCRAMBLE_COMPATIBLE (BODYTYPE_HUMANOID | BODYTYPE_MONKEY | BODYTYPE_ALIEN)
#define BODYTYPE_CAN_BE_BIOSCRAMBLED(bodytype) (!(bodytype & BODYTYPE_ROBOTIC) && (bodytype & BODYTYPE_BIOSCRAMBLE_COMPATIBLE))
// Bodyshape defines for how things can be worn, i.e., what "shape" the mob sprite is
///The limb fits the human mold. This is not meant to be literal, if the sprite "fits" on a human, it is "humanoid", regardless of origin.
#define BODYSHAPE_HUMANOID (1<<0)
///The limb fits the monkey mold.
#define BODYSHAPE_MONKEY (1<<1)
///The limb is digitigrade.
#define BODYSHAPE_DIGITIGRADE (1<<2)
///The limb is snouted.
#define BODYSHAPE_SNOUTED (1<<3)

#define BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE (BODYTYPE_ROBOTIC | BODYTYPE_LARVA_PLACEHOLDER | BODYTYPE_GOLEM)
#define BODYTYPE_CAN_BE_BIOSCRAMBLED(bodytype) (!(bodytype & BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE))

// Defines for Species IDs. Used to refer to the name of a species, for things like bodypart names or species preferences.
#define SPECIES_ABDUCTOR "abductor"
Expand Down
45 changes: 45 additions & 0 deletions code/__DEFINES/~nova_defines/antag_optin_defines.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
//defines for antag opt in objective checking
//objectives check for all players with a value equal or greater than the 'threat' level of an objective then pick from that list
//command + sec roles are always opted in regardless of opt in status

/// For temporary or otherwise 'inconvenient' objectives like kidnapping or theft
#define OPT_IN_YES_TEMP 1
/// Cool with being killed or otherwise occupied but not removed from the round
#define OPT_IN_YES_KILL 2
/// Fine with being round removed.
#define OPT_IN_YES_ROUND_REMOVE 3

#define OPT_IN_YES_TEMP_STRING "Yes - Temporary/Inconvenience"
#define OPT_IN_YES_KILL_STRING "Yes - Kill"
#define OPT_IN_YES_ROUND_REMOVE_STRING "Yes - Round Remove"
#define OPT_IN_NOT_TARGET_STRING "No"

/// Assoc list of stringified opt_in_## define to the front-end string to show users as a representation of the setting.
GLOBAL_LIST_INIT(antag_opt_in_strings, list(
"0" = OPT_IN_NOT_TARGET_STRING,
"1" = OPT_IN_YES_TEMP_STRING,
"2" = OPT_IN_YES_KILL_STRING,
"3" = OPT_IN_YES_ROUND_REMOVE_STRING,
))

/// Assoc list of stringified opt_in_## define to the color associated with it.
GLOBAL_LIST_INIT(antag_opt_in_colors, list(
OPT_IN_NOT_TARGET_STRING = COLOR_GRAY,
OPT_IN_YES_TEMP_STRING = COLOR_EMERALD,
OPT_IN_YES_KILL_STRING = COLOR_ORANGE,
OPT_IN_YES_ROUND_REMOVE_STRING = COLOR_RED
))

/// Prefers not to be a target. Will still be a potential target if playing sec or command.
#define OPT_IN_NOT_TARGET 0

/// The minimum opt-in level for people playing sec.
#define SECURITY_OPT_IN_LEVEL OPT_IN_YES_KILL
/// The minimum opt-in level for people playing command.
#define COMMAND_OPT_IN_LEVEL OPT_IN_YES_KILL

/// The default opt in level for preferences and mindless mobs.
#define OPT_IN_DEFAULT_LEVEL OPT_IN_NOT_TARGET

/// If the player has any non-ghost role antags enabled, they are forced to use a minimum of this.
#define OPT_IN_ANTAG_ENABLED_LEVEL OPT_IN_YES_TEMP
6 changes: 4 additions & 2 deletions code/__DEFINES/~nova_defines/jobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
#define JOB_UNAVAILABLE_FLAVOUR (JOB_UNAVAILABLE_LANGUAGE + 1)
#define JOB_UNAVAILABLE_AUGMENT (JOB_UNAVAILABLE_FLAVOUR + 1)

#define SEC_RESTRICTED_QUIRKS "Blind" = TRUE, "Brain Tumor" = TRUE, "Deaf" = TRUE, "Paraplegic" = TRUE, "Hemiplegic" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Pacifist" = TRUE, "No Guns" = TRUE, "Illiterate" = TRUE, "Nerve Stapled" = TRUE
#define HEAD_RESTRICTED_QUIRKS "Blind" = TRUE, "Deaf" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Brain Tumor" = TRUE, "Illiterate" = TRUE
#define SEC_RESTRICTED_QUIRKS "Blind" = TRUE, "Brain Tumor" = TRUE, "Deaf" = TRUE, "Paraplegic" = TRUE, "Hemiplegic" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Pacifist" = TRUE, "No Guns" = TRUE, "Illiterate" = TRUE, "Nerve Stapled" = TRUE, "Underworld Connections" = TRUE
#define HEAD_RESTRICTED_QUIRKS "Blind" = TRUE, "Deaf" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Brain Tumor" = TRUE, "Illiterate" = TRUE, "Underworld Connections" = TRUE
#define HEAD_RESTRICTED_QUIRKS_QM "Blind" = TRUE, "Deaf" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Brain Tumor" = TRUE, "Illiterate" = TRUE
#define GUARD_RESTRICTED_QUIRKS "Blind" = TRUE, "Deaf" = TRUE, "Foreigner" = TRUE, "Pacifist" = TRUE, "Nerve Stapled" = TRUE
#define PRISONER_RESTRICTED_QUIRKS "Underworld Connections" = TRUE

#define RESTRICTED_QUIRKS_EXCEPTIONS list("Mute" = "Signer")

Expand Down
36 changes: 24 additions & 12 deletions code/_globalvars/bitfields.dm
Original file line number Diff line number Diff line change
Expand Up @@ -378,10 +378,6 @@ DEFINE_BITFIELD(reaction_flags, list(
DEFINE_BITFIELD(bodytype, list(
"BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC,
"BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC,
"BODYTYPE_HUMANOID" = BODYTYPE_HUMANOID,
"BODYTYPE_MONKEY" = BODYTYPE_MONKEY,
"BODYTYPE_DIGITIGRADE" = BODYTYPE_DIGITIGRADE,
"BODYTYPE_SNOUTED" = BODYTYPE_SNOUTED,
"BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER,
"BODYTYPE_ALIEN" = BODYTYPE_ALIEN,
"BODYTYPE_GOLEM" = BODYTYPE_GOLEM,
Expand All @@ -390,18 +386,34 @@ DEFINE_BITFIELD(bodytype, list(
DEFINE_BITFIELD(acceptable_bodytype, list(
"BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC,
"BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC,
"BODYTYPE_HUMANOID" = BODYTYPE_HUMANOID,
"BODYTYPE_MONKEY" = BODYTYPE_MONKEY,
"BODYTYPE_DIGITIGRADE" = BODYTYPE_DIGITIGRADE,
"BODYTYPE_SNOUTED" = BODYTYPE_SNOUTED,
"BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER,
"BODYTYPE_ALIEN" = BODYTYPE_ALIEN,
"BODYTYPE_GOLEM" = BODYTYPE_GOLEM,
))

DEFINE_BITFIELD(bodyshape, list(
"BODYSHAPE_HUMANOID" = BODYSHAPE_HUMANOID,
"BODYSHAPE_MONKEY" = BODYSHAPE_MONKEY,
"BODYSHAPE_DIGITIGRADE" = BODYSHAPE_DIGITIGRADE,
"BODYSHAPE_SNOUTED" = BODYSHAPE_SNOUTED,
// NOVA EDIT ADDITION - customization
"BODYSHAPE__CUSTOM" = BODYSHAPE_CUSTOM,
"BODYSHAPE__TAUR" = BODYSHAPE_TAUR,
"BODYSHAPE__HIDE_SHOES" = BODYSHAPE_HIDE_SHOES,
"BODYSHAPE__ALT_FACEWEAR_LAYER" = BODYSHAPE_ALT_FACEWEAR_LAYER,
// NOVA EDIT END
))

DEFINE_BITFIELD(acceptable_bodyshape, list(
"BODYSHAPE_HUMANOID" = BODYSHAPE_HUMANOID,
"BODYSHAPE_MONKEY" = BODYSHAPE_MONKEY,
"BODYSHAPE_DIGITIGRADE" = BODYSHAPE_DIGITIGRADE,
"BODYSHAPE_SNOUTED" = BODYSHAPE_SNOUTED,
// NOVA EDIT ADDITION - customization
"BODYTYPE_CUSTOM" = BODYTYPE_CUSTOM,
"BODYTYPE_TAUR" = BODYTYPE_TAUR,
"BODYTYPE_HIDE_SHOES" = BODYTYPE_HIDE_SHOES,
"BODYTYPE_ALT_FACEWEAR_LAYER" = BODYTYPE_ALT_FACEWEAR_LAYER,
"BODYSHAPE__CUSTOM" = BODYSHAPE_CUSTOM,
"BODYSHAPE__TAUR" = BODYSHAPE_TAUR,
"BODYSHAPE__HIDE_SHOES" = BODYSHAPE_HIDE_SHOES,
"BODYSHAPE__ALT_FACEWEAR_LAYER" = BODYSHAPE_ALT_FACEWEAR_LAYER,
// NOVA EDIT END
))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -942,12 +942,16 @@
/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/proc/find_original()
var/list/possible_targets = list()

var/opt_in_disabled = CONFIG_GET(flag/disable_antag_opt_in_preferences) // NOVA EDIT ADDITION - ANTAG OPT-IN
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(!player.client || !player.mind || player.stat)
continue
if(!(player.mind.assigned_role.job_flags & JOB_CREW_MEMBER))
continue
possible_targets += player
// NOVA EDIT ADDITION START - Players in the interlink can't be obsession targets + Antag Optin
if (!opt_in_disabled && player.mind?.get_effective_opt_in_level() < OPT_IN_YES_ROUND_REMOVE)
continue
// NOVA EDIT ADDITION END

if(possible_targets.len)
return pick(possible_targets)
Expand Down
5 changes: 5 additions & 0 deletions code/controllers/subsystem/materials.dm
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ SUBSYSTEM_DEF(materials)
new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_STRUCTURE),
)

///A list of dimensional themes used by the dimensional anomaly and other things, most of which require materials to function.
var/list/datum/dimension_theme/dimensional_themes

///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info)
/datum/controller/subsystem/materials/proc/InitializeMaterials()
materials = list()
Expand All @@ -47,6 +50,8 @@ SUBSYSTEM_DEF(materials)
continue // Do not initialize at mapload
InitializeMaterial(list(mat_type))

dimensional_themes = init_subtypes_w_path_keys(/datum/dimension_theme)

/** Creates and caches a material datum.
*
* Arugments:
Expand Down
7 changes: 5 additions & 2 deletions code/datums/brain_damage/creepy_trauma.dm
Original file line number Diff line number Diff line change
Expand Up @@ -131,15 +131,18 @@
var/list/special_pool = list() //The special list, for quirk-based
var/chosen_victim //The obsession target

var/opt_in_disabled = CONFIG_GET(flag/disable_antag_opt_in_preferences) // NOVA EDIT ADDITION - ANTAG OPT-IN
for(var/mob/player as anything in GLOB.player_list)//prevents crew members falling in love with nuke ops they never met, and other annoying hijinks
if(!player.client || !player.mind || isnewplayer(player) || player.stat == DEAD || isbrain(player) || player == owner)
continue
if(!(player.mind.assigned_role.job_flags & JOB_CREW_MEMBER))
continue
// NOVA EDIT ADDITION START - Players in the interlink can't be obsession targets
// NOVA EDIT ADDITION START - Players in the interlink can't be obsession targets + Antag Optin
if(SSticker.IsRoundInProgress() && istype(get_area(player), /area/centcom/interlink))
continue
// NOVA EDIT END
if (!opt_in_disabled && player.mind?.get_effective_opt_in_level() < OPT_IN_YES_KILL)
continue
// NOVA EDIT ADDITION END
viable_minds += player.mind
for(var/datum/mind/possible_target as anything in viable_minds)
if(possible_target != owner && ishuman(possible_target.current))
Expand Down
4 changes: 2 additions & 2 deletions code/datums/components/creamed.dm
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list(
qdel(src)
return
bodypart_overlay = new()
if(carbon_parent.bodytype & BODYTYPE_SNOUTED) //stupid, but external organ bodytypes are not stored on the limb
if(carbon_parent.bodyshape & BODYSHAPE_SNOUTED) //stupid, but external organ bodytypes are not stored on the limb
bodypart_overlay.icon_state = "creampie_lizard"
else if(my_head.bodytype & BODYTYPE_MONKEY)
else if(my_head.bodyshape & BODYSHAPE_MONKEY)
bodypart_overlay.icon_state = "creampie_monkey"
else
bodypart_overlay.icon_state = "creampie_human"
Expand Down
15 changes: 14 additions & 1 deletion code/game/gamemodes/objective.dm
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ GLOBAL_LIST_EMPTY(objectives) //NOVA EDIT ADDITION
var/datum/mind/O = I
if(O.late_joiner)
try_target_late_joiners = TRUE
var/opt_in_disabled = CONFIG_GET(flag/disable_antag_opt_in_preferences) // NOVA EDIT ADDITION - ANTAG OPT-IN
for(var/datum/mind/possible_target in get_crewmember_minds())
if(possible_target in owners)
continue
Expand All @@ -166,6 +167,10 @@ GLOBAL_LIST_EMPTY(objectives) //NOVA EDIT ADDITION
continue
if(!is_valid_target(possible_target))
continue
// NOVA EDIT ADDITION START - Antag Opt In
if (!opt_in_disabled && !opt_in_valid(possible_target))
continue
// NOVA EDIT ADDITION END
possible_targets += possible_target
if(try_target_late_joiners)
var/list/all_possible_targets = possible_targets.Copy()
Expand Down Expand Up @@ -871,7 +876,15 @@ GLOBAL_LIST_EMPTY(possible_items)
/datum/objective/destroy/find_target(dupe_search_range, list/blacklist)
var/list/possible_targets = active_ais(TRUE)
possible_targets -= blacklist
var/mob/living/silicon/ai/target_ai = pick(possible_targets)
//var/mob/living/silicon/ai/target_ai = pick(possible_targets) // NOVA EDIT REMOVAL - Uses the below loop
// NOVA EDIT ADDITION BEGIN - ANTAG OPTIN
var/mob/living/silicon/ai/target_ai
var/opt_in_disabled = CONFIG_GET(flag/disable_antag_opt_in_preferences) // NOVA EDIT ADDITION - ANTAG OPT-IN
for (var/mob/living/silicon/ai/possible_target as anything in shuffle(possible_targets))
if (!opt_in_disabled && !opt_in_valid(possible_target))
continue
target_ai = possible_target
// NOVA EDIT ADDITION END
target = target_ai.mind
update_explanation_text()
return target
Expand Down
3 changes: 0 additions & 3 deletions code/game/machinery/syndicatebomb.dm
Original file line number Diff line number Diff line change
Expand Up @@ -584,8 +584,6 @@

qdel(src)

<<<<<<< HEAD
=======
#define DIMENSION_CHOICE_RANDOM "None/Randomized"

/obj/item/bombcore/dimensional
Expand Down Expand Up @@ -650,7 +648,6 @@

#undef DIMENSION_CHOICE_RANDOM

>>>>>>> beb979d19ac ([MIRROR] [NO GBP] Fixing the multi-dimensional bomb payload (#1209))
///Syndicate Detonator (aka the big red button)///

/obj/item/syndicatedetonator
Expand Down
10 changes: 7 additions & 3 deletions code/game/objects/effects/anomalies/anomalies_dimensional.dm
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@
animate(src, transform = matrix()*0.85, time = 3, loop = -1)
animate(transform = matrix(), time = 3, loop = -1)

/obj/effect/anomaly/dimensional/Destroy()
theme = null
target_turfs = null
return ..()

/obj/effect/anomaly/dimensional/anomalyEffect(seconds_per_tick)
. = ..()
transmute_area()
Expand All @@ -36,8 +41,7 @@
return

var/turf/affected_turf = target_turfs[1]
new /obj/effect/temp_visual/transmute_tile_flash(affected_turf)
theme.apply_theme(affected_turf)
theme.apply_theme(affected_turf, show_effect = TRUE)
target_turfs -= affected_turf

/**
Expand All @@ -47,7 +51,7 @@
/obj/effect/anomaly/dimensional/proc/prepare_area(new_theme_path)
if (!new_theme_path)
new_theme_path = pick(subtypesof(/datum/dimension_theme))
theme = new new_theme_path()
theme = SSmaterials.dimensional_themes[new_theme_path]
apply_theme_icon()

target_turfs = list()
Expand Down
30 changes: 19 additions & 11 deletions code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

/**
* Datum which describes a theme and replaces turfs and objects in specified locations to match that theme
*/
Expand Down Expand Up @@ -44,12 +43,16 @@
*
* Arguments
* * affected_turf - Turf to transform.
* * skip_sound - If the sound shouldn't be played.
* * show_effect - if the temp visual effect should be shown.
*/
/datum/dimension_theme/proc/apply_theme(turf/affected_turf, skip_sound = FALSE)
/datum/dimension_theme/proc/apply_theme(turf/affected_turf, skip_sound = FALSE, show_effect = FALSE)
if (!replace_turf(affected_turf))
return
if (!skip_sound)
playsound(affected_turf, sound, 100, TRUE)
if(show_effect)
new /obj/effect/temp_visual/transmute_tile_flash(affected_turf)
for (var/obj/object in affected_turf)
replace_object(object)
if (length(random_spawns) && prob(random_spawn_chance) && !affected_turf.is_blocked_turf(exclude_mobs = TRUE))
Expand Down Expand Up @@ -250,7 +253,7 @@
/datum/dimension_theme/radioactive
name = "Radioactive"
icon = 'icons/obj/ore.dmi'
icon_state = "Uranium ore"
icon_state = "uranium"
material = /datum/material/uranium
sound = 'sound/items/welder.ogg'

Expand Down Expand Up @@ -353,7 +356,14 @@
name = "Fancy"
icon = 'icons/obj/clothing/head/costume.dmi'
icon_state = "fancycrown"
replace_floors = null
replace_walls = /turf/closed/wall/mineral/wood/nonmetal
replace_objs = list(
/obj/structure/chair = list(/obj/structure/chair/comfy = 1),
/obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1),
)
///cooldown for changing carpets, It's kinda dull to always use the same one, but we also can't make it too random.
COOLDOWN_DECLARE(carpet_switch_cd)

#define FANCY_CARPETS list(\
/turf/open/floor/eighties, \
Expand All @@ -369,14 +379,12 @@
/turf/open/floor/carpet/royalblack, \
/turf/open/floor/carpet/royalblue,)

/datum/dimension_theme/fancy/New()
. = ..()
replace_floors = list(pick(FANCY_CARPETS) = 1)
replace_objs = list(
/obj/structure/chair = list(/obj/structure/chair/comfy = 1),
/obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1),
/obj/structure/table/wood = list(pick(subtypesof(/obj/structure/table/wood/fancy)) = 1),
)
/datum/dimension_theme/fancy/apply_theme(turf/affected_turf, skip_sound = FALSE, show_effect = FALSE)
if(COOLDOWN_FINISHED(src, carpet_switch_cd))
replace_floors = list(pick(FANCY_CARPETS) = 1)
replace_objs[/obj/structure/table/wood] = list(pick(subtypesof(/obj/structure/table/wood/fancy)) = 1)
COOLDOWN_START(src, carpet_switch_cd, 90 SECONDS)
return ..()

#undef FANCY_CARPETS

Expand Down
Loading

0 comments on commit f53c481

Please sign in to comment.