Files
JacquerelandGitHub ec3e8a90cd Rebalance the work camp again (#96731)
## About The Pull Request

People had been noting that it was taking longer to pay off a 1000 point
gulag sentence than expected, because we made some changes to mining and
forgot to update it

So now:
- There are ores in the walls again (iron, plasma, silver, and gold)
- Materials are now worth a variable amount of points (iron = plasma <
silver < gold)
- Boulders mined from the walls pop into a large amount of the kinds of
ores you can mine
- Boulders dragged out of the infinite use "work pit" contain a
guaranteed large amount of iron

The upshot of these changes are:
- You can pull 14 boulders out of the hole for a guaranteed time spent
of about 6 and a half quite boring minutes to guarantee finishing your
sentence (if you know exactly what you are doing and optimise it,
probably a bit longer for many people)
- You can mine the walls for ore at the mercy of RNG, you will _likely_
be done in about 5 minutes of mining if you're an early sentence and
obviously it gets harder the more people have already mined out the ores

I aimed for about 5 and 6 minutes as a target because of a combination
of travel time, the fact that you need to actively do something, and
because of the weather.
Remember that's only 5 or 6 minutes actually doing _mining_ (or...
watching progress bars and repeatedly falling over), doesn't include
variations in skill or luck, being hustled into the teleporter, suiting
up, processing the ores, summoning the shuttle, taking the ores to the
shuttle, and an ash storm if you're unlucky. So all around, probably
adds up to be reasonably close to a 10 minute brig timer.

We all know most people given a 1 point sentence are just going to kill
themselves anyway.

Also I moved some lightbulbs in the mining station work camp area
because you couldn't see some of the important tiles and it was annoying
me

## Why It's Good For The Game

We advise players that 1000 points in the work camp is work about a 10
minute brig sentence and this is basically ban-baiting from our policy
page if it's not actually true

## Changelog

🆑
balance: Adjusted the values of ores from the work camp to make a 1000
point sentence closer to a 10 minute brig timer
map: Moved some lightbulbs around in the work camp so you can see the
bars getting printed
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
2026-07-03 12:05:50 +02:00

114 lines
4.4 KiB
Plaintext

/obj/item/stack/sheet
name = "sheet"
lefthand_file = 'icons/mob/inhands/items/sheets_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/sheets_righthand.dmi'
icon_state = "sheet-metal_3"
abstract_type = /obj/item/stack/sheet
full_w_class = WEIGHT_CLASS_NORMAL
force = 5
throwforce = 5
max_amount = 50
throw_speed = 1
throw_range = 3
attack_verb_continuous = list("bashes", "batters", "bludgeons", "thrashes", "smashes")
attack_verb_simple = list("bash", "batter", "bludgeon", "thrash", "smash")
novariants = FALSE
material_flags = MATERIAL_EFFECTS | MATERIAL_NO_DESCRIPTORS
table_type = /obj/structure/table/greyscale
pickup_sound = 'sound/items/handling/materials/metal_pick_up.ogg'
drop_sound = 'sound/items/handling/materials/metal_drop.ogg'
sound_vary = TRUE
usable_for_construction = TRUE
/// text string used to find typepaths used in door and wall (false and tram too) construction for door assemblies and girders respectively
var/construction_path_type = null
///If true, this is worth points in the gulag labour stacker
var/gulag_value = 0
///Set to true if this is vended from a material storage
var/manufactured = FALSE
/// whether this sheet can be sniffed by the material sniffer
var/sniffable = FALSE
/obj/item/stack/sheet/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1)
. = ..()
pixel_x = rand(-4, 4)
pixel_y = rand(-4, 4)
if(sniffable && amount >= 10 && is_station_level(z))
GLOB.sniffable_sheets |= src
/obj/item/stack/sheet/Destroy(force)
if(sniffable)
GLOB.sniffable_sheets -= src
return ..()
/obj/item/stack/sheet/examine(mob/user)
. = ..()
if (manufactured && gulag_value)
. += span_notice("It has been embossed with a manufacturer's mark of guaranteed quality.")
var/datum/material/material = get_master_material()
if (!HAS_TRAIT(user, TRAIT_RESEARCH_SCANNER) || !material)
return
var/list/material_string = list()
for (var/prop_id in material.mat_properties)
var/datum/material_property/property = SSmaterials.properties[prop_id]
var/prop_value = material.get_property(prop_id)
if (isnull(prop_value)) // Error?
continue
var/descriptor = property?.get_descriptor(prop_value)
var/tooltip_hint = property?.get_tooltip(prop_value)
if (descriptor) // Overriden derivative property?
material_string += span_tooltip("[property]: [tooltip_hint]", descriptor)
if (length(material_string))
. += span_info("[capitalize(material.name)] is [english_list(material_string)].")
/obj/item/stack/sheet/add(_amount)
. = ..()
if(sniffable && amount >= 10 && is_station_level(z))
GLOB.sniffable_sheets |= src
/obj/item/stack/sheet/merge(obj/item/stack/sheet/target_stack, limit)
. = ..()
manufactured = manufactured && target_stack.manufactured
/obj/item/stack/sheet/copy_evidences(obj/item/stack/sheet/from)
. = ..()
manufactured = from.manufactured
/// removing from sniffable handled by the sniffer itself when it checks for targets
/**
* Facilitates sheets being smacked on the floor
*
* This is used for crafting by hitting the floor with items.
* The initial use case is glass sheets breaking in to shards when the floor is hit.
* Args:
* * target: The floor that was hit
* * user: The user that did the action
* * modifiers: The modifiers passed in from attackby
*/
/obj/item/stack/sheet/proc/on_attack_floor(turf/open/floor/target, mob/user, list/modifiers)
var/list/shards = list()
for(var/datum/material/mat in custom_materials)
if(mat.shard_type)
shards += mat.shard_type
if(!shards.len)
return FALSE
if(!use(1))
to_chat(user, is_cyborg ? span_warning("There is not enough material in the synthesizer to produce a shard!") : span_warning("Somehow, there is not enough of [src] to shatter!"))
if(!is_cyborg)
stack_trace("A stack of sheet material was attempted to be shattered into shards while having less than 1 sheets remaining.")
return FALSE
user.do_attack_animation(target, ATTACK_EFFECT_BOOP)
playsound(target, SFX_SHATTER, 70, TRUE)
var/list/shards_created = list()
for(var/shard_to_create in shards)
var/obj/item/new_shard = new shard_to_create(target)
new_shard.add_fingerprint(user)
shards_created += "[new_shard.name]"
user.visible_message(span_notice("[user] shatters the sheet of [name] on [target], leaving [english_list(shards_created)]."), \
span_notice("You shatter the sheet of [name] on [target], leaving [english_list(shards_created)]."))
return TRUE