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
This commit is contained in:
Joan Lung
2016-08-11 17:06:21 -04:00
committed by oranges
parent 6f4693d0f9
commit 81329edda6
22 changed files with 211 additions and 380 deletions

View File

@@ -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

View File

@@ -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()

View File

@@ -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 = "<font size=3><b>Chetr nyy hagehguf-naq-ubabe Ratvar.</b></font>"
desc = "<font size=3><b>CHETR<br>NYY<br>HAGEHUGF-NAQ-UBABE<br>RATVAR.</b></font>"
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 += "<b>[clockwork_daemons]</b> Tinkerer's Daemons: <b>[servants * 0.2 < clockwork_daemons ? "DISABLED":"ACTIVE"]</b><br>"
else
desc += "No Tinkerer's Daemons.<br>"
for(var/obj/structure/clockwork/massive/celestial_gateway/G in all_clockwork_objects)
var/area/gate_area = get_area(G)
desc += "Ark Location: <b>[uppertext(gate_area.map_name)]</b><br>"
desc += "Seconds until Ratvar's arrival: <b>[G.get_arrival_text(TRUE)]</b><br>"
if(unconverted_ai_exists)
desc += "<b>An unconverted AI exists!</b><br>"
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: <b>NONE</b><br>"
for(var/i in scripture_states)
desc += "[i] Scripture: <b>[scripture_states[i] ? "UNLOCKED":"LOCKED"]</b><br>"
if(i != SCRIPTURE_DRIVER) //ignore the always-unlocked stuff
desc += "[i] Scripture: <b>[scripture_states[i] ? "UNLOCKED":"LOCKED"]</b><br>"
..()
//GUARDIANS

View File

@@ -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

View File

@@ -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))

View File

@@ -88,9 +88,7 @@ This file's folder contains:
M.visible_message("<span class='heavy_brass'>[M]'s eyes glow a blazing yellow!</span>", \
"<span class='heavy_brass'>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.</span>")
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("<span class='big'>[M] seems to have remembered their true allegiance!</span>", \
"<span class='userdanger'>A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.</span>")
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

View File

