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