mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-11 18:22:14 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -268,6 +268,7 @@
|
||||
color = "#FAE48C"
|
||||
layer = ABOVE_MOB_LAYER
|
||||
duration = 70
|
||||
luminosity = 6
|
||||
|
||||
/obj/effect/overlay/temp/ratvar/sigil/transgression/New()
|
||||
..()
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user