diff --git a/code/datums/autolathe/autolathe.dm b/code/datums/autolathe/autolathe.dm
index 4adeb85760c..a049a4456ca 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 ca40b4a6a9e..fd907ba5f83 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 f354583318f..2e2fa3c6fba 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 c04760b4ef8..223a81ebfd9 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -84,16 +84,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)
@@ -252,15 +253,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 66c219293e9..4234c993917 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -385,7 +385,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 a5ad07213d6..d4cf8f63b33 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 b615c0cc42f..606c0b2bb91 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -43,6 +43,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 67aa054b46c..72b2ee7e57a 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 17ecd2429f7..f43ec7ad6fd 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 5e554a0f8a2..f70f505807c 100644
--- a/code/modules/mob/living/simple_animal/animals/cat.dm
+++ b/code/modules/mob/living/simple_animal/animals/cat.dm
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
//Cat
/mob/living/simple_mob/cat
name = "cat"
@@ -195,4 +196,199 @@
/mob/living/simple_mob/cat/kitten/New()
gender = pick(MALE, FEMALE)
- ..()
\ No newline at end of file
+ ..()
+=======
+//Cat
+/mob/living/simple_animal/cat
+ name = "cat"
+ desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers."
+ tt_desc = "E Felis silvestris catus"
+ intelligence_level = SA_ANIMAL
+ icon_state = "cat2"
+ item_state = "cat2"
+ 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()
+ run_at_them = 0 //DOMESTICATED
+ view_range = 5
+
+ turns_per_move = 5
+ see_in_dark = 6
+
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "kicks"
+
+ min_oxy = 16 //Require atleast 16kPA oxygen
+ minbodytemp = 223 //Below -50 Degrees Celcius
+ maxbodytemp = 323 //Above 50 Degrees Celcius
+
+ holder_type = /obj/item/weapon/holder/cat
+ mob_size = MOB_SMALL
+
+ has_langs = list("Cat")
+ speak_chance = 1
+ speak = list("Meow!","Esp!","Purr!","HSSSSS")
+ speak_emote = list("purrs", "meows")
+ emote_hear = list("meows","mews")
+ emote_see = list("shakes their head", "shivers")
+ say_maybe_target = list("Meow?","Mew?","Mao?")
+ say_got_target = list("MEOW!","HSSSS!","REEER!")
+
+ meat_amount = 1
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
+
+ var/turns_since_scan = 0
+ var/mob/flee_target
+
+/mob/living/simple_animal/cat/Life()
+ . = ..()
+ if(!.) return
+
+ if(prob(2)) //spooky
+ var/mob/observer/dead/spook = locate() in range(src,5)
+ if(spook)
+ var/turf/T = spook.loc
+ var/list/visible = list()
+ for(var/obj/O in T.contents)
+ if(!O.invisibility && O.name)
+ visible += O
+ if(visible.len)
+ var/atom/A = pick(visible)
+ visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].")
+
+ handle_flee_target()
+
+/mob/living/simple_animal/cat/PunchTarget()
+ if(ismouse(target_mob))
+ var/mob/living/simple_mob/animal/passive/mouse/mouse = target_mob
+ mouse.splat()
+ visible_emote(pick("bites \the [mouse]!","toys with \the [mouse].","chomps on \the [mouse]!"))
+ return mouse
+ else
+ ..()
+
+/mob/living/simple_animal/cat/Found(var/atom/found_atom)
+ if(ismouse(found_atom) && SA_attackable(found_atom))
+ return found_atom
+
+/mob/living/simple_animal/cat/proc/handle_flee_target()
+ //see if we should stop fleeing
+ if (flee_target && !(flee_target in ListTargets(view_range)))
+ flee_target = null
+ GiveUpMoving()
+
+ if (flee_target && !stat && !buckled)
+ if (resting)
+ lay_down()
+ if(prob(25)) say("HSSSSS")
+ stop_automated_movement = 1
+ walk_away(src, flee_target, 7, 2)
+
+/mob/living/simple_animal/cat/react_to_attack(var/atom/A)
+ if(A == src) return
+ flee_target = A
+ turns_since_scan = 5
+
+/mob/living/simple_animal/cat/ex_act()
+ . = ..()
+ react_to_attack(src.loc)
+
+//Basic friend AI
+/mob/living/simple_animal/cat/fluff
+ var/mob/living/carbon/human/friend
+ var/befriend_job = null
+ var/friend_name = null
+
+/mob/living/simple_animal/cat/fluff/Life()
+ . = ..()
+ if(!. || ai_inactive || !friend) return
+
+ var/friend_dist = get_dist(src,friend)
+
+ if (friend_dist <= 4)
+ if(stance == STANCE_IDLE)
+ if(set_follow(friend))
+ handle_stance(STANCE_FOLLOW)
+
+ if (friend_dist <= 1)
+ if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit)
+ if (prob((friend.stat < DEAD)? 50 : 15))
+ var/verb = pick("meows", "mews", "mrowls")
+ audible_emote(pick("[verb] in distress.", "[verb] anxiously."))
+ else
+ if (prob(5))
+ visible_emote(pick("nuzzles [friend].",
+ "brushes against [friend].",
+ "rubs against [friend].",
+ "purrs."))
+ else if (friend.health <= 50)
+ if (prob(10))
+ var/verb = pick("meows", "mews", "mrowls")
+ audible_emote("[verb] anxiously.")
+
+/mob/living/simple_animal/cat/fluff/verb/become_friends()
+ set name = "Become Friends"
+ set category = "IC"
+ set src in view(1)
+
+ if(!friend)
+ var/mob/living/carbon/human/H = usr
+ if(istype(H) && (!befriend_job || H.job == befriend_job) && (!friend_name || H.real_name == friend_name))
+ friend = usr
+ . = 1
+ else if(usr == friend)
+ . = 1 //already friends, but show success anyways
+
+ if(.)
+ set_dir(get_dir(src, friend))
+ visible_emote(pick("nuzzles [friend].",
+ "brushes against [friend].",
+ "rubs against [friend].",
+ "purrs."))
+ else
+ usr << "[src] ignores you."
+ return
+
+//RUNTIME IS ALIVE! SQUEEEEEEEE~
+/mob/living/simple_animal/cat/fluff/Runtime
+ name = "Runtime"
+ desc = "Her fur has the look and feel of velvet, and her tail quivers occasionally."
+ tt_desc = "E Felis silvestris medicalis" //a hypoallergenic breed produced by NT for... medical purposes? Sure.
+ gender = FEMALE
+ icon_state = "cat"
+ item_state = "cat"
+ befriend_job = "Chief Medical Officer"
+
+/mob/living/simple_animal/cat/kitten
+ name = "kitten"
+ desc = "D'aaawwww"
+ icon_state = "kitten"
+ item_state = "kitten"
+ icon_living = "kitten"
+ icon_dead = "kitten_dead"
+ gender = NEUTER
+
+// Leaving this here for now.
+/obj/item/weapon/holder/cat/fluff/bones
+ name = "Bones"
+ desc = "It's Bones! Meow."
+ gender = MALE
+ icon_state = "cat3"
+
+/mob/living/simple_animal/cat/fluff/bones
+ name = "Bones"
+ desc = "That's Bones the cat. He's a laid back, black cat. Meow."
+ gender = MALE
+ icon_state = "cat3"
+ item_state = "cat3"
+ holder_type = /obj/item/weapon/holder/cat/fluff/bones
+ friend_name = "Erstatz Vryroxes"
+
+/mob/living/simple_animal/cat/kitten/New()
+ gender = pick(MALE, FEMALE)
+ ..()
+>>>>>>> 0d51ea8... tinytweaks (#6206)
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 3f6bba48461..479ad596c12 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
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
/mob/living/simple_mob/animal/passive/cat
name = "cat"
desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers."
@@ -145,3 +146,174 @@
/obj/item/weapon/holder/cat/kitten
icon_state = "kitten"
w_class = ITEMSIZE_SMALL
+=======
+/mob/living/simple_mob/animal/passive/cat
+ name = "cat"
+ desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers."
+ tt_desc = "E Felis silvestris catus"
+ icon_state = "cat2"
+ item_state = "cat2"
+
+ movement_cooldown = 0.5 SECONDS
+
+ see_in_dark = 6 // Not sure if this actually works.
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "kicks"
+
+ holder_type = /obj/item/weapon/holder/cat
+ mob_size = MOB_SMALL
+
+ 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
+ var/mob/observer/dead/spook = locate() in range(src, 5)
+ if(spook)
+ var/turf/T = get_turf(spook)
+ var/list/visible = list()
+ for(var/obj/O in T.contents)
+ if(!O.invisibility && O.name)
+ visible += O
+ if(visible.len)
+ var/atom/A = pick(visible)
+ visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].")
+
+// Instakills mice.
+/mob/living/simple_mob/animal/passive/cat/apply_melee_effects(var/atom/A)
+ if(ismouse(A))
+ var/mob/living/simple_mob/animal/passive/mouse/mouse = A
+ if(mouse.getMaxHealth() < 20) // In case a badmin makes giant mice or something.
+ mouse.splat()
+ visible_emote(pick("bites \the [mouse]!", "toys with \the [mouse].", "chomps on \the [mouse]!"))
+ else
+ ..()
+
+/mob/living/simple_mob/animal/passive/cat/IIsAlly(mob/living/L)
+ if(L == friend) // Always be pals with our special friend.
+ return TRUE
+
+ . = ..()
+
+ if(.) // We're pals, but they might be a dirty mouse...
+ if(ismouse(L))
+ return FALSE // Cats and mice can never get along.
+
+/mob/living/simple_mob/animal/passive/cat/verb/become_friends()
+ set name = "Become Friends"
+ set category = "IC"
+ set src in view(1)
+
+ var/mob/living/L = usr
+ if(!istype(L))
+ return // Fuck off ghosts.
+
+ if(friend)
+ if(friend == usr)
+ to_chat(L, span("notice", "\The [src] is already your friend! Meow!"))
+ return
+ else
+ to_chat(L, span("warning", "\The [src] ignores you."))
+ return
+
+ friend = L
+ face_atom(L)
+ to_chat(L, span("notice", "\The [src] is now your friend! Meow."))
+ visible_emote(pick("nuzzles [friend].", "brushes against [friend].", "rubs against [friend].", "purrs."))
+
+ if(has_AI())
+ var/datum/ai_holder/AI = ai_holder
+ AI.set_follow(friend)
+
+
+//RUNTIME IS ALIVE! SQUEEEEEEEE~
+/mob/living/simple_mob/animal/passive/cat/runtime
+ name = "Runtime"
+ desc = "Her fur has the look and feel of velvet, and her tail quivers occasionally."
+ tt_desc = "E Felis silvestris medicalis" // a hypoallergenic breed produced by NT for... medical purposes? Sure.
+ gender = FEMALE
+ icon_state = "cat"
+ item_state = "cat"
+ named = TRUE
+
+/mob/living/simple_mob/animal/passive/cat/kitten
+ name = "kitten"
+ desc = "D'aaawwww!"
+ icon_state = "kitten"
+ item_state = "kitten"
+ gender = NEUTER
+
+/mob/living/simple_mob/animal/passive/cat/kitten/Initialize()
+ if(gender == NEUTER)
+ 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"
+ desc = "It's Bones! Meow."
+ gender = MALE
+ icon_state = "cat3"
+
+/mob/living/simple_mob/animal/passive/cat/bones
+ name = "Bones"
+ desc = "That's Bones the cat. He's a laid back, black cat. Meow."
+ gender = MALE
+ icon_state = "cat3"
+ item_state = "cat3"
+ 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")
+ emote_see = list("shakes their head", "shivers")
+ 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
+>>>>>>> 0d51ea8... tinytweaks (#6206)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index c41d49aff55..cbbd9e193d9 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
@@ -447,3 +450,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 00000000000..ce00ccecd23
--- /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 1f7c06a0371..048d70bd63e 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 9292260609a..51bc0356c87 100644
Binary files a/icons/obj/engine.dmi and b/icons/obj/engine.dmi differ