Tg 2 11 sync (#215)

* first series of updates

* datums

* games folder

* admin and atmosia stuffs

* moar

* mob updates borg riding

* sprites and stuff

* fixes for various things

* oops. some missed fixes
This commit is contained in:
Poojawa
2017-02-12 03:56:14 -06:00
committed by GitHub
parent 30b3dff395
commit 6674f9fc15
153 changed files with 1651 additions and 1368 deletions
@@ -22,6 +22,7 @@
E.sight_flags -= SEE_MOBS
E.flash_protect = 2
user << "We adjust our eyes to protect them from bright lights."
user.update_sight()
else
user << "We can't adjust our eyes if we don't have any!"
@@ -150,7 +150,7 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "arm_blade"
item_state = "arm_blade"
flags = ABSTRACT | NODROP
flags = ABSTRACT | NODROP | DROPDEL
w_class = WEIGHT_CLASS_HUGE
force = 25
throwforce = 0 //Just to be on the safe side
@@ -203,7 +203,6 @@
..()
if(can_drop)
new /obj/item/weapon/melee/synthetic_arm_blade(get_turf(user))
qdel(src)
/***************************************\
|***********COMBAT TENTACLES*************|
@@ -303,11 +302,10 @@
for(var/obj/item/I in H.held_items)
if(I.is_sharp())
C.visible_message("<span class='danger'>[H] impales [C] with [H.p_their()] [I.name]!</span>", "<span class='userdanger'>[H] impales you with [H.p_their()] [I.name]!</span>")
C.apply_damage(I.force*2, BRUTE, "chest")
C.apply_damage(I.force, BRUTE, "chest")
H.do_item_attack_animation(C, used_item = I)
H.add_mob_blood(C)
playsound(get_turf(H),I.hitsound,75,1)
C.Weaken(4)
return
/obj/item/projectile/tentacle/on_hit(atom/target, blocked = 0)
@@ -355,7 +353,6 @@
if(INTENT_HARM)
C.visible_message("<span class='danger'>[L] is thrown towards [H] by a tentacle!</span>","<span class='userdanger'>A tentacle grabs you and throws you towards [H]!</span>")
C.Weaken(3)
C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(src, .proc/tentacle_stab, H, C))
return 1
else
+8 -39
View File
@@ -84,8 +84,6 @@ Credit where due:
/datum/game_mode
var/list/servants_of_ratvar = list() //The Enlightened servants of Ratvar
var/required_escapees = 0 //How many servants need to escape, if applicable
var/required_silicon_converts = 0 //How many robotic lifeforms need to be converted, if applicable
var/clockwork_objective = CLOCKCULT_GATEWAY //The objective that the servants must fulfill
var/clockwork_explanation = "Construct a Gateway to the Celestial Derelict and free Ratvar." //The description of the current objective
@@ -141,20 +139,12 @@ Credit where due:
/datum/game_mode/clockwork_cult/proc/forge_clock_objectives() //Determine what objective that Ratvar's servants will fulfill
var/list/possible_objectives = list(CLOCKCULT_ESCAPE, CLOCKCULT_GATEWAY)
var/silicons_possible = FALSE
for(var/mob/living/silicon/ai/S in living_mob_list)
silicons_possible = TRUE
if(silicons_possible)
possible_objectives += CLOCKCULT_SILICONS
clockwork_objective = pick(possible_objectives)
switch(clockwork_objective)
if(CLOCKCULT_ESCAPE)
required_escapees = round(max(1, roundstart_player_count / 3)) //33% of the player count must be cultists
clockwork_explanation = "Ensure that [required_escapees] servants of Ratvar escape from [station_name()]."
clockwork_explanation = "Construct a Gateway to the Celestial Derelict and proselytize the entire station."
if(CLOCKCULT_GATEWAY)
clockwork_explanation = "Construct a Gateway to the Celestial Derelict and free Ratvar."
if(CLOCKCULT_SILICONS)
clockwork_explanation = "Ensure that all active silicon-based lifeforms on [station_name()] are servants of Ratvar and Application scripture is unlocked."
return 1
/datum/game_mode/clockwork_cult/proc/greet_servant(mob/M) //Description of their role
@@ -199,27 +189,8 @@ Credit where due:
/datum/game_mode/clockwork_cult/proc/check_clockwork_victory()
switch(clockwork_objective)
if(CLOCKCULT_ESCAPE)
var/surviving_servants = 0
for(var/datum/mind/M in servants_of_ratvar)
if(M.current && M.current.stat != DEAD && (M.current.onCentcom() || M.current.onSyndieBase()))
surviving_servants++
clockwork_explanation = "Ensure that [required_escapees] servant(s) of Ratvar escape from [station_name()].<br><i><b>[surviving_servants]</b> managed to escape!</i>"
if(surviving_servants >= required_escapees)
ticker.news_report = CULT_ESCAPE
return TRUE
if(CLOCKCULT_SILICONS)
var/total_silicons = 0
var/valid_silicons = 0
for(var/mob/living/silicon/S in mob_list) //Only check robots and AIs
if(isAI(S) || iscyborg(S))
total_silicons++
if(is_servant_of_ratvar(S) || S.stat == DEAD)
valid_silicons++
clockwork_explanation = "Ensure that all active silicon-based lifeforms on [station_name()] are servants of Ratvar and Application scripture is unlocked.<br>\
<i><b>[valid_silicons]/[total_silicons]</b> silicons were killed or converted!"
var/list/scripture_states = scripture_unlock_check()
if(valid_silicons >= total_silicons && scripture_states[SCRIPTURE_APPLICATION])
ticker.news_report = CLOCK_SILICONS
if(clockwork_gateway_activated)
ticker.news_report = CLOCK_PROSELYTIZATION
return TRUE
if(CLOCKCULT_GATEWAY)
if(ratvar_awakens)
@@ -241,18 +212,16 @@ Credit where due:
feedback_set_details("round_end_result", "win - servants completed their objective ([clockwork_objective])")
else
var/half_victory = FALSE
if(clockwork_objective == CLOCKCULT_GATEWAY)
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = locate() in all_clockwork_objects
if(G)
half_victory = TRUE
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = locate() in all_clockwork_objects
if(G)
half_victory = TRUE
if(half_victory)
text += "<span class='large_brass'><b>The crew escaped before Ratvar could rise, but the gateway was successfully constructed!</b></span>"
text += "<span class='large_brass'><b>The crew escaped before [clockwork_objective == CLOCKCULT_GATEWAY ? "Ratvar could rise":"the station could be proselytized"], but the gateway \
was successfully constructed!</b></span>"
feedback_set_details("round_end_result", "halfwin - round ended before the gateway finished")
else
text += "<span class='userdanger'>Ratvar's servants have failed!</span>"
feedback_set_details("round_end_result", "loss - servants failed their objective ([clockwork_objective])")
if(clockwork_gateway_activated && clockwork_objective != CLOCKCULT_GATEWAY)
ticker.news_report = CLOCK_PROSELYTIZATION
text += "<br><b>The servants' objective was:</b> <br>[clockwork_explanation]"
text += "<br>Ratvar's servants had <b>[clockwork_caches]</b> Tinkerer's Caches."
text += "<br><b>Construction Value(CV)</b> was: <b>[clockwork_construction_value]</b>"
@@ -159,11 +159,10 @@
/obj/effect/clockwork/sigil/submission/accession/post_channel(mob/living/L)
if(L.isloyal())
var/mob/living/carbon/C = L
delete_on_finish = TRUE
C.visible_message("<span class='warning'>[C] visibly trembles!</span>", \
L.visible_message("<span class='warning'>[L] visibly trembles!</span>", \
"<span class='sevtug'>[text2ratvar("You will be mine and his. This puny trinket will not stop me.")]</span>")
for(var/obj/item/weapon/implant/mindshield/M in C.implants)
for(var/obj/item/weapon/implant/mindshield/M in L.implants)
qdel(M)
@@ -159,7 +159,7 @@
/obj/item/stack/tile/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
if(source)
return FALSE
return list("operation_time" = amount, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH)
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH)
//Airlock conversion
/obj/machinery/door/airlock/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
@@ -263,42 +263,18 @@
//Hitting a clockwork structure will try to repair it.
/obj/structure/destructible/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
. = TRUE
if(!can_be_repaired)
user << "<span class='warning'>[src] cannot be repaired!</span>"
return
if(obj_integrity >= max_integrity)
user << "<span class='warning'>[src] is at maximum integrity!</span>"
return
var/amount_to_heal = max_integrity - obj_integrity
var/healing_for_cycle = min(amount_to_heal, repair_amount)
var/power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
user << "<span class='warning'>You need at least <b>[power_required]W</b> power to start repairing [src], and at least \
<b>[round(amount_to_heal*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W</b> to fully repair it!</span>"
var/list/repair_values = list()
if(!proselytizer.proselytizer_repair_checks(repair_values, src, user))
return
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] starts covering [src] in glowing orange energy...</span>", \
"<span class='alloy'>You start repairing [src]...</span>")
//hugeass while because we need to re-check after the do_after
proselytizer.repairing = src
while(proselytizer && user && src && obj_integrity < max_integrity)
amount_to_heal = max_integrity - obj_integrity
if(amount_to_heal <= 0)
while(proselytizer && user && src)
if(!do_after(user, repair_values["healing_for_cycle"] * proselytizer.speed_multiplier, target = src, \
extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytizer_repair_checks, repair_values, src, user, TRUE)))
break
healing_for_cycle = min(amount_to_heal, repair_amount)
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)) || \
!do_after(user, healing_for_cycle * proselytizer.speed_multiplier, target = src) || \
!proselytizer || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
break
amount_to_heal = max_integrity - obj_integrity
if(amount_to_heal <= 0)
break
healing_for_cycle = min(amount_to_heal, repair_amount)
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
break
obj_integrity = Clamp(obj_integrity + healing_for_cycle, 0, max_integrity)
proselytizer.modify_stored_power(-power_required)
obj_integrity = Clamp(obj_integrity + repair_values["healing_for_cycle"], 0, max_integrity)
proselytizer.modify_stored_power(-repair_values["power_required"])
playsound(src, 'sound/machines/click.ogg', 50, 1)
if(proselytizer)
@@ -309,42 +285,18 @@
//Proselytizer mob heal proc, to avoid as much copypaste as possible.
/mob/living/proc/proselytizer_heal(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
if(!is_servant_of_ratvar(src))
user << "<span class='warning'>[src] does not serve Ratvar!</span>"
return FALSE
if(health >= maxHealth || (flags & GODMODE))
user << "<span class='warning'>[src == user ? "You" : "[src]"] [src == user ? "are" : "is"] at maximum health!</span>"
return FALSE
var/amount_to_heal = maxHealth - health
var/healing_for_cycle = min(amount_to_heal, 4)
var/power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
user << "<span class='warning'>You need at least <b>[power_required]W</b> power to start repairing[src == user ? " yourself" : " [src]"], and at least \
<b>[round(amount_to_heal*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W</b> to fully repair [src == user ? "yourself" : "[p_them()]"]!</span>"
return FALSE
var/list/repair_values = list()
if(!proselytizer.proselytizer_repair_checks(repair_values, src, user))
return
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...</span>", \
"<span class='alloy'>You start repairin[src == user ? "g yourself" : "g [src]"]...</span>")
//hugeass while because we need to re-check after the do_after
proselytizer.repairing = src
while(proselytizer && user && src && health < maxHealth)
amount_to_heal = maxHealth - health
if(amount_to_heal <= 0)
while(proselytizer && user && src)
if(!do_after(user, repair_values["healing_for_cycle"] * proselytizer.speed_multiplier, target = src, \
extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytizer_repair_checks, repair_values, src, user, TRUE)))
break
healing_for_cycle = min(amount_to_heal, 4)
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)) || \
!do_after(user, healing_for_cycle * proselytizer.speed_multiplier, target = src) || \
!proselytizer || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
break
amount_to_heal = maxHealth - health
if(amount_to_heal <= 0)
break
healing_for_cycle = min(amount_to_heal, 4)
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
break
proselytizer_heal_tick(healing_for_cycle)
proselytizer.modify_stored_power(-power_required)
proselytizer_heal_tick(repair_values["healing_for_cycle"])
proselytizer.modify_stored_power(-repair_values["power_required"])
playsound(src, 'sound/machines/click.ogg', 50, 1)
if(proselytizer)
@@ -382,14 +334,17 @@
if(health < maxHealth && !(flags & GODMODE))
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...</span>", \
"<span class='alloy'>You start repairin[src == user ? "g yourself" : "g [src]"]...</span>")
proselytizer.repairing = src
if(do_after(user,80*proselytizer.speed_multiplier, target=src))
adjustHealth(-maxHealth)
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.</span>", \
"<span class='alloy'>You finish repairin[src == user ? "g yourself" : "g [src]"].</span>")
if(proselytizer)
proselytizer.repairing = null
else
user << "<span class='warning'>[src == user ? "You" : "[src]"] [src == user ? "are" : "is"] at maximum health!</span>"
//Convert shards and replicant alloy directly to power
//Convert shards and gear bits directly to power
/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -POWER_STANDARD, "spawn_dir" = SOUTH)
@@ -404,6 +359,3 @@
/obj/item/clockwork/alloy_shards/small/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.02), "spawn_dir" = SOUTH)
/obj/item/clockwork/component/replicant_alloy/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -CLOCKCULT_POWER_UNIT, "spawn_dir" = SOUTH)
@@ -196,22 +196,17 @@
if(proselytize_values["power_cost"] > 0)
proselytize_values["power_cost"] *= 2
if(!can_use_power(proselytize_values["power_cost"]))
if(stored_power - proselytize_values["power_cost"] < 0)
user << "<span class='warning'>You need <b>[proselytize_values["power_cost"]]W</b> power to proselytize [target]!</span>"
else if(stored_power - proselytize_values["power_cost"] > max_power)
user << "<span class='warning'>Your [name] contains too much power to proselytize [target]!</span>"
var/target_type = target.type
if(!proselytize_checks(proselytize_values, target, target_type, user))
return FALSE
proselytize_values["operation_time"] *= speed_multiplier
playsound(target, 'sound/machines/click.ogg', 50, 1)
if(proselytize_values["operation_time"])
var/target_type = target.type
user.visible_message("<span class='warning'>[user]'s [name] begins tearing apart [target]!</span>", "<span class='brass'>You begin proselytizing [target]...</span>")
if(!do_after(user, proselytize_values["operation_time"], target = target))
return FALSE
if(repairing || !can_use_power(proselytize_values["power_cost"]) || !target || target.type != target_type) //Check again to prevent bypassing via spamclick
if(!do_after(user, proselytize_values["operation_time"], target = target, extra_checks = CALLBACK(src, .proc/proselytize_checks, proselytize_values, target, target_type, user, TRUE)))
return FALSE
user.visible_message("<span class='warning'>[user]'s [name] covers [target] in golden energy!</span>", "<span class='brass'>You proselytize [target].</span>")
else
@@ -234,3 +229,64 @@
if(no_table_check)
return TRUE
return FALSE
/obj/item/clockwork/clockwork_proselytizer/proc/proselytize_checks(list/proselytize_values, atom/target, expected_type, mob/user, silent) //checked constantly while proselytizing
if(!islist(proselytize_values) || !target || QDELETED(target) || !user)
return FALSE
if(repairing)
return FALSE
if(target.type != expected_type)
return FALSE
if(can_use_power(RATVAR_POWER_CHECK))
proselytize_values["power_cost"] = 0
if(!can_use_power(proselytize_values["power_cost"]))
if(stored_power - proselytize_values["power_cost"] < 0)
if(!silent)
user << "<span class='warning'>You need <b>[proselytize_values["power_cost"]]W</b> power to proselytize [target]!</span>"
else if(stored_power - proselytize_values["power_cost"] > max_power)
if(!silent)
user << "<span class='warning'>Your [name] contains too much power to proselytize [target]!</span>"
return FALSE
return TRUE
//The repair check proc.
//Is dark magic. Can probably kill you.
/obj/item/clockwork/clockwork_proselytizer/proc/proselytizer_repair_checks(list/repair_values, atom/target, mob/user, silent) //Exists entirely to avoid an otherwise unreadable series of checks.
if(!islist(repair_values) || !target || QDELETED(target) || !user)
return FALSE
if(isliving(target))
var/mob/living/L = target
if(!is_servant_of_ratvar(L))
if(!silent)
user << "<span class='warning'>[L] does not serve Ratvar!</span>"
return FALSE
if(L.health >= L.maxHealth || (L.flags & GODMODE))
if(!silent)
user << "<span class='warning'>[L == user ? "You are" : "[L] is"] at maximum health!</span>"
return FALSE
repair_values["amount_to_heal"] = L.maxHealth - L.health
else if(isobj(target))
if(istype(target, /obj/structure/destructible/clockwork))
var/obj/structure/destructible/clockwork/C = target
if(!C.can_be_repaired)
if(!silent)
user << "<span class='warning'>[C] cannot be repaired!</span>"
return FALSE
var/obj/O = target
if(O.obj_integrity >= O.max_integrity)
if(!silent)
user << "<span class='warning'>[O] is at maximum integrity!</span>"
return FALSE
repair_values["amount_to_heal"] = O.max_integrity - O.obj_integrity
else
return FALSE
if(repair_values["amount_to_heal"] <= 0)
return FALSE
repair_values["healing_for_cycle"] = min(repair_values["amount_to_heal"], PROSELYTIZER_REPAIR_PER_TICK)
repair_values["power_required"] = round(repair_values["healing_for_cycle"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!can_use_power(RATVAR_POWER_CHECK) && !can_use_power(repair_values["power_required"]))
if(!silent)
user << "<span class='warning'>You need at least <b>[repair_values["power_required"]]W</b> power to start repairin[target == user ? "g yourself" : "g [target]"], and at least \
<b>[round(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W</b> to fully repair [target == user ? "yourself" : "[target.p_them()]"]!</span>"
return FALSE
return TRUE
@@ -179,7 +179,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
if(!channel_time)
return TRUE
for(var/invocation in invocations)
if(!check_special_requirements() || !do_after(invoker, channel_time / invocations.len, target = invoker) || !check_special_requirements())
if(!do_after(invoker, channel_time / invocations.len, target = invoker, extra_checks = CALLBACK(src, .proc/check_special_requirements)))
slab.busy = null
return FALSE
if(multiple_invokers_used)
@@ -206,9 +206,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
/datum/clockwork_scripture/channeled/scripture_effects()
for(var/i in 1 to chant_amount)
if(!can_recite())
break
if(!do_after(invoker, chant_interval, target = invoker))
if(!do_after(invoker, chant_interval, target = invoker, extra_checks = CALLBACK(src, .proc/can_recite)))
break
clockwork_say(invoker, text2ratvar(pick(chant_invocations)), whispered)
if(!chant_effects(i))
@@ -3,7 +3,7 @@
///////////////
//Ark of the Clockwork Justiciar: Creates a Gateway to the Celestial Derelict, either summoning ratvar or proselytizing everything.
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar
/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar
descname = "Structure, Win Condition"
name = "Ark of the Clockwork Justiciar"
desc = "Tears apart a rift in spacetime to Reebe, the Celestial Derelict.\n\
@@ -15,19 +15,21 @@
consumed_components = list(BELLIGERENT_EYE = 10, VANGUARD_COGWHEEL = 10, GEIS_CAPACITOR = 10, REPLICANT_ALLOY = 10, HIEROPHANT_ANSIBLE = 10)
invokers_required = 5
multiple_invokers_used = TRUE
object_path = /obj/structure/destructible/clockwork/massive/celestial_gateway
creator_message = null
usage_tip = "The gateway is completely vulnerable to attack during its five-minute duration. It will periodically give indication of its general position to everyone on the station \
as well as being loud enough to be heard throughout the entire sector. Defend it with your life!"
tier = SCRIPTURE_JUDGEMENT
sort_priority = 1
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/New()
/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar/New()
if(ticker && ticker.mode && ticker.mode.clockwork_objective != CLOCKCULT_GATEWAY)
invocations = list("ARMORER! FRIGHT! AMPERAGE! VANGUARD! I CALL UPON YOU!!", \
"THIS STATION WILL BE A BEACON OF HOPE IN THE DARKNESS OF SPACE!!", \
"HELP US MAKE THIS SHOW ENGINE'S GLORY!!")
..()
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/check_special_requirements()
/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar/check_special_requirements()
if(!slab.no_cost)
if(ratvar_awakens)
invoker << "<span class='big_brass'>\"I am already here, idiot.\"</span>"
@@ -47,11 +49,4 @@
else
invoker << "<span class='warning'>Ratvar's recent banishment renders him too weak to be wrung forth from Reebe!</span>"
return FALSE
return TRUE
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/scripture_effects()
var/turf/T = get_turf(invoker)
if(T)
new/obj/structure/destructible/clockwork/massive/celestial_gateway(T)
return TRUE
return FALSE
return ..()
@@ -9,8 +9,7 @@
anchored = 1
density = 1
resistance_flags = FIRE_PROOF | ACID_PROOF
var/repair_amount = 4 //how much a proselytizer can repair each cycle
var/can_be_repaired = TRUE //if a proselytizer can repair it at all
var/can_be_repaired = TRUE //if a proselytizer can repair it
break_message = "<span class='warning'>The frog isn't a meme after all!</span>" //The message shown when a structure breaks
break_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' //The sound played when a structure breaks
debris = list(/obj/item/clockwork/alloy_shards/large = 1, \
@@ -72,9 +71,10 @@
. *= min(max_integrity/max(obj_integrity, 1), 4)
. = round(., 0.01)
/obj/structure/destructible/clockwork/can_be_unfasten_wrench(mob/user)
/obj/structure/destructible/clockwork/can_be_unfasten_wrench(mob/user, silent)
if(anchored && obj_integrity <= round(max_integrity * 0.25, 1))
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
if(!silent)
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
return FAILED_UNFASTEN
return ..()
@@ -158,9 +158,10 @@
var/powered = total_accessable_power()
return powered == PROCESS_KILL ? 25 : powered //make sure we don't accidentally return the arbitrary PROCESS_KILL define
/obj/structure/destructible/clockwork/powered/can_be_unfasten_wrench(mob/user)
/obj/structure/destructible/clockwork/powered/can_be_unfasten_wrench(mob/user, silent)
if(active)
user << "<span class='warning'>[src] needs to be disabled before it can be unsecured!</span>"
if(!silent)
user << "<span class='warning'>[src] needs to be disabled before it can be unsecured!</span>"
return FAILED_UNFASTEN
return ..()
@@ -74,8 +74,6 @@
hierophant_message("<span class='large_brass'><b>A gateway to the Celestial Derelict has been created in [gate_area.map_name]!</b></span>", FALSE, src)
if(!objective_is_gateway)
ratvar_portal = FALSE
hierophant_message("<span class='big_brass'>This newly constructed gateway will not free Ratvar, \
and will instead simply proselytize and convert everything and everyone on the station.</span>", TRUE)
SSshuttle.registerHostileEnvironment(src)
START_PROCESSING(SSprocessing, src)
@@ -210,13 +208,14 @@
animate(glow, transform = matrix() * 3, alpha = 0, time = 5)
var/turf/startpoint = get_turf(src)
QDEL_IN(src, 3)
clockwork_gateway_activated = TRUE
if(ratvar_portal)
sleep(3)
clockwork_gateway_activated = TRUE
new/obj/structure/destructible/clockwork/massive/ratvar(startpoint)
else
INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 0) //call the shuttle immediately
sleep(3)
clockwork_gateway_activated = TRUE
send_to_playing_players("<span class='ratvar'>\"[text2ratvar("Behold")]!\"</span>\n<span class='inathneq_large'>\"[text2ratvar("See Engine's mercy")]!\"</span>\n\
<span class='sevtug_large'>\"[text2ratvar("Observe Engine's design skills")]!\"</span>\n<span class='nezbere_large'>\"[text2ratvar("Behold Engine's light")]!!\"</span>\n\
<span class='nzcrentr_large'>\"[text2ratvar("Gaze upon Engine's power")]!\"</span>")
@@ -234,13 +233,8 @@
dist = FALSE
T.ratvar_act(dist)
CHECK_TICK
for(var/mob/living/silicon/robot/R in silicon_mobs)
if(R && R.stat != DEAD && !is_servant_of_ratvar(R))
add_servant_of_ratvar(R)
for(var/i in ai_list)
var/mob/living/silicon/ai/A = i
if(A && A.stat != DEAD && !is_servant_of_ratvar(A))
add_servant_of_ratvar(A)
for(var/mob/living/L in living_mob_list)
L.ratvar_act()
for(var/I in all_clockwork_mobs)
var/mob/M = I
if(M.stat == CONSCIOUS)
@@ -25,9 +25,10 @@
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='nzcrentr_small'>It requires <b>[hierophant_cost]W</b> to broadcast over the Hierophant Network, and <b>[gateway_cost]W</b> to open a Spatial Gateway.</span>"
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/can_be_unfasten_wrench(mob/user)
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/can_be_unfasten_wrench(mob/user, silent)
if(active)
user << "<span class='warning'>[src] is currently sustaining a gateway!</span>"
if(!silent)
user << "<span class='warning'>[src] is currently sustaining a gateway!</span>"
return FAILED_UNFASTEN
return ..()
@@ -32,14 +32,16 @@
/obj/structure/destructible/clockwork/ocular_warden/hulk_damage()
return 25
/obj/structure/destructible/clockwork/ocular_warden/can_be_unfasten_wrench(mob/user)
/obj/structure/destructible/clockwork/ocular_warden/can_be_unfasten_wrench(mob/user, silent)
if(anchored)
if(obj_integrity <= max_integrity * 0.25)
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
if(!silent)
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
return FAILED_UNFASTEN
else
for(var/obj/structure/destructible/clockwork/ocular_warden/W in orange(3, src))
user << "<span class='neovgre'>You sense another ocular warden too near this location. Activating this one this close would cause them to fight.</span>"
if(!silent)
user << "<span class='neovgre'>You sense another ocular warden too near this location. Activating this one this close would cause them to fight.</span>"
return FAILED_UNFASTEN
return SUCCESSFUL_UNFASTEN
+1 -1
View File
@@ -498,9 +498,9 @@ var/list/teleport_runes = list()
sleep(40)
if(src)
color = "#FF0000"
new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed
if(cult_mode)
cult_mode.eldergod = 0
new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
if((istype(I, /obj/item/weapon/tome) && iscultist(user)))
@@ -196,9 +196,32 @@
/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
return S.Integrate(src)
/obj/item/proc/IntegrateAmount() //returns the amount of resources gained when eating this item
if(materials[MAT_METAL] || materials[MAT_GLASS])
return 1
return 0
/obj/item/weapon/gun/swarmer_act()//Stops you from eating the entire armory
return FALSE
/obj/item/clockwork/alloy_shards/IntegrateAmount()
return 10
/obj/item/stack/tile/brass/IntegrateAmount()
return 5
/obj/item/clockwork/alloy_shards/medium/gear_bit/large/IntegrateAmount()
return 4
/obj/item/clockwork/alloy_shards/large/IntegrateAmount()
return 3
/obj/item/clockwork/alloy_shards/medium/IntegrateAmount()
return 2
/obj/item/clockwork/alloy_shards/small/IntegrateAmount()
return 1
/turf/open/floor/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor
return FALSE
@@ -316,6 +339,10 @@
S << "<span class='warning'>This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.</span>"
return FALSE
/obj/machinery/deepfryer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This kitchen appliance should be preserved, it will make delicious unhealthy snacks for our masters in the future. Aborting.</span>"
return FALSE
/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>"
return FALSE
@@ -362,6 +389,10 @@
S << "<span class='warning'>This object is receiving unactivated swarmer shells to help us. Aborting.</span>"
return FALSE
/obj/structure/destructible/clockwork/massive/celestial_gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This object is multiplying existing resources. Aborting.</span>"
return FALSE
/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
. = ..()
var/turf/here = get_turf(src)
@@ -373,13 +404,12 @@
/obj/item/device/unactivated_swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(S.resources + 50 > S.max_resources)
S << "<span class='warning'>We have too many resources to reconsume this shell. Aborting.</span>"
else
..()
S.resources += 49 //refund the whole thing
..()
return FALSE //would logically be TRUE, but we don't want AI swarmers eating player spawn chances.
/obj/item/device/unactivated_swarmer/IntegrateAmount()
return 50
/obj/machinery/hydroponics/soil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This object does not contain enough materials to work with.</span>"
return FALSE
@@ -396,13 +426,13 @@
return 0
return new fabrication_object(loc)
/mob/living/simple_animal/hostile/swarmer/proc/Integrate(obj/item/target)
if(resources >= max_resources)
var/resource_gain = target.IntegrateAmount()
if(resources + resource_gain > max_resources)
src << "<span class='warning'>We cannot hold more materials!</span>"
return TRUE
if((target.materials[MAT_METAL]) || (target.materials[MAT_GLASS]))
resources++
if(resource_gain)
resources += resource_gain
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
var/obj/effect/overlay/temp/swarmer/integrate/I = new /obj/effect/overlay/temp/swarmer/integrate(get_turf(target))
@@ -57,6 +57,7 @@
U.hidden_uplink.telecrystals = CHALLENGE_TELECRYSTALS
U.hidden_uplink.set_gamemode(/datum/game_mode/nuclear)
config.shuttle_refuel_delay = max(config.shuttle_refuel_delay, CHALLENGE_SHUTTLE_DELAY)
feedback_set("nuclear_challenge_mode",1)
qdel(src)
/obj/item/device/nuclear_challenge/proc/check_allowed(mob/living/user)
+1 -1
View File
@@ -20,7 +20,7 @@ var/bomb_set
density = 1
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/timer_set = 60
var/timer_set = 90
var/default_timer_set = 90
var/minimum_timer_set = 90
var/maximum_timer_set = 3600