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