Skip to content

Commit

Permalink
[MIRROR] Starlight Control (Aurora works now, space gas doesn't touch…
Browse files Browse the repository at this point in the history
… starlight, narsie ending effects) [MDB IGNORE] (#24406)

* Starlight Control (Aurora works now, space gas doesn't touch starlight, narsie ending effects) (#78877)

## About The Pull Request

[Implements a setter for starlight
variables](tgstation/tgstation@af34f06)

I want to start to modify starlight more, and that means I need a way to
hook into everything that uses it and update it, so we can modify it on
the fly.

This does that, alongside removing space overlays from nearspace (too
many false positives) and making the aurora modify all turfs projecting
starlight, rather then all turfs in an area.

Do still need to figure out handling for the starlight color usage in
turf underlays tho (I gave up, we just keep it static. I'll fix it
someday but the render_relay strategy just doesn't work with its masking
setup)

[Reworks how starlight overlays
work](tgstation/tgstation@9da4bc3)

Instead of setting color on the overlays directly, we instead store an
object with our current settings in every mob's screen, and
render_target it down onto our overlays.

This lets us update overlay colors VERY trivially. Just need to set
color on the overlay var. Makes modifying starlight a lot cheaper.

It doesn't work on area overlays, because suffering, and it MIGHT induce
extra cost on clients. if it does we can do something about that, we'll
play it by ear

[Removes parallax starlight
coloring.](tgstation/tgstation@5f701a1)

I'm sorta iffy on the color, the effect can be real oppressive in some
cases, and I'd like to use starlight color for more events in world, and
having it vary can make that looking nice hard.

[Adds some visual effects to narsie being
summoned](tgstation/tgstation@a423cfc)

As the rune drawing progresses space (starlight and parallax) go from
normal to greyscale. Then, right about when narsie shows up, starlight
becomes vibrant red.

It's a nice effect. I wanna do more shit like this, I think it'll
improve vibes significantly.
## Why It's Good For The Game

Can't embed it because of github's upload limit, can show a
[link](https://cdn.discordapp.com/attachments/458452245256601615/1160821856358645860/2023-10-08_22-31-22.mp4?ex=65360e99&is=65239999&hm=680e33e4e0026b89e132afc50c04a648a24f869eb662f274a381a5de5c5a36f2&)
for the narsie stuff

Here's
[one](https://cdn.discordapp.com/attachments/326831214667235328/1160813747196141568/2023-10-08_22-34-10.mp4?ex=6536070c&is=6523920c&hm=f8d571d1013da89887f49f3fec99f632251eeeac83085aa7dde97009aee3922f&)
for the aurora too.

This gives us more pretty starlight shit, and the ABILITY to do more
pretty starlight shit. I'm pretty jazzed, and I hope people use this
proc more (keeping in mind that it's pretty hard on the lighting system,
and needs significant delay between changes)
## Changelog

🆑
add: Narsie summoning has had some effects added to space and starlight
del: Removes the link between spacegas color and starlight. It was a
slight bit too vibrant and I think impacted the vibe too wildly to be
incidental.
fix: The aurora event actually... works now. Space lights up and all
that
/🆑

* Starlight Control (Aurora works now, space gas doesn't touch starlight, narsie ending effects)

* Update space.dm

* Update shuttles.dm

---------

Co-authored-by: LemonInTheDark <[email protected]>
Co-authored-by: Bloop <[email protected]>
  • Loading branch information
3 people authored and FFMirrorBot committed Oct 18, 2023
1 parent e4f69d1 commit 7e2ac68
Show file tree
Hide file tree
Showing 29 changed files with 447 additions and 127 deletions.
6 changes: 6 additions & 0 deletions code/__DEFINES/dcs/signals/signals_global.dm
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,13 @@
/// Global signal when light debugging is canceled
#define COMSIG_LIGHT_DEBUG_DISABLED "!light_debug_disabled"

/// Global signal when starlight color is changed (old_star, new_star)
#define COMSIG_STARLIGHT_COLOR_CHANGED "!starlight_color_changed"

/// Global signal sent when a religious sect is chosen
#define COMSIG_RELIGIOUS_SECT_CHANGED "!religious_sect_changed"
/// Global signal sent when a religious sect is reset
#define COMSIG_RELIGIOUS_SECT_RESET "!religious_sect_reset"

/// Global signal sent when narsie summon count is updated: (new count)
#define COMSIG_NARSIE_SUMMON_UPDATE "!narsie_summon_update"
8 changes: 3 additions & 5 deletions code/__DEFINES/flags.dm
Original file line number Diff line number Diff line change
Expand Up @@ -130,14 +130,12 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define ABDUCTOR_PROOF (1<<11)
/// If blood cultists can draw runes or build structures on this AREA.
#define CULT_PERMITTED (1<<12)
///Whther this area is iluminated by starlight. Used by the aurora_caelus event
#define AREA_USES_STARLIGHT (1<<13)
/// If engravings are persistent in this area
#define PERSISTENT_ENGRAVINGS (1<<14)
#define PERSISTENT_ENGRAVINGS (1<<13)
/// Mobs that die in this area don't produce a dead chat message
#define NO_DEATH_MESSAGE (1<<15)
#define NO_DEATH_MESSAGE (1<<14)
/// This area should have extra shielding from certain event effects
#define EVENT_PROTECTED (1<<16)
#define EVENT_PROTECTED (1<<15)

/*
These defines are used specifically with the atom/pass_flags bitmask
Expand Down
3 changes: 3 additions & 0 deletions code/__DEFINES/gradient.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// spacemandmm doesn't really implement gradient() right, so let's just handle that here yeah?
#define hsl_gradient(index, args...) UNLINT(gradient(args, space = COLORSPACE_HSL, index))
#define hsv_gradient(index, args...) UNLINT(gradient(args, space = COLORSPACE_HSV, index))
4 changes: 4 additions & 0 deletions code/__DEFINES/space.dm
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
#define SPACE_SIGNAL_GPSTAG "Distant Signal"

/// Every mob in the game will have a screen object sitting inside them with a reference matching this
/// So you can render_source against it and never need to update it again
#define SPACE_OVERLAY_RENDER_TARGET(offset) "*space_overlay_target[offset]"
1 change: 0 additions & 1 deletion code/_globalvars/bitfields.dm
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ DEFINE_BITFIELD(appearance_flags, list(

DEFINE_BITFIELD(area_flags, list(
"ABDUCTOR_PROOF" = ABDUCTOR_PROOF,
"AREA_USES_STARLIGHT" = AREA_USES_STARLIGHT,
"BLOBS_ALLOWED" = BLOBS_ALLOWED,
"BLOCK_SUICIDE" = BLOCK_SUICIDE,
"CAVES_ALLOWED" = CAVES_ALLOWED,
Expand Down
29 changes: 29 additions & 0 deletions code/_onclick/hud/hud.dm
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,11 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(
var/ui_style
var/erp_ui_style //SKYRAT EDIT - ADDITION - ERP ICONS FIX

// List of weakrefs to objects that we add to our screen that we don't expect to DO anything
// They typically use * in their render target. They exist solely so we can reuse them,
// and avoid needing to make changes to all idk 300 consumers if we want to change the appearance
var/list/asset_refs_for_reuse = list()

/datum/hud/New(mob/owner)
mymob = owner

Expand Down Expand Up @@ -155,6 +160,11 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(

owner.overlay_fullscreen("see_through_darkness", /atom/movable/screen/fullscreen/see_through_darkness)

// Register onto the global spacelight appearances
// So they can be render targeted by anything in the world
for(var/obj/starlight_appearance/starlight as anything in GLOB.starlight_objects)
register_reuse(starlight)

RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_plane_increase))
RegisterSignal(mymob, COMSIG_MOB_LOGIN, PROC_REF(client_refresh))
RegisterSignal(mymob, COMSIG_MOB_LOGOUT, PROC_REF(clear_client))
Expand Down Expand Up @@ -274,6 +284,8 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(

/datum/hud/proc/on_plane_increase(datum/source, old_max_offset, new_max_offset)
SIGNAL_HANDLER
for(var/i in old_max_offset + 1 to new_max_offset)
register_reuse(GLOB.starlight_objects[i + 1])
build_plane_groups(old_max_offset + 1, new_max_offset)

/// Creates the required plane masters to fill out new z layers (because each "level" of multiz gets its own plane master set)
Expand Down Expand Up @@ -402,6 +414,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(
reorganize_alerts(screenmob)
screenmob.reload_fullscreen()
update_parallax_pref(screenmob)
update_reuse(screenmob)

// ensure observers get an accurate and up-to-date view
if (!viewmob)
Expand Down Expand Up @@ -453,6 +466,22 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(
ui_style = new_ui_style
build_hand_slots()

/datum/hud/proc/register_reuse(atom/movable/screen/reuse)
asset_refs_for_reuse += WEAKREF(reuse)
mymob?.client?.screen += reuse

/datum/hud/proc/unregister_reuse(atom/movable/screen/reuse)
asset_refs_for_reuse -= WEAKREF(reuse)
mymob?.client?.screen -= reuse

/datum/hud/proc/update_reuse(mob/show_to)
for(var/datum/weakref/screen_ref as anything in asset_refs_for_reuse)
var/atom/movable/screen/reuse = screen_ref.resolve()
if(isnull(reuse))
asset_refs_for_reuse -= screen_ref
continue
show_to.client?.screen += reuse

//Triggered when F12 is pressed (Unless someone changed something in the DMF)
/mob/verb/button_pressed_F12()
set name = "F12"
Expand Down
19 changes: 10 additions & 9 deletions code/_onclick/hud/parallax/random_layer.dm
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/// Parallax layers that vary between rounds. Has come code to make sure we all have the same one
/// Parallax layers that vary between rounds. Has some code to make sure we all have the same one
/atom/movable/screen/parallax_layer/random
blend_mode = BLEND_OVERLAY
speed = 2
Expand All @@ -12,23 +12,24 @@

/// Make this layer unique, with color or position or something
/atom/movable/screen/parallax_layer/random/proc/get_random_look()
return

/// Copy a parallax instance to ensure parity between everyones parallax
/atom/movable/screen/parallax_layer/random/proc/copy_parallax(atom/movable/screen/parallax_layer/random/twin)
return

/// For applying minor effects related to parallax. If you want big stuff, put it in a station trait or something
/atom/movable/screen/parallax_layer/random/proc/apply_global_effects()
return

/// Gassy background with a few random colors, also tints starlight!
/// Gassy background with a few random colors
/atom/movable/screen/parallax_layer/random/space_gas
icon_state = "space_gas"

/// The colors we can be
var/possible_colors = list(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE)
/// The color we are. If starlight_color is not set, we also become the starlight color
/// The color we are
var/parallax_color
/// The color we give to starlight
var/starlight_color

/atom/movable/screen/parallax_layer/random/space_gas/get_random_look()
parallax_color = parallax_color || pick(possible_colors)
Expand All @@ -37,13 +38,13 @@
parallax_color = twin.parallax_color
add_atom_colour(parallax_color, ADMIN_COLOUR_PRIORITY)

/atom/movable/screen/parallax_layer/random/space_gas/apply_global_effects()
GLOB.starlight_color = starlight_color || parallax_color

/// Space gas but green for the radioactive nebula station trait
/atom/movable/screen/parallax_layer/random/space_gas/radioactive
parallax_color = list(0,0,0,0, 0,2,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //very vibrant green
starlight_color = COLOR_VIBRANT_LIME

/atom/movable/screen/parallax_layer/random/space_gas/radioactive/apply_global_effects()
. = ..()
set_base_starlight("#189156")

/// Big asteroid rocks appear in the background
/atom/movable/screen/parallax_layer/random/asteroids
Expand Down
30 changes: 30 additions & 0 deletions code/_onclick/hud/rendering/plane_master.dm
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,9 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master)
// You aren't the source? don't change yourself
return
RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_increase))
RegisterSignal(SSdcs, COMSIG_NARSIE_SUMMON_UPDATE, PROC_REF(narsie_modified))
if(GLOB.narsie_summon_count >= 1)
narsie_start_midway(GLOB.narsie_effect_last_modified) // We assume we're on the start, so we can use this number
offset_increase(0, SSmapping.max_plane_offset)

/atom/movable/screen/plane_master/parallax/proc/on_offset_increase(datum/source, old_offset, new_offset)
Expand Down Expand Up @@ -332,6 +335,33 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master)
// If we're outside bounds AND we're the 0th plane, we need to show cause parallax is hacked to hell
return offset != 0 && is_outside_bounds

/// Starts the narsie animation midway, so we can catch up to everyone else quickly
/atom/movable/screen/plane_master/parallax/proc/narsie_start_midway(start_time)
var/time_elapsed = world.time - start_time
narsie_summoned_effect(max(16 SECONDS - time_elapsed, 0))

/// Starts the narsie animation, make us grey, then red
/atom/movable/screen/plane_master/parallax/proc/narsie_modified(datum/source, new_count)
SIGNAL_HANDLER
if(new_count >= 1)
narsie_summoned_effect(16 SECONDS)
else
narsie_unsummoned()

/atom/movable/screen/plane_master/parallax/proc/narsie_summoned_effect(animate_time)
if(GLOB.narsie_summon_count >= 2)
var/static/list/nightmare_parallax = list(255,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, -130,0,0,0)
animate(src, color = nightmare_parallax, time = animate_time)
return

var/static/list/grey_parallax = list(0.4,0.4,0.4,0, 0.4,0.4,0.4,0, 0.4,0.4,0.4,0, 0,0,0,1, -0.1,-0.1,-0.1,0)
// We're gonna animate ourselves grey
// Then, once it's done, about 40 seconds into the event itself, we're gonna start doin some shit. see below
animate(src, color = grey_parallax, time = animate_time)

/atom/movable/screen/plane_master/parallax/proc/narsie_unsummoned()
animate(src, color = null, time = 8 SECONDS)

/atom/movable/screen/plane_master/gravpulse
name = "Gravpulse"
documentation = "Ok so this one's fun. Basically, we want to be able to distort the game plane when a grav annom is around.\
Expand Down
9 changes: 6 additions & 3 deletions code/controllers/subsystem/lighting.dm
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ SUBSYSTEM_DEF(lighting)
var/static/list/sources_queue = list() // List of lighting sources queued for update.
var/static/list/corners_queue = list() // List of lighting corners queued for update.
var/static/list/objects_queue = list() // List of lighting objects queued for update.
var/static/list/current_sources = list()
#ifdef VISUALIZE_LIGHT_UPDATES
var/allow_duped_values = FALSE
var/allow_duped_corners = FALSE
Expand All @@ -30,11 +31,13 @@ SUBSYSTEM_DEF(lighting)
if(!init_tick_checks)
MC_SPLIT_TICK

var/list/queue
var/i = 0
if(!resumed)
current_sources = sources_queue
sources_queue = list()

// UPDATE SOURCE QUEUE
queue = sources_queue
var/i = 0
var/list/queue = current_sources
while(i < length(queue)) //we don't use for loop here because i cannot be changed during an iteration
i += 1

Expand Down
3 changes: 2 additions & 1 deletion code/controllers/subsystem/mapping.dm
Original file line number Diff line number Diff line change
Expand Up @@ -885,7 +885,8 @@ GLOBAL_LIST_EMPTY(the_station_areas)
/datum/controller/subsystem/mapping/proc/generate_offset_lists(gen_from, new_offset)
create_plane_offsets(gen_from, new_offset)
for(var/offset in gen_from to new_offset)
GLOB.fullbright_overlays += create_fullbright_overlay(offset)
GLOB.starlight_objects += starlight_object(offset)
GLOB.starlight_overlays += starlight_overlay(offset)

for(var/datum/gas/gas_type as anything in GLOB.meta_gas_info)
var/list/gas_info = GLOB.meta_gas_info[gas_type]
Expand Down
11 changes: 11 additions & 0 deletions code/datums/components/cult_ritual_item.dm
Original file line number Diff line number Diff line change
Expand Up @@ -310,12 +310,23 @@
if(!initial(rune_to_scribe.no_scribe_boost) && (our_turf.type in turfs_that_boost_us))
scribe_mod *= 0.5

var/scribe_started = initial(rune_to_scribe.started_creating)
var/scribe_failed = initial(rune_to_scribe.failed_to_create)
if(scribe_started)
var/datum/callback/startup = CALLBACK(GLOBAL_PROC, scribe_started)
startup.Invoke()
var/datum/callback/failed
if(scribe_failed)
failed = CALLBACK(GLOBAL_PROC, scribe_failed)

SEND_SOUND(cultist, sound('sound/weapons/slice.ogg', 0, 1, 10))
if(!do_after(cultist, scribe_mod, target = get_turf(cultist), timed_action_flags = IGNORE_SLOWDOWNS))
cleanup_shields()
failed?.Invoke()
return FALSE
if(!can_scribe_rune(tool, cultist))
cleanup_shields()
failed?.Invoke()
return FALSE

cultist.visible_message(
Expand Down
17 changes: 13 additions & 4 deletions code/datums/materials/_material.dm
Original file line number Diff line number Diff line change
Expand Up @@ -162,11 +162,17 @@ Simple datum which is instanced once per type and is used for every object of sa
// We assume no parallax means no space means no light
if(SSmapping.level_trait(on.z, ZTRAIT_NOPARALLAX))
return
on.set_light(2, 0.75, get_starlight_color())
if(!starlight_color)
on.RegisterSignal(SSdcs, COMSIG_STARLIGHT_COLOR_CHANGED, TYPE_PROC_REF(/turf, material_starlight_changed))
RegisterSignal(on, COMSIG_QDELETING, PROC_REF(lit_turf_deleted))
on.set_light(2, 0.75, starlight_color || GLOB.starlight_color)

///Gets the space color and possible changed color if space is different
/datum/material/proc/get_starlight_color()
return starlight_color || GLOB.starlight_color
/turf/proc/material_starlight_changed(datum/source, old_star, new_star)
if(light_color == old_star)
set_light_color(new_star)

/datum/material/proc/lit_turf_deleted(turf/source)
source.set_light(0, 0, null)

/datum/material/proc/get_greyscale_config_for(datum/greyscale_config/config_path)
if(!config_path)
Expand Down Expand Up @@ -220,6 +226,9 @@ Simple datum which is instanced once per type and is used for every object of sa
/datum/material/proc/on_removed_turf(turf/T, amount, material_flags)
if(alpha < 255)
T.RemoveElement(/datum/element/turf_z_transparency)
// yeets glow
T.UnregisterSignal(SSdcs, COMSIG_STARLIGHT_COLOR_CHANGED)
T.set_light(0, 0, null)

/**
* This proc is called when the mat is found in an item that's consumed by accident. see /obj/item/proc/on_accidental_consumption.
Expand Down
5 changes: 4 additions & 1 deletion code/game/area/areas/misc.dm
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@

/area/space/nearstation
icon_state = "space_near"
area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT
area_flags = UNIQUE_AREA
static_lighting = TRUE
base_lighting_alpha = 0
base_lighting_color = null

/area/misc/start
name = "start area"
Expand Down
6 changes: 3 additions & 3 deletions code/game/area/areas/ruins/space.dm
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
// Ruin solars define, /area/solars was moved to /area/station/solars, causing the solars specific areas to lose their properties
/area/ruin/space/solars
requires_power = FALSE
area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT
area_flags = UNIQUE_AREA
flags_1 = NONE
ambience_index = AMBIENCE_ENGI
airlock_wires = /datum/wires/airlock/engineering
Expand Down Expand Up @@ -311,7 +311,7 @@
icon = 'icons/area/areas_ruins.dmi' // Solars inheriet areas_misc.dmi, not areas_ruin.dmi
icon_state = "os_charlie_solars"
requires_power = FALSE
area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT
area_flags = UNIQUE_AREA
sound_environment = SOUND_AREA_SPACE

/area/ruin/space/ancientstation/charlie/storage
Expand Down Expand Up @@ -535,7 +535,7 @@
/area/ruin/space/djstation/solars
name = "\improper DJ Station Solars"
icon_state = "DJ"
area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT
area_flags = UNIQUE_AREA
has_gravity = STANDARD_GRAVITY

/area/ruin/space/djstation/service
Expand Down
2 changes: 1 addition & 1 deletion code/game/area/areas/station/solars.dm
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/area/station/solars
icon_state = "panels"
requires_power = FALSE
area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT
area_flags = UNIQUE_AREA
flags_1 = NONE
ambience_index = AMBIENCE_ENGI
airlock_wires = /datum/wires/airlock/engineering
Expand Down
6 changes: 5 additions & 1 deletion code/game/atoms_movable.dm
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,11 @@
QDEL_NULL(em_block)
// We're gonna build a light, and mask it with the base turf's appearance
// grab a 32x32 square of it
var/mutable_appearance/light = new(GLOB.fullbright_overlays[GET_TURF_PLANE_OFFSET(generate_for) + 1])
// I would like to use GLOB.starbright_overlays here
// But that breaks down for... some? reason. I think recieving a render relay breaks keep_together or something
// So we're just gonna accept that this'll break with starlight color changing. hardly matters since this is really only for offset stuff, but I'd love to fix it someday
var/mutable_appearance/light = new(GLOB.starlight_objects[GET_TURF_PLANE_OFFSET(generate_for) + 1])
light.render_target = ""
light.appearance_flags |= KEEP_TOGETHER
// Now apply a copy of the turf, set to multiply
// This will multiply against our light, so we only light up the bits that aren't "on" the wall
Expand Down
9 changes: 9 additions & 0 deletions code/game/turfs/open/floor/glass.dm
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
/turf/open/floor/glass/Destroy()
. = ..()
QDEL_LIST(glow_stuff)
UnregisterSignal(SSdcs, COMSIG_STARLIGHT_COLOR_CHANGED)

/// If this turf is at the bottom of the local rendering stack
/// Then we're gonna make it emissive block so the space below glows
Expand All @@ -51,8 +52,16 @@
return

glow_stuff = partially_block_emissives(src, alpha_to_leave)
if(!starlight_color)
RegisterSignal(SSdcs, COMSIG_STARLIGHT_COLOR_CHANGED, PROC_REF(starlight_changed))
else
UnregisterSignal(SSdcs, COMSIG_STARLIGHT_COLOR_CHANGED)
set_light(2, 0.75, starlight_color || GLOB.starlight_color)

/turf/open/floor/glass/proc/starlight_changed(datum/source, old_star, new_star)
if(light_color == old_star)
set_light(l_color = new_star)

/turf/open/floor/glass/make_plating()
return

Expand Down
Loading

0 comments on commit 7e2ac68

Please sign in to comment.