@@ -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 << "<span class='warning'>That section of scripture is still locked!</span>"
return 0
if(SCRIPTURE_DRIVER,SCRIPTURE_SCRIPT,SCRIPTURE_APPLICATION,SCRIPTURE_REVENANT,SCRIPTURE_JUDGEMENT); //; for the empty if
else
user << "<span class='warning'>That section of scripture is still locked!</span>"
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 << "<span class='warning'>That scripture is no longer unlocked, and cannot be recited!</span>"
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 = "<font color=#BE8700 size=3><b><center>Chetr nyy hagehguf-naq-ubabe Ratvar.</center></b></font><br><br>\
\
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.<br><br>\
\
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.<br><br>\
\
This is done through <b>Components</b> - 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.<br><br>\
\
In addition to their ability to pull components, slabs also possess other functionalities...<br><br>\
\
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.<br><br>\
\
The second functionality of the clockwork slab is Recollection, which will display this guide.<br><br>\
\
The third to fifth functionalities are several buttons in the top left while holding the slab, from left to right, they are:<br>\
Hierophant Network, which allows communication to other servants.<br>\
Guvax, which simply allows you to quickly invoke the Guvax scripture.<br>\
Vanguard, which, like Guvax, simply allows you to quickly invoke the Vanguard scripture.<br><br>\
\
Examine the slab for component amount information.<br><br>\
\
A complete list of scripture, its effects, and its requirements can be found below. <i>Note that anything above a driver always consumes the components listed unless otherwise \
specified.</i><br><br>"
var/text_to_add = ""
var/drivers = "<font color=#BE8700 size=3><b>Drivers</b></font>"
var/scripts = "<font color=#BE8700 size=3><b>Scripts</b></font><br><i>These scriptures require at least five servants and a tinkerer's cache.</i>"
var/applications = "<font color=#BE8700 size=3><b>Applications</b></font><br><i>These scriptures require at least eight servants, three tinkerer's caches, and 100CV.</i>"
var/revenant = "<font color=#BE8700 size=3><b>Revenant</b></font><br><i>These scriptures require at least ten servants and 200CV.</i>"
var/judgement = "<font color=#BE8700 size=3><b>Judgement</b></font><br><i>These scriptures require at least twelve servants and 300CV. In addition, there may not be any active non-servant AIs.</i>"
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 += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Requirement: </b>\
[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" : ""]<br>\
<b>Component Cost: </b>\
[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" : ""]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_SCRIPT)
scripts += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Requirement: </b>\
[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" : ""]<br>\
<b>Component Cost: </b>\
[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" : ""]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_APPLICATION)
applications += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Requirement: </b>\
[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" : ""]<br>\
<b>Component Cost: </b>\
[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" : ""]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_REVENANT)
revenant += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Requirement: </b>\
[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" : ""]<br>\
<b>Component Cost: </b>\
[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" : ""]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_JUDGEMENT)
judgement += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Requirement: </b>\
[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" : ""]<br>\
<b>Component Cost: </b>\
[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" : ""]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
text_to_add += "[drivers]<br>[scripts]<br>[applications]<br>[revenant]<br>[judgement]<br>"
text_to_add += "<font color=#BE8700 size=3><b><center>Purge all untruths and honor Ratvar.</center></b></font>"
text += text_to_add
var/text = "If you're seeing this, file a bug report."
if(ratvar_awakens)
text = "<font color=#BE8700 size=3><b>"
for(var/i in 1 to 100)
text += "HONOR RATVAR "
text += "</b></font>"
else
text = "<font color=#BE8700 size=3><b><center>Chetr nyy hagehguf-naq-ubabe Ratvar.</center></b></font><br><br>\
\
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.<br><br>\
\
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.<br><br>\
\
This is done through <b>Components</b> - 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.<br><br>\
\
In addition to their ability to pull components, slabs also possess other functionalities...<br><br>\
\
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.<br><br>\
\
The second functionality of the clockwork slab is Recollection, which will display this guide.<br><br>\
\
The third to fifth functionalities are several buttons in the top left while holding the slab, from left to right, they are:<br>\
Hierophant Network, which allows communication to other servants.<br>\
Guvax, which simply allows you to quickly invoke the Guvax scripture.<br>\
Vanguard, which, like Guvax, simply allows you to quickly invoke the Vanguard scripture.<br><br>\
\
Examine the slab for component amount information.<br><br>\
\
A complete list of scripture, its effects, and its requirements can be found below. <i>Note that anything above a driver always consumes the components listed unless otherwise \
specified.</i><br><br>"
var/text_to_add = ""
var/drivers = "<font color=#BE8700 size=3><b>[SCRIPTURE_DRIVER]</b></font>"
var/scripts = "<font color=#BE8700 size=3><b>[SCRIPTURE_SCRIPT]</b></font><br><i>These scriptures require at least five servants and a tinkerer's cache.</i>"
var/applications = "<font color=#BE8700 size=3><b>[SCRIPTURE_APPLICATION]</b></font><br><i>These scriptures require at least eight servants, three tinkerer's caches, and 100CV.</i>"
var/revenant = "<font color=#BE8700 size=3><b>[SCRIPTURE_REVENANT]</b></font><br><i>These scriptures require at least ten servants and 200CV.</i>"
var/judgement = "<font color=#BE8700 size=3><b>[SCRIPTURE_REVENANT]</b></font><br><i>These scriptures require at least twelve servants and 300CV. In addition, there may not be any active non-servant AIs.</i>"
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 += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Requirement: </b>\
[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" : ""]<br>\
<b>Component Cost: </b>\
[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" : ""]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_SCRIPT)
scripts += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Requirement: </b>\
[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" : ""]<br>\
<b>Component Cost: </b>\
[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" : ""]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_APPLICATION)
applications += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Requirement: </b>\
[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" : ""]<br>\
<b>Component Cost: </b>\
[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" : ""]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_REVENANT)
revenant += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Requirement: </b>\
[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" : ""]<br>\
<b>Component Cost: </b>\
[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" : ""]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_JUDGEMENT)
judgement += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Requirement: </b>\
[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" : ""]<br>\
<b>Component Cost: </b>\
[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" : ""]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
text_to_add += "[drivers]<br>[scripts]<br>[applications]<br>[revenant]<br>[judgement]<br>"
text_to_add += "<font color=#BE8700 size=3><b><center>Purge all untruths and honor Ratvar.</center></b></font>"
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."

View File

@@ -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 = "<span class='heavy_brass'>You are a clockwork reclaimer</span><b>, 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.</b>"
/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("<span class='warning'>[src] bursts into deadly shrapnel!</span>")
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 << "<span class='warning'>[H] isn't a valid target! Valid targets are conscious non-servants.</span>"
return 0
if(get_dist(src, H) > 3)
src << "<span class='warning'>You need to be closer to dominate [H]!</span>"
return 0
visible_message("<span class='warning'>[src] rockets with blinding speed towards [H]!</span>", "<span class='heavy_brass'>You leap with blinding speed towards [H]'s head!</span>")
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("<span class='warning'>[src] tears apart [H]'s [H.name]!</span>")
H.unEquip(H.head)
qdel(H.head)
H.visible_message("<span class='warning'>[src] latches onto [H]'s head and digs its claws in!</span>", "<span class='userdanger'>[src] leaps onto your head and impales its claws deep!</span>")
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 << "<span class='userdanger'>ASSIMILATION SUCCESSFUL.</span>"
H << "<span class='userdanger'>ASSIMILATION SUCCESSFUL.</span>"
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 << "<span class='warning'>You have no host! Alt-click on a non-servant to enslave them.</span>"
return
var/mob/living/carbon/human/L = usr.loc
usr.loc = get_turf(L)
pixel_y = initial(pixel_y)
usr.visible_message("<span class='warning'>[usr] jumps off of [L]'s head!</span>", "<span class='notice'>You disengage from your host.</span>")
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

