From 81329edda6113767bfef8fe852eb0e2c2ab2c45c Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Thu, 11 Aug 2016 17:06:21 -0400 Subject: [PATCH] Clockcult fixes and tweaks (#19795) * Clockcult fixes and tweaks * die but don't stay dead * stay dead but never die * instinct * unreadable dark magic * idiocy knows no bounds * danger close * like four fucking times faster * superdynamics --- .../clockcult.dm} | 12 +- code/_onclick/hud/action_button.dm | 3 +- code/_onclick/hud/alert.dm | 13 +- code/controllers/subsystem/ticker.dm | 6 + code/datums/action.dm | 3 + code/game/gamemodes/clock_cult/clock_cult.dm | 4 - code/game/gamemodes/clock_cult/clock_items.dm | 308 +++++++++--------- code/game/gamemodes/clock_cult/clock_mobs.dm | 107 ------ .../game/gamemodes/clock_cult/clock_ratvar.dm | 23 +- .../gamemodes/clock_cult/clock_scripture.dm | 2 +- .../gamemodes/clock_cult/clock_structures.dm | 4 - .../gamemodes/clock_cult/clock_unsorted.dm | 46 +-- code/game/gamemodes/cult/cult_comms.dm | 1 + code/game/objects/effects/overlays.dm | 1 + code/modules/client/verbs/suicide.dm | 5 - code/modules/countdown/countdown.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 5 - code/modules/mob/living/death.dm | 2 - code/modules/mob/living/living_defense.dm | 35 -- code/modules/mob/living/living_defines.dm | 3 - code/modules/tooltip/tooltip.html | 4 +- tgstation.dme | 2 +- 22 files changed, 211 insertions(+), 380 deletions(-) rename code/{game/gamemodes/clock_cult/__clock_defines.dm => __DEFINES/clockcult.dm} (91%) diff --git a/code/game/gamemodes/clock_cult/__clock_defines.dm b/code/__DEFINES/clockcult.dm similarity index 91% rename from code/game/gamemodes/clock_cult/__clock_defines.dm rename to code/__DEFINES/clockcult.dm index 1b829386fb1..504dcb27e96 100644 --- a/code/game/gamemodes/clock_cult/__clock_defines.dm +++ b/code/__DEFINES/clockcult.dm @@ -7,12 +7,12 @@ var/global/list/all_clockwork_mobs = list() //All clockwork SERVANTS (not creatu var/global/list/clockwork_component_cache = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //The pool of components that caches draw from var/global/ratvar_awakens = FALSE //If Ratvar has been summoned -#define SCRIPTURE_PERIPHERAL 0 //Scripture tiers; peripherals should never be used -#define SCRIPTURE_DRIVER 1 -#define SCRIPTURE_SCRIPT 2 -#define SCRIPTURE_APPLICATION 3 -#define SCRIPTURE_REVENANT 4 -#define SCRIPTURE_JUDGEMENT 5 +#define SCRIPTURE_PERIPHERAL "Peripheral" //Scripture tiers; peripherals should never be used +#define SCRIPTURE_DRIVER "Driver" +#define SCRIPTURE_SCRIPT "Script" +#define SCRIPTURE_APPLICATION "Application" +#define SCRIPTURE_REVENANT "Revenant" +#define SCRIPTURE_JUDGEMENT "Judgement" #define SLAB_PRODUCTION_TIME 900 //how long(deciseconds) slabs require to produce a single component; defaults to 1 minute 30 seconds diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 9afcfeaf73e..7b6f2d6edcf 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -1,6 +1,7 @@ /obj/screen/movable/action_button var/datum/action/linked_action + var/actiontooltipstyle = "" screen_loc = null /obj/screen/movable/action_button/Click(location,control,params) @@ -51,7 +52,7 @@ /obj/screen/movable/action_button/MouseEntered(location,control,params) - openToolTip(usr,src,params,title = name,content = desc) + openToolTip(usr,src,params,title = name,content = desc,theme = actiontooltipstyle) /obj/screen/movable/action_button/MouseExited() diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 903ca7902ba..02287efea2b 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -258,12 +258,12 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /obj/screen/alert/clockwork/infodump/MouseEntered(location,control,params) if(ratvar_awakens) - desc = "Chetr nyy hagehguf-naq-ubabe Ratvar." + desc = "CHETR
NYY
HAGEHUGF-NAQ-UBABE
RATVAR.
" else var/servants = 0 var/validservants = 0 var/unconverted_ai_exists = FALSE - var/list/scripture_states = get_scripture_states() + var/list/scripture_states = scripture_unlock_check() for(var/mob/living/L in living_mob_list) if(is_servant_of_ratvar(L)) servants++ @@ -284,9 +284,13 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." desc += "[clockwork_daemons] Tinkerer's Daemons: [servants * 0.2 < clockwork_daemons ? "DISABLED":"ACTIVE"]
" else desc += "No Tinkerer's Daemons.
" + for(var/obj/structure/clockwork/massive/celestial_gateway/G in all_clockwork_objects) + var/area/gate_area = get_area(G) + desc += "Ark Location: [uppertext(gate_area.map_name)]
" + desc += "Seconds until Ratvar's arrival: [G.get_arrival_text(TRUE)]
" if(unconverted_ai_exists) desc += "An unconverted AI exists!
" - if(scripture_states["Revenant"]) + if(scripture_states[SCRIPTURE_REVENANT]) var/inathneq_available = clockwork_generals_invoked["inath-neq"] <= world.time var/sevtug_available = clockwork_generals_invoked["sevtug"] <= world.time var/nezbere_available = clockwork_generals_invoked["nezbere"] <= world.time @@ -299,7 +303,8 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." else desc += "Generals available: NONE
" for(var/i in scripture_states) - desc += "[i] Scripture: [scripture_states[i] ? "UNLOCKED":"LOCKED"]
" + if(i != SCRIPTURE_DRIVER) //ignore the always-unlocked stuff + desc += "[i] Scripture: [scripture_states[i] ? "UNLOCKED":"LOCKED"]
" ..() //GUARDIANS diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index a1dcbdaa2f8..55daa97c710 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -31,6 +31,11 @@ var/datum/subsystem/ticker/ticker var/list/syndicate_coalition = list() //list of traitor-compatible factions var/list/factions = list() //list of all factions var/list/availablefactions = list() //list of factions with openings + var/list/scripture_states = list(SCRIPTURE_DRIVER = TRUE, \ + SCRIPTURE_SCRIPT = FALSE, \ + SCRIPTURE_APPLICATION = FALSE, \ + SCRIPTURE_REVENANT = FALSE, \ + SCRIPTURE_JUDGEMENT = FALSE) //list of clockcult scripture states for announcements var/delay_end = 0 //if set true, the round will not restart on it's own @@ -103,6 +108,7 @@ var/datum/subsystem/ticker/ticker mode.process(wait * 0.1) check_queue() check_maprotate() + scripture_states = scripture_unlock_alert(scripture_states) if(!mode.explosion_in_progress && mode.check_finished() || force_ending) current_state = GAME_STATE_FINISHED diff --git a/code/datums/action.dm b/code/datums/action.dm index 31779f99b8f..775e08f8e49 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -13,6 +13,7 @@ var/obj/screen/movable/action_button/button = null var/button_icon = 'icons/mob/actions.dmi' var/background_icon_state = "bg_default" + var/buttontooltipstyle = "" var/icon_icon = 'icons/mob/actions.dmi' var/button_icon_state = "default" @@ -23,6 +24,7 @@ button = new button.linked_action = src button.name = name + button.actiontooltipstyle = buttontooltipstyle if(desc) button.desc = desc @@ -189,6 +191,7 @@ /datum/action/item_action/clock background_icon_state = "bg_clock" + buttontooltipstyle = "clockcult" /datum/action/item_action/clock/IsAvailable() if(!is_servant_of_ratvar(owner)) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 0df34837f65..075a38924e4 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -88,9 +88,7 @@ This file's folder contains: M.visible_message("[M]'s eyes glow a blazing yellow!", \ "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork Justiciar above all else. Perform his every \ whim without hesitation.") - var/list/scripture_states = get_scripture_states() ticker.mode.servants_of_ratvar += M.mind - scripture_unlock_alert(scripture_states) ticker.mode.update_servant_icons_added(M.mind) M.mind.special_role = "Servant of Ratvar" M.languages_spoken |= RATVAR @@ -145,9 +143,7 @@ This file's folder contains: if(!silent) M.visible_message("[M] seems to have remembered their true allegiance!", \ "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.") - var/list/scripture_states = get_scripture_states() ticker.mode.servants_of_ratvar -= M.mind - scripture_unlock_alert(scripture_states) ticker.mode.update_servant_icons_removed(M.mind) all_clockwork_mobs -= M M.mind.memory = "" //Not sure if there's a better way to do this diff --git a/code/game/gamemodes/clock_cult/clock_items.dm b/code/game/gamemodes/clock_cult/clock_items.dm index 1f56e35e440..61292798350 100644 --- a/code/game/gamemodes/clock_cult/clock_items.dm +++ b/code/game/gamemodes/clock_cult/clock_items.dm @@ -208,34 +208,24 @@ return 1 /obj/item/clockwork/slab/proc/recite_scripture(mob/living/user) - var/list/tiers_of_scripture = list("Drivers") - tiers_of_scripture += "Scripts[ratvar_awakens || scripture_unlock_check(SCRIPTURE_SCRIPT) || no_cost ? "" : " \[LOCKED\]"]" - tiers_of_scripture += "Applications[ratvar_awakens || scripture_unlock_check(SCRIPTURE_APPLICATION) || no_cost ? "" : " \[LOCKED\]"]" - tiers_of_scripture += "Revenant[ratvar_awakens || scripture_unlock_check(SCRIPTURE_REVENANT) || no_cost ? "" : " \[LOCKED\]"]" - tiers_of_scripture += "Judgement[ratvar_awakens || scripture_unlock_check(SCRIPTURE_JUDGEMENT) || no_cost ? "" : " \[LOCKED\]"]" + var/list/tiers_of_scripture = scripture_unlock_check() + for(var/i in tiers_of_scripture) + if(!tiers_of_scripture[i] && !ratvar_awakens && !no_cost) + tiers_of_scripture["[i] \[LOCKED\]"] = TRUE + tiers_of_scripture -= i var/scripture_tier = input(user, "Choose a category of scripture to recite.", "[src]") as null|anything in tiers_of_scripture if(!scripture_tier || !user.canUseTopic(src)) return 0 var/list/available_scriptures = list() var/datum/clockwork_scripture/scripture_to_recite - var/tier_to_browse switch(scripture_tier) - if("Drivers") - tier_to_browse = SCRIPTURE_DRIVER - if("Scripts") - tier_to_browse = SCRIPTURE_SCRIPT - if("Applications") - tier_to_browse = SCRIPTURE_APPLICATION - if("Revenant") - tier_to_browse = SCRIPTURE_REVENANT - if("Judgement") - tier_to_browse = SCRIPTURE_JUDGEMENT - if(!tier_to_browse) - user << "That section of scripture is still locked!" - return 0 + if(SCRIPTURE_DRIVER,SCRIPTURE_SCRIPT,SCRIPTURE_APPLICATION,SCRIPTURE_REVENANT,SCRIPTURE_JUDGEMENT); //; for the empty if + else + user << "That section of scripture is still locked!" + return 0 for(var/S in subtypesof(/datum/clockwork_scripture)) var/datum/clockwork_scripture/C = S - if(initial(C.tier) == tier_to_browse) + if(initial(C.tier) == scripture_tier) available_scriptures += "[initial(C.name)] ([initial(C.descname)])" if(!available_scriptures.len) return 0 @@ -248,7 +238,8 @@ scripture_to_recite = new C if(!scripture_to_recite || user.get_active_hand() != src) return 0 - if(!ratvar_awakens && !no_cost && !scripture_unlock_check(scripture_to_recite.tier)) + tiers_of_scripture = scripture_unlock_check() + if(!ratvar_awakens && !no_cost && !tiers_of_scripture[scripture_to_recite.tier]) user << "That scripture is no longer unlocked, and cannot be recited!" return 0 scripture_to_recite.slab = src @@ -257,139 +248,141 @@ return 1 /obj/item/clockwork/slab/proc/show_guide(mob/living/user) - var/text = "
Chetr nyy hagehguf-naq-ubabe Ratvar.


\ - \ - First and foremost, you serve Ratvar, the Clockwork Justiciar, in any ways he sees fit. This is with no regard to your personal well-being, and you would do well to think of the larger \ - scale of things than your life. Through foul and unholy magics was the Celestial Derelict formed, and fouler still those which trapped your master within it for all eternity. The Justiciar \ - wishes retribution upon those who performed this terrible act upon him - the Nar-Sian cultists - and you are to help him obtain it.

\ - \ - This is not a trivial task. Due to the nature of his prison, Ratvar is incapable of directly influencing the mortal plane. There is, however, a workaround - links between the perceptible \ - universe and Reebe (the Celestial Derelict) can be created and utilized. This is typically done via the creation of a slab akin to the one you are holding right now. The slabs tap into the \ - tidal flow of energy and information keeping Reebe sealed and presents it as meaningless images to preserve sanity. This slab can utilize the power in many different ways.

\ - \ - This is done through Components - pieces of the Justiciar's body that have since fallen off in the countless years since his imprisonment. Ratvar's unfortunate condition results \ - in the fragmentation of his body. These components still house great power on their own, and can slowly be drawn from Reebe by links capable of doing so. The most basic of these links lies \ - in the clockwork slab, which will slowly generate components over time - one component of a random type is produced every 1 minute and 30 seconds, plus 30 seconds per each servant above 5, \ - which is obviously inefficient. There are other ways to create these components through scripture and certain structures.

\ - \ - In addition to their ability to pull components, slabs also possess other functionalities...

\ - \ - The first functionality of the slab is Recital. This allows you to consume components either from your slab or from the global cache (more on that in the scripture list) to perform \ - effects usually considered magical in nature. Effects vary considerably - you might drain the power of nearby APCs, cause mass confusion, or force people to walk. Nevertheless, scripture \ - is extremely important to a successful takeover.

\ - \ - The second functionality of the clockwork slab is Recollection, which will display this guide.

\ - \ - The third to fifth functionalities are several buttons in the top left while holding the slab, from left to right, they are:
\ - Hierophant Network, which allows communication to other servants.
\ - Guvax, which simply allows you to quickly invoke the Guvax scripture.
\ - Vanguard, which, like Guvax, simply allows you to quickly invoke the Vanguard scripture.

\ - \ - Examine the slab for component amount information.

\ - \ - A complete list of scripture, its effects, and its requirements can be found below. Note that anything above a driver always consumes the components listed unless otherwise \ - specified.

" - var/text_to_add = "" - var/drivers = "Drivers" - var/scripts = "Scripts
These scriptures require at least five servants and a tinkerer's cache." - var/applications = "Applications
These scriptures require at least eight servants, three tinkerer's caches, and 100CV." - var/revenant = "Revenant
These scriptures require at least ten servants and 200CV." - var/judgement = "Judgement
These scriptures require at least twelve servants and 300CV. In addition, there may not be any active non-servant AIs." - for(var/V in subtypesof(/datum/clockwork_scripture)) - var/datum/clockwork_scripture/S = V - var/datum/clockwork_scripture/S2 = new V - var/list/req_comps = S2.required_components - var/list/cons_comps = S2.consumed_components - qdel(S2) - switch(initial(S.tier)) - if(SCRIPTURE_DRIVER) - drivers += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ - \ - Component Requirement: \ - [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ - [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ - [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ - [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \ - [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ - Component Cost: \ - [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ - [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ - [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ - [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \ - [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ - Tip: [initial(S.usage_tip)]
" - if(SCRIPTURE_SCRIPT) - scripts += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ - \ - Component Requirement: \ - [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ - [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ - [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ - [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \ - [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ - Component Cost: \ - [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ - [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ - [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ - [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \ - [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ - Tip: [initial(S.usage_tip)]
" - if(SCRIPTURE_APPLICATION) - applications += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ - \ - Component Requirement: \ - [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ - [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ - [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ - [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \ - [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ - Component Cost: \ - [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ - [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ - [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ - [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \ - [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ - Tip: [initial(S.usage_tip)]
" - if(SCRIPTURE_REVENANT) - revenant += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ - \ - Component Requirement: \ - [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ - [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ - [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ - [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \ - [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ - Component Cost: \ - [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ - [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ - [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ - [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \ - [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ - Tip: [initial(S.usage_tip)]
" - if(SCRIPTURE_JUDGEMENT) - judgement += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ - \ - Component Requirement: \ - [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ - [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ - [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ - [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \ - [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ - Component Cost: \ - [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ - [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ - [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ - [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \ - [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ - Tip: [initial(S.usage_tip)]
" - text_to_add += "[drivers]
[scripts]
[applications]
[revenant]
[judgement]
" - text_to_add += "
Purge all untruths and honor Ratvar.
" - text += text_to_add + var/text = "If you're seeing this, file a bug report." if(ratvar_awakens) text = "" for(var/i in 1 to 100) text += "HONOR RATVAR " text += "" + else + text = "
Chetr nyy hagehguf-naq-ubabe Ratvar.


\ + \ + First and foremost, you serve Ratvar, the Clockwork Justiciar, in any ways he sees fit. This is with no regard to your personal well-being, and you would do well to think of the larger \ + scale of things than your life. Through foul and unholy magics was the Celestial Derelict formed, and fouler still those which trapped your master within it for all eternity. The Justiciar \ + wishes retribution upon those who performed this terrible act upon him - the Nar-Sian cultists - and you are to help him obtain it.

\ + \ + This is not a trivial task. Due to the nature of his prison, Ratvar is incapable of directly influencing the mortal plane. There is, however, a workaround - links between the perceptible \ + universe and Reebe (the Celestial Derelict) can be created and utilized. This is typically done via the creation of a slab akin to the one you are holding right now. The slabs tap into the \ + tidal flow of energy and information keeping Reebe sealed and presents it as meaningless images to preserve sanity. This slab can utilize the power in many different ways.

\ + \ + This is done through Components - pieces of the Justiciar's body that have since fallen off in the countless years since his imprisonment. Ratvar's unfortunate condition results \ + in the fragmentation of his body. These components still house great power on their own, and can slowly be drawn from Reebe by links capable of doing so. The most basic of these links lies \ + in the clockwork slab, which will slowly generate components over time - one component of a random type is produced every 1 minute and 30 seconds, plus 30 seconds per each servant above 5, \ + which is obviously inefficient. There are other ways to create these components through scripture and certain structures.

\ + \ + In addition to their ability to pull components, slabs also possess other functionalities...

\ + \ + The first functionality of the slab is Recital. This allows you to consume components either from your slab or from the global cache (more on that in the scripture list) to perform \ + effects usually considered magical in nature. Effects vary considerably - you might drain the power of nearby APCs, cause mass confusion, or force people to walk. Nevertheless, scripture \ + is extremely important to a successful takeover.

\ + \ + The second functionality of the clockwork slab is Recollection, which will display this guide.

\ + \ + The third to fifth functionalities are several buttons in the top left while holding the slab, from left to right, they are:
\ + Hierophant Network, which allows communication to other servants.
\ + Guvax, which simply allows you to quickly invoke the Guvax scripture.
\ + Vanguard, which, like Guvax, simply allows you to quickly invoke the Vanguard scripture.

\ + \ + Examine the slab for component amount information.

\ + \ + A complete list of scripture, its effects, and its requirements can be found below. Note that anything above a driver always consumes the components listed unless otherwise \ + specified.

" + var/text_to_add = "" + var/drivers = "[SCRIPTURE_DRIVER]" + var/scripts = "[SCRIPTURE_SCRIPT]
These scriptures require at least five servants and a tinkerer's cache." + var/applications = "[SCRIPTURE_APPLICATION]
These scriptures require at least eight servants, three tinkerer's caches, and 100CV." + var/revenant = "[SCRIPTURE_REVENANT]
These scriptures require at least ten servants and 200CV." + var/judgement = "[SCRIPTURE_REVENANT]
These scriptures require at least twelve servants and 300CV. In addition, there may not be any active non-servant AIs." + for(var/V in subtypesof(/datum/clockwork_scripture)) + var/datum/clockwork_scripture/S = V + var/datum/clockwork_scripture/S2 = new V + var/list/req_comps = S2.required_components + var/list/cons_comps = S2.consumed_components + qdel(S2) + switch(initial(S.tier)) + if(SCRIPTURE_DRIVER) + drivers += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Requirement: \ + [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ + [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ + [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ + [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \ + [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ + Component Cost: \ + [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ + [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ + [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ + [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \ + [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_SCRIPT) + scripts += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Requirement: \ + [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ + [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ + [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ + [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \ + [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ + Component Cost: \ + [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ + [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ + [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ + [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \ + [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_APPLICATION) + applications += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Requirement: \ + [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ + [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ + [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ + [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \ + [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ + Component Cost: \ + [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ + [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ + [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ + [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \ + [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_REVENANT) + revenant += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Requirement: \ + [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ + [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ + [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ + [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \ + [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ + Component Cost: \ + [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ + [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ + [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ + [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \ + [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_JUDGEMENT) + judgement += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Requirement: \ + [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ + [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ + [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ + [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \ + [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ + Component Cost: \ + [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \ + [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \ + [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \ + [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \ + [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\ + Tip: [initial(S.usage_tip)]
" + text_to_add += "[drivers]
[scripts]
[applications]
[revenant]
[judgement]
" + text_to_add += "
Purge all untruths and honor Ratvar.
" + text += text_to_add var/datum/browser/popup = new(user, "slab", "", 600, 500) popup.set_content(text) popup.open() @@ -625,15 +618,6 @@ w_class = 3 armor = list(melee = 80, bullet = 50, laser = -15, energy = 5, bomb = 35, bio = 0, rad = 0) -/obj/item/clothing/head/helmet/clockwork/reclaimer //Used when a reclaimer mindjacks someone - name = "clockwork reclaimer" - desc = "A clockwork spider, hitchhiking like a horrible mechanical parasite." - icon_state = "reclaimer" - flags = NODROP - unacidable = TRUE - flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS - flags_cover = HEADCOVERSEYES - /obj/item/clothing/head/helmet/clockwork/equipped(mob/living/user, slot) ..() if(slot == slot_head && !is_servant_of_ratvar(user)) @@ -981,6 +965,14 @@ icon_state = "daemon_shell" w_class = 3 +/obj/item/clockwork/daemon_shell/New() + ..() + clockwork_daemons++ + +/obj/item/clockwork/daemon_shell/Destroy() + clockwork_daemons-- + return ..() + /obj/item/clockwork/tinkerers_daemon //Shouldn't ever appear on its own name = "tinkerer's daemon" desc = "An arachnoid shell with a single spinning cogwheel in its center." diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm index a9baba25167..b8cea36531a 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs.dm @@ -470,110 +470,3 @@ /mob/living/simple_animal/hostile/clockwork/marauder/proc/is_in_host() //Checks if the marauder is inside of their host return host && loc == host - - - -/mob/living/simple_animal/hostile/clockwork/reclaimer - name = "clockwork reclaimer" - desc = "A tiny clockwork arachnid with a single cogwheel spinning quickly in its head. Its legs blur, too fast to be seen clearly." - icon_state = "clockwork_reclaimer" - health = 50 - maxHealth = 50 - melee_damage_lower = 10 - melee_damage_upper = 10 - attacktext = "slams into" - attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg' - ventcrawler = 2 - playstyle_string = "You are a clockwork reclaimer, a harbringer of the Justiciar's light. You can crawl through vents to move more swiftly. Your \ - goal: purge all untruths and honor Ratvar. You may alt-click a valid target to break yourself apart and convert the target to a servant of Ratvar." - -/mob/living/simple_animal/hostile/clockwork/reclaimer/New() - ..() - if(prob(1)) - real_name = "jehovah's witness" - name = real_name - spawn(1) - if(mind) - mind.special_role = null - add_servant_of_ratvar(src, TRUE) - src << playstyle_string - -/mob/living/simple_animal/hostile/clockwork/reclaimer/Life() - ..() - if(ishuman(loc)) - var/mob/living/carbon/human/L = loc - if(L.stat || !L.client) - disengage() - -/mob/living/simple_animal/hostile/clockwork/reclaimer/death() - ..(1) - visible_message("[src] bursts into deadly shrapnel!") - for(var/mob/living/carbon/C in range(2, src)) - C.adjustBruteLoss(rand(3, 5)) - qdel(src) - -/mob/living/simple_animal/hostile/clockwork/reclaimer/AltClickOn(atom/movable/A) - if(!ishuman(A)) - return ..() - var/mob/living/carbon/human/H = A - if(is_servant_of_ratvar(H) || H.stat || (H.mind && !H.client)) - src << "[H] isn't a valid target! Valid targets are conscious non-servants." - return 0 - if(get_dist(src, H) > 3) - src << "You need to be closer to dominate [H]!" - return 0 - visible_message("[src] rockets with blinding speed towards [H]!", "You leap with blinding speed towards [H]'s head!") - for(var/i = 9, i > 0, i -= 3) - pixel_y += i - sleep(1) - icon_state = "[initial(icon_state)]_charging" - while(loc != H.loc) - if(!H) - icon_state = initial(icon_state) - return 0 - sleep(1) - forceMove(get_step(src, get_dir(src, H))) - if(H.head) - H.visible_message("[src] tears apart [H]'s [H.name]!") - H.unEquip(H.head) - qdel(H.head) - H.visible_message("[src] latches onto [H]'s head and digs its claws in!", "[src] leaps onto your head and impales its claws deep!") - add_servant_of_ratvar(H) - H.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork/reclaimer(null), slot_head) - loc = H - icon_state = initial(icon_state) - status_flags += GODMODE - src << "ASSIMILATION SUCCESSFUL." - H << "ASSIMILATION SUCCESSFUL." - clockwork_say(H, rot13("ASSIMILATION SUCCESSFUL.")) - if(!H.mind) - mind.transfer_to(H) - return 1 - -/mob/living/simple_animal/hostile/clockwork/reclaimer/verb/disengage() - set name = "Disgengage From Host" - set desc = "Jumps off of your host if you have one, freeing their mind but allowing you movement." - set category = "Clockwork" - - if(!ishuman(usr.loc)) - usr << "You have no host! Alt-click on a non-servant to enslave them." - return - var/mob/living/carbon/human/L = usr.loc - usr.loc = get_turf(L) - pixel_y = initial(pixel_y) - usr.visible_message("[usr] jumps off of [L]'s head!", "You disengage from your host.") - usr.status_flags -= GODMODE - remove_servant_of_ratvar(L) - L.unEquip(L.head) - qdel(L.head) - - - -/mob/living/mind_control_holder - name = "imprisoned mind" - desc = "A helpless mind, imprisoned in its own body." - stat = 0 - status_flags = GODMODE - -/mob/living/mind_control_holder/say() - return 0 diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm index 73ad516b9fc..23481a508a9 100644 --- a/code/game/gamemodes/clock_cult/clock_ratvar.dm +++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm @@ -76,6 +76,13 @@ var/damage = max((health * 0.70) / severity, 100) //requires multiple bombs to take down take_damage(damage, BRUTE) +/obj/structure/clockwork/massive/celestial_gateway/proc/get_arrival_text(s_on_time) + . = "IMMINENT" + if(!health) + . = "DETONATING" + else if(GATEWAY_RATVAR_ARRIVAL - progress_in_seconds > 0) + . = "[round(max((GATEWAY_RATVAR_ARRIVAL - progress_in_seconds) / (GATEWAY_SUMMON_RATE * 0.5), 0), 1)][s_on_time ? "S":""]" + /obj/structure/clockwork/massive/celestial_gateway/process() if(!progress_in_seconds || prob(7)) for(var/M in mob_list) @@ -122,10 +129,7 @@ ..() icon_state = initial(icon_state) if(is_servant_of_ratvar(user) || isobserver(user)) - var/arrival_text = "IMMINENT" - if(GATEWAY_RATVAR_ARRIVAL - progress_in_seconds > 0) - arrival_text = "[round(max((GATEWAY_RATVAR_ARRIVAL - progress_in_seconds) / (GATEWAY_SUMMON_RATE * 0.5), 0), 1)]" - user << "Seconds until Ratvar's arrival: [arrival_text]s" + user << "Seconds until Ratvar's arrival: [get_arrival_text(TRUE)]" switch(progress_in_seconds) if(-INFINITY to GATEWAY_REEBE_FOUND) user << "It's still opening." @@ -188,16 +192,11 @@ /obj/structure/clockwork/massive/ratvar/attack_ghost(mob/dead/observer/O) - var/alertresult = alert(O, "Embrace the Justiciar's light? You can no longer be cloned!",,"Cogscarab", "Reclaimer", "No") + var/alertresult = alert(O, "Embrace the Justiciar's light? You can no longer be cloned!",,"Yes", "No") if(alertresult == "No" || !O) return 0 - var/mob/living/simple_animal/R - if(alertresult == "Cogscarab") - R = new/mob/living/simple_animal/drone/cogscarab/ratvar(get_turf(src)) - R.visible_message("[R] forms, and its eyes blink open, glowing bright red!") - else - R = new/mob/living/simple_animal/hostile/clockwork/reclaimer(get_turf(src)) - R.visible_message("[R] forms, and it emits a faint hum!") + var/mob/living/simple_animal/drone/cogscarab/ratvar/R = new/mob/living/simple_animal/drone/cogscarab/ratvar(get_turf(src)) + R.visible_message("[R] forms, and its eyes blink open, glowing bright red!") R.key = O.key diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index c4f6748928d..145b4b762fb 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -236,7 +236,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed var/total_duration = 200 /datum/clockwork_scripture/vanguard/check_special_requirements() - if(islist(invoker.stun_absorption) && invoker.stun_absorption["vanguard"] && invoker.stun_absorption["vanguard"]["duration"] > world.time) + if(islist(invoker.stun_absorption) && invoker.stun_absorption["vanguard"] && invoker.stun_absorption["vanguard"]["end_time"] > world.time) invoker << "You are already shielded by a Vanguard!" return 0 return 1 diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm index 12a5f7f177f..e0fc254e1ea 100644 --- a/code/game/gamemodes/clock_cult/clock_structures.dm +++ b/code/game/gamemodes/clock_cult/clock_structures.dm @@ -161,17 +161,13 @@ /obj/structure/clockwork/cache/New() ..() START_PROCESSING(SSobj, src) - var/list/scripture_states = get_scripture_states() clockwork_caches++ - scripture_unlock_alert(scripture_states) SetLuminosity(2,1) for(var/i in all_clockwork_mobs) cache_check(i) /obj/structure/clockwork/cache/Destroy() - var/list/scripture_states = get_scripture_states() clockwork_caches-- - scripture_unlock_alert(scripture_states) STOP_PROCESSING(SSobj, src) if(linkedwall) linkedwall.linkedcache = null diff --git a/code/game/gamemodes/clock_cult/clock_unsorted.dm b/code/game/gamemodes/clock_cult/clock_unsorted.dm index 62c858a16be..81b10a46837 100644 --- a/code/game/gamemodes/clock_cult/clock_unsorted.dm +++ b/code/game/gamemodes/clock_cult/clock_unsorted.dm @@ -27,6 +27,7 @@ button_icon_state = "hierophant" background_icon_state = "bg_clock" check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS + buttontooltipstyle = "clockcult" var/title = "Servant" var/span_for_name = "heavy_brass" var/span_for_message = "brass" @@ -50,6 +51,7 @@ button_icon_state = "ratvarian_spear" background_icon_state = "bg_clock" check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS + buttontooltipstyle = "clockcult" var/cooldown = 0 var/base_cooldown = 3000 @@ -128,7 +130,7 @@ S2.visible_message("The air in front of [target] ripples before suddenly tearing open!") return 1 -/proc/scripture_unlock_check(scripture_tier) //check if the selected scripture tier is unlocked +/proc/scripture_unlock_check() //returns a list of scriptures and if they're unlocked or not var/servants = 0 var/unconverted_ai_exists = FALSE for(var/mob/living/M in living_mob_list) @@ -136,39 +138,25 @@ servants++ else if(isAI(M)) unconverted_ai_exists = TRUE - switch(scripture_tier) - if(SCRIPTURE_DRIVER) - return 1 - if(SCRIPTURE_SCRIPT) - if(servants >= 5 && clockwork_caches) - return 1 //5 or more non-brain servants and any number of clockwork caches - if(SCRIPTURE_APPLICATION) - if(servants >= 8 && clockwork_caches >= 3 && clockwork_construction_value >= 100) - return 1 //8 or more non-brain servants, 3+ clockwork caches, and at least 100 CV - if(SCRIPTURE_REVENANT) - if(servants >= 10 && clockwork_caches >= 4 && clockwork_construction_value >= 200) - return 1 //10 or more non-brain servants, 4+ clockwork caches, and at least 200 CV - if(SCRIPTURE_JUDGEMENT) - if(servants >= 12 && clockwork_caches >= 5 && clockwork_construction_value >= 300 && !unconverted_ai_exists) - return 1 //12 or more non-brain servants, 5+ clockwork caches, at least 300 CV, and there are no living, non-servant ais - return 0 + . = list(SCRIPTURE_DRIVER = TRUE, SCRIPTURE_SCRIPT = FALSE, SCRIPTURE_APPLICATION = FALSE, SCRIPTURE_REVENANT = FALSE, SCRIPTURE_JUDGEMENT = FALSE) + //Drivers: always unlocked + .[SCRIPTURE_SCRIPT] = (servants >= 5 && clockwork_caches) + //Script: 5 or more non-brain servants and any number of clockwork caches + .[SCRIPTURE_APPLICATION] = (servants >= 8 && clockwork_caches >= 3 && clockwork_construction_value >= 100) + //Application: 8 or more non-brain servants, 3+ clockwork caches, and at least 100 CV + .[SCRIPTURE_REVENANT] = (servants >= 10 && clockwork_caches >= 4 && clockwork_construction_value >= 200) + //Revenant: 10 or more non-brain servants, 4+ clockwork caches, and at least 200 CV + .[SCRIPTURE_JUDGEMENT] = (servants >= 12 && clockwork_caches >= 5 && clockwork_construction_value >= 300 && !unconverted_ai_exists) + //Judgement: 12 or more non-brain servants, 5+ clockwork caches, at least 300 CV, and there are no living, non-servant ais /proc/scripture_unlock_alert(list/previous_states) //reports to servants when scripture is locked or unlocked - var/list/states = get_scripture_states() - for(var/i in states) - if(states[i] != previous_states[i]) - hierophant_message("Hierophant Network: [i] Scripture has been [states[i] ? "un":""]locked.") - -/proc/get_scripture_states() //returns the current unlock states of each unlockable scripture tier - . = list("Script" = scripture_unlock_check(SCRIPTURE_SCRIPT), \ - "Application" = scripture_unlock_check(SCRIPTURE_APPLICATION), \ - "Revenant" = scripture_unlock_check(SCRIPTURE_REVENANT), \ - "Judgement" = scripture_unlock_check(SCRIPTURE_JUDGEMENT)) + . = scripture_unlock_check() + for(var/i in .) + if(.[i] != previous_states[i]) + hierophant_message("Hierophant Network: [i] Scripture has been [.[i] ? "un":""]locked.") /proc/change_construction_value(amount) - var/list/scripture_states = get_scripture_states() clockwork_construction_value += amount - scripture_unlock_alert(scripture_states) /proc/get_component_name(id) //returns a component name from a component id switch(id) diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 606583e54ea..accff66ebdd 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -3,6 +3,7 @@ name = "Communion" button_icon_state = "cult_comms" background_icon_state = "bg_demon" + buttontooltipstyle = "cult" check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS /datum/action/innate/cultcomm/IsAvailable() diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 8fd15241c95..bb73af6b43f 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -268,6 +268,7 @@ color = "#FAE48C" layer = ABOVE_MOB_LAYER duration = 70 + luminosity = 6 /obj/effect/overlay/temp/ratvar/sigil/transgression/New() ..() diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 43a08eceb15..413590b6db8 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -157,11 +157,6 @@ /mob/living/proc/canSuicide() if(stat == CONSCIOUS) - if(mental_dominator) - src << "This body's force of will is too strong! You can't break it enough to murder them." - if(mind_control_holder) - mind_control_holder << "Through tremendous force of will, you stop a suicide attempt!" - return 0 return 1 else if(stat == DEAD) src << "You're already dead!" diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm index c334452ebc5..53eb8d34caf 100644 --- a/code/modules/countdown/countdown.dm +++ b/code/modules/countdown/countdown.dm @@ -116,7 +116,7 @@ if(!istype(G)) return else if(G.health && !G.purpose_fulfilled) - return "
[GATEWAY_RATVAR_ARRIVAL - G.progress_in_seconds]
" + return "
[G.get_arrival_text(FALSE)]
" /obj/effect/countdown/transformer name = "transformer countdown" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 7f7ef87a4b4..c2d06ce0ad9 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -256,11 +256,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Ghost" set desc = "Relinquish your life and enter the land of the dead." - if(mental_dominator) - src << "This body's force of will is too strong! You can't break it enough to force them into a catatonic state." - if(mind_control_holder) - mind_control_holder << "Through tremendous force of will, you stop a catatonia attempt!" - return 0 if(stat != DEAD) succumb() if(stat == DEAD) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 70530432c29..fc1bf88240b 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -54,9 +54,7 @@ message_type=DEADCHAT_DEATHRATTLE) if(mind) mind.store_memory("Time of death: [tod]", 0) - var/list/scripture_states = get_scripture_states() living_mob_list -= src - scripture_unlock_alert(scripture_states) if(!gibbed) dead_mob_list += src else if(buckled) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 85b466c18c7..86cfd6bc7bf 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -178,41 +178,6 @@ //Mobs on Fire end -/mob/living/proc/dominate_mind(mob/living/target, duration = 100, silent) //Allows one mob to assume control of another while imprisoning the old consciousness for a time - if(!target) - return 0 - if(target.mental_dominator) - src << "[target] is already being controlled by someone else!" - return 0 - if(!target.mind) - src << "[target] is mindless and would make you permanently catatonic!" - return 0 - if(!silent) - src << "You pounce upon [target]'s mind and seize control of their body!" - target << "Your control over your body is wrenched away from you!" - target.mind_control_holder = new/mob/living/mind_control_holder(target) - target.mind_control_holder.real_name = "imprisoned mind of [target.real_name]" - target.mind.transfer_to(target.mind_control_holder) - mind.transfer_to(target) - target.mental_dominator = src - spawn(duration) - if(!src) - if(!silent) - target << "You try to return to your own body, but sense nothing! You're being forced out!" - target.ghostize(1) - target.mind_control_holder.mind.transfer_to(target) - if(!silent) - target << "You take control of your own body again!" - return 0 - if(!silent) - target << "You're forced out! You return to your own body." - target.mind.transfer_to(src) - target.mind_control_holder.mind.transfer_to(target) - qdel(mind_control_holder) - if(!silent) - target << "You take control of your own body again!" - return 1 - /mob/living/acid_act(acidpwr, toxpwr, acid_volume) take_organ_damage(min(10*toxpwr, acid_volume * toxpwr)) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 490366374f0..83103ebf337 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -69,8 +69,5 @@ var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added - var/mob/living/mental_dominator //The person controlling the mind of this person, if applicable - var/mob/living/mind_control_holder/mind_control_holder //If the mob is being mind controlled, where their old mind is stored (check clock_mobs.dm) - var/blood_volume = 0 //how much blood the mob has var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html index cb94f6c0b75..89de61e5eec 100644 --- a/code/modules/tooltip/tooltip.html +++ b/code/modules/tooltip/tooltip.html @@ -51,8 +51,8 @@ .wraith .wrap {border-color: #492136;} .wraith .content {border-color: #331726; background-color: #471962;} - .cult .wrap {border-color: #610002;} - .cult .content {color: #0F0B0C; border-color: #A10000; background-color: #4A363B;} + .cult .wrap {border-color: #292222;} + .cult .content {color: #FF0000; border-color: #4C4343; background-color: #3C3434;} .clockcult .wrap {border-color: #170800;} .clockcult .content {color: #B18B25; border-color: #000000; background-color: #5F380E;} diff --git a/tgstation.dme b/tgstation.dme index 85719642ba1..8012abce338 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -25,6 +25,7 @@ #include "code\__DEFINES\admin.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\bots.dm" +#include "code\__DEFINES\clockcult.dm" #include "code\__DEFINES\clothing.dm" #include "code\__DEFINES\combat.dm" #include "code\__DEFINES\contracts.dm" @@ -324,7 +325,6 @@ #include "code\game\gamemodes\changeling\powers\strained_muscles.dm" #include "code\game\gamemodes\changeling\powers\tiny_prick.dm" #include "code\game\gamemodes\changeling\powers\transform.dm" -#include "code\game\gamemodes\clock_cult\__clock_defines.dm" #include "code\game\gamemodes\clock_cult\clock_cult.dm" #include "code\game\gamemodes\clock_cult\clock_items.dm" #include "code\game\gamemodes\clock_cult\clock_machines.dm"