diff --git a/code/datums/autolathe/autolathe.dm b/code/datums/autolathe/autolathe.dm
index 4adeb85760..a049a4456c 100644
--- a/code/datums/autolathe/autolathe.dm
+++ b/code/datums/autolathe/autolathe.dm
@@ -6,7 +6,8 @@ var/datum/category_collection/autolathe/autolathe_recipes
if(I.matter && !resources)
resources = list()
for(var/material in I.matter)
- resources[material] = I.matter[material]*1.25 // More expensive to produce than they are to recycle.
+ var/coeff = (no_scale ? 1 : 1.25) //most objects are more expensive to produce than to recycle
+ resources[material] = I.matter[material]*coeff // but if it's a sheet or RCD cartridge, it's 1:1
if(is_stack && istype(I, /obj/item/stack))
var/obj/item/stack/IS = I
max_stack = IS.max_amount
@@ -66,6 +67,7 @@ var/datum/category_collection/autolathe/autolathe_recipes
var/power_use = 0
var/is_stack
var/max_stack
+ var/no_scale
/datum/category_item/autolathe/dd_SortValue()
return name
\ No newline at end of file
diff --git a/code/datums/autolathe/engineering.dm b/code/datums/autolathe/engineering.dm
index ca40b4a6a9..fd907ba5f8 100644
--- a/code/datums/autolathe/engineering.dm
+++ b/code/datums/autolathe/engineering.dm
@@ -93,6 +93,7 @@
/datum/category_item/autolathe/engineering/rcd_ammo
name = "matter cartridge"
path =/obj/item/weapon/rcd_ammo
+ no_scale = TRUE //prevents material duplication exploits
/datum/category_item/autolathe/engineering/rcd
name = "rapid construction device"
diff --git a/code/datums/autolathe/general.dm b/code/datums/autolathe/general.dm
index f354583318..2e2fa3c6fb 100644
--- a/code/datums/autolathe/general.dm
+++ b/code/datums/autolathe/general.dm
@@ -73,22 +73,26 @@
/datum/category_item/autolathe/general/metal
name = "steel sheets"
path =/obj/item/stack/material/steel
- is_stack = 1
+ is_stack = TRUE
+ no_scale = TRUE //prevents material duplication exploits
/datum/category_item/autolathe/general/glass
name = "glass sheets"
path =/obj/item/stack/material/glass
- is_stack = 1
+ is_stack = TRUE
+ no_scale = TRUE //prevents material duplication exploits
/datum/category_item/autolathe/general/rglass
name = "reinforced glass sheets"
path =/obj/item/stack/material/glass/reinforced
- is_stack = 1
+ is_stack = TRUE
+ no_scale = TRUE //prevents material duplication exploits
/datum/category_item/autolathe/general/rods
name = "metal rods"
path =/obj/item/stack/rods
- is_stack = 1
+ is_stack = TRUE
+ no_scale = TRUE //prevents material duplication exploits
/datum/category_item/autolathe/general/knife
name = "kitchen knife"
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 3a1fbf7897..7d7c64f949 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -83,16 +83,17 @@
else
//Make sure it's buildable and list requires resources.
for(var/material in R.resources)
- var/sheets = round(stored_material[material]/round(R.resources[material]*mat_efficiency))
+ var/coeff = (R.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient
+ var/sheets = round(stored_material[material]/round(R.resources[material]*coeff))
if(isnull(max_sheets) || max_sheets > sheets)
max_sheets = sheets
- if(!isnull(stored_material[material]) && stored_material[material] < round(R.resources[material]*mat_efficiency))
+ if(!isnull(stored_material[material]) && stored_material[material] < round(R.resources[material]*coeff))
can_make = 0
if(!comma)
comma = 1
else
material_string += ", "
- material_string += "[round(R.resources[material] * mat_efficiency)] [material]"
+ material_string += "[round(R.resources[material] * coeff)] [material]"
material_string += ".
"
//Build list of multipliers for sheets.
if(R.is_stack)
@@ -251,15 +252,16 @@
update_use_power(2)
//Check if we still have the materials.
+ var/coeff = (making.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient
for(var/material in making.resources)
if(!isnull(stored_material[material]))
- if(stored_material[material] < round(making.resources[material] * mat_efficiency) * multiplier)
+ if(stored_material[material] < round(making.resources[material] * coeff) * multiplier)
return
//Consume materials.
for(var/material in making.resources)
if(!isnull(stored_material[material]))
- stored_material[material] = max(0, stored_material[material] - round(making.resources[material] * mat_efficiency) * multiplier)
+ stored_material[material] = max(0, stored_material[material] - round(making.resources[material] * coeff) * multiplier)
update_icon() // So lid closes
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 25d5979002..4aef867592 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -384,7 +384,7 @@
if(!opened)
icon_state = icon_closed
if(sealed)
- overlays += "sealed"
+ overlays += "welded"
else
icon_state = icon_opened
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index a5ad07213d..d4cf8f63b3 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -298,6 +298,14 @@
/obj/structure/flora/sif
icon = 'icons/obj/flora/sifflora.dmi'
+/obj/structure/flora/sif/attack_hand(mob/user)
+ if (user.a_intent == I_HURT)
+ if(do_after(user, 5 SECONDS))
+ user.visible_message("\The [user] digs up \the [src.name].", "You dig up \the [src.name].")
+ qdel(src)
+ else
+ user.visible_message("\The [user] pokes \the [src.name].", "You poke \the [src.name].")
+
/datum/category_item/catalogue/flora/subterranean_bulbs
name = "Sivian Flora - Subterranean Bulbs"
desc = "A plant which is native to Sif, it continues the trend of being a bioluminescent specimen. These plants \
@@ -340,4 +348,4 @@
/obj/structure/flora/sif/eyes/Initialize()
icon_state = "[initial(icon_state)][rand(1,3)]"
- . = ..()
+ . = ..()
\ No newline at end of file
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 789b95ab69..c51fc614d1 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -41,6 +41,9 @@
set_flooring(get_flooring_data(floortype))
else
footstep_sounds = base_footstep_sounds
+ if(can_dirty)
+ if(prob(2))
+ new /obj/effect/decal/cleanable/dirt(src) //5% chance to start with dirt on a floor tile- give the janitor something to do
/turf/simulated/floor/proc/set_flooring(var/decl/flooring/newflooring)
make_plating(defer_icon_update = 1)
diff --git a/code/game/turfs/simulated/outdoors/grass.dm b/code/game/turfs/simulated/outdoors/grass.dm
index 67aa054b46..72b2ee7e57 100644
--- a/code/game/turfs/simulated/outdoors/grass.dm
+++ b/code/game/turfs/simulated/outdoors/grass.dm
@@ -29,7 +29,7 @@ var/list/grass_types = list(
name = "growth"
icon_state = "grass_sif"
edge_blending_priority = 4
- grass_chance = 0
+ grass_chance = 5
var/tree_chance = 2
grass_types = list(
diff --git a/code/modules/blob2/blobs/core.dm b/code/modules/blob2/blobs/core.dm
index 17ecd2429f..f43ec7ad6f 100644
--- a/code/modules/blob2/blobs/core.dm
+++ b/code/modules/blob2/blobs/core.dm
@@ -6,6 +6,7 @@ var/list/blob_cores = list()
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
desc = "A huge, pulsating yellow mass."
+ density = TRUE //bandaid fix for PolarisSS13/6173
max_integrity = 150
point_return = -1
health_regen = 0 //we regen in Life() instead of when pulsed
diff --git a/code/modules/mob/living/simple_animal/animals/cat.dm b/code/modules/mob/living/simple_animal/animals/cat.dm
index 20d98f9084..140deb0b24 100644
--- a/code/modules/mob/living/simple_animal/animals/cat.dm
+++ b/code/modules/mob/living/simple_animal/animals/cat.dm
@@ -6,9 +6,9 @@
intelligence_level = SA_ANIMAL
icon_state = "cat2"
item_state = "cat2"
- icon_living = "cat2"
- icon_dead = "cat2_dead"
- icon_rest = "cat2_rest"
+ icon_living = "[initial(icon_state)]"
+ icon_dead = "[initial(icon_state)]_dead"
+ icon_rest = "[initial(icon_state)]_rest"
investigates = 1
specific_targets = 1 //Only targets with Found()
@@ -161,9 +161,6 @@
gender = FEMALE
icon_state = "cat"
item_state = "cat"
- icon_living = "cat"
- icon_dead = "cat_dead"
- icon_rest = "cat_rest"
befriend_job = "Chief Medical Officer"
/mob/living/simple_animal/cat/kitten
@@ -188,9 +185,6 @@
gender = MALE
icon_state = "cat3"
item_state = "cat3"
- icon_living = "cat3"
- icon_dead = "cat3_dead"
- icon_rest = "cat3_rest"
holder_type = /obj/item/weapon/holder/cat/fluff/bones
friend_name = "Erstatz Vryroxes"
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
index b0ade63e92..0c33c0351b 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
@@ -4,9 +4,6 @@
tt_desc = "E Felis silvestris catus"
icon_state = "cat2"
item_state = "cat2"
- icon_living = "cat2"
- icon_dead = "cat2_dead"
- icon_rest = "cat2_rest"
movement_cooldown = 0.5 SECONDS
@@ -21,6 +18,14 @@
has_langs = list("Cat")
var/mob/living/friend = null // Our best pal, who we'll follow. Meow.
+ var/named = FALSE //have I been named yet?
+
+/mob/living/simple_mob/animal/passive/cat/Initialize()
+ icon_living = "[initial(icon_state)]"
+ icon_dead = "[initial(icon_state)]_dead"
+ icon_rest = "[initial(icon_state)]_rest"
+ update_icon()
+ return ..()
/mob/living/simple_mob/animal/passive/cat/handle_special()
if(!stat && prob(2)) // spooky
@@ -90,17 +95,13 @@
gender = FEMALE
icon_state = "cat"
item_state = "cat"
- icon_living = "cat"
- icon_dead = "cat_dead"
- icon_rest = "cat_rest"
+ named = TRUE
/mob/living/simple_mob/animal/passive/cat/kitten
name = "kitten"
- desc = "D'aaawwww"
+ desc = "D'aaawwww!"
icon_state = "kitten"
item_state = "kitten"
- icon_living = "kitten"
- icon_dead = "kitten_dead"
gender = NEUTER
/mob/living/simple_mob/animal/passive/cat/kitten/Initialize()
@@ -108,6 +109,10 @@
gender = pick(MALE, FEMALE)
return ..()
+/mob/living/simple_mob/animal/passive/cat/black
+ icon_state = "cat"
+ item_state = "cat"
+
// Leaving this here for now.
/obj/item/weapon/holder/cat/fluff/bones
name = "Bones"
@@ -121,12 +126,9 @@
gender = MALE
icon_state = "cat3"
item_state = "cat3"
- icon_living = "cat3"
- icon_dead = "cat3_dead"
- icon_rest = "cat3_rest"
+ named = TRUE
holder_type = /obj/item/weapon/holder/cat/fluff/bones
-
/datum/say_list/cat
speak = list("Meow!","Esp!","Purr!","HSSSSS")
emote_hear = list("meows","mews")
@@ -134,3 +136,34 @@
say_maybe_target = list("Meow?","Mew?","Mao?")
say_got_target = list("MEOW!","HSSSS!","REEER!")
+/mob/living/simple_mob/animal/passive/cat/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen))
+ if(named)
+ to_chat(user, "\the [name] already has a name!")
+ else
+ var/tmp_name = sanitizeSafe(input(user, "Give \the [name] a name", "Name"), MAX_NAME_LEN)
+ if(length(tmp_name) > 50)
+ to_chat(user, "The name can be at most 50 characters long.")
+ else
+ to_chat(user, "You name \the [name]. Meow!")
+ name = tmp_name
+ named = TRUE
+ else
+ ..()
+
+/obj/item/weapon/cat_box
+ name = "faintly purring box"
+ desc = "This box is purring faintly. You're pretty sure there's a cat inside it."
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "box"
+ var/cattype = /mob/living/simple_mob/animal/passive/cat
+
+/obj/item/weapon/cat_box/attack_self(var/mob/user)
+ var/turf/catturf = get_turf(src)
+ to_chat(user, "You peek into \the [name]-- and a cat jumps out!")
+ new cattype(catturf)
+ new /obj/item/stack/material/cardboard(catturf) //if i fits i sits
+ qdel(src)
+
+/obj/item/weapon/cat_box/black
+ cattype = /mob/living/simple_mob/animal/passive/cat/black
\ No newline at end of file
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 35df250581..ec6a03fc0e 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -99,6 +99,7 @@
return ..()
/obj/machinery/power/supermatter/Destroy()
+ STOP_PROCESSING(SSobj, src)
QDEL_NULL(soundloop)
return ..()
@@ -150,6 +151,8 @@
H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
spawn(pull_time)
explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1)
+ spawn(5) //to allow the explosion to finish
+ new /obj/item/broken_sm(TS)
qdel(src)
return
@@ -452,3 +455,21 @@
/obj/machinery/power/supermatter/shard/announce_warning() //Shards don't get announcements
return
+
+/obj/item/broken_sm
+ name = "shattered supermatter plinth"
+ desc = "The shattered remains of a supermatter shard plinth. It doesn't look safe to be around."
+ icon = 'icons/obj/engine.dmi'
+ icon_state = "darkmatter_broken"
+
+/obj/item/broken_sm/New()
+ message_admins("Broken SM shard created at ([x],[y],[z] - JMP)",0,1)
+ START_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/broken_sm/process()
+ radiation_repository.radiate(src, 50)
+
+/obj/item/broken_sm/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
diff --git a/html/changelogs/mistyLuminescence - tinytweaks.yml b/html/changelogs/mistyLuminescence - tinytweaks.yml
new file mode 100644
index 0000000000..ce00ccecd2
--- /dev/null
+++ b/html/changelogs/mistyLuminescence - tinytweaks.yml
@@ -0,0 +1,42 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: mistyLuminescence
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "When the supermatter explodes, it now leaves behind a shattered plinth that continues to emit radiation. You should probably get rid of it."
+ - bugfix: "If you destroy the supermatter early (e.g. through admin deletion shenanigans), it no longer irradiates everyone forever."
+ - bugfix: "Welding lockers now actually updates their sprite properly."
+ - tweak: "Every floor tile now has a minor (2%) chance to spawn with some dirt on it. The Janitor now has a job again."
+ - tweak: "Similarly, every Sif grass tile now has a minor (5%) chance to spawn with some fancy eyebulb grass on it. It can be removed by clicking on it with harm intent."
+ - rscadd: "Adds cats-in-boxes, which can be activated (once) to spawn cats. There's an orange tabby (Cargo cats) and a tuxedo (Runtime) version."
+ - bugfix: "Fixes a material duplication exploit."
\ No newline at end of file
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 1f7c06a037..048d70bd63 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/obj/engine.dmi b/icons/obj/engine.dmi
index 9292260609..51bc0356c8 100644
Binary files a/icons/obj/engine.dmi and b/icons/obj/engine.dmi differ