View File

@@ -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 << "<span class='big'><b>Seconds until Ratvar's arrival:</b> [arrival_text]s</span>"
user << "<span class='big'><b>Seconds until Ratvar's arrival:</b> [get_arrival_text(TRUE)]</span>"
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
user << "<span class='heavy_brass'>It's still opening.</span>"
@@ -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("<span class='heavy_brass'>[R] forms, and its eyes blink open, glowing bright red!</span>")
else
R = new/mob/living/simple_animal/hostile/clockwork/reclaimer(get_turf(src))
R.visible_message("<span class='heavy_brass'>[R] forms, and it emits a faint hum!</span>")
var/mob/living/simple_animal/drone/cogscarab/ratvar/R = new/mob/living/simple_animal/drone/cogscarab/ratvar(get_turf(src))
R.visible_message("<span class='heavy_brass'>[R] forms, and its eyes blink open, glowing bright red!</span>")
R.key = O.key

View File

@@ -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 << "<span class='warning'>You are already shielded by a Vanguard!</span>"
return 0
return 1

View File

@@ -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

View File

@@ -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("<span class='warning'>The air in front of [target] ripples before suddenly tearing open!</span>")
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("<span class='large_brass'><i>Hierophant Network:</i> <b>[i] Scripture has been [states[i] ? "un":""]locked.</b></span>")
/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("<span class='large_brass'><i>Hierophant Network:</i> <b>[i] Scripture has been [.[i] ? "un":""]locked.</b></span>")
/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)

View File

@@ -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()

View File

@@ -268,6 +268,7 @@
color = "#FAE48C"
layer = ABOVE_MOB_LAYER
duration = 70
luminosity = 6
/obj/effect/overlay/temp/ratvar/sigil/transgression/New()
..()

View File

@@ -157,11 +157,6 @@
/mob/living/proc/canSuicide()
if(stat == CONSCIOUS)
if(mental_dominator)
src << "<span class='warning'>This body's force of will is too strong! You can't break it enough to murder them.</span>"
if(mind_control_holder)
mind_control_holder << "<span class='userdanger'>Through tremendous force of will, you stop a suicide attempt!</span>"
return 0
return 1
else if(stat == DEAD)
src << "You're already dead!"

View File

@@ -116,7 +116,7 @@
if(!istype(G))
return
else if(G.health && !G.purpose_fulfilled)
return "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'>[GATEWAY_RATVAR_ARRIVAL - G.progress_in_seconds]</div>"
return "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'>[G.get_arrival_text(FALSE)]</div>"
/obj/effect/countdown/transformer
name = "transformer countdown"

View File

@@ -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 << "<span class='warning'>This body's force of will is too strong! You can't break it enough to force them into a catatonic state.</span>"
if(mind_control_holder)
mind_control_holder << "<span class='userdanger'>Through tremendous force of will, you stop a catatonia attempt!</span>"
return 0
if(stat != DEAD)
succumb()
if(stat == DEAD)

View File

@@ -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)

View File

@@ -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 << "<span class='warning'>[target] is already being controlled by someone else!</span>"
return 0
if(!target.mind)
src << "<span class='warning'>[target] is mindless and would make you permanently catatonic!</span>"
return 0
if(!silent)
src << "<span class='userdanger'>You pounce upon [target]'s mind and seize control of their body!</span>"
target << "<span class='userdanger'>Your control over your body is wrenched away from you!</span>"
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 << "<span class='userdanger'>You try to return to your own body, but sense nothing! You're being forced out!</span>"
target.ghostize(1)
target.mind_control_holder.mind.transfer_to(target)
if(!silent)
target << "<span class='userdanger'>You take control of your own body again!</span>"
return 0
if(!silent)
target << "<span class='userdanger'>You're forced out! You return to your own body.</span>"
target.mind.transfer_to(src)
target.mind_control_holder.mind.transfer_to(target)
qdel(mind_control_holder)
if(!silent)
target << "<span class='userdanger'>You take control of your own body again!</span>"
return 1
/mob/living/acid_act(acidpwr, toxpwr, acid_volume)
take_organ_damage(min(10*toxpwr, acid_volume * toxpwr))

View File

@@ -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

View File

@@ -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;}

View File

@@ -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"