diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index a78cdd4b69b..5773cbfc89d 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -21,6 +21,7 @@
#define CLOSED_DOOR_LAYER 3.1
#define CLOSED_FIREDOOR_LAYER 3.11
#define ABOVE_OBJ_LAYER 3.2
+#define ABOVE_WINDOW_LAYER 3.3
#define SIGN_LAYER 3.4
#define HIGH_OBJ_LAYER 3.5
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 4a2c0a330ee..c7601e7e34f 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -368,6 +368,9 @@ var/list/blood_splatter_icons = list()
/atom/proc/narsie_act()
return
+/atom/proc/ratvar_act()
+ return
+
/atom/proc/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
return 0
diff --git a/code/game/gamemodes/clock_cult/clock_items.dm b/code/game/gamemodes/clock_cult/clock_items.dm
index 06f8bf706b8..b5a86772423 100644
--- a/code/game/gamemodes/clock_cult/clock_items.dm
+++ b/code/game/gamemodes/clock_cult/clock_items.dm
@@ -526,6 +526,7 @@
item_state = "resonator_u"
w_class = 3
force = 5
+ flags = NOBLUDGEON
var/stored_alloy = 0 //Requires this to function; each chunk of replicant alloy provides 10 charge
var/max_alloy = 100
var/uses_alloy = TRUE
@@ -551,10 +552,10 @@
else
return ..()
-/obj/item/clockwork/clockwork_proselytizer/afterattack(atom/target, mob/living/user, flag, params)
- if(!target || !user)
+/obj/item/clockwork/clockwork_proselytizer/afterattack(atom/target, mob/living/user, proximity_flag, params)
+ if(!target || !user || !proximity_flag)
return 0
- if(user.a_intent == "harm" || !user.Adjacent(target) || !is_servant_of_ratvar(user))
+ if(user.a_intent == "harm" || !is_servant_of_ratvar(user))
return ..()
proselytize(target, user)
@@ -571,21 +572,62 @@
var/new_obj_type //The path of the new type of object to replace the old
var/alloy_cost = 0
var/valid_target = FALSE //If the proselytizer will actually function on the object
- if(istype(target, /turf/closed/wall) && !istype(target, /turf/closed/wall/r_wall) && !istype(target, /turf/closed/wall/clockwork)) //This looks sloppy, but it's the only way
+ if(istype(target, /turf/closed/wall/clockwork))
+ operation_time = 80
+ new_obj_type = /turf/open/floor/clockwork
+ alloy_cost = -4
+ valid_target = TRUE
+ else if(istype(target, /turf/open/floor/clockwork))
+ operation_time = 80
+ new_obj_type = /turf/closed/wall/clockwork
+ alloy_cost = 4
+ valid_target = TRUE
+ else if(istype(target, /turf/closed/wall) && !istype(target, /turf/closed/wall/r_wall))
operation_time = 50
new_obj_type = /turf/closed/wall/clockwork
alloy_cost = 5
valid_target = TRUE //Need to change valid_target to 1 or TRUE in each check so that it doesn't return an invalid value
- else if(istype(src, /turf/open/floor) && !istype(target, /turf/open/floor/clockwork))
+ else if(istype(target, /turf/open/floor))
operation_time = 30
new_obj_type = /turf/open/floor/clockwork
alloy_cost = 1
valid_target = TRUE
- else if(istype(src, /obj/machinery/door/airlock) && !istype(src, /obj/machinery/door/airlock/clockwork))
+ else if(istype(target, /obj/machinery/door/airlock) && !istype(target, /obj/machinery/door/airlock/clockwork))
operation_time = 40
- new_obj_type = /obj/machinery/door/airlock/clockwork
+ var/obj/machinery/door/airlock/A = target
+ if(A.glass)
+ new_obj_type = /obj/machinery/door/airlock/clockwork/brass
+ else
+ new_obj_type = /obj/machinery/door/airlock/clockwork
alloy_cost = 5
valid_target = TRUE
+ else if(istype(target, /obj/structure/window) && !istype(target, /obj/structure/window/reinforced/clockwork))
+ var/obj/structure/window/W = target
+ if(W.fulltile)
+ new_obj_type = /obj/structure/window/reinforced/clockwork/fulltile
+ operation_time = 20
+ alloy_cost = 5
+ valid_target = TRUE
+ else if(istype(target, /obj/structure/grille) && !istype(target, /obj/structure/grille/ratvar))
+ var/obj/structure/grille/G = target
+ if(G.destroyed)
+ new_obj_type = /obj/structure/grille/ratvar/broken
+ operation_time = 10
+ else
+ new_obj_type = /obj/structure/grille/ratvar
+ operation_time = 15
+ alloy_cost = 0
+ valid_target = TRUE
+ else if(istype(target, /obj/structure/clockwork/wall_gear))
+ operation_time = 30
+ new_obj_type = /obj/item/clockwork/component/replicant_alloy
+ alloy_cost = 6
+ valid_target = TRUE
+ else if(istype(target, /obj/item/clockwork/alloy_shards))
+ operation_time = 30
+ new_obj_type = /obj/item/clockwork/component/replicant_alloy
+ alloy_cost = 7
+ valid_target = TRUE
if(!uses_alloy)
alloy_cost = 0
if(!valid_target)
@@ -597,12 +639,17 @@
if(stored_alloy - alloy_cost < 0)
user << "You need [alloy_cost] replicant alloy to proselytize [target]!"
return 0
+ if(stored_alloy - alloy_cost > 100)
+ user << "You have too much replicant alloy stored to proselytize [target]!"
+ return 0
user.visible_message("[user]'s [src] begins tearing apart [target]!", "You begin proselytizing [target]...")
playsound(target, 'sound/machines/click.ogg', 50, 1)
if(!do_after(user, operation_time, target = target))
return 0
if(stored_alloy - alloy_cost < 0) //Check again to prevent bypassing via spamclick
return 0
+ if(stored_alloy - alloy_cost > 100)
+ return 0
user.visible_message("[user]'s [name] disgorges a chunk of metal and shapes it over what's left of [target]!", \
"You proselytize [target].")
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
@@ -640,6 +687,7 @@
spawn(300) //5 minutes
if(src)
visible_message("[src] cracks in two and fades away!")
+ PoolOrNew(/obj/effect/overlay/temp/ratvar/spearbreak, get_turf(src))
qdel(src)
/obj/item/clockwork/ratvarian_spear/afterattack(atom/target, mob/living/user, flag, params)
@@ -669,6 +717,7 @@
L.Stun(3)
L.Weaken(3)
visible_message("[src] snaps in two and dematerializes!")
+ PoolOrNew(/obj/effect/overlay/temp/ratvar/spearbreak, get_turf(L))
qdel(src)
/obj/item/device/mmi/posibrain/soul_vessel //Soul vessel: An ancient positronic brain with a lawset catered to serving Ratvar.
@@ -784,6 +833,15 @@
cultist_message = "The eye gives you an intensely hateful glare."
servant_of_ratvar_messages = list("\"...\"", "For a moment, your mind is flooded with extremely violent thoughts.")
+/obj/item/clockwork/component/belligerent_eye/blind_eye
+ name = "blind eye"
+ desc = "A heavy brass eye, its red iris fallen dark."
+ clockwork_desc = "A smashed ocular warden covered in dents. Might still be serviceable as a substitute for a belligerent eye."
+ icon_state = "blind_eye"
+ cultist_message = "The eye flickers at you with intense hate before falling dark."
+ servant_of_ratvar_messages = list("The eye flickers before falling dark.", "You feel watched.")
+ w_class = 3
+
/obj/item/clockwork/component/vanguard_cogwheel
name = "vanguard cogwheel"
desc = "A sturdy brass cog with a faintly glowing blue gem in its center."
@@ -792,6 +850,15 @@
cultist_message = "\"Pray to your god that we never meet.\""
servant_of_ratvar_messages = list("\"Be safe, child.\"", "You feel unexplainably comforted.", "\"Never forget: pain is temporary. The Justiciar's glory is eternal.\"")
+/obj/item/clockwork/component/vanguard_cogwheel/pinion_lock
+ name = "pinion lock"
+ desc = "A dented and scratched gear. It's very heavy."
+ clockwork_desc = "A broken gear lock for pinion airlocks. Might still be serviceable as a substitute for a vanguard cogwheel."
+ icon_state = "pinion_lock"
+ cultist_message = "The gear grows warm in your hands."
+ servant_of_ratvar_messages = list("The lock isn't getting any lighter.")
+ w_class = 3
+
/obj/item/clockwork/component/guvax_capacitor
name = "guvax capacitor"
desc = "A curiously cold brass doodad. It seems as though it really doesn't appreciate being held."
@@ -826,24 +893,6 @@
servant_of_ratvar_messages = list("A piece of armor hovers away from the others for a moment.", "Red flame appears in the cuirass before sputtering out.")
w_class = 3
-/obj/item/clockwork/component/replicant_alloy/blind_eye
- name = "blind eye"
- desc = "A heavy brass eye, its red iris fallen dark."
- clockwork_desc = "A smashed ocular warden covered in dents. Might still be serviceable as a substitute for replicant alloy."
- icon_state = "blind_eye"
- cultist_message = "The eye flickers at you with intense hate before falling dark."
- servant_of_ratvar_messages = list("The eye flickers before falling dark.", "You feel watched.")
- w_class = 3
-
-/obj/item/clockwork/component/replicant_alloy/pinion_lock
- name = "pinion lock"
- desc = "A dented and scratched gear. It's very heavy."
- clockwork_desc = "A broken gear lock for pinion airlocks. Might still be serviceable as a substitute for replicant alloy."
- icon_state = "pinion_lock"
- cultist_message = "The gear grows warm in your hands."
- servant_of_ratvar_messages = list("The lock isn't getting any lighter.")
- w_class = 3
-
/obj/item/clockwork/component/hierophant_ansible
name = "hierophant ansible"
desc = "Some sort of transmitter? It seems as though it's trying to say something."
@@ -851,3 +900,9 @@
component_id = "hierophant_ansible"
cultist_message = "\"Gur obff nlf vg'f abg ntnvafg gur ehyrf gb xvyy lbh.\""
servant_of_ratvar_messages = list("\"Rkvyr vf fhpu n'ober. Gurer'f abguvat v'pna uhag va urer.\"", "\"Jung'f xrrcvat lbh? V'jnag gb tb xvyy fbzrguvat.\"", "\"HEHEHEHEHEHEH!\"")
+
+/obj/item/clockwork/alloy_shards
+ name = "replicant alloy shards"
+ desc = "Broken shards of some oddly malleable metal. They occasionally move and seem to glow."
+ clockwork_desc = "Broken shards of replicant alloy. Could probably be proselytized into replicant alloy, though there's not much left."
+ icon_state = "alloy_shards"
diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm
index f40028870b8..628f59155f0 100644
--- a/code/game/gamemodes/clock_cult/clock_ratvar.dm
+++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm
@@ -151,7 +151,7 @@
/obj/structure/clockwork/massive/ratvar/attack_ghost(mob/dead/observer/O)
if(alert(O, "Embrace the Justiciar's light? You can no longer be cloned!",,"Yes", "No") == "No" || !O)
return 0
- var/mob/living/simple_animal/hostile/clockwork_reclaimer/R = new(get_turf(O))
+ var/mob/living/simple_animal/hostile/clockwork_reclaimer/R = new(get_turf(src))
R.visible_message("[R] forms and hums to life!")
R.key = O.key
@@ -192,8 +192,10 @@
world << "\"[pick("BLOOD GOD!!!", "NAR-SIE!!!", "AT LAST, YOUR TIME HAS COME!")]\""
world << "\"Ratvar?! How?!\""
for(var/obj/singularity/narsie/N in range(15, src))
- clash_of_the_titans(N) //IT'S TIME FOR THE BATTLE OF THE AGES
+ if(N.clashing)
+ continue
N.clashing = TRUE
+ clash_of_the_titans(N) //IT'S TIME FOR THE BATTLE OF THE AGES
break
return 1
@@ -243,46 +245,3 @@
narsie.clashing = FALSE
qdel(src)
return 1
-
-/atom/proc/ratvar_act() //Called on everything near Ratvar
- return
-
-/turf/closed/wall/ratvar_act() //Walls and floors are changed to their clockwork variants
- if(prob(20))
- ChangeTurf(/turf/closed/wall/clockwork)
-/turf/closed/wall/clockwork/ratvar_act()
- return 0
-
-/turf/open/floor/ratvar_act()
- if(prob(20))
- ChangeTurf(/turf/open/floor/clockwork)
-/turf/open/floor/clockwork/ratvar_act()
- return 0
-
-/obj/structure/window/ratvar_act() //Windows turn into Ratvarian windows
- if(!fulltile)
- new/obj/structure/window/reinforced/clockwork(get_turf(src), dir)
- else
- new/obj/structure/window/reinforced/clockwork/fulltile(get_turf(src))
- qdel(src)
-/obj/structure/window/reinforced/clockwork/ratvar_act()
- return 0
-
-/obj/machinery/door/airlock/ratvar_act() //Airlocks become pinion airlocks that only allow servants
- new/obj/machinery/door/airlock/clockwork(get_turf(src))
- qdel(src)
-/obj/machinery/door/airlock/clockwork/ratvar_act()
- return 0
-
-/mob/living/ratvar_act()
- if(!add_servant_of_ratvar(src) && !is_servant_of_ratvar(src))
- src << "A blinding light boils you alive! Run!"
- adjustFireLoss(35)
- if(src)
- adjust_fire_stacks(1)
- IgniteMob()
-
-/mob/dead/observer/ratvar_act() //Ghosts flash yellow for a second
- var/old_color = color
- color = rgb(75, 53, 0)
- animate(src, color = old_color, time = 10)
diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm
index b3ef697aaba..6a4bcaa5487 100644
--- a/code/game/gamemodes/clock_cult/clock_structures.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures.dm
@@ -32,25 +32,22 @@
/obj/structure/clockwork/proc/destroyed()
if(!takes_damage)
return 0
- for(var/obj/item/I in debris)
+ for(var/I in debris)
new I (get_turf(src))
visible_message(break_message)
playsound(src, break_sound, 50, 1)
qdel(src)
return 1
-/obj/structure/clockwork/proc/damaged(mob/living/user, obj/item/I, amount, taip)
- if(!amount || !taip || !taip in list(BRUTE, BURN))
+/obj/structure/clockwork/proc/damaged(mob/living/user, amount, damage_type)
+ if(!amount || !damage_type || !damage_type in list(BRUTE, BURN))
return 0
- if(user.a_intent == "harm" && user.canUseTopic(I) && I.force && takes_damage)
- user.visible_message("[user] strikes [src] with [I]!", "You strike [src] with [I]!")
- playsound(src, I.hitsound, 50, 1)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- health = max(0, health - I.force)
+ if(takes_damage)
+ health = max(0, health - amount)
if(!health)
destroyed()
- return 1
+ return 1
+ return 0
/obj/structure/clockwork/ex_act(severity)
if(takes_damage)
@@ -72,11 +69,34 @@
..()
desc = initial(desc)
+/obj/structure/clockwork/proc/attack_generic(mob/user, damage = 0, damage_type = BRUTE) //used by attack_alien, attack_animal, and attack_slime
+ user.do_attack_animation(src)
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.visible_message("[user] smashes into [src]!")
+ take_damage(damage, damage_type)
+
+/obj/structure/clockwork/attack_alien(mob/living/user)
+ attack_generic(user, 15)
+
+/obj/structure/clockwork/attack_animal(mob/living/simple_animal/M)
+ if(!M.melee_damage_upper)
+ return
+ attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
+
+/obj/structure/clockwork/attack_slime(mob/living/simple_animal/slime/user)
+ if(!user.is_adult)
+ return
+ attack_generic(user, rand(10, 15))
+
/obj/structure/clockwork/attacked_by(obj/item/I, mob/living/user)
- if(user.a_intent == "harm" && user.Adjacent(I) && I.force && takes_damage)
- damaged(user, I, I.force, I.damtype)
- else
- return ..()
+ if(I.force && takes_damage)
+ damaged(user, I.force, I.damtype)
+ playsound(src, I.hitsound, 50, 1)
+ return ..()
+
+/obj/structure/clockwork/mech_melee_attack(obj/mecha/M)
+ if(..())
+ take_damage(M.force, M.damtype)
/obj/structure/clockwork/cache //Tinkerer's cache: Stores components for later use.
name = "tinkerer's cache"
@@ -207,7 +227,7 @@
max_health = 25
construction_value = 15
break_message = "The warden's eye gives a glare of utter hate before falling dark!"
- debris = list(/obj/item/clockwork/component/replicant_alloy/blind_eye)
+ debris = list(/obj/item/clockwork/component/belligerent_eye/blind_eye)
var/damage_per_tick = 3
var/sight_range = 3
var/mob/living/target
@@ -472,6 +492,23 @@
else
icon_state = "[initial(icon_state)]_inactive"
+/obj/structure/clockwork/wall_gear
+ name = "massive gear"
+ icon_state = "wall_gear"
+ climbable = TRUE
+ desc = "A massive brass gear."
+ clockwork_desc = "A massive brass gear that could possibly be proselytized into replicant alloy."
+ break_message = "The gear breaks apart into shards of alloy!"
+ debris = list(/obj/item/clockwork/alloy_shards)
+
+/obj/structure/clockwork/wall_gear/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/wrench))
+ anchored = !anchored
+ user.visible_message("[user] [anchored ? "":"un"]anchors [src] from the floor.", \
+ "You [anchored ? "":"un"]anchors [src] from the floor.")
+ return 1
+ return ..()
+
///////////////////////
// CLOCKWORK EFFECTS //
///////////////////////
@@ -672,7 +709,7 @@
desc = "A strange set of markings drawn on the ground."
clockwork_desc = "A sigil of some purpose."
icon_state = "sigil"
- alpha = 25
+ alpha = 30
var/affects_servants = FALSE
/obj/effect/clockwork/sigil/attack_hand(mob/user)
@@ -698,6 +735,7 @@
desc = "A dull, barely-visible golden sigil. It's as though light was carved into the ground."
icon = 'icons/effects/clockwork_effects.dmi'
clockwork_desc = "A sigil that will stun the first non-servant to cross it. Nar-Sie's dogs will be knocked down."
+ icon_state = "sigildull"
color = rgb(255, 255, 0)
/obj/effect/clockwork/sigil/transgression/sigil_effects(mob/living/L)
@@ -712,6 +750,7 @@
L.adjustBruteLoss(10)
L.Weaken(5)
L.Stun(5)
+ PoolOrNew(/obj/effect/overlay/temp/ratvar/transgression, get_turf(src))
qdel(src)
return 1
@@ -719,8 +758,9 @@
name = "ominous sigil"
desc = "A brilliant golden sigil. Something about it really bothers you."
clockwork_desc = "A sigil that will enslave the first person to cross it, provided they do not move and they stand still for a brief time."
+ icon_state = "sigilsubmission"
color = rgb(255, 255, 0)
- alpha = 75
+ alpha = 100
/obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L)
visible_message("[src] begins to glow a piercing magenta!")
@@ -746,8 +786,9 @@
name = "suspicious sigil"
desc = "A barely-visible sigil. Things seem a bit quieter around it."
clockwork_desc = "A sigil that will listen for and transmit anything it hears."
+ icon_state = "sigiltransmission"
color = rgb(75, 75, 75)
- alpha = 50
+ alpha = 60
flags = HEAR
languages = ALL
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 7f80531c354..a380483b864 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -4,6 +4,7 @@
icon_state = "arcade"
icon_keyboard = null
icon_screen = "invaders"
+ clockwork = TRUE //it'd look weird
var/list/prizes = list(
/obj/item/weapon/storage/box/snappops = 2,
/obj/item/toy/talking/AI = 2,
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index c13ba3af2c4..ca136bbf26b 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -147,6 +147,7 @@
network = list("thunder")
density = 0
circuit = null
+ clockwork = TRUE //it'd look very weird
/obj/machinery/computer/security/telescreen/update_icon()
icon_state = initial(icon_state)
@@ -169,6 +170,7 @@
icon_state = "television"
icon_keyboard = null
icon_screen = "detective_tv"
+ clockwork = TRUE //it'd look weird
/obj/machinery/computer/security/mining
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 35ca17a8641..15d4abb448f 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -13,6 +13,7 @@
var/icon_keyboard = "generic_key"
var/icon_screen = "generic"
var/computer_health = 25
+ var/clockwork = FALSE
/obj/machinery/computer/New(location, obj/item/weapon/circuitboard/C)
..(location)
@@ -53,6 +54,21 @@
if(3)
take_damage(rand(10,30), BRUTE, 0)
+/obj/machinery/computer/ratvar_act()
+ if(!clockwork && prob(20))
+ clockwork = TRUE
+ icon_screen = "ratvar[rand(1, 4)]"
+ icon_keyboard = "ratvar_key[rand(1, 6)]"
+ icon_state = "ratvarcomputer[rand(1, 4)]"
+ update_icon()
+
+/obj/machinery/computer/narsie_act()
+ if(clockwork && clockwork != initial(clockwork) && prob(20)) //if it's clockwork but isn't normally clockwork
+ clockwork = FALSE
+ icon_screen = initial(icon_screen)
+ icon_keyboard = initial(icon_keyboard)
+ icon_state = initial(icon_state)
+ update_icon()
/obj/machinery/computer/bullet_act(obj/item/projectile/P)
take_damage(P.damage, P.damage_type, 0)
@@ -84,7 +100,7 @@
user << " You start to disconnect the monitor..."
if(do_after(user, 20/I.toolspeed, target = src))
deconstruction()
- var/obj/structure/frame/computer/A = new /obj/structure/frame/computer( src.loc )
+ var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
A.circuit = circuit
A.anchored = 1
circuit = null
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 51c0c3e8264..fa64dac99c6 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -609,3 +609,4 @@
icon_state = "laptop"
icon_screen = "medlaptop"
icon_keyboard = "laptop_key"
+ clockwork = TRUE //it'd look weird
diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm
index 19b2364b032..8ce898358d3 100644
--- a/code/game/machinery/computer/telecrystalconsoles.dm
+++ b/code/game/machinery/computer/telecrystalconsoles.dm
@@ -8,6 +8,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
icon_state = "tcstation"
icon_keyboard = "tcstation_key"
icon_screen = "syndie"
+ clockwork = TRUE //it'd look weird, at least if ratvar ever got there
/////////////////////////////////////////////
/obj/machinery/computer/telecrystals/uplinker
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index b57a640508d..827d9915248 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -122,6 +122,14 @@ var/list/airlock_overlays = list()
PoolOrNew(/obj/effect/overlay/temp/cult/door/unruned, T)
qdel(src)
+/obj/machinery/door/airlock/ratvar_act() //Airlocks become pinion airlocks that only allow servants
+ if(prob(20))
+ if(glass)
+ new/obj/machinery/door/airlock/clockwork/brass(get_turf(src))
+ else
+ new/obj/machinery/door/airlock/clockwork(get_turf(src))
+ qdel(src)
+
/obj/machinery/door/airlock/Destroy()
qdel(wires)
wires = null
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 667fec072c4..8ff1fa08b6d 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -395,6 +395,9 @@
PoolOrNew(/obj/effect/overlay/temp/ratvar/door, T)
PoolOrNew(/obj/effect/overlay/temp/ratvar/beam/door, T)
+/obj/machinery/door/airlock/clockwork/ratvar_act()
+ return 0
+
/obj/machinery/door/airlock/clockwork/attackby(obj/item/I, mob/living/user, params)
if(!attempt_construction(I, user))
return ..()
@@ -461,11 +464,15 @@
apart!")
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
new/obj/item/clockwork/component/replicant_alloy(get_turf(src))
- new/obj/item/clockwork/component/replicant_alloy/pinion_lock(get_turf(src))
+ new/obj/item/clockwork/component/vanguard_cogwheel/pinion_lock(get_turf(src))
qdel(src)
return 1
return 0
+/obj/machinery/door/airlock/clockwork/brass
+ glass = 1
+ opacity = 0
+
#undef GEAR_SECURE
#undef GEAR_UNFASTENED
#undef GEAR_LOOSE
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 13a0d69f8e4..3ca4f3151c5 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -186,6 +186,9 @@
/obj/machinery/door/window/narsie_act()
color = "#7D1919"
+/obj/machinery/door/window/ratvar_act()
+ qdel(src) //TODO clockwork windoors
+
/obj/machinery/door/window/bullet_act(obj/item/projectile/P)
. = ..()
take_damage(round(P.damage / 2), P.damage_type, 0)
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 90c942b32f3..a25b010ec30 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -148,6 +148,12 @@
/obj/effect/overlay/temp/ratvar/beam/door
layer = CLOSED_FIREDOOR_LAYER //above closed doors
+/obj/effect/overlay/temp/ratvar/beam/grille
+ layer = LOW_ITEM_LAYER //above grilles
+
+/obj/effect/overlay/temp/ratvar/beam/itemconsume
+ layer = HIGH_OBJ_LAYER
+
/obj/effect/overlay/temp/ratvar/wall
icon_state = "ratvarwallglow"
@@ -156,11 +162,36 @@
/obj/effect/overlay/temp/ratvar/window
icon_state = "ratvarwindowglow"
- layer = ABOVE_OBJ_LAYER //To be above the window it creates
+ layer = ABOVE_WINDOW_LAYER //above windows
+
+/obj/effect/overlay/temp/ratvar/grille
+ icon_state = "ratvargrilleglow"
+ layer = LOW_ITEM_LAYER //above grilles
+
+/obj/effect/overlay/temp/ratvar/grille/broken
+ icon_state = "ratvarbrokengrilleglow"
/obj/effect/overlay/temp/ratvar/window/single
icon_state = "ratvarwindowglow_s"
+/obj/effect/overlay/temp/ratvar/spearbreak
+ icon = 'icons/effects/64x64.dmi'
+ icon_state = "ratvarspearbreak"
+ pixel_y = -16
+ pixel_x = -16
+
+/obj/effect/overlay/temp/ratvar/transgression
+ icon = 'icons/effects/clockwork_effects.dmi'
+ icon_state = "sigildull"
+ color = "#FAE48C"
+ duration = 40
+
+/obj/effect/overlay/temp/ratvar/transgression/New()
+ ..()
+ var/oldtransform = transform
+ animate(src, transform = matrix()*2, time = 5)
+ animate(transform = oldtransform, alpha = 0, time = 25)
+
/obj/effect/overlay/temp/revenant
name = "spooky lights"
icon_state = "purplesparkles"
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index b2b5bf94732..3a8e565ceca 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -23,6 +23,13 @@
else
take_damage(rand(5,10), BRUTE, 0)
+/obj/structure/grille/ratvar_act()
+ if(destroyed)
+ new /obj/structure/grille/ratvar/broken(src.loc)
+ else
+ new /obj/structure/grille/ratvar(src.loc)
+ qdel(src)
+
/obj/structure/grille/blob_act(obj/effect/blob/B)
qdel(src)
@@ -113,7 +120,7 @@
..()
/obj/structure/grille/proc/Break()
- icon_state = "brokengrille"
+ icon_state = "broken[initial(icon_state)]"
density = 0
destroyed = 1
stored.amount = 1
@@ -143,7 +150,7 @@
health = 10
density = 1
destroyed = 0
- icon_state = "grille"
+ icon_state = initial(icon_state)
R.use(1)
return
@@ -260,11 +267,43 @@
return 0
/obj/structure/grille/broken // Pre-broken grilles for map placement
- icon_state = "brokengrille"
density = 0
health = 0
destroyed = 1
/obj/structure/grille/broken/New()
..()
- stored.amount = 1
\ No newline at end of file
+ stored.amount = 1
+ icon_state = "brokengrille"
+
+/obj/structure/grille/ratvar
+ icon_state = "ratvargrille"
+ desc = "A strangely-shaped grille."
+
+/obj/structure/grille/ratvar/New()
+ ..()
+ if(destroyed)
+ PoolOrNew(/obj/effect/overlay/temp/ratvar/grille/broken, get_turf(src))
+ else
+ PoolOrNew(/obj/effect/overlay/temp/ratvar/grille, get_turf(src))
+ PoolOrNew(/obj/effect/overlay/temp/ratvar/beam/grille, get_turf(src))
+
+/obj/structure/grille/ratvar/narsie_act()
+ take_damage(rand(2, 7), BURN)
+ if(src)
+ var/previouscolor = color
+ color = "#960000"
+ animate(src, color = previouscolor, time = 8)
+
+/obj/structure/grille/ratvar/ratvar_act()
+ return
+
+/obj/structure/grille/ratvar/broken
+ density = 0
+ health = 0
+ destroyed = 1
+
+/obj/structure/grille/ratvar/broken/New()
+ ..()
+ stored.amount = 1
+ icon_state = "brokenratvargrille"
diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm
index 7dc62153c5d..1d5fab163d8 100644
--- a/code/game/objects/structures/table_frames.dm
+++ b/code/game/objects/structures/table_frames.dm
@@ -73,6 +73,16 @@
else
return ..()
+/obj/structure/table_frame/narsie_act()
+ if(prob(20))
+ new /obj/structure/table_frame/wood(src.loc)
+ qdel(src)
+
+/obj/structure/table_frame/ratvar_act()
+ if(prob(20))
+ new /obj/structure/table_frame/brass(src.loc)
+ qdel(src)
+
/*
* Wooden Frames
*/
@@ -109,3 +119,16 @@
qdel(src)
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"
+ framestackamount = 0
+
+/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 a4dfb691ee1..a2c92d7ca8d 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -61,6 +61,10 @@
if(prob(20))
new /obj/structure/table/wood(src.loc)
+/obj/structure/table/ratvar_act()
+ if(prob(20))
+ new /obj/structure/table/reinforced/brass(src.loc)
+
/obj/structure/table/mech_melee_attack(obj/mecha/M)
playsound(src.loc, 'sound/weapons/punch4.ogg', 50, 1)
visible_message("[M.name] smashes [src]!")
@@ -366,6 +370,27 @@
else
return ..()
+/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"
+ frame = /obj/structure/table_frame/brass
+ canSmoothWith = list(/obj/structure/table/reinforced/brass)
+
+/obj/structure/table/reinforced/brass/table_destroy()
+ qdel(src)
+
+/obj/structure/table/reinforced/brass/narsie_act()
+ ..()
+ if(src) //do we still exist?
+ var/previouscolor = color
+ color = "#960000"
+ animate(src, color = previouscolor, time = 8)
+
+/obj/structure/table/reinforced/brass/ratvar_act()
+ health = initial(health)
+ return
/*
* Surgery Tables
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 2f36a388261..a32e47d98fb 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -73,6 +73,13 @@
for(var/obj/item/weapon/shard/shard in debris)
shard.color = NARSIE_WINDOW_COLOUR
+/obj/structure/window/ratvar_act()
+ if(!fulltile)
+ new/obj/structure/window/reinforced/clockwork(get_turf(src), dir)
+ else
+ new/obj/structure/window/reinforced/clockwork/fulltile(get_turf(src))
+ qdel(src)
+
/obj/structure/window/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
shatter()
@@ -492,10 +499,11 @@
opacity = TRUE
/obj/structure/window/reinforced/clockwork
- name = "ratvarian window"
+ name = "brass window"
desc = "A paper-thin pane of translucent yet reinforced brass."
- icon = 'icons/obj/clockwork_objects.dmi'
+ icon = 'icons/obj/smooth_structures/clockwork_window.dmi'
icon_state = "clockwork_window_single"
+ maxhealth = 100
/obj/structure/window/reinforced/clockwork/New(loc, direct)
..()
@@ -511,9 +519,22 @@
qdel(I)
debris += new/obj/item/clockwork/component/vanguard_cogwheel(src)
+/obj/structure/window/reinforced/clockwork/ratvar_act()
+ health = maxhealth
+ update_icon()
+ return 0
+
+/obj/structure/window/reinforced/clockwork/narsie_act()
+ take_damage(rand(15, 45), BURN)
+ if(src)
+ var/previouscolor = color
+ color = "#960000"
+ animate(src, color = previouscolor, time = 8)
+
/obj/structure/window/reinforced/clockwork/fulltile
icon_state = "clockwork_window"
smooth = SMOOTH_TRUE
canSmoothWith = null
fulltile = 1
dir = 5
+ maxhealth = 150
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index ed76a82b149..65e0e3c0321 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -180,6 +180,10 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
if(prob(20))
ChangeTurf(/turf/open/floor/engine/cult)
+/turf/open/floor/ratvar_act()
+ if(prob(20))
+ ChangeTurf(/turf/open/floor/clockwork)
+
/turf/open/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 272471258b6..1338eff7435 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -147,3 +147,13 @@
make_plating()
return 1
return ..()
+
+/turf/open/floor/clockwork/ratvar_act()
+ return 0
+
+/turf/open/floor/clockwork/narsie_act()
+ ..()
+ if(istype(src, /turf/open/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 e7bbe209179..2d23beac576 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -159,6 +159,13 @@
/turf/open/floor/engine/cult/narsie_act()
return
+/turf/open/floor/engine/cult/ratvar_act()
+ ..()
+ if(istype(src, /turf/open/floor/engine/cult)) //if we haven't changed type
+ var/previouscolor = color
+ color = "#FAE48C"
+ animate(src, color = previouscolor, time = 8)
+
/turf/open/floor/engine/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
if(builtin_tile)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index bec463937c6..90875a5cb53 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -255,5 +255,9 @@
if(prob(20))
ChangeTurf(/turf/closed/wall/mineral/cult)
+/turf/closed/wall/ratvar_act()
+ if(prob(20))
+ ChangeTurf(/turf/closed/wall/clockwork)
+
/turf/closed/wall/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
return 0
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index 24f8708cd87..53a1b4b7234 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -21,6 +21,13 @@
/turf/closed/wall/mineral/cult/narsie_act()
return
+/turf/closed/wall/mineral/cult/ratvar_act()
+ ..()
+ if(istype(src, /turf/closed/wall/mineral/cult)) //if we haven't changed type
+ var/previouscolor = color
+ color = "#FAE48C"
+ animate(src, color = previouscolor, time = 8)
+
/turf/closed/wall/mineral/cult/artificer
name = "runed stone wall"
desc = "A cold stone wall engraved with indecipherable symbols. Studying them causes your head to pound."
@@ -72,16 +79,44 @@
if(!WT.remove_fuel(1, user))
return 0
user.visible_message("[user] breaks apart [src]!", "You break apart [src]!")
- break_wall()
+ dismantle_wall()
return 1
return ..()
+/turf/closed/wall/clockwork/ratvar_act()
+ return 0
+
+/turf/closed/wall/clockwork/narsie_act()
+ ..()
+ if(istype(src, /turf/closed/wall/clockwork)) //if we haven't changed type
+ var/previouscolor = color
+ color = "#960000"
+ animate(src, color = previouscolor, time = 8)
+
+/turf/closed/wall/clockwork/dismantle_wall(devastated=0, explode=0)
+ if(devastated)
+ devastate_wall()
+ ChangeTurf(/turf/open/floor/plating)
+ else
+ playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ var/newgirder = break_wall()
+ if(newgirder) //maybe we don't /want/ a girder!
+ transfer_fingerprints_to(newgirder)
+ ChangeTurf(/turf/open/floor/clockwork)
+
+ for(var/obj/O in src.contents) //Eject contents!
+ if(istype(O,/obj/structure/sign/poster))
+ var/obj/structure/sign/poster/P = O
+ P.roll_and_drop(src)
+ else
+ O.loc = src
+
/turf/closed/wall/clockwork/break_wall()
- new/obj/item/clockwork/component/replicant_alloy(get_turf(src))
- return(new /obj/structure/girder(src))
+ return new/obj/structure/clockwork/wall_gear(src)
/turf/closed/wall/clockwork/devastate_wall()
- return break_wall()
+ new/obj/item/clockwork/alloy_shards(src)
+
/turf/closed/wall/vault
icon = 'icons/turf/walls.dmi'
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 003bb9ceb26..ba15a04fcc6 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -25,6 +25,7 @@
var/category = "Any"
var/author
var/SQLquery
+ clockwork = TRUE //it'd look weird
/obj/machinery/computer/libraryconsole/attack_hand(mob/user)
if(..())
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 2d723a055f0..6ff5f293f25 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -109,19 +109,29 @@ var/list/image/ghost_images_simple = list() //this is a list of all ghost images
animate(src, pixel_y = 2, time = 10, loop = -1)
..()
+/mob/dead/observer/narsie_act()
+ var/old_color = color
+ color = "#96000"
+ animate(src, color = old_color, time = 10)
+
+/mob/dead/observer/ratvar_act()
+ var/old_color = color
+ color = "#FAE48C"
+ animate(src, color = old_color, time = 10)
+
/mob/dead/observer/Destroy()
ghost_images_full -= ghostimage
qdel(ghostimage)
ghostimage = null
-
+
ghost_images_default -= ghostimage_default
qdel(ghostimage_default)
ghostimage_default = null
-
+
ghost_images_simple -= ghostimage_simple
qdel(ghostimage_simple)
ghostimage_simple = null
-
+
updateallghostimages()
return ..()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f3620a344a1..2acca7c0b47 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -787,6 +787,13 @@ Sorry Giacom. Please don't be mad :(
gib()
return
+/mob/living/ratvar_act()
+ if(!add_servant_of_ratvar(src) && !is_servant_of_ratvar(src))
+ src << "A blinding light boils you alive! Run!"
+ adjustFireLoss(35)
+ if(src)
+ adjust_fire_stacks(1)
+ IgniteMob()
/atom/movable/proc/do_attack_animation(atom/A, end_pixel_y)
var/pixel_x_diff = 0
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index f5134d2e4a4..d8b4222dc07 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -369,6 +369,7 @@
icon = 'icons/obj/terminals.dmi'
icon_state = "dorm_available"
density = 0
+ clockwork = TRUE //it'd look weird
/obj/machinery/computer/shuttle/pod/update_icon()
return
diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm
index b79c1b175fa..88c755eda86 100644
--- a/code/modules/shuttle/syndicate.dm
+++ b/code/modules/shuttle/syndicate.dm
@@ -28,6 +28,7 @@
req_access = list(access_syndicate)
shuttleId = "steel_rain"
possible_destinations = null
+ clockwork = TRUE //it'd look weird
/obj/machinery/computer/shuttle/syndicate/drop_pod/Topic(href, href_list)
if(href_list["move"])
diff --git a/code/modules/stock_market/computer.dm b/code/modules/stock_market/computer.dm
index 1fc2a0a10fa..ced8a43f179 100644
--- a/code/modules/stock_market/computer.dm
+++ b/code/modules/stock_market/computer.dm
@@ -6,6 +6,7 @@
icon_keyboard = "no_keyboard"
var/logged_in = "Cargo Department"
var/vmode = 1
+ clockwork = TRUE //it'd look weird
/obj/machinery/computer/stockexchange/New()
..()
diff --git a/icons/effects/64x64.dmi b/icons/effects/64x64.dmi
new file mode 100644
index 00000000000..b86cf580eef
Binary files /dev/null and b/icons/effects/64x64.dmi differ
diff --git a/icons/effects/clockwork_effects.dmi b/icons/effects/clockwork_effects.dmi
index ab349f4b2a8..fbc158cef3f 100644
Binary files a/icons/effects/clockwork_effects.dmi and b/icons/effects/clockwork_effects.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index ba9fe28fae6..842b303931c 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi
index 80c71eb6618..7468a2ae331 100644
Binary files a/icons/obj/clockwork_objects.dmi and b/icons/obj/clockwork_objects.dmi differ
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 7d49c55d3d4..e359eb9d2f5 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/doors/airlocks/clockwork/overlays.dmi b/icons/obj/doors/airlocks/clockwork/overlays.dmi
index 1f95be24660..e7cff13b076 100644
Binary files a/icons/obj/doors/airlocks/clockwork/overlays.dmi and b/icons/obj/doors/airlocks/clockwork/overlays.dmi differ
diff --git a/icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi b/icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi
index 817b150d37a..2da7c0e4e04 100644
Binary files a/icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi and b/icons/obj/doors/airlocks/clockwork/pinion_airlock.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/smooth_structures/clockwork_window.dmi b/icons/obj/smooth_structures/clockwork_window.dmi
new file mode 100644
index 00000000000..2f3208888ec
Binary files /dev/null and b/icons/obj/smooth_structures/clockwork_window.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 219bb139c66..12f0a9ab281 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