diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index db82ee191b6..f38a741b114 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -610,6 +610,9 @@ var/list/blood_splatter_icons = list()
/atom/proc/narsie_act()
return
+/atom/proc/ratvar_act()
+ return
+
/atom/proc/atom_say(message)
if(!message)
return
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 052df8d9623..52cf7e10c69 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -1,12 +1,13 @@
-/* Diffrent misc types of sheets
+/* Different misc types of sheets
* Contains:
- * Metal
- * Plasteel
- * Wood
- * Cloth
- * Plastic
- * Cardboard
- * Runed Metal (cult)
+ * Metal
+ * Plasteel
+ * Wood
+ * Cloth
+ * Plastic
+ * Cardboard
+ * Runed Metal (cult)
+ * Brass (clockwork cult)
*/
/*
@@ -107,10 +108,13 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
/obj/item/stack/sheet/metal/fifty
amount = 50
+/obj/item/stack/sheet/metal/ratvar_act()
+ new /obj/item/stack/tile/brass(loc, amount)
+ qdel(src)
+
/obj/item/stack/sheet/metal/narsie_act()
- if(prob(20))
- new /obj/item/stack/sheet/runed_metal(loc, amount)
- qdel(src)
+ new /obj/item/stack/sheet/runed_metal(loc, amount)
+ qdel(src)
/obj/item/stack/sheet/metal/New(var/loc, var/amount=null)
recipes = metal_recipes
@@ -273,12 +277,15 @@ var/global/list/datum/stack_recipe/cult = list ( \
/obj/item/stack/sheet/runed_metal
name = "runed metal"
desc = "Sheets of cold metal with shifting inscriptions writ upon them."
- singular_name = "runed metal"
+ singular_name = "runed metal sheet"
icon_state = "sheet-runed"
- icon = 'icons/obj/items.dmi'
sheettype = "runed"
merge_type = /obj/item/stack/sheet/runed_metal
+/obj/item/stack/sheet/runed_metal/ratvar_act()
+ new /obj/item/stack/tile/brass(loc, amount)
+ qdel(src)
+
/obj/item/stack/sheet/runed_metal/attack_self(mob/living/user)
if(!iscultist(user))
to_chat(user, "Only one with forbidden knowledge could hope to work this metal...")
@@ -306,6 +313,39 @@ var/global/list/datum/stack_recipe/cult = list ( \
recipes = cult
return ..()
+/*
+ * Brass
+ */
+var/global/list/datum/stack_recipe/brass_recipes = list ( \
+ new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \
+ )
+
+/obj/item/stack/tile/brass
+ name = "brass"
+ desc = "Sheets made out of brass."
+ singular_name = "brass sheet"
+ icon_state = "sheet-brass"
+ icon = 'icons/obj/items.dmi'
+ burn_state = FIRE_PROOF
+ throwforce = 10
+ max_amount = 50
+ throw_speed = 1
+ throw_range = 3
+ turf_type = /turf/simulated/floor/clockwork
+
+/obj/item/stack/tile/brass/narsie_act()
+ new /obj/item/stack/sheet/runed_metal(loc, amount)
+ qdel(src)
+
+/obj/item/stack/tile/brass/New(loc, amount=null)
+ recipes = brass_recipes
+ . = ..()
+ pixel_x = 0
+ pixel_y = 0
+
+/obj/item/stack/tile/brass/fifty
+ amount = 50
+
/*
* Bones
*/
diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm
index e370fb482b0..6f5a70af404 100644
--- a/code/game/objects/structures/table_frames.dm
+++ b/code/game/objects/structures/table_frames.dm
@@ -86,6 +86,10 @@
new /obj/structure/table_frame/wood(loc)
qdel(src)
+/obj/structure/table_frame/ratvar_act()
+ new /obj/structure/table_frame/brass(loc)
+ qdel(src)
+
/*
* Wooden Frames
*/
@@ -118,3 +122,30 @@
make_new_table(/obj/structure/table/wood/poker)
else
return ..()
+
+/obj/structure/table_frame/brass
+ name = "brass table frame"
+ desc = "Four pieces of brass arranged in a square. It's slightly warm to the touch."
+ icon_state = "brass_frame"
+ burn_state = FIRE_PROOF
+ framestack = /obj/item/stack/tile/brass
+ framestackamount = 1
+
+/obj/structure/table_frame/brass/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/stack/tile/brass))
+ var/obj/item/stack/tile/brass/W = I
+ if(W.get_amount() < 1)
+ to_chat(user, "You need one brass sheet to do this!")
+ return
+ to_chat(user, "You start adding [W] to [src]...")
+ if(do_after(user, 20, target = src) && W.use(1))
+ make_new_table(/obj/structure/table/reinforced/brass)
+ else
+ return ..()
+
+/obj/structure/table_frame/brass/narsie_act()
+ ..()
+ if(src) //do we still exist?
+ var/previouscolor = color
+ color = "#960000"
+ animate(src, color = previouscolor, time = 8)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 6cb6ef50d0f..5b6fec84c73 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -78,6 +78,10 @@
new /obj/structure/table/wood(loc)
qdel(src)
+/obj/structure/table/ratvar_act()
+ new /obj/structure/table/reinforced/brass(loc)
+ qdel(src)
+
/obj/structure/table/ex_act(severity)
switch(severity)
if(1)
@@ -477,8 +481,9 @@
burn_state = FLAMMABLE
burntime = 20
-/obj/structure/table/wood/narsie_act()
- return
+/obj/structure/table/wood/narsie_act(total_override = TRUE)
+ if(!total_override)
+ ..()
/obj/structure/table/wood/poker //No specialties, Just a mapping object.
name = "gambling table"
@@ -488,8 +493,7 @@
buildstack = /obj/item/stack/tile/carpet
/obj/structure/table/wood/poker/narsie_act()
- new /obj/structure/table/wood(loc)
- qdel(src)
+ ..(FALSE)
/*
* Fancy Tables
@@ -565,6 +569,29 @@
else
. = ..()
+/obj/structure/table/reinforced/brass
+ name = "brass table"
+ desc = "A solid, slightly beveled brass table."
+ icon = 'icons/obj/smooth_structures/brass_table.dmi'
+ icon_state = "brass_table"
+ burn_state = FIRE_PROOF
+ frame = /obj/structure/table_frame/brass
+ framestack = /obj/item/stack/tile/brass
+ buildstack = /obj/item/stack/tile/brass
+ framestackamount = 1
+ buildstackamount = 1
+ canSmoothWith = list(/obj/structure/table/reinforced/brass)
+
+/obj/structure/table/reinforced/brass/narsie_act()
+ take_damage(rand(15, 45), BRUTE)
+ if(src) //do we still exist?
+ var/previouscolor = color
+ color = "#960000"
+ animate(src, color = previouscolor, time = 8)
+
+/obj/structure/table/reinforced/brass/ratvar_act()
+ obj_integrity = max_integrity
+
/*
* Racks
*/
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 0476df52ceb..dbc41924251 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -223,5 +223,10 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
if(prob(20))
ChangeTurf(/turf/simulated/floor/engine/cult)
+/turf/simulated/floor/ratvar_act(force, ignore_mobs)
+ . = ..()
+ if(.)
+ ChangeTurf(/turf/simulated/floor/clockwork)
+
/turf/simulated/floor/can_have_cabling()
return !burnt && !broken
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index f46d81584d7..ddc95afaccd 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -67,3 +67,32 @@
/turf/simulated/floor/noslip/MakeSlippery()
return
+
+//Clockwork floor: Slowly heals toxin damage on nearby servants.
+/turf/simulated/floor/clockwork
+ name = "clockwork floor"
+ desc = "Tightly-pressed brass tiles. They emit minute vibration."
+ icon_state = "clockwork_floor"
+
+/turf/simulated/floor/clockwork/attackby(obj/item/I, mob/living/user, params)
+ if(iscrowbar(I))
+ user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...")
+ playsound(src, I.usesound, 20, 1)
+ if(!do_after(user, 70*I.toolspeed, target = src))
+ return 0
+ user.visible_message("[user] pries up [src]!", "You pry up [src]!")
+ playsound(src, I.usesound, 80, 1)
+ make_plating()
+ return 1
+ return ..()
+
+/turf/simulated/floor/clockwork/make_plating()
+ new /obj/item/stack/tile/brass(src)
+ return ..()
+
+/turf/simulated/floor/clockwork/narsie_act()
+ ..()
+ if(istype(src, /turf/simulated/floor/clockwork)) //if we haven't changed type
+ var/previouscolor = color
+ color = "#960000"
+ animate(src, color = previouscolor, time = 8)
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 53a043bd5e3..18ff4d697fa 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -146,6 +146,13 @@
/turf/simulated/floor/engine/cult/narsie_act()
return
+/turf/simulated/floor/engine/cult/ratvar_act()
+ . = ..()
+ if(istype(src, /turf/simulated/floor/engine/cult)) //if we haven't changed type
+ var/previouscolor = color
+ color = "#FAE48C"
+ animate(src, color = previouscolor, time = 8)
+
/turf/simulated/floor/engine/n20/New()
..()
var/datum/gas_mixture/adding = new
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 83de35ea82c..2f05b738385 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -415,6 +415,15 @@
/turf/proc/can_lay_cable()
return can_have_cabling() & !intact
+/turf/ratvar_act(force, ignore_mobs, probability = 40)
+ . = (prob(probability) || force)
+ for(var/I in src)
+ var/atom/A = I
+ if(ignore_mobs && ismob(A))
+ continue
+ if(ismob(A) || .)
+ A.ratvar_act()
+
/turf/proc/add_blueprints(atom/movable/AM)
var/image/I = new
I.appearance = AM.appearance
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index d194094e289..abf090ef440 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/smooth_structures/brass_table.dmi b/icons/obj/smooth_structures/brass_table.dmi
new file mode 100644
index 00000000000..f3cc8bb9ee5
Binary files /dev/null and b/icons/obj/smooth_structures/brass_table.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 99744a46b2d..ed29bb274fd 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 62ba9c4e66c..d1a3cfbf675 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