Bleeding edgy refresh (#303)
* not code stuff * other things * global vars, defines, helpers * onclick hud stuff, orphans, world.dm * controllers and datums * game folder * everything not client/mobs in modules * client folder * stage 1 mob stuff * simple animal things * silicons * carbon things * ayylmaos and monkeys * hyoomahn * icons n shit * sprite fixes * compile fixes * some fixes I cherrypicked. * qdel fixes * forgot brain refractors
This commit is contained in:
@@ -54,12 +54,12 @@
|
||||
H.set_machine(src)
|
||||
if(href_list["school"])
|
||||
if(used)
|
||||
H << "You already used this contract!"
|
||||
to_chat(H, "You already used this contract!")
|
||||
return
|
||||
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
|
||||
if(candidates.len)
|
||||
if(used)
|
||||
H << "You already used this contract!"
|
||||
to_chat(H, "You already used this contract!")
|
||||
return
|
||||
used = 1
|
||||
var/mob/dead/observer/theghost = pick(candidates)
|
||||
@@ -67,7 +67,7 @@
|
||||
if(H && H.mind)
|
||||
ticker.mode.update_wiz_icons_added(H.mind)
|
||||
else
|
||||
H << "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later."
|
||||
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
|
||||
|
||||
/obj/item/weapon/antag_spawner/contract/spawn_antag(client/C, turf/T, type = "")
|
||||
new /obj/effect/particle_effect/smoke(T)
|
||||
@@ -77,25 +77,25 @@
|
||||
var/wizard_name = "the wizard"
|
||||
if(usr)
|
||||
wizard_name = usr.real_name
|
||||
M << "<B>You are [wizard_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals."
|
||||
to_chat(M, "<B>You are [wizard_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.")
|
||||
switch(type)
|
||||
if("destruction")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
|
||||
M << "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball."
|
||||
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
|
||||
if("bluespace")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
|
||||
M << "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt."
|
||||
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
|
||||
if("healing")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
|
||||
M.put_in_hands_or_del(new /obj/item/weapon/gun/magic/staff/healing(M))
|
||||
M << "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall."
|
||||
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
|
||||
if("robeless")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
|
||||
M << "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap."
|
||||
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
|
||||
|
||||
equip_antag(M)
|
||||
var/wizard_name_first = pick(wizard_first)
|
||||
@@ -140,13 +140,13 @@
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/proc/check_usability(mob/user)
|
||||
if(used)
|
||||
user << "<span class='warning'>[src] is out of power!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
|
||||
return 0
|
||||
if(!(user.mind in ticker.mode.syndicates))
|
||||
user << "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>"
|
||||
to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>")
|
||||
return 0
|
||||
if(user.z != ZLEVEL_CENTCOM)
|
||||
user << "<span class='warning'>[src] is out of range! It can only be used at your base!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] is out of range! It can only be used at your base!</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
S.start()
|
||||
qdel(src)
|
||||
else
|
||||
user << "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>"
|
||||
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
|
||||
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
|
||||
@@ -236,7 +236,7 @@
|
||||
|
||||
/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user)
|
||||
if(user.z != 1)
|
||||
user << "<span class='notice'>You should probably wait until you reach the station.</span>"
|
||||
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
|
||||
return
|
||||
if(used)
|
||||
return
|
||||
@@ -247,12 +247,12 @@
|
||||
used = 1
|
||||
var/mob/dead/observer/theghost = pick(demon_candidates)
|
||||
spawn_antag(theghost.client, get_turf(src), initial(demon_type.name))
|
||||
user << shatter_msg
|
||||
user << veil_msg
|
||||
to_chat(user, shatter_msg)
|
||||
to_chat(user, veil_msg)
|
||||
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
|
||||
qdel(src)
|
||||
else
|
||||
user << "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>"
|
||||
to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>")
|
||||
|
||||
|
||||
/obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "")
|
||||
@@ -275,12 +275,12 @@
|
||||
new_objective2.owner = S.mind
|
||||
new_objective2.explanation_text = "[objective_verb] everyone[usr ? " else while you're at it":""]."
|
||||
S.mind.objectives += new_objective2
|
||||
S << S.playstyle_string
|
||||
S << "<B>You are currently not currently in the same plane of existence as the station. \
|
||||
Ctrl+Click a blood pool to manifest.</B>"
|
||||
to_chat(S, S.playstyle_string)
|
||||
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. \
|
||||
Ctrl+Click a blood pool to manifest.</B>")
|
||||
if(new_objective)
|
||||
S << "<B>Objective #[1]</B>: [new_objective.explanation_text]"
|
||||
S << "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]"
|
||||
to_chat(S, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
|
||||
to_chat(S, "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]")
|
||||
|
||||
/obj/item/weapon/antag_spawner/slaughter_demon/laughter
|
||||
name = "vial of tickles"
|
||||
|
||||
@@ -70,9 +70,10 @@ var/list/blobs_legit = list() //used for win-score calculations, contains only b
|
||||
|
||||
/datum/game_mode/blob/proc/show_message(message)
|
||||
for(var/datum/mind/blob in blob_overminds)
|
||||
blob.current << message
|
||||
to_chat(blob.current, message)
|
||||
|
||||
/datum/game_mode/blob/post_setup()
|
||||
set waitfor = FALSE
|
||||
|
||||
for(var/datum/mind/blob in blob_overminds)
|
||||
var/mob/camera/blob/B = blob.current.become_overmind(TRUE, round(blob_base_starting_points/blob_overminds.len))
|
||||
@@ -88,16 +89,15 @@ var/list/blobs_legit = list() //used for win-score calculations, contains only b
|
||||
if(B)
|
||||
B.max_occurrences = 0 // disable the event
|
||||
|
||||
spawn(0)
|
||||
var/message_delay = rand(messagedelay_low, messagedelay_high) //between 4 and 6 minutes with 2400 low and 3600 high.
|
||||
. = ..()
|
||||
|
||||
sleep(message_delay)
|
||||
var/message_delay = rand(messagedelay_low, messagedelay_high) //between 4 and 6 minutes with 2400 low and 3600 high.
|
||||
|
||||
send_intercept(1)
|
||||
message_sent = TRUE
|
||||
sleep(message_delay)
|
||||
|
||||
sleep(24000) //40 minutes, plus burst_delay*3(minimum of 6 minutes, maximum of 8)
|
||||
if(!replacementmode)
|
||||
send_intercept(2) //if the blob has been alive this long, it's time to bomb it
|
||||
send_intercept(1)
|
||||
message_sent = TRUE
|
||||
|
||||
return ..()
|
||||
sleep(24000) //40 minutes, plus burst_delay*3(minimum of 6 minutes, maximum of 8)
|
||||
if(!replacementmode)
|
||||
send_intercept(2) //if the blob has been alive this long, it's time to bomb it
|
||||
@@ -21,24 +21,24 @@
|
||||
..()
|
||||
if(blobwincount <= blobs_legit.len)
|
||||
feedback_set_details("round_end_result","win - blob took over")
|
||||
world << "<FONT size = 3><B>The blob has taken over the station!</B></FONT>"
|
||||
world << "<B>The entire station was eaten by the Blob!</B>"
|
||||
to_chat(world, "<FONT size = 3><B>The blob has taken over the station!</B></FONT>")
|
||||
to_chat(world, "<B>The entire station was eaten by the Blob!</B>")
|
||||
log_game("Blob mode completed with a blob victory.")
|
||||
|
||||
ticker.news_report = BLOB_WIN
|
||||
|
||||
else if(station_was_nuked)
|
||||
feedback_set_details("round_end_result","halfwin - nuke")
|
||||
world << "<FONT size = 3><B>Partial Win: The station has been destroyed!</B></FONT>"
|
||||
world << "<B>Directive 7-12 has been successfully carried out, preventing the Blob from spreading.</B>"
|
||||
to_chat(world, "<FONT size = 3><B>Partial Win: The station has been destroyed!</B></FONT>")
|
||||
to_chat(world, "<B>Directive 7-12 has been successfully carried out, preventing the Blob from spreading.</B>")
|
||||
log_game("Blob mode completed with a tie (station destroyed).")
|
||||
|
||||
ticker.news_report = BLOB_NUKE
|
||||
|
||||
else if(!blob_cores.len)
|
||||
feedback_set_details("round_end_result","loss - blob eliminated")
|
||||
world << "<FONT size = 3><B>The staff has won!</B></FONT>"
|
||||
world << "<B>The alien organism has been eradicated from the station!</B>"
|
||||
to_chat(world, "<FONT size = 3><B>The staff has won!</B></FONT>")
|
||||
to_chat(world, "<B>The alien organism has been eradicated from the station!</B>")
|
||||
log_game("Blob mode completed with a crew victory.")
|
||||
|
||||
ticker.news_report = BLOB_DESTROYED
|
||||
@@ -68,5 +68,5 @@
|
||||
var/text = "<FONT size = 2><B>The blob[(blob_mode.blob_overminds.len > 1 ? "s were" : " was")]:</B></FONT>"
|
||||
for(var/datum/mind/blob in blob_mode.blob_overminds)
|
||||
text += printplayer(blob)
|
||||
world << text
|
||||
to_chat(world, text)
|
||||
return 1
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
intercepttext += " 2. If found, use any neccesary means to contain and destroy the organism.<BR>"
|
||||
intercepttext += " 3. Avoid damage to the capital infrastructure of the station.<BR>"
|
||||
intercepttext += "<BR>Note in the event of a quarantine breach or uncontrolled spread of the biohazard, <b>Biohazard Response Procedure 5-12</b> may be issued.<BR>"
|
||||
print_command_report(intercepttext,"Level 5-6 Biohazard Response Procedures")
|
||||
print_command_report(text=intercepttext,title="Level 5-6 Biohazard Response Procedures",announce=FALSE)
|
||||
priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
|
||||
if(2)
|
||||
var/nukecode = random_nukecode()
|
||||
@@ -29,8 +29,7 @@
|
||||
intercepttext += "1. Secure the Nuclear Authentication Disk.<BR>"
|
||||
intercepttext += "2. Detonate the Nuke located in the vault.<BR>"
|
||||
intercepttext += "Nuclear Authentication Code: [nukecode] <BR>"
|
||||
print_command_report(intercepttext,"Classified [command_name()] Update")
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg')
|
||||
print_command_report(text=intercepttext,announce=TRUE)
|
||||
|
||||
for(var/mob/living/silicon/ai/aiPlayer in player_list)
|
||||
if (aiPlayer.client)
|
||||
@@ -38,7 +37,6 @@
|
||||
aiPlayer.set_zeroth_law(law)
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -99,7 +97,7 @@
|
||||
if(valid_territories.len)
|
||||
num_territories = valid_territories.len //Add them all up to make the total number of area types
|
||||
else
|
||||
world << "ERROR: NO VALID TERRITORIES"
|
||||
to_chat(world, "ERROR: NO VALID TERRITORIES")
|
||||
|
||||
/datum/station_state/proc/score(datum/station_state/result)
|
||||
if(!result)
|
||||
|
||||
@@ -68,10 +68,10 @@
|
||||
var/rendered = "<font color=\"#EE4000\"><b>\[Blob Telepathy\] [real_name]</b> [spanned_message]</font>"
|
||||
for(var/M in mob_list)
|
||||
if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob))
|
||||
M << rendered
|
||||
to_chat(M, rendered)
|
||||
if(isobserver(M))
|
||||
var/link = FOLLOW_LINK(M, src)
|
||||
M << "[link] [rendered]"
|
||||
to_chat(M, "[link] [rendered]")
|
||||
|
||||
////////////////
|
||||
// BLOB SPORE //
|
||||
@@ -102,7 +102,7 @@
|
||||
var/is_zombie = 0
|
||||
gold_core_spawnable = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobspore/New(loc, var/obj/structure/blob/factory/linked_node)
|
||||
/mob/living/simple_animal/hostile/blob/blobspore/Initialize(mapload, var/obj/structure/blob/factory/linked_node)
|
||||
if(istype(linked_node))
|
||||
factory = linked_node
|
||||
factory.spores += src
|
||||
@@ -222,7 +222,7 @@
|
||||
see_in_dark = 8
|
||||
var/independent = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobbernaut/New()
|
||||
/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize()
|
||||
..()
|
||||
if(!independent) //no pulling people deep into the blob
|
||||
verbs -= /mob/living/verb/pulled
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
spore.factory = null
|
||||
if(naut)
|
||||
naut.factory = null
|
||||
naut << "<span class='userdanger'>Your factory was destroyed! You feel yourself dying!</span>"
|
||||
to_chat(naut, "<span class='userdanger'>Your factory was destroyed! You feel yourself dying!</span>")
|
||||
naut.throw_alert("nofactory", /obj/screen/alert/nofactory)
|
||||
spores = null
|
||||
return ..()
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
var/manualplace_min_time = 600 //in deciseconds //a minute, to get bearings
|
||||
var/autoplace_max_time = 3600 //six minutes, as long as should be needed
|
||||
|
||||
/mob/camera/blob/New(loc, pre_placed = 0, mode_made = 0, starting_points = 60)
|
||||
/mob/camera/blob/Initialize(mapload, pre_placed = 0, mode_made = 0, starting_points = 60)
|
||||
blob_points = starting_points
|
||||
if(pre_placed) //we already have a core!
|
||||
manualplace_min_time = 0
|
||||
@@ -61,8 +61,8 @@
|
||||
if(!blob_core)
|
||||
if(!placed)
|
||||
if(manualplace_min_time && world.time >= manualplace_min_time)
|
||||
src << "<b><span class='big'><font color=\"#EE4000\">You may now place your blob core.</font></span></b>"
|
||||
src << "<span class='big'><font color=\"#EE4000\">You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.</font></span>"
|
||||
to_chat(src, "<b><span class='big'><font color=\"#EE4000\">You may now place your blob core.</font></span></b>")
|
||||
to_chat(src, "<span class='big'><font color=\"#EE4000\">You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.</font></span>")
|
||||
manualplace_min_time = 0
|
||||
if(autoplace_max_time && world.time >= autoplace_max_time)
|
||||
place_blob_core(base_point_rate, 1)
|
||||
@@ -92,7 +92,7 @@
|
||||
/mob/camera/blob/Login()
|
||||
..()
|
||||
sync_mind()
|
||||
src << "<span class='notice'>You are the overmind!</span>"
|
||||
to_chat(src, "<span class='notice'>You are the overmind!</span>")
|
||||
blob_help()
|
||||
update_health_hud()
|
||||
add_points(0)
|
||||
@@ -100,7 +100,7 @@
|
||||
/mob/camera/blob/examine(mob/user)
|
||||
..()
|
||||
if(blob_reagent_datum)
|
||||
user << "Its chemical is <font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</font>."
|
||||
to_chat(user, "Its chemical is <font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</font>.")
|
||||
|
||||
/mob/camera/blob/update_health_hud()
|
||||
if(blob_core)
|
||||
@@ -119,7 +119,7 @@
|
||||
|
||||
if (src.client)
|
||||
if(client.prefs.muted & MUTE_IC)
|
||||
src << "You cannot send IC messages (muted)."
|
||||
to_chat(src, "You cannot send IC messages (muted).")
|
||||
return
|
||||
if (src.client.handle_spam_prevention(message,MUTE_IC))
|
||||
return
|
||||
@@ -142,10 +142,10 @@
|
||||
|
||||
for(var/mob/M in mob_list)
|
||||
if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob))
|
||||
M << rendered
|
||||
to_chat(M, rendered)
|
||||
if(isobserver(M))
|
||||
var/link = FOLLOW_LINK(M, src)
|
||||
M << "[link] [rendered]"
|
||||
to_chat(M, "[link] [rendered]")
|
||||
|
||||
/mob/camera/blob/emote(act,m_type=1,message = null)
|
||||
return
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/camera/blob/proc/can_buy(cost = 15)
|
||||
if(blob_points < cost)
|
||||
src << "<span class='warning'>You cannot afford this, you need at least [cost] resources!</span>"
|
||||
to_chat(src, "<span class='warning'>You cannot afford this, you need at least [cost] resources!</span>")
|
||||
return 0
|
||||
add_points(-cost)
|
||||
return 1
|
||||
@@ -15,30 +15,30 @@
|
||||
if("blob" in M.faction)
|
||||
continue
|
||||
if(M.client)
|
||||
src << "<span class='warning'>There is someone too close to place your blob core!</span>"
|
||||
to_chat(src, "<span class='warning'>There is someone too close to place your blob core!</span>")
|
||||
return 0
|
||||
for(var/mob/living/M in view(13, src))
|
||||
if("blob" in M.faction)
|
||||
continue
|
||||
if(M.client)
|
||||
src << "<span class='warning'>Someone could see your blob core from here!</span>"
|
||||
to_chat(src, "<span class='warning'>Someone could see your blob core from here!</span>")
|
||||
return 0
|
||||
var/turf/T = get_turf(src)
|
||||
if(T.density)
|
||||
src << "<span class='warning'>This spot is too dense to place a blob core on!</span>"
|
||||
to_chat(src, "<span class='warning'>This spot is too dense to place a blob core on!</span>")
|
||||
return 0
|
||||
for(var/obj/O in T)
|
||||
if(istype(O, /obj/structure/blob))
|
||||
if(istype(O, /obj/structure/blob/normal))
|
||||
qdel(O)
|
||||
else
|
||||
src << "<span class='warning'>There is already a blob here!</span>"
|
||||
to_chat(src, "<span class='warning'>There is already a blob here!</span>")
|
||||
return 0
|
||||
else if(O.density)
|
||||
src << "<span class='warning'>This spot is too dense to place a blob core on!</span>"
|
||||
to_chat(src, "<span class='warning'>This spot is too dense to place a blob core on!</span>")
|
||||
return 0
|
||||
if(world.time <= manualplace_min_time && world.time <= autoplace_max_time)
|
||||
src << "<span class='warning'>It is too early to place your blob core!</span>"
|
||||
to_chat(src, "<span class='warning'>It is too early to place your blob core!</span>")
|
||||
return 0
|
||||
else if(placement_override == 1)
|
||||
var/turf/T = pick(blobstart)
|
||||
@@ -80,19 +80,19 @@
|
||||
T = get_turf(src)
|
||||
var/obj/structure/blob/B = (locate(/obj/structure/blob) in T)
|
||||
if(!B)
|
||||
src << "<span class='warning'>There is no blob here!</span>"
|
||||
to_chat(src, "<span class='warning'>There is no blob here!</span>")
|
||||
return
|
||||
if(!istype(B, /obj/structure/blob/normal))
|
||||
src << "<span class='warning'>Unable to use this blob, find a normal one.</span>"
|
||||
to_chat(src, "<span class='warning'>Unable to use this blob, find a normal one.</span>")
|
||||
return
|
||||
if(needsNode && nodes_required)
|
||||
if(!(locate(/obj/structure/blob/node) in orange(3, T)) && !(locate(/obj/structure/blob/core) in orange(4, T)))
|
||||
src << "<span class='warning'>You need to place this blob closer to a node or core!</span>"
|
||||
to_chat(src, "<span class='warning'>You need to place this blob closer to a node or core!</span>")
|
||||
return //handholdotron 2000
|
||||
if(nearEquals)
|
||||
for(var/obj/structure/blob/L in orange(nearEquals, T))
|
||||
if(L.type == blobType)
|
||||
src << "<span class='warning'>There is a similar blob nearby, move more than [nearEquals] tiles away from it!</span>"
|
||||
to_chat(src, "<span class='warning'>There is a similar blob nearby, move more than [nearEquals] tiles away from it!</span>")
|
||||
return
|
||||
if(!can_buy(price))
|
||||
return
|
||||
@@ -105,9 +105,9 @@
|
||||
set desc = "Toggle requiring nodes to place resource and factory blobs."
|
||||
nodes_required = !nodes_required
|
||||
if(nodes_required)
|
||||
src << "<span class='warning'>You now require a nearby node or core to place factory and resource blobs.</span>"
|
||||
to_chat(src, "<span class='warning'>You now require a nearby node or core to place factory and resource blobs.</span>")
|
||||
else
|
||||
src << "<span class='warning'>You no longer require a nearby node or core to place factory and resource blobs.</span>"
|
||||
to_chat(src, "<span class='warning'>You no longer require a nearby node or core to place factory and resource blobs.</span>")
|
||||
|
||||
/mob/camera/blob/verb/create_shield_power()
|
||||
set category = "Blob"
|
||||
@@ -143,13 +143,13 @@
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/structure/blob/factory/B = locate(/obj/structure/blob/factory) in T
|
||||
if(!B)
|
||||
src << "<span class='warning'>You must be on a factory blob!</span>"
|
||||
to_chat(src, "<span class='warning'>You must be on a factory blob!</span>")
|
||||
return
|
||||
if(B.naut) //if it already made a blobbernaut, it can't do it again
|
||||
src << "<span class='warning'>This factory blob is already sustaining a blobbernaut.</span>"
|
||||
to_chat(src, "<span class='warning'>This factory blob is already sustaining a blobbernaut.</span>")
|
||||
return
|
||||
if(B.obj_integrity < B.max_integrity * 0.5)
|
||||
src << "<span class='warning'>This factory blob is too damaged to sustain a blobbernaut.</span>"
|
||||
to_chat(src, "<span class='warning'>This factory blob is too damaged to sustain a blobbernaut.</span>")
|
||||
return
|
||||
if(!can_buy(40))
|
||||
return
|
||||
@@ -173,11 +173,11 @@
|
||||
blobber.key = C.key
|
||||
blobber << 'sound/effects/blobattack.ogg'
|
||||
blobber << 'sound/effects/attackblob.ogg'
|
||||
blobber << "<b>You are a blobbernaut!</b>"
|
||||
blobber << "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed."
|
||||
blobber << "You can communicate with other blobbernauts and overminds via <b>:b</b>"
|
||||
blobber << "Your overmind's blob reagent is: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!"
|
||||
blobber << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]"
|
||||
to_chat(blobber, "<b>You are a blobbernaut!</b>")
|
||||
to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.")
|
||||
to_chat(blobber, "You can communicate with other blobbernauts and overminds via <b>:b</b>")
|
||||
to_chat(blobber, "Your overmind's blob reagent is: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
|
||||
to_chat(blobber, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]")
|
||||
if(blobber)
|
||||
blobber.notransform = 0
|
||||
|
||||
@@ -188,14 +188,14 @@
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/structure/blob/node/B = locate(/obj/structure/blob/node) in T
|
||||
if(!B)
|
||||
src << "<span class='warning'>You must be on a blob node!</span>"
|
||||
to_chat(src, "<span class='warning'>You must be on a blob node!</span>")
|
||||
return
|
||||
if(!blob_core)
|
||||
src << "<span class='userdanger'>You have no core and are about to die! May you rest in peace.</span>"
|
||||
to_chat(src, "<span class='userdanger'>You have no core and are about to die! May you rest in peace.</span>")
|
||||
return
|
||||
var/area/A = get_area(T)
|
||||
if(isspaceturf(T) || A && !A.blob_allowed)
|
||||
src << "<span class='warning'>You cannot relocate your core here!</span>"
|
||||
to_chat(src, "<span class='warning'>You cannot relocate your core here!</span>")
|
||||
return
|
||||
if(!can_buy(80))
|
||||
return
|
||||
@@ -216,17 +216,17 @@
|
||||
/mob/camera/blob/proc/remove_blob(turf/T)
|
||||
var/obj/structure/blob/B = locate() in T
|
||||
if(!B)
|
||||
src << "<span class='warning'>There is no blob there!</span>"
|
||||
to_chat(src, "<span class='warning'>There is no blob there!</span>")
|
||||
return
|
||||
if(B.point_return < 0)
|
||||
src << "<span class='warning'>Unable to remove this blob.</span>"
|
||||
to_chat(src, "<span class='warning'>Unable to remove this blob.</span>")
|
||||
return
|
||||
if(max_blob_points < B.point_return + blob_points)
|
||||
src << "<span class='warning'>You have too many resources to remove this blob!</span>"
|
||||
to_chat(src, "<span class='warning'>You have too many resources to remove this blob!</span>")
|
||||
return
|
||||
if(B.point_return)
|
||||
add_points(B.point_return)
|
||||
src << "<span class='notice'>Gained [B.point_return] resources from removing \the [B].</span>"
|
||||
to_chat(src, "<span class='notice'>Gained [B.point_return] resources from removing \the [B].</span>")
|
||||
qdel(B)
|
||||
|
||||
/mob/camera/blob/verb/expand_blob_power()
|
||||
@@ -243,7 +243,7 @@
|
||||
for(var/obj/structure/blob/AB in range(T, 1))
|
||||
possibleblobs += AB
|
||||
if(!possibleblobs.len)
|
||||
src << "<span class='warning'>There is no blob adjacent to the target tile!</span>"
|
||||
to_chat(src, "<span class='warning'>There is no blob adjacent to the target tile!</span>")
|
||||
return
|
||||
if(can_buy(4))
|
||||
var/attacksuccess = FALSE
|
||||
@@ -260,7 +260,7 @@
|
||||
if(attacksuccess) //if we successfully attacked a turf with a blob on it, don't refund shit
|
||||
B.blob_attack_animation(T, src)
|
||||
else
|
||||
src << "<span class='warning'>There is a blob there!</span>"
|
||||
to_chat(src, "<span class='warning'>There is a blob there!</span>")
|
||||
add_points(4) //otherwise, refund all of the cost
|
||||
else
|
||||
var/list/cardinalblobs = list()
|
||||
@@ -295,7 +295,7 @@
|
||||
rally_spores(T)
|
||||
|
||||
/mob/camera/blob/proc/rally_spores(turf/T)
|
||||
src << "You rally your spores."
|
||||
to_chat(src, "You rally your spores.")
|
||||
var/list/surrounding_turfs = block(locate(T.x - 1, T.y - 1, T.z), locate(T.x + 1, T.y + 1, T.z))
|
||||
if(!surrounding_turfs.len)
|
||||
return
|
||||
@@ -312,7 +312,7 @@
|
||||
if(!speak_text)
|
||||
return
|
||||
else
|
||||
src << "You broadcast with your minions, <B>[speak_text]</B>"
|
||||
to_chat(src, "You broadcast with your minions, <B>[speak_text]</B>")
|
||||
for(var/BLO in blob_mobs)
|
||||
var/mob/living/simple_animal/hostile/blob/BM = BLO
|
||||
if(BM.stat == CONSCIOUS)
|
||||
@@ -337,33 +337,33 @@
|
||||
for(var/BLO in blob_mobs)
|
||||
var/mob/living/simple_animal/hostile/blob/BM = BLO
|
||||
BM.update_icons() //If it's getting a new chemical, tell it what it does!
|
||||
BM << "Your overmind's blob reagent is now: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!"
|
||||
BM << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]"
|
||||
src << "Your reagent is now: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!"
|
||||
src << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.description]"
|
||||
to_chat(BM, "Your overmind's blob reagent is now: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
|
||||
to_chat(BM, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]")
|
||||
to_chat(src, "Your reagent is now: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
|
||||
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.description]")
|
||||
if(blob_reagent_datum.effectdesc)
|
||||
src << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.effectdesc]"
|
||||
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.effectdesc]")
|
||||
|
||||
/mob/camera/blob/verb/blob_help()
|
||||
set category = "Blob"
|
||||
set name = "*Blob Help*"
|
||||
set desc = "Help on how to blob."
|
||||
src << "<b>As the overmind, you can control the blob!</b>"
|
||||
src << "Your blob reagent is: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!"
|
||||
src << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.description]"
|
||||
to_chat(src, "<b>As the overmind, you can control the blob!</b>")
|
||||
to_chat(src, "Your blob reagent is: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
|
||||
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.description]")
|
||||
if(blob_reagent_datum.effectdesc)
|
||||
src << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.effectdesc]"
|
||||
src << "<b>You can expand, which will attack people, damage objects, or place a Normal Blob if the tile is clear.</b>"
|
||||
src << "<i>Normal Blobs</i> will expand your reach and can be upgraded into special blobs that perform certain functions."
|
||||
src << "<b>You can upgrade normal blobs into the following types of blob:</b>"
|
||||
src << "<i>Shield Blobs</i> are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires."
|
||||
src << "<i>Resource Blobs</i> are blobs which produce more resources for you, build as many of these as possible to consume the station. This type of blob must be placed near node blobs or your core to work."
|
||||
src << "<i>Factory Blobs</i> are blobs that spawn blob spores which will attack nearby enemies. This type of blob must be placed near node blobs or your core to work."
|
||||
src << "<i>Blobbernauts</i> can be produced from factories for a cost, and are hard to kill, powerful, and moderately smart. The factory used to create one will become fragile and briefly unable to produce spores."
|
||||
src << "<i>Node Blobs</i> are blobs which grow, like the core. Like the core it can activate resource and factory blobs."
|
||||
src << "<b>In addition to the buttons on your HUD, there are a few click shortcuts to speed up expansion and defense.</b>"
|
||||
src << "<b>Shortcuts:</b> Click = Expand Blob <b>|</b> Middle Mouse Click = Rally Spores <b>|</b> Ctrl Click = Create Shield Blob <b>|</b> Alt Click = Remove Blob"
|
||||
src << "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them."
|
||||
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.effectdesc]")
|
||||
to_chat(src, "<b>You can expand, which will attack people, damage objects, or place a Normal Blob if the tile is clear.</b>")
|
||||
to_chat(src, "<i>Normal Blobs</i> will expand your reach and can be upgraded into special blobs that perform certain functions.")
|
||||
to_chat(src, "<b>You can upgrade normal blobs into the following types of blob:</b>")
|
||||
to_chat(src, "<i>Shield Blobs</i> are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires.")
|
||||
to_chat(src, "<i>Resource Blobs</i> are blobs which produce more resources for you, build as many of these as possible to consume the station. This type of blob must be placed near node blobs or your core to work.")
|
||||
to_chat(src, "<i>Factory Blobs</i> are blobs that spawn blob spores which will attack nearby enemies. This type of blob must be placed near node blobs or your core to work.")
|
||||
to_chat(src, "<i>Blobbernauts</i> can be produced from factories for a cost, and are hard to kill, powerful, and moderately smart. The factory used to create one will become fragile and briefly unable to produce spores.")
|
||||
to_chat(src, "<i>Node Blobs</i> are blobs which grow, like the core. Like the core it can activate resource and factory blobs.")
|
||||
to_chat(src, "<b>In addition to the buttons on your HUD, there are a few click shortcuts to speed up expansion and defense.</b>")
|
||||
to_chat(src, "<b>Shortcuts:</b> Click = Expand Blob <b>|</b> Middle Mouse Click = Rally Spores <b>|</b> Ctrl Click = Create Shield Blob <b>|</b> Alt Click = Remove Blob")
|
||||
to_chat(src, "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them.")
|
||||
if(!placed && autoplace_max_time <= world.time)
|
||||
src << "<span class='big'><font color=\"#EE4000\">You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.</font></span>"
|
||||
src << "<span class='big'><font color=\"#EE4000\">You [manualplace_min_time ? "will be able to":"can"] manually place your blob core by pressing the Place Blob Core button in the bottom right corner of the screen.</font></span>"
|
||||
to_chat(src, "<span class='big'><font color=\"#EE4000\">You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.</font></span>")
|
||||
to_chat(src, "<span class='big'><font color=\"#EE4000\">You [manualplace_min_time ? "will be able to":"can"] manually place your blob core by pressing the Place Blob Core button in the bottom right corner of the screen.</font></span>")
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/obj/structure/blob
|
||||
name = "blob"
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
luminosity = 1
|
||||
light_range = 2
|
||||
desc = "A thick wall of writhing tendrils."
|
||||
density = 0 //this being 0 causes two bugs, being able to attack blob tiles behind other blobs and being unable to move on blob tiles in no gravity, but turning it to 1 causes the blob mobs to be unable to path through blobs, which is probably worse.
|
||||
opacity = 0
|
||||
@@ -229,7 +229,7 @@
|
||||
/obj/structure/blob/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/device/analyzer))
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user << "<b>The analyzer beeps once, then reports:</b><br>"
|
||||
to_chat(user, "<b>The analyzer beeps once, then reports:</b><br>")
|
||||
user << 'sound/machines/ping.ogg'
|
||||
chemeffectreport(user)
|
||||
typereport(user)
|
||||
@@ -238,16 +238,16 @@
|
||||
|
||||
/obj/structure/blob/proc/chemeffectreport(mob/user)
|
||||
if(overmind)
|
||||
user << "<b>Material: <font color=\"[overmind.blob_reagent_datum.color]\">[overmind.blob_reagent_datum.name]</font><span class='notice'>.</span></b>"
|
||||
user << "<b>Material Effects:</b> <span class='notice'>[overmind.blob_reagent_datum.analyzerdescdamage]</span>"
|
||||
user << "<b>Material Properties:</b> <span class='notice'>[overmind.blob_reagent_datum.analyzerdesceffect]</span><br>"
|
||||
to_chat(user, "<b>Material: <font color=\"[overmind.blob_reagent_datum.color]\">[overmind.blob_reagent_datum.name]</font><span class='notice'>.</span></b>")
|
||||
to_chat(user, "<b>Material Effects:</b> <span class='notice'>[overmind.blob_reagent_datum.analyzerdescdamage]</span>")
|
||||
to_chat(user, "<b>Material Properties:</b> <span class='notice'>[overmind.blob_reagent_datum.analyzerdesceffect]</span><br>")
|
||||
else
|
||||
user << "<b>No Material Detected!</b><br>"
|
||||
to_chat(user, "<b>No Material Detected!</b><br>")
|
||||
|
||||
/obj/structure/blob/proc/typereport(mob/user)
|
||||
user << "<b>Blob Type:</b> <span class='notice'>[uppertext(initial(name))]</span>"
|
||||
user << "<b>Health:</b> <span class='notice'>[obj_integrity]/[max_integrity]</span>"
|
||||
user << "<b>Effects:</b> <span class='notice'>[scannerreport()]</span>"
|
||||
to_chat(user, "<b>Blob Type:</b> <span class='notice'>[uppertext(initial(name))]</span>")
|
||||
to_chat(user, "<b>Health:</b> <span class='notice'>[obj_integrity]/[max_integrity]</span>")
|
||||
to_chat(user, "<b>Effects:</b> <span class='notice'>[scannerreport()]</span>")
|
||||
|
||||
/obj/structure/blob/attack_animal(mob/living/simple_animal/M)
|
||||
if("blob" in M.faction) //sorry, but you can't kill the blob as a blobbernaut
|
||||
@@ -308,11 +308,11 @@
|
||||
..()
|
||||
var/datum/atom_hud/hud_to_check = huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
if(user.research_scanner || (user in hud_to_check.hudusers))
|
||||
user << "<b>Your HUD displays an extensive report...</b><br>"
|
||||
to_chat(user, "<b>Your HUD displays an extensive report...</b><br>")
|
||||
chemeffectreport(user)
|
||||
typereport(user)
|
||||
else
|
||||
user << "It seems to be made of [get_chem_name()]."
|
||||
to_chat(user, "It seems to be made of [get_chem_name()].")
|
||||
|
||||
/obj/structure/blob/proc/scannerreport()
|
||||
return "A generic blob. Looks like someone forgot to override this proc, adminhelp this."
|
||||
@@ -325,7 +325,7 @@
|
||||
/obj/structure/blob/normal
|
||||
name = "normal blob"
|
||||
icon_state = "blob"
|
||||
luminosity = 0
|
||||
light_range = 0
|
||||
obj_integrity = 21
|
||||
max_integrity = 25
|
||||
health_regen = 1
|
||||
|
||||
@@ -18,7 +18,7 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
antag_flag = ROLE_CHANGELING
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
required_players = 10
|
||||
required_players = 15
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
reroll_friendly = 1
|
||||
@@ -197,19 +197,19 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
|
||||
/datum/game_mode/proc/greet_changeling(datum/mind/changeling, you_are=1)
|
||||
if (you_are)
|
||||
changeling.current << "<span class='boldannounce'>You are [changeling.changeling.changelingID], a changeling! You have absorbed and taken the form of a human.</span>"
|
||||
changeling.current << "<span class='boldannounce'>Use say \":g message\" to communicate with your fellow changelings.</span>"
|
||||
changeling.current << "<b>You must complete the following tasks:</b>"
|
||||
to_chat(changeling.current, "<span class='boldannounce'>You are [changeling.changeling.changelingID], a changeling! You have absorbed and taken the form of a human.</span>")
|
||||
to_chat(changeling.current, "<span class='boldannounce'>Use say \":g message\" to communicate with your fellow changelings.</span>")
|
||||
to_chat(changeling.current, "<b>You must complete the following tasks:</b>")
|
||||
|
||||
if (changeling.current.mind)
|
||||
var/mob/living/carbon/human/H = changeling.current
|
||||
if(H.mind.assigned_role == "Clown")
|
||||
H << "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself."
|
||||
to_chat(H, "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself.")
|
||||
H.dna.remove_mutation(CLOWNMUT)
|
||||
|
||||
var/obj_count = 1
|
||||
for(var/datum/objective/objective in changeling.objectives)
|
||||
changeling.current << "<b>Objective #[obj_count]</b>: [objective.explanation_text]"
|
||||
to_chat(changeling.current, "<b>Objective #[obj_count]</b>: [objective.explanation_text]")
|
||||
obj_count++
|
||||
return
|
||||
|
||||
@@ -269,7 +269,7 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
feedback_add_details("changeling_success","FAIL")
|
||||
text += "<br>"
|
||||
|
||||
world << text
|
||||
to_chat(world, text)
|
||||
|
||||
|
||||
return 1
|
||||
@@ -351,25 +351,25 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
var/datum/changelingprofile/prof = stored_profiles[1]
|
||||
if(prof.dna == user.dna && stored_profiles.len >= dna_max)//If our current DNA is the stalest, we gotta ditch it.
|
||||
if(verbose)
|
||||
user << "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>"
|
||||
to_chat(user, "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>")
|
||||
return
|
||||
if(!target)
|
||||
return
|
||||
if((target.disabilities & NOCLONE) || (target.disabilities & HUSK))
|
||||
if(verbose)
|
||||
user << "<span class='warning'>DNA of [target] is ruined beyond usability!</span>"
|
||||
to_chat(user, "<span class='warning'>DNA of [target] is ruined beyond usability!</span>")
|
||||
return
|
||||
if(!ishuman(target))//Absorbing monkeys is entirely possible, but it can cause issues with transforming. That's what lesser form is for anyway!
|
||||
if(verbose)
|
||||
user << "<span class='warning'>We could gain no benefit from absorbing a lesser creature.</span>"
|
||||
to_chat(user, "<span class='warning'>We could gain no benefit from absorbing a lesser creature.</span>")
|
||||
return
|
||||
if(has_dna(target.dna))
|
||||
if(verbose)
|
||||
user << "<span class='warning'>We already have this DNA in storage!</span>"
|
||||
to_chat(user, "<span class='warning'>We already have this DNA in storage!</span>")
|
||||
return
|
||||
if(!target.has_dna())
|
||||
if(verbose)
|
||||
user << "<span class='warning'>[target] is not compatible with our biology.</span>"
|
||||
to_chat(user, "<span class='warning'>[target] is not compatible with our biology.</span>")
|
||||
return
|
||||
return 1
|
||||
|
||||
|
||||
@@ -54,23 +54,23 @@
|
||||
if(!ishuman(user) && !ismonkey(user)) //typecast everything from mob to carbon from this point onwards
|
||||
return 0
|
||||
if(req_human && !ishuman(user))
|
||||
user << "<span class='warning'>We cannot do that in this form!</span>"
|
||||
to_chat(user, "<span class='warning'>We cannot do that in this form!</span>")
|
||||
return 0
|
||||
var/datum/changeling/c = user.mind.changeling
|
||||
if(c.chem_charges < chemical_cost)
|
||||
user << "<span class='warning'>We require at least [chemical_cost] unit\s of chemicals to do that!</span>"
|
||||
to_chat(user, "<span class='warning'>We require at least [chemical_cost] unit\s of chemicals to do that!</span>")
|
||||
return 0
|
||||
if(c.absorbedcount < req_dna)
|
||||
user << "<span class='warning'>We require at least [req_dna] sample\s of compatible DNA.</span>"
|
||||
to_chat(user, "<span class='warning'>We require at least [req_dna] sample\s of compatible DNA.</span>")
|
||||
return 0
|
||||
if(req_stat < user.stat)
|
||||
user << "<span class='warning'>We are incapacitated.</span>"
|
||||
to_chat(user, "<span class='warning'>We are incapacitated.</span>")
|
||||
return 0
|
||||
if((user.status_flags & FAKEDEATH) && (!ignores_fakedeath))
|
||||
user << "<span class='warning'>We are incapacitated.</span>"
|
||||
to_chat(user, "<span class='warning'>We are incapacitated.</span>")
|
||||
return 0
|
||||
if(c.geneticdamage > max_genetic_damage)
|
||||
user << "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>"
|
||||
to_chat(user, "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
@@ -8,27 +8,27 @@
|
||||
thepower = S
|
||||
|
||||
if(thepower == null)
|
||||
user << "This is awkward. Changeling power purchase failed, please report this bug to a coder!"
|
||||
to_chat(user, "This is awkward. Changeling power purchase failed, please report this bug to a coder!")
|
||||
return
|
||||
|
||||
if(absorbedcount < thepower.req_dna)
|
||||
user << "We lack the energy to evolve this ability!"
|
||||
to_chat(user, "We lack the energy to evolve this ability!")
|
||||
return
|
||||
|
||||
if(has_sting(thepower))
|
||||
user << "We have already evolved this ability!"
|
||||
to_chat(user, "We have already evolved this ability!")
|
||||
return
|
||||
|
||||
if(thepower.dna_cost < 0)
|
||||
user << "We cannot evolve this ability."
|
||||
to_chat(user, "We cannot evolve this ability.")
|
||||
return
|
||||
|
||||
if(geneticpoints < thepower.dna_cost)
|
||||
user << "We have reached our capacity for abilities."
|
||||
to_chat(user, "We have reached our capacity for abilities.")
|
||||
return
|
||||
|
||||
if(user.status_flags & FAKEDEATH)//To avoid potential exploits by buying new powers while in stasis, which clears your verblist.
|
||||
user << "We lack the energy to evolve new abilities right now."
|
||||
to_chat(user, "We lack the energy to evolve new abilities right now.")
|
||||
return
|
||||
|
||||
geneticpoints -= thepower.dna_cost
|
||||
@@ -38,16 +38,16 @@
|
||||
//Reselect powers
|
||||
/datum/changeling/proc/lingRespec(mob/user)
|
||||
if(!ishuman(user))
|
||||
user << "<span class='danger'>We can't remove our evolutions in this form!</span>"
|
||||
to_chat(user, "<span class='danger'>We can't remove our evolutions in this form!</span>")
|
||||
return
|
||||
if(canrespec)
|
||||
user << "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>"
|
||||
to_chat(user, "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>")
|
||||
user.remove_changeling_powers(1)
|
||||
canrespec = 0
|
||||
user.make_changeling()
|
||||
return 1
|
||||
else
|
||||
user << "<span class='danger'>You lack the power to readapt your evolutions!</span>"
|
||||
to_chat(user, "<span class='danger'>You lack the power to readapt your evolutions!</span>")
|
||||
return 0
|
||||
|
||||
/mob/proc/make_changeling()
|
||||
|
||||
@@ -12,14 +12,14 @@
|
||||
|
||||
var/datum/changeling/changeling = user.mind.changeling
|
||||
if(changeling.isabsorbing)
|
||||
user << "<span class='warning'>We are already absorbing!</span>"
|
||||
to_chat(user, "<span class='warning'>We are already absorbing!</span>")
|
||||
return
|
||||
|
||||
if(!user.pulling || !iscarbon(user.pulling))
|
||||
user << "<span class='warning'>We must be grabbing a creature to absorb them!</span>"
|
||||
to_chat(user, "<span class='warning'>We must be grabbing a creature to absorb them!</span>")
|
||||
return
|
||||
if(user.grab_state <= GRAB_NECK)
|
||||
user << "<span class='warning'>We must have a tighter grip to absorb this creature!</span>"
|
||||
to_chat(user, "<span class='warning'>We must have a tighter grip to absorb this creature!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/target = user.pulling
|
||||
@@ -34,22 +34,22 @@
|
||||
for(var/stage = 1, stage<=3, stage++)
|
||||
switch(stage)
|
||||
if(1)
|
||||
user << "<span class='notice'>This creature is compatible. We must hold still...</span>"
|
||||
to_chat(user, "<span class='notice'>This creature is compatible. We must hold still...</span>")
|
||||
if(2)
|
||||
user.visible_message("<span class='warning'>[user] extends a proboscis!</span>", "<span class='notice'>We extend a proboscis.</span>")
|
||||
if(3)
|
||||
user.visible_message("<span class='danger'>[user] stabs [target] with the proboscis!</span>", "<span class='notice'>We stab [target] with the proboscis.</span>")
|
||||
target << "<span class='userdanger'>You feel a sharp stabbing pain!</span>"
|
||||
to_chat(target, "<span class='userdanger'>You feel a sharp stabbing pain!</span>")
|
||||
target.take_overall_damage(40)
|
||||
|
||||
feedback_add_details("changeling_powers","A[stage]")
|
||||
if(!do_mob(user, target, 150))
|
||||
user << "<span class='warning'>Our absorption of [target] has been interrupted!</span>"
|
||||
to_chat(user, "<span class='warning'>Our absorption of [target] has been interrupted!</span>")
|
||||
changeling.isabsorbing = 0
|
||||
return
|
||||
|
||||
user.visible_message("<span class='danger'>[user] sucks the fluids from [target]!</span>", "<span class='notice'>We have absorbed [target].</span>")
|
||||
target << "<span class='userdanger'>You are absorbed by the changeling!</span>"
|
||||
to_chat(target, "<span class='userdanger'>You are absorbed by the changeling!</span>")
|
||||
|
||||
if(!changeling.has_dna(target.dna))
|
||||
changeling.add_new_profile(target, user)
|
||||
@@ -65,22 +65,24 @@
|
||||
//Recent as opposed to all because rounds tend to have a LOT of text.
|
||||
var/list/recent_speech = list()
|
||||
|
||||
if(target.say_log.len > LING_ABSORB_RECENT_SPEECH)
|
||||
recent_speech = target.say_log.Copy(target.say_log.len-LING_ABSORB_RECENT_SPEECH+1,0) //0 so len-LING_ARS+1 to end of list
|
||||
var/list/say_log = target.logging[INDIVIDUAL_SAY_LOG]
|
||||
|
||||
if(LAZYLEN(say_log) > LING_ABSORB_RECENT_SPEECH)
|
||||
recent_speech = say_log.Copy(say_log.len-LING_ABSORB_RECENT_SPEECH+1,0) //0 so len-LING_ARS+1 to end of list
|
||||
else
|
||||
for(var/spoken_memory in target.say_log)
|
||||
for(var/spoken_memory in say_log)
|
||||
if(recent_speech.len >= LING_ABSORB_RECENT_SPEECH)
|
||||
break
|
||||
recent_speech[spoken_memory] = target.say_log[spoken_memory]
|
||||
recent_speech[spoken_memory] = say_log[spoken_memory]
|
||||
|
||||
if(recent_speech.len)
|
||||
user.mind.store_memory("<B>Some of [target]'s speech patterns, we should study these to better impersonate them!</B>")
|
||||
user << "<span class='boldnotice'>Some of [target]'s speech patterns, we should study these to better impersonate them!</span>"
|
||||
to_chat(user, "<span class='boldnotice'>Some of [target]'s speech patterns, we should study these to better impersonate them!</span>")
|
||||
for(var/spoken_memory in recent_speech)
|
||||
user.mind.store_memory("\"[recent_speech[spoken_memory]]\"")
|
||||
user << "<span class='notice'>\"[recent_speech[spoken_memory]]\"</span>"
|
||||
to_chat(user, "<span class='notice'>\"[recent_speech[spoken_memory]]\"</span>")
|
||||
user.mind.store_memory("<B>We have no more knowledge of [target]'s speech patterns.</B>")
|
||||
user << "<span class='boldnotice'>We have no more knowledge of [target]'s speech patterns.</span>"
|
||||
to_chat(user, "<span class='boldnotice'>We have no more knowledge of [target]'s speech patterns.</span>")
|
||||
|
||||
if(target.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points!
|
||||
changeling.chem_charges += min(target.mind.changeling.chem_charges, changeling.chem_storage)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
//Recover from stuns.
|
||||
/obj/effect/proc_holder/changeling/adrenaline/sting_action(mob/living/user)
|
||||
user << "<span class='notice'>Energy rushes through us.[user.lying ? " We arise." : ""]</span>"
|
||||
to_chat(user, "<span class='notice'>Energy rushes through us.[user.lying ? " We arise." : ""]</span>")
|
||||
user.SetSleeping(0)
|
||||
user.SetParalysis(0)
|
||||
user.SetStunned(0)
|
||||
|
||||
@@ -17,14 +17,14 @@
|
||||
if(E.flash_protect)
|
||||
E.sight_flags |= SEE_MOBS
|
||||
E.flash_protect = -1
|
||||
user << "We adjust our eyes to sense prey through walls."
|
||||
to_chat(user, "We adjust our eyes to sense prey through walls.")
|
||||
else
|
||||
E.sight_flags -= SEE_MOBS
|
||||
E.flash_protect = 2
|
||||
user << "We adjust our eyes to protect them from bright lights."
|
||||
to_chat(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!"
|
||||
to_chat(user, "We can't adjust our eyes if we don't have any!")
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/obj/effect/proc_holder/changeling/biodegrade/sting_action(mob/living/carbon/human/user)
|
||||
var/used = FALSE // only one form of shackles removed per use
|
||||
if(!user.restrained() && istype(user.loc, /turf/open))
|
||||
user << "<span class='warning'>We are already free!</span>"
|
||||
to_chat(user, "<span class='warning'>We are already free!</span>")
|
||||
return 0
|
||||
|
||||
if(user.handcuffed)
|
||||
@@ -40,7 +40,7 @@
|
||||
if(!istype(C))
|
||||
return 0
|
||||
C.visible_message("<span class='warning'>[C]'s hinges suddenly begin to melt and run!</span>")
|
||||
user << "<span class='warning'>We vomit acidic goop onto the interior of [C]!</span>"
|
||||
to_chat(user, "<span class='warning'>We vomit acidic goop onto the interior of [C]!</span>")
|
||||
addtimer(CALLBACK(src, .proc/open_closet, user, C), 70)
|
||||
used = TRUE
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
if(!istype(C))
|
||||
return 0
|
||||
C.visible_message("<span class='warning'>[src] shifts and starts to fall apart!</span>")
|
||||
user << "<span class='warning'>We secrete acidic enzymes from our skin and begin melting our cocoon...</span>"
|
||||
to_chat(user, "<span class='warning'>We secrete acidic enzymes from our skin and begin melting our cocoon...</span>")
|
||||
addtimer(CALLBACK(src, .proc/dissolve_cocoon, user, C), 25) //Very short because it's just webs
|
||||
used = TRUE
|
||||
|
||||
@@ -74,9 +74,9 @@
|
||||
C.locked = FALSE
|
||||
C.broken = TRUE
|
||||
C.open()
|
||||
user << "<span class='warning'>We open the container restraining us!</span>"
|
||||
to_chat(user, "<span class='warning'>We open the container restraining us!</span>")
|
||||
|
||||
/obj/effect/proc_holder/changeling/biodegrade/proc/dissolve_cocoon(mob/living/carbon/human/user, obj/structure/spider/cocoon/C)
|
||||
if(C && user.loc == C)
|
||||
qdel(C) //The cocoon's destroy will move the changeling outside of it without interference
|
||||
user << "<span class='warning'>We dissolve the cocoon!</span>"
|
||||
to_chat(user, "<span class='warning'>We dissolve the cocoon!</span>")
|
||||
|
||||
@@ -8,11 +8,11 @@
|
||||
/obj/effect/proc_holder/changeling/digitalcamo/sting_action(mob/user)
|
||||
|
||||
if(user.digitalcamo)
|
||||
user << "<span class='notice'>We return to normal.</span>"
|
||||
to_chat(user, "<span class='notice'>We return to normal.</span>")
|
||||
user.digitalinvis = 0
|
||||
user.digitalcamo = 0
|
||||
else
|
||||
user << "<span class='notice'>We distort our form to hide from the AI</span>"
|
||||
to_chat(user, "<span class='notice'>We distort our form to hide from the AI</span>")
|
||||
user.digitalcamo = 1
|
||||
user.digitalinvis = 1
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay.
|
||||
/obj/effect/proc_holder/changeling/fakedeath/sting_action(mob/living/user)
|
||||
user << "<span class='notice'>We begin our stasis, preparing energy to arise once more.</span>"
|
||||
to_chat(user, "<span class='notice'>We begin our stasis, preparing energy to arise once more.</span>")
|
||||
if(user.stat != DEAD)
|
||||
user.emote("deathgasp")
|
||||
user.tod = worldtime2text()
|
||||
@@ -25,12 +25,12 @@
|
||||
|
||||
/obj/effect/proc_holder/changeling/fakedeath/proc/ready_to_regenerate(mob/user)
|
||||
if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers)
|
||||
user << "<span class='notice'>We are ready to revive.</span>"
|
||||
to_chat(user, "<span class='notice'>We are ready to revive.</span>")
|
||||
user.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null)
|
||||
|
||||
/obj/effect/proc_holder/changeling/fakedeath/can_sting(mob/user)
|
||||
if(user.status_flags & FAKEDEATH)
|
||||
user << "<span class='warning'>We are already reviving.</span>"
|
||||
to_chat(user, "<span class='warning'>We are already reviving.</span>")
|
||||
return
|
||||
if(!user.stat) //Confirmation for living changelings if they want to fake their death
|
||||
switch(alert("Are we sure we wish to fake our own death?",,"Yes", "No"))
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
/obj/effect/proc_holder/changeling/fleshmend/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/effect/proc_holder/changeling/fleshmend/process()
|
||||
if(recent_uses > 1)
|
||||
@@ -30,10 +30,10 @@
|
||||
//Starts healing you every second for 10 seconds.
|
||||
//Can be used whilst unconscious.
|
||||
/obj/effect/proc_holder/changeling/fleshmend/sting_action(mob/living/user)
|
||||
user << "<span class='notice'>We begin to heal rapidly.</span>"
|
||||
to_chat(user, "<span class='notice'>We begin to heal rapidly.</span>")
|
||||
if(recent_uses > 1)
|
||||
user << "<span class='warning'>Our healing's effectiveness is reduced \
|
||||
by quick repeated use!</span>"
|
||||
to_chat(user, "<span class='warning'>Our healing's effectiveness is reduced \
|
||||
by quick repeated use!</span>")
|
||||
|
||||
recent_uses++
|
||||
INVOKE_ASYNC(src, .proc/fleshmend, user)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
req_human = 1
|
||||
|
||||
/obj/effect/proc_holder/changeling/headcrab/sting_action(mob/user)
|
||||
set waitfor = FALSE
|
||||
var/datum/mind/M = user.mind
|
||||
var/list/organs = user.getorganszone("head", 1)
|
||||
|
||||
@@ -15,24 +16,24 @@
|
||||
|
||||
explosion(get_turf(user),0,0,2,0,silent=1)
|
||||
for(var/mob/living/carbon/human/H in range(2,user))
|
||||
H << "<span class='userdanger'>You are blinded by a shower of blood!</span>"
|
||||
to_chat(H, "<span class='userdanger'>You are blinded by a shower of blood!</span>")
|
||||
H.Stun(1)
|
||||
H.blur_eyes(20)
|
||||
H.adjust_eye_damage(5)
|
||||
H.confused += 3
|
||||
for(var/mob/living/silicon/S in range(2,user))
|
||||
S << "<span class='userdanger'>Your sensors are disabled by a shower of blood!</span>"
|
||||
to_chat(S, "<span class='userdanger'>Your sensors are disabled by a shower of blood!</span>")
|
||||
S.Weaken(3)
|
||||
var/turf = get_turf(user)
|
||||
spawn(5) // So it's not killed in explosion
|
||||
var/mob/living/simple_animal/hostile/headcrab/crab = new(turf)
|
||||
for(var/obj/item/organ/I in organs)
|
||||
I.loc = crab
|
||||
crab.origin = M
|
||||
if(crab.origin)
|
||||
crab.origin.active = 1
|
||||
crab.origin.transfer_to(crab)
|
||||
crab << "<span class='warning'>You burst out of the remains of your former body in a shower of gore!</span>"
|
||||
user.gib()
|
||||
feedback_add_details("changeling_powers","LR")
|
||||
return 1
|
||||
. = TRUE
|
||||
sleep(5) // So it's not killed in explosion
|
||||
var/mob/living/simple_animal/hostile/headcrab/crab = new(turf)
|
||||
for(var/obj/item/organ/I in organs)
|
||||
I.loc = crab
|
||||
crab.origin = M
|
||||
if(crab.origin)
|
||||
crab.origin.active = 1
|
||||
crab.origin.transfer_to(crab)
|
||||
to_chat(crab, "<span class='warning'>You burst out of the remains of your former body in a shower of gore!</span>")
|
||||
@@ -10,7 +10,7 @@
|
||||
..()
|
||||
var/datum/changeling/changeling=user.mind.changeling
|
||||
changeling.changeling_speak = 1
|
||||
user << "<i><font color=#800080>Use say \":g message\" to communicate with the other changelings.</font></i>"
|
||||
to_chat(user, "<i><font color=#800080>Use say \":g message\" to communicate with the other changelings.</font></i>")
|
||||
var/obj/effect/proc_holder/changeling/hivemind_upload/S1 = new
|
||||
if(!changeling.has_sting(S1))
|
||||
changeling.purchasedpowers+=S1
|
||||
@@ -36,7 +36,7 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
names += prof.name
|
||||
|
||||
if(names.len <= 0)
|
||||
user << "<span class='notice'>The airwaves already have all of our DNA.</span>"
|
||||
to_chat(user, "<span class='notice'>The airwaves already have all of our DNA.</span>")
|
||||
return
|
||||
|
||||
var/chosen_name = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
|
||||
@@ -50,7 +50,7 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
var/datum/changelingprofile/uploaded_dna = new chosen_dna.type
|
||||
chosen_dna.copy_profile(uploaded_dna)
|
||||
hivemind_bank += uploaded_dna
|
||||
user << "<span class='notice'>We channel the DNA of [chosen_name] to the air.</span>"
|
||||
to_chat(user, "<span class='notice'>We channel the DNA of [chosen_name] to the air.</span>")
|
||||
feedback_add_details("changeling_powers","HU")
|
||||
return 1
|
||||
|
||||
@@ -66,7 +66,7 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
var/datum/changeling/changeling = user.mind.changeling
|
||||
var/datum/changelingprofile/first_prof = changeling.stored_profiles[1]
|
||||
if(first_prof.name == user.real_name)//If our current DNA is the stalest, we gotta ditch it.
|
||||
user << "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>"
|
||||
to_chat(user, "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>")
|
||||
return
|
||||
return 1
|
||||
|
||||
@@ -78,7 +78,7 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
names[prof.name] = prof
|
||||
|
||||
if(names.len <= 0)
|
||||
user << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
|
||||
to_chat(user, "<span class='notice'>There's no new DNA to absorb from the air.</span>")
|
||||
return
|
||||
|
||||
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
|
||||
@@ -91,6 +91,6 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
var/datum/changelingprofile/downloaded_prof = new chosen_prof.type
|
||||
chosen_prof.copy_profile(downloaded_prof)
|
||||
changeling.add_profile(downloaded_prof)
|
||||
user << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
|
||||
to_chat(user, "<span class='notice'>We absorb the DNA of [S] from the air.</span>")
|
||||
feedback_add_details("changeling_powers","HD")
|
||||
return 1
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
return
|
||||
if(!user || user.notransform)
|
||||
return 0
|
||||
user << "<span class='notice'>We transform our appearance.</span>"
|
||||
to_chat(user, "<span class='notice'>We transform our appearance.</span>")
|
||||
|
||||
changeling.purchasedpowers -= src
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
/obj/effect/proc_holder/changeling/lesserform/sting_action(mob/living/carbon/human/user)
|
||||
if(!user || user.notransform)
|
||||
return 0
|
||||
user << "<span class='warning'>Our genes cry out!</span>"
|
||||
to_chat(user, "<span class='warning'>Our genes cry out!</span>")
|
||||
|
||||
user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE)
|
||||
|
||||
|
||||
@@ -11,26 +11,26 @@
|
||||
return
|
||||
var/datum/changeling/changeling = user.mind.changeling
|
||||
if(changeling.islinking)
|
||||
user << "<span class='warning'>We have already formed a link with the victim!</span>"
|
||||
to_chat(user, "<span class='warning'>We have already formed a link with the victim!</span>")
|
||||
return
|
||||
if(!user.pulling)
|
||||
user << "<span class='warning'>We must be tightly grabbing a creature to link with them!</span>"
|
||||
to_chat(user, "<span class='warning'>We must be tightly grabbing a creature to link with them!</span>")
|
||||
return
|
||||
if(!iscarbon(user.pulling))
|
||||
user << "<span class='warning'>We cannot link with this creature!</span>"
|
||||
to_chat(user, "<span class='warning'>We cannot link with this creature!</span>")
|
||||
return
|
||||
var/mob/living/carbon/target = user.pulling
|
||||
if(!target.mind)
|
||||
user << "<span class='warning'>The victim has no mind to link to!</span>"
|
||||
to_chat(user, "<span class='warning'>The victim has no mind to link to!</span>")
|
||||
return
|
||||
if(target.stat == DEAD)
|
||||
user << "<span class='warning'>The victim is dead, you cannot link to a dead mind!</span>"
|
||||
to_chat(user, "<span class='warning'>The victim is dead, you cannot link to a dead mind!</span>")
|
||||
return
|
||||
if(target.mind.changeling)
|
||||
user << "<span class='warning'>The victim is already a part of the hivemind!</span>"
|
||||
to_chat(user, "<span class='warning'>The victim is already a part of the hivemind!</span>")
|
||||
return
|
||||
if(user.grab_state <= GRAB_AGGRESSIVE)
|
||||
user << "<span class='warning'>We must have a tighter grip to link with this creature!</span>"
|
||||
to_chat(user, "<span class='warning'>We must have a tighter grip to link with this creature!</span>")
|
||||
return
|
||||
return changeling.can_absorb_dna(user,target)
|
||||
|
||||
@@ -41,29 +41,29 @@
|
||||
for(var/i in 1 to 3)
|
||||
switch(i)
|
||||
if(1)
|
||||
user << "<span class='notice'>This creature is compatible. We must hold still...</span>"
|
||||
to_chat(user, "<span class='notice'>This creature is compatible. We must hold still...</span>")
|
||||
if(2)
|
||||
user << "<span class='notice'>We stealthily stab [target] with a minor proboscis...</span>"
|
||||
target << "<span class='userdanger'>You experience a stabbing sensation and your ears begin to ring...</span>"
|
||||
to_chat(user, "<span class='notice'>We stealthily stab [target] with a minor proboscis...</span>")
|
||||
to_chat(target, "<span class='userdanger'>You experience a stabbing sensation and your ears begin to ring...</span>")
|
||||
if(3)
|
||||
user << "<span class='notice'>We mold the [target]'s mind like clay, granting [target.p_them()] the ability to speak in the hivemind!</span>"
|
||||
target << "<span class='userdanger'>A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened!</span>"
|
||||
to_chat(user, "<span class='notice'>We mold the [target]'s mind like clay, granting [target.p_them()] the ability to speak in the hivemind!</span>")
|
||||
to_chat(target, "<span class='userdanger'>A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened!</span>")
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.lingcheck() == 2)
|
||||
M << "<i><font color=#800080>We can sense a foreign presence in the hivemind...</font></i>"
|
||||
to_chat(M, "<i><font color=#800080>We can sense a foreign presence in the hivemind...</font></i>")
|
||||
target.mind.linglink = 1
|
||||
target.say(":g AAAAARRRRGGGGGHHHHH!!")
|
||||
target << "<font color=#800040><span class='boldannounce'>You can now communicate in the changeling hivemind, say \":g message\" to communicate!</span>"
|
||||
to_chat(target, "<font color=#800040><span class='boldannounce'>You can now communicate in the changeling hivemind, say \":g message\" to communicate!</span>")
|
||||
target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them
|
||||
sleep(1800)
|
||||
feedback_add_details("changeling_powers","A [i]")
|
||||
if(!do_mob(user, target, 20))
|
||||
user << "<span class='warning'>Our link with [target] has ended!</span>"
|
||||
to_chat(user, "<span class='warning'>Our link with [target] has ended!</span>")
|
||||
changeling.islinking = 0
|
||||
target.mind.linglink = 0
|
||||
return
|
||||
|
||||
changeling.islinking = 0
|
||||
target.mind.linglink = 0
|
||||
user << "<span class='notice'>You cannot sustain the connection any longer, your victim fades from the hivemind</span>"
|
||||
target << "<span class='userdanger'>The link cannot be sustained any longer, your connection to the hivemind has faded!</span>"
|
||||
to_chat(user, "<span class='notice'>You cannot sustain the connection any longer, your victim fades from the hivemind</span>")
|
||||
to_chat(target, "<span class='userdanger'>The link cannot be sustained any longer, your connection to the hivemind has faded!</span>")
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
if(changeling.mimicing)
|
||||
changeling.mimicing = ""
|
||||
changeling.chem_recharge_slowdown -= 0.5
|
||||
user << "<span class='notice'>We return our vocal glands to their original position.</span>"
|
||||
to_chat(user, "<span class='notice'>We return our vocal glands to their original position.</span>")
|
||||
return
|
||||
|
||||
var/mimic_voice = stripped_input(user, "Enter a name to mimic.", "Mimic Voice", null, MAX_NAME_LEN)
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
changeling.mimicing = mimic_voice
|
||||
changeling.chem_recharge_slowdown += 0.5
|
||||
user << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will slow down regenerating chemicals while active.</span>"
|
||||
user << "<span class='notice'>Use this power again to return to our original voice and return chemical production to normal levels.</span>"
|
||||
to_chat(user, "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will slow down regenerating chemicals while active.</span>")
|
||||
to_chat(user, "<span class='notice'>Use this power again to return to our original voice and return chemical production to normal levels.</span>")
|
||||
|
||||
feedback_add_details("changeling_powers","MV")
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
/obj/effect/proc_holder/changeling/weapon/sting_action(mob/living/user)
|
||||
if(!user.drop_item())
|
||||
user << "<span class='warning'>The [user.get_active_held_item()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!</span>"
|
||||
to_chat(user, "<span class='warning'>The [user.get_active_held_item()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!</span>")
|
||||
return
|
||||
var/limb_regen = 0
|
||||
if(user.active_hand_index % 2 == 0) //we regen the arm before changing it into the weapon
|
||||
@@ -111,10 +111,10 @@
|
||||
|
||||
/obj/effect/proc_holder/changeling/suit/sting_action(mob/living/carbon/human/user)
|
||||
if(!user.canUnEquip(user.wear_suit))
|
||||
user << "\the [user.wear_suit] is stuck to your body, you cannot grow a [suit_name_simple] over it!"
|
||||
to_chat(user, "\the [user.wear_suit] is stuck to your body, you cannot grow a [suit_name_simple] over it!")
|
||||
return
|
||||
if(!user.canUnEquip(user.head))
|
||||
user << "\the [user.head] is stuck on your head, you cannot grow a [helmet_name_simple] over it!"
|
||||
to_chat(user, "\the [user.head] is stuck on your head, you cannot grow a [helmet_name_simple] over it!")
|
||||
return
|
||||
|
||||
user.dropItemToGround(user.head)
|
||||
@@ -185,7 +185,7 @@
|
||||
if(!A.requiresID() || A.allowed(user)) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message.
|
||||
return
|
||||
if(A.locked)
|
||||
user << "<span class='warning'>The airlock's bolts prevent it from being forced!</span>"
|
||||
to_chat(user, "<span class='warning'>The airlock's bolts prevent it from being forced!</span>")
|
||||
return
|
||||
|
||||
if(A.hasPower())
|
||||
@@ -245,11 +245,11 @@
|
||||
if(!silent)
|
||||
loc.visible_message("<span class='warning'>[loc.name]\'s arm starts stretching inhumanly!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a tentacle.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
else
|
||||
loc << "<span class='notice'>You prepare to extend a tentacle.</span>"
|
||||
to_chat(loc, "<span class='notice'>You prepare to extend a tentacle.</span>")
|
||||
|
||||
|
||||
/obj/item/weapon/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj)
|
||||
user << "<span class='warning'>The [name] is not ready yet.<span>"
|
||||
to_chat(user, "<span class='warning'>The [name] is not ready yet.<span>")
|
||||
|
||||
/obj/item/ammo_casing/magic/tentacle
|
||||
name = "tentacle"
|
||||
@@ -264,9 +264,9 @@
|
||||
gun = tentacle_gun
|
||||
..()
|
||||
|
||||
/obj/item/ammo_casing/magic/tentacle/Destroy(obj/item/weapon/gun/magic/tentacle/tentacle_gun)
|
||||
/obj/item/ammo_casing/magic/tentacle/Destroy()
|
||||
gun = null
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/projectile/tentacle
|
||||
name = "tentacle"
|
||||
@@ -316,7 +316,7 @@
|
||||
if(istype(target, /obj/item))
|
||||
var/obj/item/I = target
|
||||
if(!I.anchored)
|
||||
firer << "<span class='notice'>You pull [I] towards yourself.</span>"
|
||||
to_chat(firer, "<span class='notice'>You pull [I] towards yourself.</span>")
|
||||
H.throw_mode_on()
|
||||
I.throw_at(H, 10, 2)
|
||||
. = 1
|
||||
@@ -340,10 +340,10 @@
|
||||
on_hit(I) //grab the item as if you had hit it directly with the tentacle
|
||||
return 1
|
||||
else
|
||||
firer << "<span class='danger'>You can't seem to pry [I] off of [C]'s hands!<span>"
|
||||
to_chat(firer, "<span class='danger'>You can't seem to pry [I] off of [C]'s hands!<span>")
|
||||
return 0
|
||||
else
|
||||
firer << "<span class='danger'>[C] has nothing in hand to disarm!<span>"
|
||||
to_chat(firer, "<span class='danger'>[C] has nothing in hand to disarm!<span>")
|
||||
return 0
|
||||
|
||||
if(INTENT_GRAB)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
//Heals the things that the other regenerative abilities don't.
|
||||
/obj/effect/proc_holder/changeling/panacea/sting_action(mob/user)
|
||||
user << "<span class='notice'>We cleanse impurities from our form.</span>"
|
||||
to_chat(user, "<span class='notice'>We cleanse impurities from our form.</span>")
|
||||
|
||||
var/mob/living/simple_animal/borer/B = user.has_brain_worms()
|
||||
if(B)
|
||||
@@ -18,7 +18,7 @@
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.vomit(0)
|
||||
user << "<span class='notice'>A parasite exits our form.</span>"
|
||||
to_chat(user, "<span class='notice'>A parasite exits our form.</span>")
|
||||
var/list/bad_organs = list(
|
||||
user.getorgan(/obj/item/organ/body_egg),
|
||||
user.getorgan(/obj/item/organ/zombie_infection))
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
always_keep = TRUE
|
||||
|
||||
/obj/effect/proc_holder/changeling/regenerate/sting_action(mob/living/user)
|
||||
user << "<span class='notice'>You feel an itching, both inside and \
|
||||
outside as your tissues knit and reknit.</span>"
|
||||
to_chat(user, "<span class='notice'>You feel an itching, both inside and \
|
||||
outside as your tissues knit and reknit.</span>")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
var/list/missing = C.get_missing_limbs()
|
||||
@@ -26,7 +26,7 @@
|
||||
and tearing!</span>")
|
||||
C.emote("scream")
|
||||
C.regenerate_limbs(1)
|
||||
C.regenerate_organs()
|
||||
C.regenerate_organs()
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.restore_blood()
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
user.emote("scream")
|
||||
user.regenerate_limbs(0, list("head"))
|
||||
user.regenerate_organs()
|
||||
user << "<span class='notice'>We have revived ourselves.</span>"
|
||||
to_chat(user, "<span class='notice'>We have revived ourselves.</span>")
|
||||
user.mind.changeling.purchasedpowers -= src
|
||||
feedback_add_details("changeling_powers","CR")
|
||||
return 1
|
||||
|
||||
@@ -14,12 +14,12 @@
|
||||
/obj/effect/proc_holder/changeling/strained_muscles/sting_action(mob/living/carbon/user)
|
||||
active = !active
|
||||
if(active)
|
||||
user << "<span class='notice'>Our muscles tense and strengthen.</span>"
|
||||
to_chat(user, "<span class='notice'>Our muscles tense and strengthen.</span>")
|
||||
else
|
||||
user.status_flags &= ~GOTTAGOFAST
|
||||
user << "<span class='notice'>Our muscles relax.</span>"
|
||||
to_chat(user, "<span class='notice'>Our muscles relax.</span>")
|
||||
if(stacks >= 10)
|
||||
user << "<span class='danger'>We collapse in exhaustion.</span>"
|
||||
to_chat(user, "<span class='danger'>We collapse in exhaustion.</span>")
|
||||
user.Weaken(3)
|
||||
user.emote("gasp")
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
user.status_flags |= GOTTAGOFAST
|
||||
if(user.stat != CONSCIOUS || user.staminaloss >= 90)
|
||||
active = !active
|
||||
user << "<span class='notice'>Our muscles relax without the energy to strengthen them.</span>"
|
||||
to_chat(user, "<span class='notice'>Our muscles relax without the energy to strengthen them.</span>")
|
||||
user.Weaken(2)
|
||||
user.status_flags &= ~GOTTAGOFAST
|
||||
break
|
||||
@@ -37,7 +37,7 @@
|
||||
user.staminaloss += stacks * 1.3 //At first the changeling may regenerate stamina fast enough to nullify fatigue, but it will stack
|
||||
|
||||
if(stacks == 11) //Warning message that the stacks are getting too high
|
||||
user << "<span class='warning'>Our legs are really starting to hurt...</span>"
|
||||
to_chat(user, "<span class='warning'>Our legs are really starting to hurt...</span>")
|
||||
|
||||
sleep(40)
|
||||
|
||||
|
||||
@@ -14,13 +14,13 @@
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/proc/set_sting(mob/user)
|
||||
user << "<span class='notice'>We prepare our sting, use alt+click or middle mouse button on target to sting them.</span>"
|
||||
to_chat(user, "<span class='notice'>We prepare our sting, use alt+click or middle mouse button on target to sting them.</span>")
|
||||
user.mind.changeling.chosen_sting = src
|
||||
user.hud_used.lingstingdisplay.icon_state = sting_icon
|
||||
user.hud_used.lingstingdisplay.invisibility = 0
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/proc/unset_sting(mob/user)
|
||||
user << "<span class='warning'>We retract our sting, we can't sting anyone for now.</span>"
|
||||
to_chat(user, "<span class='warning'>We retract our sting, we can't sting anyone for now.</span>")
|
||||
user.mind.changeling.chosen_sting = null
|
||||
user.hud_used.lingstingdisplay.icon_state = null
|
||||
user.hud_used.lingstingdisplay.invisibility = INVISIBILITY_ABSTRACT
|
||||
@@ -33,7 +33,7 @@
|
||||
if(!..())
|
||||
return
|
||||
if(!user.mind.changeling.chosen_sting)
|
||||
user << "We haven't prepared our sting yet!"
|
||||
to_chat(user, "We haven't prepared our sting yet!")
|
||||
if(!iscarbon(target))
|
||||
return
|
||||
if(!isturf(user.loc))
|
||||
@@ -49,9 +49,9 @@
|
||||
/obj/effect/proc_holder/changeling/sting/sting_feedback(mob/user, mob/target)
|
||||
if(!target)
|
||||
return
|
||||
user << "<span class='notice'>We stealthily sting [target.name].</span>"
|
||||
to_chat(user, "<span class='notice'>We stealthily sting [target.name].</span>")
|
||||
if(target.mind && target.mind.changeling)
|
||||
target << "<span class='warning'>You feel a tiny prick.</span>"
|
||||
to_chat(target, "<span class='warning'>You feel a tiny prick.</span>")
|
||||
return 1
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
if(!selected_dna)
|
||||
return
|
||||
if(NOTRANSSTING in selected_dna.dna.species.species_traits)
|
||||
user << "<span class = 'notice'>That DNA is not compatible with changeling retrovirus!"
|
||||
to_chat(user, "<span class = 'notice'>That DNA is not compatible with changeling retrovirus!")
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -83,30 +83,32 @@
|
||||
if(!..())
|
||||
return
|
||||
if((target.disabilities & HUSK) || !target.has_dna())
|
||||
user << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
|
||||
to_chat(user, "<span class='warning'>Our sting appears ineffective against its DNA.</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/transformation/sting_action(mob/user, mob/target)
|
||||
set waitfor = FALSE
|
||||
add_logs(user, target, "stung", "transformation sting", " new identity is [selected_dna.dna.real_name]")
|
||||
var/datum/dna/NewDNA = selected_dna.dna
|
||||
if(ismonkey(target))
|
||||
user << "<span class='notice'>Our genes cry out as we sting [target.name]!</span>"
|
||||
to_chat(user, "<span class='notice'>Our genes cry out as we sting [target.name]!</span>")
|
||||
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
var/mob/living/carbon/C = target
|
||||
if(istype(C))
|
||||
if(C.status_flags & CANWEAKEN)
|
||||
C.do_jitter_animation(500)
|
||||
C.take_bodypart_damage(20, 0) //The process is extremely painful
|
||||
|
||||
target.visible_message("<span class='danger'>[target] begins to violenty convulse!</span>","<span class='userdanger'>You feel a tiny prick and a begin to uncontrollably convulse!</span>")
|
||||
spawn(10)
|
||||
C.real_name = NewDNA.real_name
|
||||
NewDNA.transfer_identity(C, transfer_SE=1)
|
||||
C.updateappearance(mutcolor_update=1)
|
||||
C.domutcheck()
|
||||
feedback_add_details("changeling_powers","TS")
|
||||
return 1
|
||||
. = TRUE
|
||||
if(istype(C))
|
||||
sleep(10)
|
||||
C.real_name = NewDNA.real_name
|
||||
NewDNA.transfer_identity(C, transfer_SE=1)
|
||||
C.updateappearance(mutcolor_update=1)
|
||||
C.domutcheck()
|
||||
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/false_armblade
|
||||
@@ -130,7 +132,7 @@
|
||||
if(!..())
|
||||
return
|
||||
if((target.disabilities & HUSK) || !target.has_dna())
|
||||
user << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
|
||||
to_chat(user, "<span class='warning'>Our sting appears ineffective against its DNA.</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -138,11 +140,11 @@
|
||||
add_logs(user, target, "stung", object="falso armblade sting")
|
||||
|
||||
if(!target.drop_item())
|
||||
user << "<span class='warning'>The [target.get_active_held_item()] is stuck to their hand, you cannot grow a false armblade over it!</span>"
|
||||
to_chat(user, "<span class='warning'>The [target.get_active_held_item()] is stuck to their hand, you cannot grow a false armblade over it!</span>")
|
||||
return
|
||||
|
||||
if(ismonkey(target))
|
||||
user << "<span class='notice'>Our genes cry out as we sting [target.name]!</span>"
|
||||
to_chat(user, "<span class='notice'>Our genes cry out as we sting [target.name]!</span>")
|
||||
|
||||
var/obj/item/weapon/melee/arm_blade/false/blade = new(target,1)
|
||||
target.put_in_hands(blade)
|
||||
@@ -207,7 +209,7 @@
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/blind/sting_action(mob/user, mob/living/carbon/target)
|
||||
add_logs(user, target, "stung", "blind sting")
|
||||
target << "<span class='danger'>Your eyes burn horrifically!</span>"
|
||||
to_chat(target, "<span class='danger'>Your eyes burn horrifically!</span>")
|
||||
target.become_nearsighted()
|
||||
target.blind_eyes(20)
|
||||
target.blur_eyes(40)
|
||||
|
||||
@@ -11,36 +11,93 @@
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/glasses/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/under/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/under/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
allowed = list(/obj/item/changeling)
|
||||
|
||||
/obj/item/clothing/suit/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/head/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/head/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/shoes/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/shoes/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/gloves/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/gloves/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/mask/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/mask/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
slot_flags = ALL
|
||||
allowed = list(/obj/item/changeling)
|
||||
|
||||
/obj/item/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
//Change our DNA to that of somebody we've absorbed.
|
||||
/obj/effect/proc_holder/changeling/transform/sting_action(mob/living/carbon/human/user)
|
||||
var/datum/changeling/changeling = user.mind.changeling
|
||||
@@ -62,7 +119,7 @@
|
||||
var/chosen_name = input(prompt, title, null) as null|anything in names
|
||||
if(!chosen_name)
|
||||
return
|
||||
|
||||
|
||||
if(chosen_name == "Drop Flesh Disguise")
|
||||
for(var/slot in slots)
|
||||
if(istype(user.vars[slot], slot2type[slot]))
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
var/const/changeling_amount = 1 //hard limit on changelings if scaling is turned off
|
||||
|
||||
/datum/game_mode/traitor/changeling/announce()
|
||||
world << "<B>The current game mode is - Traitor+Changeling!</B>"
|
||||
world << "<B>There are alien creatures on the station along with some syndicate operatives out for their own gain! Do not let the changelings or the traitors succeed!</B>"
|
||||
to_chat(world, "<B>The current game mode is - Traitor+Changeling!</B>")
|
||||
to_chat(world, "<B>There are alien creatures on the station along with some syndicate operatives out for their own gain! Do not let the changelings or the traitors succeed!</B>")
|
||||
|
||||
/datum/game_mode/traitor/changeling/can_start()
|
||||
if(!..())
|
||||
|
||||
@@ -91,7 +91,7 @@ Credit where due:
|
||||
name = "clockwork cult"
|
||||
config_tag = "clockwork_cult"
|
||||
antag_flag = ROLE_SERVANT_OF_RATVAR
|
||||
required_players = 10
|
||||
required_players = 24
|
||||
required_enemies = 3
|
||||
recommended_enemies = 3
|
||||
enemy_minimum_age = 14
|
||||
@@ -153,7 +153,7 @@ Credit where due:
|
||||
var/greeting_text = "<br><b><span class='large_brass'>You are a servant of Ratvar, the Clockwork Justiciar.</span>\n\
|
||||
Rusting eternally in the Celestial Derelict, Ratvar has formed a covenant of mortals, with you as one of its members. As one of the Justiciar's servants, you are to work to the best of your \
|
||||
ability to assist in completion of His agenda. You may not know the specifics of how to do so, but luckily you have a vessel to help you learn.</b>"
|
||||
M << greeting_text
|
||||
to_chat(M, greeting_text)
|
||||
return 1
|
||||
|
||||
/datum/game_mode/proc/equip_servant(mob/living/L) //Grants a clockwork slab to the mob, with one of each component
|
||||
@@ -171,10 +171,10 @@ Credit where due:
|
||||
if(!S.forceMove(get_turf(L)))
|
||||
qdel(S)
|
||||
if(S && !QDELETED(S))
|
||||
L << "<b>[slot] is a link to the halls of Reebe and your master. You may use it to perform many tasks, but also become oriented with the workings of Ratvar and how to best complete your \
|
||||
to_chat(L, "<b>[slot] is a link to the halls of Reebe and your master. You may use it to perform many tasks, but also become oriented with the workings of Ratvar and how to best complete your \
|
||||
tasks. This clockwork slab will be instrumental in your triumph. Remember: you can speak discreetly with your fellow servants by using the <span class='brass'>Hierophant Network</span> action button, \
|
||||
and you can find a concise tutorial by using the slab in-hand and selecting Recollection.</b>"
|
||||
L << "<i>Alternatively, check out the wiki page at </i><b>https://tgstation13.org/wiki/Clockwork_Cult</b><i>, which contains additional information.</i>"
|
||||
and you can find a concise tutorial by using the slab in-hand and selecting Recollection.</b>")
|
||||
to_chat(L, "<i>Alternatively, check out the wiki page at </i><b>https://tgstation13.org/wiki/Clockwork_Cult</b><i>, which contains additional information.</i>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -182,7 +182,7 @@ Credit where due:
|
||||
if(!L || !istype(L) || !L.mind)
|
||||
return 0
|
||||
var/datum/mind/M = L.mind
|
||||
M.current << "<b>This is Ratvar's will:</b> [clockwork_explanation]"
|
||||
to_chat(M.current, "<b>This is Ratvar's will:</b> [clockwork_explanation]")
|
||||
M.memory += "<b>Ratvar's will:</b> [clockwork_explanation]<br>"
|
||||
return 1
|
||||
|
||||
@@ -218,7 +218,7 @@ Credit where due:
|
||||
if(half_victory)
|
||||
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")
|
||||
feedback_set_details("round_end_result", "halfwin - servants constructed the gateway but their objective was not completed ([clockwork_objective])")
|
||||
else
|
||||
text += "<span class='userdanger'>Ratvar's servants have failed!</span>"
|
||||
feedback_set_details("round_end_result", "loss - servants failed their objective ([clockwork_objective])")
|
||||
@@ -233,7 +233,7 @@ Credit where due:
|
||||
text += "<br><b>Ratvar's servants were:</b>"
|
||||
for(var/datum/mind/M in servants_of_ratvar)
|
||||
text += printplayer(M)
|
||||
world << text
|
||||
to_chat(world, text)
|
||||
|
||||
/datum/game_mode/proc/update_servant_icons_added(datum/mind/M)
|
||||
var/datum/atom_hud/antag/A = huds[ANTAG_HUD_CLOCKWORK]
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
if(!is_servant_of_ratvar(M) && M != L)
|
||||
M.flash_act()
|
||||
if(iscultist(L))
|
||||
L << "<span class='heavy_brass'>\"Watch your step, wretch.\"</span>"
|
||||
to_chat(L, "<span class='heavy_brass'>\"Watch your step, wretch.\"</span>")
|
||||
L.adjustBruteLoss(10)
|
||||
L.Weaken(7)
|
||||
L.visible_message("<span class='warning'>[src] appears around [L] in a burst of light!</span>", \
|
||||
@@ -83,18 +83,19 @@
|
||||
layer = LOW_SIGIL_LAYER
|
||||
alpha = 125
|
||||
color = "#FAE48C"
|
||||
light_range = 2 //soft light
|
||||
light_power = 0.9
|
||||
light_color = "#FAE48C"
|
||||
stat_affected = UNCONSCIOUS
|
||||
resist_string = "glows faintly yellow"
|
||||
var/convert_time = 70
|
||||
var/glow_light = 2 //soft light
|
||||
var/glow_falloff = 1
|
||||
var/delete_on_finish = TRUE
|
||||
sigil_name = "Sigil of Submission"
|
||||
var/glow_type
|
||||
|
||||
/obj/effect/clockwork/sigil/submission/New()
|
||||
..()
|
||||
SetLuminosity(glow_light,glow_falloff)
|
||||
update_light()
|
||||
|
||||
/obj/effect/clockwork/sigil/submission/proc/post_channel(mob/living/L)
|
||||
|
||||
@@ -119,7 +120,7 @@
|
||||
return
|
||||
post_channel(L)
|
||||
if(is_eligible_servant(L))
|
||||
L << "<span class='heavy_brass'>\"You belong to me now.\"</span>"
|
||||
to_chat(L, "<span class='heavy_brass'>\"You belong to me now.\"</span>")
|
||||
add_servant_of_ratvar(L)
|
||||
L.Weaken(3) //Completely defenseless for about five seconds - mainly to give them time to read over the information they've just been presented with
|
||||
L.Stun(3)
|
||||
@@ -130,12 +131,12 @@
|
||||
for(var/M in mob_list)
|
||||
if(isobserver(M))
|
||||
var/link = FOLLOW_LINK(M, L)
|
||||
M << "[link] <span class='heavy_brass'>[message] [L.real_name]!</span>"
|
||||
to_chat(M, "[link] <span class='heavy_brass'>[message] [L.real_name]!</span>")
|
||||
else if(is_servant_of_ratvar(M))
|
||||
if(M == L)
|
||||
M << "<span class='heavy_brass'>[message] you!</span>"
|
||||
to_chat(M, "<span class='heavy_brass'>[message] you!</span>")
|
||||
else
|
||||
M << "<span class='heavy_brass'>[message] [L.real_name]!</span>"
|
||||
to_chat(M, "<span class='heavy_brass'>[message] [L.real_name]!</span>")
|
||||
if(delete_on_finish)
|
||||
qdel(src)
|
||||
else
|
||||
@@ -153,8 +154,9 @@
|
||||
icon_state = "sigiltransgression"
|
||||
alpha = 200
|
||||
color = "#A97F1B"
|
||||
glow_light = 4 //bright light
|
||||
glow_falloff = 3
|
||||
light_range = 3 //bright light
|
||||
light_power = 1
|
||||
light_color = "#A97F1B"
|
||||
delete_on_finish = FALSE
|
||||
sigil_name = "Sigil of Accession"
|
||||
glow_type = /obj/effect/overlay/temp/ratvar/sigil/accession
|
||||
@@ -177,6 +179,7 @@
|
||||
icon_state = "sigiltransmission"
|
||||
alpha = 50
|
||||
color = "#EC8A2D"
|
||||
light_color = "#EC8A2D"
|
||||
resist_string = "glows faintly"
|
||||
sigil_name = "Sigil of Transmission"
|
||||
affects_servants = TRUE
|
||||
@@ -195,22 +198,22 @@
|
||||
var/structure_number = 0
|
||||
for(var/obj/structure/destructible/clockwork/powered/P in range(SIGIL_ACCESS_RANGE, src))
|
||||
structure_number++
|
||||
user << "<span class='[power_charge ? "brass":"alloy"]'>It is storing <b>[ratvar_awakens ? "INFINITY":"[power_charge]"]W</b> of power, \
|
||||
and <b>[structure_number]</b> Clockwork Structure[structure_number == 1 ? "":"s"] [structure_number == 1 ? "is":"are"] in range.</span>"
|
||||
to_chat(user, "<span class='[power_charge ? "brass":"alloy"]'>It is storing <b>[ratvar_awakens ? "INFINITY":"[power_charge]"]W</b> of power, \
|
||||
and <b>[structure_number]</b> Clockwork Structure[structure_number == 1 ? "":"s"] [structure_number == 1 ? "is":"are"] in range.</span>")
|
||||
if(iscyborg(user))
|
||||
user << "<span class='brass'>You can recharge from the [sigil_name] by crossing it.</span>"
|
||||
to_chat(user, "<span class='brass'>You can recharge from the [sigil_name] by crossing it.</span>")
|
||||
|
||||
/obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L)
|
||||
if(is_servant_of_ratvar(L))
|
||||
if(iscyborg(L))
|
||||
charge_cyborg(L)
|
||||
else if(power_charge)
|
||||
L << "<span class='brass'>You feel a slight, static shock.</span>"
|
||||
to_chat(L, "<span class='brass'>You feel a slight, static shock.</span>")
|
||||
|
||||
/obj/effect/clockwork/sigil/transmission/proc/charge_cyborg(mob/living/silicon/robot/cyborg)
|
||||
if(!cyborg_checks(cyborg))
|
||||
return
|
||||
cyborg << "<span class='brass'>You start to charge from the [sigil_name]...</span>"
|
||||
to_chat(cyborg, "<span class='brass'>You start to charge from the [sigil_name]...</span>")
|
||||
if(!do_after(cyborg, 50, target = src))
|
||||
return
|
||||
if(!cyborg_checks(cyborg))
|
||||
@@ -227,16 +230,16 @@
|
||||
|
||||
/obj/effect/clockwork/sigil/transmission/proc/cyborg_checks(mob/living/silicon/robot/cyborg)
|
||||
if(!cyborg.cell)
|
||||
cyborg << "<span class='warning'>You have no cell!</span>"
|
||||
to_chat(cyborg, "<span class='warning'>You have no cell!</span>")
|
||||
return FALSE
|
||||
if(!power_charge)
|
||||
cyborg << "<span class='warning'>The [sigil_name] has no stored power!</span>"
|
||||
to_chat(cyborg, "<span class='warning'>The [sigil_name] has no stored power!</span>")
|
||||
return FALSE
|
||||
if(cyborg.cell.charge > cyborg.cell.maxcharge - MIN_CLOCKCULT_POWER)
|
||||
cyborg << "<span class='warning'>You are already at maximum charge!</span>"
|
||||
to_chat(cyborg, "<span class='warning'>You are already at maximum charge!</span>")
|
||||
return FALSE
|
||||
if(cyborg.has_status_effect(STATUS_EFFECT_POWERREGEN))
|
||||
cyborg << "<span class='warning'>You are already regenerating power!</span>"
|
||||
to_chat(cyborg, "<span class='warning'>You are already regenerating power!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -260,10 +263,9 @@
|
||||
else
|
||||
alpha = min(initial(alpha) + power_charge*0.02, 255)
|
||||
if(!power_charge)
|
||||
SetLuminosity(0)
|
||||
set_light(0)
|
||||
else
|
||||
SetLuminosity(round(alpha*0.03, 1), round(alpha*0.02, 1))
|
||||
|
||||
set_light(round(alpha*0.02, 1), round(alpha*0.005, 1))
|
||||
|
||||
//Vitality Matrix: Drains health from non-servants to heal or even revive servants.
|
||||
/obj/effect/clockwork/sigil/vitality
|
||||
@@ -287,11 +289,11 @@
|
||||
/obj/effect/clockwork/sigil/vitality/examine(mob/user)
|
||||
..()
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
user << "<span class='[vitality ? "inathneq_small":"alloy"]'>It has access to <b>[ratvar_awakens ? "INFINITE":"[vitality]"]</b> units of vitality.</span>"
|
||||
to_chat(user, "<span class='[vitality ? "inathneq_small":"alloy"]'>It has access to <b>[ratvar_awakens ? "INFINITE":"[vitality]"]</b> units of vitality.</span>")
|
||||
if(ratvar_awakens)
|
||||
user << "<span class='inathneq_small'>It can revive Servants at no cost!</span>"
|
||||
to_chat(user, "<span class='inathneq_small'>It can revive Servants at no cost!</span>")
|
||||
else
|
||||
user << "<span class='inathneq_small'>It can revive Servants at a cost of <b>[base_revive_cost]</b> vitality plus vitality equal to the non-oxygen damage they have, in addition to being destroyed in the process.</span>"
|
||||
to_chat(user, "<span class='inathneq_small'>It can revive Servants at a cost of <b>[base_revive_cost]</b> vitality plus vitality equal to the non-oxygen damage they have, in addition to being destroyed in the process.</span>")
|
||||
|
||||
/obj/effect/clockwork/sigil/vitality/sigil_effects(mob/living/L)
|
||||
if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active)
|
||||
@@ -315,7 +317,7 @@
|
||||
animate(V, alpha = 0, transform = matrix()*2, time = 8)
|
||||
playsound(L, 'sound/magic/WandODeath.ogg', 50, 1)
|
||||
L.visible_message("<span class='warning'>[L] collapses in on [L.p_them()]self as [src] flares bright blue!</span>")
|
||||
L << "<span class='inathneq_large'>\"[text2ratvar("Your life will not be wasted.")]\"</span>"
|
||||
to_chat(L, "<span class='inathneq_large'>\"[text2ratvar("Your life will not be wasted.")]\"</span>")
|
||||
for(var/obj/item/W in L)
|
||||
if(!L.dropItemToGround(W))
|
||||
qdel(W)
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
clockwork_desc = "A gateway in reality."
|
||||
icon_state = "spatial_gateway"
|
||||
density = 1
|
||||
luminosity = 2
|
||||
light_range = 2
|
||||
light_power = 3
|
||||
light_color = "#6A4D2F"
|
||||
var/sender = TRUE //If this gateway is made for sending, not receiving
|
||||
var/both_ways = FALSE
|
||||
var/lifetime = 25 //How many deciseconds this portal will last
|
||||
@@ -15,6 +17,7 @@
|
||||
|
||||
/obj/effect/clockwork/spatial_gateway/New()
|
||||
..()
|
||||
update_light()
|
||||
addtimer(CALLBACK(src, .proc/check_setup), 1)
|
||||
|
||||
/obj/effect/clockwork/spatial_gateway/Destroy()
|
||||
@@ -53,7 +56,7 @@
|
||||
/obj/effect/clockwork/spatial_gateway/examine(mob/user)
|
||||
..()
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
user << "<span class='brass'>It has [uses] uses remaining.</span>"
|
||||
to_chat(user, "<span class='brass'>It has [uses] uses remaining.</span>")
|
||||
|
||||
/obj/effect/clockwork/spatial_gateway/attack_ghost(mob/user)
|
||||
if(linked_gateway)
|
||||
@@ -84,7 +87,7 @@
|
||||
qdel(src)
|
||||
return TRUE
|
||||
if(istype(I, /obj/item/clockwork/slab))
|
||||
user << "<span class='heavy_brass'>\"I don't think you want to drop your slab into that.\"\n\"If you really want to, try throwing it.\"</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"I don't think you want to drop your slab into that.\"\n\"If you really want to, try throwing it.\"</span>")
|
||||
return TRUE
|
||||
if(user.drop_item() && uses)
|
||||
user.visible_message("<span class='warning'>[user] drops [I] into [src]!</span>", "<span class='danger'>You drop [I] into [src]!</span>")
|
||||
@@ -123,7 +126,7 @@
|
||||
return FALSE
|
||||
if(isliving(A))
|
||||
var/mob/living/user = A
|
||||
user << "<span class='warning'><b>You pass through [src] and appear elsewhere!</b></span>"
|
||||
to_chat(user, "<span class='warning'><b>You pass through [src] and appear elsewhere!</b></span>")
|
||||
linked_gateway.visible_message("<span class='warning'>A shape appears in [linked_gateway] before emerging!</span>")
|
||||
playsound(src, 'sound/effects/EMPulse.ogg', 50, 1)
|
||||
playsound(linked_gateway, 'sound/effects/EMPulse.ogg', 50, 1)
|
||||
@@ -159,31 +162,31 @@
|
||||
possible_targets[avoid_assoc_duplicate_keys("[L.name] ([L.real_name])", teleportnames)] = L
|
||||
|
||||
if(!possible_targets.len)
|
||||
invoker << "<span class='warning'>There are no other eligible targets for a Spatial Gateway!</span>"
|
||||
to_chat(invoker, "<span class='warning'>There are no other eligible targets for a Spatial Gateway!</span>")
|
||||
return FALSE
|
||||
var/input_target_key = input(invoker, "Choose a target to form a rift to.", "Spatial Gateway") as null|anything in possible_targets
|
||||
var/atom/movable/target = possible_targets[input_target_key]
|
||||
if(!src || !input_target_key || !invoker || !invoker.canUseTopic(src, !issilicon(invoker)) || !is_servant_of_ratvar(invoker) || (istype(src, /obj/item) && invoker.get_active_held_item() != src) || !invoker.can_speak_vocal())
|
||||
return FALSE //if any of the involved things no longer exist, the invoker is stunned, too far away to use the object, or does not serve ratvar, or if the object is an item and not in the mob's active hand, fail
|
||||
if(!target) //if we have no target, but did have a key, let them retry
|
||||
invoker << "<span class='warning'>That target no longer exists!</span>"
|
||||
to_chat(invoker, "<span class='warning'>That target no longer exists!</span>")
|
||||
return procure_gateway(invoker, time_duration, gateway_uses, two_way)
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(!is_servant_of_ratvar(L))
|
||||
invoker << "<span class='warning'>That target is no longer a Servant!</span>"
|
||||
to_chat(invoker, "<span class='warning'>That target is no longer a Servant!</span>")
|
||||
return procure_gateway(invoker, time_duration, gateway_uses, two_way)
|
||||
if(L.stat != CONSCIOUS)
|
||||
invoker << "<span class='warning'>That Servant is no longer conscious!</span>"
|
||||
to_chat(invoker, "<span class='warning'>That Servant is no longer conscious!</span>")
|
||||
return procure_gateway(invoker, time_duration, gateway_uses, two_way)
|
||||
var/istargetobelisk = istype(target, /obj/structure/destructible/clockwork/powered/clockwork_obelisk)
|
||||
var/issrcobelisk = istype(src, /obj/structure/destructible/clockwork/powered/clockwork_obelisk)
|
||||
if(issrcobelisk && !anchored)
|
||||
invoker << "<span class='warning'>[src] is no longer secured!</span>"
|
||||
to_chat(invoker, "<span class='warning'>[src] is no longer secured!</span>")
|
||||
return FALSE
|
||||
if(istargetobelisk)
|
||||
if(!target.anchored)
|
||||
invoker << "<span class='warning'>That [target.name] is no longer secured!</span>"
|
||||
to_chat(invoker, "<span class='warning'>That [target.name] is no longer secured!</span>")
|
||||
return procure_gateway(invoker, time_duration, gateway_uses, two_way)
|
||||
var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/CO = target
|
||||
var/efficiency = CO.get_efficiency_mod()
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
. = min(cell.charge, 250)
|
||||
cell.use(.)
|
||||
if(prob(20))
|
||||
src << "<span class='userdanger'>ERROR: Power loss detected!</span>"
|
||||
to_chat(src, "<span class='userdanger'>ERROR: Power loss detected!</span>")
|
||||
spark_system.start()
|
||||
|
||||
/obj/mecha/power_drain(clockcult_user)
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
if(!servantsonly && isobserver(M))
|
||||
if(target)
|
||||
var/link = FOLLOW_LINK(M, target)
|
||||
M << "[link] [message]"
|
||||
to_chat(M, "[link] [message]")
|
||||
else
|
||||
M << message
|
||||
to_chat(M, message)
|
||||
else if(is_servant_of_ratvar(M))
|
||||
M << message
|
||||
to_chat(M, message)
|
||||
return TRUE
|
||||
|
||||
//Sends a titled message from a mob to all servants of ratvar and ghosts.
|
||||
|
||||
@@ -50,9 +50,12 @@
|
||||
if(locate(/obj/structure/table) in src)
|
||||
return FALSE
|
||||
if(is_blocked_turf(src, TRUE))
|
||||
user << "<span class='warning'>Something is in the way, preventing you from proselytizing [src] into a clockwork wall.</span>"
|
||||
to_chat(user, "<span class='warning'>Something is in the way, preventing you from proselytizing [src] into a clockwork wall.</span>")
|
||||
return TRUE
|
||||
return list("operation_time" = 100, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH)
|
||||
var/operation_time = 100
|
||||
if(proselytizer.speed_multiplier > 0)
|
||||
operation_time /= proselytizer.speed_multiplier
|
||||
return list("operation_time" = operation_time, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH)
|
||||
|
||||
//False wall conversion
|
||||
/obj/structure/falsewall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
@@ -80,7 +83,7 @@
|
||||
if(proselytizer.metal_to_power)
|
||||
var/no_delete = FALSE
|
||||
if(amount_temp < 2)
|
||||
user << "<span class='warning'>You need at least <b>2</b> floor tiles to convert into power.</span>"
|
||||
to_chat(user, "<span class='warning'>You need at least <b>2</b> floor tiles to convert into power.</span>")
|
||||
return TRUE
|
||||
if(IsOdd(amount_temp))
|
||||
amount_temp--
|
||||
@@ -98,7 +101,7 @@
|
||||
new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make)
|
||||
use(used)
|
||||
else
|
||||
user << "<span class='warning'>You need at least <b>20</b> floor tiles to convert into brass.</span>"
|
||||
to_chat(user, "<span class='warning'>You need at least <b>20</b> floor tiles to convert into brass.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/stack/rods/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
@@ -116,7 +119,7 @@
|
||||
new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make)
|
||||
use(used)
|
||||
else
|
||||
user << "<span class='warning'>You need at least <b>10</b> rods to convert into brass.</span>"
|
||||
to_chat(user, "<span class='warning'>You need at least <b>10</b> rods to convert into brass.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/stack/sheet/metal/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
@@ -134,7 +137,7 @@
|
||||
new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make)
|
||||
use(used)
|
||||
else
|
||||
user << "<span class='warning'>You need at least <b>5</b> sheets of metal to convert into brass.</span>"
|
||||
to_chat(user, "<span class='warning'>You need at least <b>5</b> sheets of metal to convert into brass.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/stack/sheet/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
@@ -152,7 +155,7 @@
|
||||
new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make)
|
||||
use(used)
|
||||
else
|
||||
user << "<span class='warning'>You need at least <b>2</b> sheets of plasteel to convert into brass.</span>"
|
||||
to_chat(user, "<span class='warning'>You need at least <b>2</b> sheets of plasteel to convert into brass.</span>")
|
||||
return TRUE
|
||||
|
||||
//Brass directly to power
|
||||
@@ -314,14 +317,18 @@
|
||||
//Hitting a ratvar'd silicon will also try to repair it.
|
||||
/mob/living/silicon/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
. = TRUE
|
||||
if(proselytizer_heal(user, proselytizer) && user)
|
||||
if(health == maxHealth) //if we're at maximum health, prosel the turf under us
|
||||
return FALSE
|
||||
else if(proselytizer_heal(user, proselytizer) && user)
|
||||
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. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at <b>[abs(HEALTH_THRESHOLD_DEAD - health)]/[abs(HEALTH_THRESHOLD_DEAD - maxHealth)]</b> health.</span>")
|
||||
|
||||
//Same with clockwork mobs.
|
||||
/mob/living/simple_animal/hostile/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
. = TRUE
|
||||
if(proselytizer_heal(user, proselytizer) && user)
|
||||
if(health == maxHealth) //if we're at maximum health, prosel the turf under us
|
||||
return FALSE
|
||||
else if(proselytizer_heal(user, proselytizer) && user)
|
||||
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. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at <b>[health]/[maxHealth]</b> health.</span>")
|
||||
|
||||
@@ -329,20 +336,20 @@
|
||||
/mob/living/simple_animal/drone/cogscarab/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
. = TRUE
|
||||
if(stat == DEAD)
|
||||
try_reactivate(user)
|
||||
try_reactivate(user) //if we're at maximum health, prosel the turf under us
|
||||
return
|
||||
if(health < maxHealth && !(flags & GODMODE))
|
||||
if(health == maxHealth)
|
||||
return FALSE
|
||||
else if(!(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))
|
||||
if(do_after(user, (maxHealth - health)*2, 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 gear bits directly to power
|
||||
/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
|
||||
@@ -46,14 +46,14 @@
|
||||
else
|
||||
var/mob/living/L = target
|
||||
if(L.null_rod_check())
|
||||
ranged_ability_user << "<span class='sevtug'>\"A void weapon? Really, you expect me to be able to do anything?\"</span>"
|
||||
to_chat(ranged_ability_user, "<span class='sevtug'>\"A void weapon? Really, you expect me to be able to do anything?\"</span>")
|
||||
return TRUE
|
||||
if(is_servant_of_ratvar(L))
|
||||
if(L != ranged_ability_user)
|
||||
ranged_ability_user << "<span class='sevtug'>\"[L.p_they(TRUE)] already serve[L.p_s()] Ratvar. [text2ratvar("Perhaps [ranged_ability_user.p_theyre()] into bondage?")]\"</span>"
|
||||
to_chat(ranged_ability_user, "<span class='sevtug'>\"[L.p_they(TRUE)] already serve[L.p_s()] Ratvar. [text2ratvar("Perhaps [ranged_ability_user.p_theyre()] into bondage?")]\"</span>")
|
||||
return TRUE
|
||||
if(L.stat == DEAD)
|
||||
ranged_ability_user << "<span class='sevtug'>\"[L.p_theyre(TRUE)] dead, idiot.\"</span>"
|
||||
to_chat(ranged_ability_user, "<span class='sevtug'>\"[L.p_theyre(TRUE)] dead, idiot.\"</span>")
|
||||
return TRUE
|
||||
|
||||
if(istype(L.buckled, /obj/structure/destructible/clockwork/geis_binding)) //if they're already bound, just stun them
|
||||
@@ -100,10 +100,10 @@
|
||||
if(isliving(target) && (target in view(7, get_turf(ranged_ability_user))))
|
||||
var/mob/living/L = target
|
||||
if(!is_servant_of_ratvar(L))
|
||||
ranged_ability_user << "<span class='inathneq'>\"[L] does not yet serve Ratvar.\"</span>"
|
||||
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L] does not yet serve Ratvar.\"</span>")
|
||||
return TRUE
|
||||
if(L.stat == DEAD)
|
||||
ranged_ability_user << "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] dead. [text2ratvar("Oh, child. To have your life cut short...")]\"</span>"
|
||||
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] dead. [text2ratvar("Oh, child. To have your life cut short...")]\"</span>")
|
||||
return TRUE
|
||||
|
||||
var/brutedamage = L.getBruteLoss()
|
||||
@@ -111,7 +111,7 @@
|
||||
var/oxydamage = L.getOxyLoss()
|
||||
var/totaldamage = brutedamage + burndamage + oxydamage
|
||||
if(!totaldamage && (!L.reagents || !L.reagents.has_reagent("holywater")))
|
||||
ranged_ability_user << "<span class='inathneq'>\"[L] is unhurt and untainted.\"</span>"
|
||||
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L] is unhurt and untainted.\"</span>")
|
||||
return TRUE
|
||||
|
||||
successful = TRUE
|
||||
@@ -130,14 +130,14 @@
|
||||
else
|
||||
clockwork_say(ranged_ability_user, text2ratvar("Purge foul darkness!"))
|
||||
add_logs(ranged_ability_user, L, "purged of holy water with Sentinel's Compromise")
|
||||
ranged_ability_user << "<span class='brass'>You bathe [L == ranged_ability_user ? "yourself":"[L]"] in Inath-neq's power!</span>"
|
||||
to_chat(ranged_ability_user, "<span class='brass'>You bathe [L == ranged_ability_user ? "yourself":"[L]"] in Inath-neq's power!</span>")
|
||||
L.visible_message("<span class='warning'>A blue light washes over [L], mending [L.p_their()] bruises and burns!</span>", \
|
||||
"<span class='heavy_brass'>You feel Inath-neq's power healing your wounds, but a deep nausea overcomes you!</span>")
|
||||
playsound(targetturf, 'sound/magic/Staff_Healing.ogg', 50, 1)
|
||||
|
||||
if(L.reagents && L.reagents.has_reagent("holywater"))
|
||||
L.reagents.remove_reagent("holywater", 1000)
|
||||
L << "<span class='heavy_brass'>Ratvar's light flares, banishing the darkness. Your devotion remains intact!</span>"
|
||||
to_chat(L, "<span class='heavy_brass'>Ratvar's light flares, banishing the darkness. Your devotion remains intact!</span>")
|
||||
|
||||
remove_ranged_ability()
|
||||
|
||||
@@ -194,13 +194,13 @@
|
||||
if(isliving(target) && (target in view(7, get_turf(ranged_ability_user))))
|
||||
var/mob/living/L = target
|
||||
if(!is_servant_of_ratvar(L))
|
||||
ranged_ability_user << "<span class='inathneq'>\"[L] does not yet serve Ratvar.\"</span>"
|
||||
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L] does not yet serve Ratvar.\"</span>")
|
||||
return TRUE
|
||||
if(L.stat == DEAD)
|
||||
ranged_ability_user << "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] dead. [text2ratvar("Oh, child. To have your life cut short...")]\"</span>"
|
||||
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] dead. [text2ratvar("Oh, child. To have your life cut short...")]\"</span>")
|
||||
return TRUE
|
||||
if(islist(L.stun_absorption) && L.stun_absorption["vanguard"] && L.stun_absorption["vanguard"]["end_time"] > world.time)
|
||||
ranged_ability_user << "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] already shielded by a Vanguard.\"</span>"
|
||||
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] already shielded by a Vanguard.\"</span>")
|
||||
return TRUE
|
||||
|
||||
successful = TRUE
|
||||
|
||||
@@ -12,20 +12,20 @@
|
||||
/obj/item/clockwork/component/pickup(mob/living/user)
|
||||
..()
|
||||
if(iscultist(user) || (user.mind && user.mind.isholy))
|
||||
user << "<span class='[message_span]'>[cultist_message]</span>"
|
||||
to_chat(user, "<span class='[message_span]'>[cultist_message]</span>")
|
||||
if(user.mind && user.mind.isholy)
|
||||
user << "<span class='boldannounce'>The power of your faith melts away the [src]!</span>"
|
||||
to_chat(user, "<span class='boldannounce'>The power of your faith melts away the [src]!</span>")
|
||||
var/obj/item/weapon/ore/slag/wrath = new /obj/item/weapon/ore/slag
|
||||
qdel(src)
|
||||
user.put_in_active_hand(wrath)
|
||||
if(is_servant_of_ratvar(user) && prob(20))
|
||||
var/pickedmessage = pick(servant_of_ratvar_messages)
|
||||
user << "<span class='[message_span]'>[servant_of_ratvar_messages[pickedmessage] ? "[text2ratvar(pickedmessage)]" : pickedmessage]</span>"
|
||||
to_chat(user, "<span class='[message_span]'>[servant_of_ratvar_messages[pickedmessage] ? "[text2ratvar(pickedmessage)]" : pickedmessage]</span>")
|
||||
|
||||
/obj/item/clockwork/component/examine(mob/user)
|
||||
..()
|
||||
if(is_servant_of_ratvar(user))
|
||||
user << "<span class='[message_span]'>You should put this in a slab or cache immediately.</span>"
|
||||
to_chat(user, "<span class='[message_span]'>You should put this in a slab or cache immediately.</span>")
|
||||
|
||||
/obj/item/clockwork/component/belligerent_eye
|
||||
name = "belligerent eye"
|
||||
@@ -53,6 +53,13 @@
|
||||
cultist_message = "The gem turns black and cold for a moment before its normal glow returns."
|
||||
servant_of_ratvar_messages = list("\"Disgusting failure.\"" = TRUE, "You feel scrutinized." = FALSE, "\"Weaklings.\"" = TRUE, "\"Pathetic defenses.\"" = TRUE)
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
light_range = 1.4
|
||||
light_power = 0.4
|
||||
light_color = "#F42B9D"
|
||||
|
||||
/obj/item/clockwork/component/belligerent_eye/lens_gem/New()
|
||||
..()
|
||||
update_light()
|
||||
|
||||
/obj/item/clockwork/component/vanguard_cogwheel
|
||||
name = "vanguard cogwheel"
|
||||
|
||||
@@ -33,14 +33,14 @@
|
||||
..()
|
||||
if(slot == slot_head && !is_servant_of_ratvar(user))
|
||||
if(!iscultist(user))
|
||||
user << "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>")
|
||||
user.visible_message("<span class='warning'>As [user] puts [src] on, it flickers off their head!</span>", "<span class='warning'>The helmet flickers off your head, leaving only nausea!</span>")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.vomit(20, 1, 1, 0, 1)
|
||||
else
|
||||
user << "<span class='heavy_brass'>\"Do you have a hole in your head? You're about to.\"</span>"
|
||||
user << "<span class='userdanger'>The helmet tries to drive a spike through your head as you scramble to remove it!</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"Do you have a hole in your head? You're about to.\"</span>")
|
||||
to_chat(user, "<span class='userdanger'>The helmet tries to drive a spike through your head as you scramble to remove it!</span>")
|
||||
user.emote("scream")
|
||||
user.apply_damage(30, BRUTE, "head")
|
||||
user.adjustBrainLoss(30)
|
||||
@@ -94,14 +94,14 @@
|
||||
..()
|
||||
if(slot == slot_wear_suit && !is_servant_of_ratvar(user))
|
||||
if(!iscultist(user))
|
||||
user << "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>")
|
||||
user.visible_message("<span class='warning'>As [user] puts [src] on, it flickers off their body!</span>", "<span class='warning'>The curiass flickers off your body, leaving only nausea!</span>")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.vomit(20, 1, 1, 0, 1)
|
||||
else
|
||||
user << "<span class='heavy_brass'>\"I think this armor is too hot for you to handle.\"</span>"
|
||||
user << "<span class='userdanger'>The curiass emits a burst of flame as you scramble to get it off!</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"I think this armor is too hot for you to handle.\"</span>")
|
||||
to_chat(user, "<span class='userdanger'>The curiass emits a burst of flame as you scramble to get it off!</span>")
|
||||
user.emote("scream")
|
||||
user.apply_damage(15, BURN, "chest")
|
||||
user.adjust_fire_stacks(2)
|
||||
@@ -155,14 +155,14 @@
|
||||
..()
|
||||
if(slot == slot_gloves && !is_servant_of_ratvar(user))
|
||||
if(!iscultist(user))
|
||||
user << "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>")
|
||||
user.visible_message("<span class='warning'>As [user] puts [src] on, it flickers off their arms!</span>", "<span class='warning'>The gauntlets flicker off your arms, leaving only nausea!</span>")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.vomit(10, 1, 1, 0, 1)
|
||||
else
|
||||
user << "<span class='heavy_brass'>\"Did you like having arms?\"</span>"
|
||||
user << "<span class='userdanger'>The gauntlets suddenly squeeze tight, crushing your arms before you manage to get them off!</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"Did you like having arms?\"</span>")
|
||||
to_chat(user, "<span class='userdanger'>The gauntlets suddenly squeeze tight, crushing your arms before you manage to get them off!</span>")
|
||||
user.emote("scream")
|
||||
user.apply_damage(7, BRUTE, "l_arm")
|
||||
user.apply_damage(7, BRUTE, "r_arm")
|
||||
@@ -205,14 +205,14 @@
|
||||
..()
|
||||
if(slot == slot_shoes && !is_servant_of_ratvar(user))
|
||||
if(!iscultist(user))
|
||||
user << "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>")
|
||||
user.visible_message("<span class='warning'>As [user] puts [src] on, it flickers off their feet!</span>", "<span class='warning'>The treads flicker off your feet, leaving only nausea!</span>")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.vomit(10, 1, 1, 0, 1)
|
||||
else
|
||||
user << "<span class='heavy_brass'>\"Let's see if you can dance with these.\"</span>"
|
||||
user << "<span class='userdanger'>The treads turn searing hot as you scramble to get them off!</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"Let's see if you can dance with these.\"</span>")
|
||||
to_chat(user, "<span class='userdanger'>The treads turn searing hot as you scramble to get them off!</span>")
|
||||
user.emote("scream")
|
||||
user.apply_damage(7, BURN, "l_leg")
|
||||
user.apply_damage(7, BURN, "r_leg")
|
||||
|
||||
@@ -127,26 +127,26 @@
|
||||
/obj/item/clockwork/clockwork_proselytizer/examine(mob/living/user)
|
||||
..()
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
user << "<span class='brass'>Can be used to convert walls, floors, windows, airlocks, and a variety of other objects to clockwork variants.</span>"
|
||||
user << "<span class='brass'>Can also form some objects into Brass sheets, as well as reform Clockwork Walls into Clockwork Floors, and vice versa.</span>"
|
||||
to_chat(user, "<span class='brass'>Can be used to convert walls, floors, windows, airlocks, and a variety of other objects to clockwork variants.</span>")
|
||||
to_chat(user, "<span class='brass'>Can also form some objects into Brass sheets, as well as reform Clockwork Walls into Clockwork Floors, and vice versa.</span>")
|
||||
if(uses_power)
|
||||
if(metal_to_power)
|
||||
user << "<span class='alloy'>It can convert rods, metal, plasteel, and brass to power at rates of <b>1:[POWER_ROD]W</b>, <b>1:[POWER_METAL]W</b>, \
|
||||
<b>1:[POWER_PLASTEEL]W</b>, and <b>1:[POWER_FLOOR]W</b>, respectively.</span>"
|
||||
to_chat(user, "<span class='alloy'>It can convert rods, metal, plasteel, and brass to power at rates of <b>1:[POWER_ROD]W</b>, <b>1:[POWER_METAL]W</b>, \
|
||||
<b>1:[POWER_PLASTEEL]W</b>, and <b>1:[POWER_FLOOR]W</b>, respectively.</span>")
|
||||
else
|
||||
user << "<span class='alloy'>It can convert brass to power at a rate of <b>1:[POWER_FLOOR]W</b>.</span>"
|
||||
user << "<span class='alloy'>It is storing <b>[get_power()]W/[get_max_power()]W</b> of power, and is gaining <b>[charge_rate*0.5]W</b> of power per second.</span>"
|
||||
user << "<span class='alloy'>Use it in-hand to produce brass sheets.</span>"
|
||||
to_chat(user, "<span class='alloy'>It can convert brass to power at a rate of <b>1:[POWER_FLOOR]W</b>.</span>")
|
||||
to_chat(user, "<span class='alloy'>It is storing <b>[get_power()]W/[get_max_power()]W</b> of power, and is gaining <b>[charge_rate*0.5]W</b> of power per second.</span>")
|
||||
to_chat(user, "<span class='alloy'>Use it in-hand to produce <b>5</b> brass sheets at a cost of <b>[POWER_WALL_TOTAL]W</b> power.</span>")
|
||||
|
||||
/obj/item/clockwork/clockwork_proselytizer/attack_self(mob/living/user)
|
||||
if(is_servant_of_ratvar(user))
|
||||
if(!can_use_power(POWER_WALL_TOTAL))
|
||||
user << "<span class='warning'>[src] requires <b>[POWER_WALL_TOTAL]W</b> of power to produce brass sheets!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] requires <b>[POWER_WALL_TOTAL]W</b> of power to produce brass sheets!</span>")
|
||||
return
|
||||
modify_stored_power(-POWER_WALL_TOTAL)
|
||||
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
new/obj/item/stack/tile/brass(user.loc, 5)
|
||||
user << "<span class='brass'>You user [stored_power ? "some":"all"] of [src]'s power to produce some brass sheets. It now stores <b>[get_power()]W/[get_max_power()]W</b> of power.</span>"
|
||||
to_chat(user, "<span class='brass'>You user [stored_power ? "some":"all"] of [src]'s power to produce some brass sheets. It now stores <b>[get_power()]W/[get_max_power()]W</b> of power.</span>")
|
||||
|
||||
/obj/item/clockwork/clockwork_proselytizer/pre_attackby(atom/target, mob/living/user, params)
|
||||
if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/weapon/storage))
|
||||
@@ -180,14 +180,14 @@
|
||||
if(!target || !user)
|
||||
return FALSE
|
||||
if(repairing)
|
||||
user << "<span class='warning'>You are currently repairing [repairing] with [src]!</span>"
|
||||
to_chat(user, "<span class='warning'>You are currently repairing [repairing] with [src]!</span>")
|
||||
return FALSE
|
||||
var/list/proselytize_values = target.proselytize_vals(user, src) //relevant values for proselytizing stuff, given as an associated list
|
||||
if(!islist(proselytize_values))
|
||||
if(proselytize_values != TRUE) //if we get true, fail, but don't send a message for whatever reason
|
||||
if(!isturf(target)) //otherwise, if we didn't get TRUE and the original target wasn't a turf, try to proselytize the turf
|
||||
return proselytize(get_turf(target), user, no_table_check)
|
||||
user << "<span class='warning'>[target] cannot be proselytized!</span>"
|
||||
to_chat(user, "<span class='warning'>[target] cannot be proselytized!</span>")
|
||||
if(!no_table_check)
|
||||
return TRUE
|
||||
return FALSE
|
||||
@@ -218,16 +218,16 @@
|
||||
|
||||
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
var/new_thing_type = proselytize_values["new_obj_type"]
|
||||
if(isturf(target))
|
||||
if(isturf(target)) //if our target is a turf, we're just going to ChangeTurf it and assume it'll work out.
|
||||
var/turf/T = target
|
||||
T.ChangeTurf(new_thing_type)
|
||||
else
|
||||
if(proselytize_values["dir_in_new"])
|
||||
new new_thing_type(get_turf(target), proselytize_values["spawn_dir"])
|
||||
new new_thing_type(get_turf(target), proselytize_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New()
|
||||
else
|
||||
var/atom/A = new new_thing_type(get_turf(target))
|
||||
A.setDir(proselytize_values["spawn_dir"])
|
||||
if(!proselytize_values["no_target_deletion"])
|
||||
if(!proselytize_values["no_target_deletion"]) //for some cases where proselytize_vals() modifies the object but doesn't want it deleted
|
||||
qdel(target)
|
||||
modify_stored_power(-proselytize_values["power_cost"])
|
||||
if(no_table_check)
|
||||
@@ -246,27 +246,29 @@
|
||||
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>"
|
||||
to_chat(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>"
|
||||
to_chat(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.
|
||||
//What this proc does is it takes an existing list of values, which it modifies.
|
||||
//This(modifying an existing object) is the only way to get information OUT of a do_after callback, which this is used as.
|
||||
/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))
|
||||
if(isliving(target)) //standard checks for if we can affect the target
|
||||
var/mob/living/L = target
|
||||
if(!is_servant_of_ratvar(L))
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[L] does not serve Ratvar!</span>"
|
||||
to_chat(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>"
|
||||
to_chat(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))
|
||||
@@ -274,23 +276,23 @@
|
||||
var/obj/structure/destructible/clockwork/C = target
|
||||
if(!C.can_be_repaired)
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[C] cannot be repaired!</span>"
|
||||
to_chat(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>"
|
||||
to_chat(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)
|
||||
if(repair_values["amount_to_heal"] <= 0) //nothing to heal!
|
||||
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)
|
||||
repair_values["healing_for_cycle"] = min(repair_values["amount_to_heal"], PROSELYTIZER_REPAIR_PER_TICK) //modify the healing for this cycle
|
||||
repair_values["power_required"] = round(repair_values["healing_for_cycle"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER) //and get the power cost from that
|
||||
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>"
|
||||
to_chat(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
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/channeled/volt_void/cyborg)
|
||||
|
||||
/obj/item/clockwork/slab/cyborg/access_display(mob/living/user)
|
||||
user << "<span class='warning'>Use the action buttons to recite your limited set of scripture!</span>"
|
||||
to_chat(user, "<span class='warning'>Use the action buttons to recite your limited set of scripture!</span>")
|
||||
|
||||
/obj/item/clockwork/slab/New()
|
||||
..()
|
||||
@@ -138,7 +138,7 @@
|
||||
if(S == src)
|
||||
continue
|
||||
S.production_time = production_time + 50 //set it to our next production plus five seconds, so that if you hold the same slabs, the same one will always generate
|
||||
L << "<span class='warning'>Your slab cl[pick("ank", "ink", "unk", "ang")]s as it produces a </span><span class='[get_component_span(component_to_generate)]'>component</span><span class='warning'>.</span>"
|
||||
to_chat(L, "<span class='warning'>Your slab cl[pick("ank", "ink", "unk", "ang")]s as it produces a </span><span class='[get_component_span(component_to_generate)]'>component</span><span class='warning'>.</span>")
|
||||
|
||||
/obj/item/clockwork/slab/examine(mob/user)
|
||||
..()
|
||||
@@ -148,16 +148,16 @@
|
||||
if(!quickbound[i])
|
||||
continue
|
||||
var/datum/clockwork_scripture/quickbind_slot = quickbound[i]
|
||||
user << "<b>Quickbind</b> button: <span class='[get_component_span(initial(quickbind_slot.primary_component))]'>[initial(quickbind_slot.name)]</span>."
|
||||
if(clockwork_caches)
|
||||
user << "<b>Stored components (with global cache):</b>"
|
||||
to_chat(user, "<b>Quickbind</b> button: <span class='[get_component_span(initial(quickbind_slot.primary_component))]'>[initial(quickbind_slot.name)]</span>.")
|
||||
if(clockwork_caches) //show components on examine
|
||||
to_chat(user, "<b>Stored components (with global cache):</b>")
|
||||
for(var/i in stored_components)
|
||||
user << "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[stored_components[i]]</b> \
|
||||
(<b>[stored_components[i] + clockwork_component_cache[i]]</b>)</span>"
|
||||
to_chat(user, "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[stored_components[i]]</b> \
|
||||
(<b>[stored_components[i] + clockwork_component_cache[i]]</b>)</span>")
|
||||
else
|
||||
user << "<b>Stored components:</b>"
|
||||
to_chat(user, "<b>Stored components:</b>")
|
||||
for(var/i in stored_components)
|
||||
user << "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[stored_components[i]]</b></span>"
|
||||
to_chat(user, "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[stored_components[i]]</b></span>")
|
||||
|
||||
//Component Transferal
|
||||
/obj/item/clockwork/slab/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
@@ -174,7 +174,7 @@
|
||||
targetslab = S
|
||||
if(targetslab)
|
||||
if(targetslab == src)
|
||||
user << "<span class='heavy_brass'>\"You can't transfer components into your own slab, idiot.\"</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"You can't transfer components into your own slab, idiot.\"</span>")
|
||||
else
|
||||
for(var/i in stored_components)
|
||||
targetslab.stored_components[i] += stored_components[i]
|
||||
@@ -184,7 +184,7 @@
|
||||
user.visible_message("<span class='notice'>[user] empties [src] into [target]'s [targetslab.name].</span>", \
|
||||
"<span class='notice'>You transfer your slab's components into [target]'s [targetslab.name].</span>")
|
||||
else
|
||||
user << "<span class='warning'>[target] has no slabs to transfer components to.</span>"
|
||||
to_chat(user, "<span class='warning'>[target] has no slabs to transfer components to.</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
|
||||
/obj/item/clockwork/slab/proc/show_hierophant(mob/living/user)
|
||||
if(!user.can_speak_vocal())
|
||||
user << "<span class='warning'>You cannot speak into the slab!</span>"
|
||||
to_chat(user, "<span class='warning'>You cannot speak into the slab!</span>")
|
||||
return FALSE
|
||||
var/message = stripped_input(user, "Enter a message to send to your fellow servants.", "Hierophant")
|
||||
if(!message || !user || !user.canUseTopic(src) || !user.can_speak_vocal())
|
||||
@@ -238,7 +238,7 @@
|
||||
//Scripture Recital
|
||||
/obj/item/clockwork/slab/attack_self(mob/living/user)
|
||||
if(iscultist(user))
|
||||
user << "<span class='heavy_brass'>\"You reek of blood. You've got a lot of nerve to even look at that slab.\"</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"You reek of blood. You've got a lot of nerve to even look at that slab.\"</span>")
|
||||
user.visible_message("<span class='warning'>A sizzling sound comes from [user]'s hands!</span>", "<span class='userdanger'>[src] suddenly grows extremely hot in your hands!</span>")
|
||||
playsound(get_turf(user), 'sound/weapons/sear.ogg', 50, 1)
|
||||
user.drop_item()
|
||||
@@ -247,15 +247,15 @@
|
||||
user.apply_damage(5, BURN, "r_arm")
|
||||
return 0
|
||||
if(!is_servant_of_ratvar(user))
|
||||
user << "<span class='warning'>The information on [src]'s display shifts rapidly. After a moment, your head begins to pound, and you tear your eyes away.</span>"
|
||||
to_chat(user, "<span class='warning'>The information on [src]'s display shifts rapidly. After a moment, your head begins to pound, and you tear your eyes away.</span>")
|
||||
user.confused += 5
|
||||
user.dizziness += 5
|
||||
return 0
|
||||
if(busy)
|
||||
user << "<span class='warning'>[src] refuses to work, displaying the message: \"[busy]!\"</span>"
|
||||
to_chat(user, "<span class='warning'>[src] refuses to work, displaying the message: \"[busy]!\"</span>")
|
||||
return 0
|
||||
if(!nonhuman_usable && !ishuman(user))
|
||||
user << "<span class='nezbere'>[src] hums fitfully in your hands, but doesn't seem to do anything...</span>"
|
||||
to_chat(user, "<span class='nezbere'>[src] hums fitfully in your hands, but doesn't seem to do anything...</span>")
|
||||
return 0
|
||||
access_display(user)
|
||||
|
||||
@@ -277,13 +277,13 @@
|
||||
if(!scripture || !user || !user.canUseTopic(src) || (!nonhuman_usable && !ishuman(user)))
|
||||
return FALSE
|
||||
if(user.get_active_held_item() != src)
|
||||
user << "<span class='warning'>You need to hold the slab in your active hand to recite scripture!</span>"
|
||||
to_chat(user, "<span class='warning'>You need to hold the slab in your active hand to recite scripture!</span>")
|
||||
return FALSE
|
||||
var/initial_tier = initial(scripture.tier)
|
||||
if(initial_tier != SCRIPTURE_PERIPHERAL)
|
||||
var/list/tiers_of_scripture = scripture_unlock_check()
|
||||
if(!ratvar_awakens && !no_cost && !tiers_of_scripture[initial_tier])
|
||||
user << "<span class='warning'>That scripture is not unlocked, and cannot be recited!</span>"
|
||||
to_chat(user, "<span class='warning'>That scripture is not unlocked, and cannot be recited!</span>")
|
||||
return FALSE
|
||||
var/datum/clockwork_scripture/scripture_to_recite = new scripture
|
||||
scripture_to_recite.slab = src
|
||||
@@ -369,17 +369,17 @@
|
||||
<font color=#BE8700 size=3><b><center>Purge all untruths and honor Ratvar.</center></b></font>"
|
||||
return textlist.Join()
|
||||
|
||||
/obj/item/clockwork/slab/ui_data(mob/user)
|
||||
/obj/item/clockwork/slab/ui_data(mob/user) //we display a lot of data via TGUI
|
||||
var/list/data = list()
|
||||
data["components"] = stored_components.Copy()
|
||||
var/list/temp_data = list("<font color=#B18B25>")
|
||||
for(var/i in data["components"])
|
||||
for(var/i in data["components"]) //display the slab's components
|
||||
temp_data += "<font color=[get_component_color_bright(i)]>[get_component_acronym(i)] <b>[data["components"][i]]</b></font>"
|
||||
if(i != HIEROPHANT_ANSIBLE)
|
||||
temp_data += " "
|
||||
else
|
||||
temp_data += " ("
|
||||
if(clockwork_caches)
|
||||
if(clockwork_caches) //if we have caches, display what's in the global cache
|
||||
for(var/i in clockwork_component_cache)
|
||||
temp_data += "<font color=[get_component_color_bright(i)]>[get_component_acronym(i)] <b>[data["components"][i] + clockwork_component_cache[i]]</b></font>"
|
||||
if(i != HIEROPHANT_ANSIBLE)
|
||||
@@ -390,7 +390,7 @@
|
||||
temp_data = temp_data.Join()
|
||||
data["components"] = temp_data
|
||||
|
||||
switch(selected_scripture)
|
||||
switch(selected_scripture) //display info based on selected scripture tier
|
||||
if(SCRIPTURE_DRIVER)
|
||||
data["tier_info"] = "<font color=#B18B25><i>These scriptures are always unlocked.</i></font>"
|
||||
if(SCRIPTURE_SCRIPT)
|
||||
@@ -405,7 +405,7 @@
|
||||
data["selected"] = selected_scripture
|
||||
|
||||
data["target_comp"] = "<font color=#B18B25>NONE</font>"
|
||||
if(target_component_id)
|
||||
if(target_component_id) //if we have a component to make, display that, too
|
||||
data["target_comp"] = "<font color=[get_component_color_bright(target_component_id)]>[get_component_acronym(target_component_id)]</font>"
|
||||
|
||||
generate_all_scripture()
|
||||
@@ -413,7 +413,7 @@
|
||||
data["scripture"] = list()
|
||||
for(var/s in all_scripture)
|
||||
var/datum/clockwork_scripture/S = all_scripture[s]
|
||||
if(S.tier == selected_scripture)
|
||||
if(S.tier == selected_scripture) //display only scriptures of the selected tier
|
||||
var/scripture_color = get_component_color_bright(S.primary_component)
|
||||
var/list/temp_info = list("name" = "<font color=[scripture_color]><b>[S.name]</b></font>",
|
||||
"descname" = "<font color=[scripture_color]>([S.descname])</font>",
|
||||
@@ -493,7 +493,7 @@
|
||||
|
||||
/obj/item/clockwork/slab/proc/update_quickbind()
|
||||
for(var/datum/action/item_action/clock/quickbind/Q in actions)
|
||||
qdel(Q)
|
||||
qdel(Q) //regenerate all our quickbound scriptures
|
||||
if(LAZYLEN(quickbound))
|
||||
for(var/i in 1 to quickbound.len)
|
||||
if(!quickbound[i])
|
||||
@@ -503,7 +503,7 @@
|
||||
var/datum/clockwork_scripture/quickbind_slot = all_scripture[quickbound[i]]
|
||||
Q.name = "[quickbind_slot.name] ([Q.scripture_index])"
|
||||
var/list/temp_desc = list()
|
||||
for(var/c in quickbind_slot.consumed_components)
|
||||
for(var/c in quickbind_slot.consumed_components) //show how much the bound scripture costs
|
||||
if(quickbind_slot.consumed_components[c])
|
||||
temp_desc += "<font color=[get_component_color_bright(c)]>[get_component_acronym(c)] <b>[quickbind_slot.consumed_components[c]]</b></font> "
|
||||
if(LAZYLEN(temp_desc))
|
||||
|
||||
@@ -44,8 +44,8 @@
|
||||
else
|
||||
update_status(FALSE)
|
||||
if(iscultist(user)) //Cultists spontaneously combust
|
||||
user << "<span class='heavy_brass'>\"Consider yourself judged, whelp.\"</span>"
|
||||
user << "<span class='userdanger'>You suddenly catch fire!</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>\"Consider yourself judged, whelp.\"</span>")
|
||||
to_chat(user, "<span class='userdanger'>You suddenly catch fire!</span>")
|
||||
user.adjust_fire_stacks(5)
|
||||
user.IgniteMob()
|
||||
return 1
|
||||
@@ -79,10 +79,10 @@
|
||||
return 0
|
||||
switch(active)
|
||||
if(TRUE)
|
||||
L << "<span class='notice'>As you put on [src], its lens begins to glow, information flashing before your eyes.</span>\n\
|
||||
<span class='heavy_brass'>Judicial visor active. Use the action button to gain the ability to smite the unworthy.</span>"
|
||||
to_chat(L, "<span class='notice'>As you put on [src], its lens begins to glow, information flashing before your eyes.</span>\n\
|
||||
<span class='heavy_brass'>Judicial visor active. Use the action button to gain the ability to smite the unworthy.</span>")
|
||||
if(FALSE)
|
||||
L << "<span class='notice'>As you take off [src], its lens darkens once more.</span>"
|
||||
to_chat(L, "<span class='notice'>As you take off [src], its lens darkens once more.</span>")
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/glasses/judicial_visor/proc/recharge_visor(mob/living/user)
|
||||
@@ -90,7 +90,7 @@
|
||||
return 0
|
||||
recharging = FALSE
|
||||
if(user && src == user.get_item_by_slot(slot_glasses))
|
||||
user << "<span class='brass'>Your [name] hums. It is ready.</span>"
|
||||
to_chat(user, "<span class='brass'>Your [name] hums. It is ready.</span>")
|
||||
else
|
||||
active = FALSE
|
||||
icon_state = "judicial_visor_[active]"
|
||||
@@ -158,7 +158,7 @@
|
||||
|
||||
/obj/effect/clockwork/judicial_marker/New(loc, caster)
|
||||
..()
|
||||
SetLuminosity(4, 3)
|
||||
set_light(1.4, 2, "#FE9C11")
|
||||
user = caster
|
||||
INVOKE_ASYNC(src, .proc/judicialblast)
|
||||
|
||||
@@ -168,10 +168,11 @@
|
||||
sleep(16)
|
||||
layer = ABOVE_ALL_MOB_LAYER
|
||||
flick("judicial_explosion", src)
|
||||
set_light(1.4, 2, "#B451A1")
|
||||
sleep(13)
|
||||
var/targetsjudged = 0
|
||||
playsound(src, 'sound/effects/explosionfar.ogg', 100, 1, 1, 1)
|
||||
SetLuminosity(0)
|
||||
set_light(0)
|
||||
for(var/mob/living/L in range(1, src))
|
||||
if(is_servant_of_ratvar(L))
|
||||
continue
|
||||
@@ -183,20 +184,20 @@
|
||||
if(!iscultist(L))
|
||||
L.visible_message("<span class='warning'>[L] is struck by a judicial explosion!</span>", \
|
||||
"<span class='userdanger'>[!issilicon(L) ? "An unseen force slams you into the ground!" : "ERROR: Motor servos disabled by external source!"]</span>")
|
||||
L.Weaken(8)
|
||||
L.Weaken(8) //stun targets for 14-16 seconds
|
||||
else
|
||||
L.visible_message("<span class='warning'>[L] is struck by a judicial explosion!</span>", \
|
||||
"<span class='heavy_brass'>\"Keep an eye out, filth.\"</span>\n<span class='userdanger'>A burst of heat crushes you against the ground!</span>")
|
||||
L.Weaken(4) //half the stun, but sets cultists on fire
|
||||
L.Weaken(4) //stun for 6-8 seconds, but set cultist targets on fire
|
||||
L.adjust_fire_stacks(2)
|
||||
L.IgniteMob()
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
C.silent += 6
|
||||
targetsjudged++
|
||||
L.adjustBruteLoss(10)
|
||||
L.adjustBruteLoss(10) //do a small amount of damage
|
||||
add_logs(user, L, "struck with a judicial blast")
|
||||
user << "<span class='brass'><b>[targetsjudged ? "Successfully judged <span class='neovgre'>[targetsjudged]</span>":"Judged no"] heretic[targetsjudged == 1 ? "":"s"].</b></span>"
|
||||
to_chat(user, "<span class='brass'><b>[targetsjudged ? "Successfully judged <span class='neovgre'>[targetsjudged]</span>":"Judged no"] heretic[targetsjudged == 1 ? "":"s"].</b></span>")
|
||||
sleep(3) //so the animation completes properly
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -52,22 +52,22 @@
|
||||
/obj/item/clockwork/ratvarian_spear/examine(mob/user)
|
||||
..()
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
user << "<span class='brass'>Stabbing a human you are pulling or have grabbed with the spear will impale them, doing massive damage and stunning.</span>"
|
||||
to_chat(user, "<span class='brass'>Stabbing a human you are pulling or have grabbed with the spear will impale them, doing massive damage and stunning.</span>")
|
||||
if(!iscyborg(user))
|
||||
user << "<span class='brass'>Throwing the spear will do massive damage, break the spear, and stun the target.</span>"
|
||||
to_chat(user, "<span class='brass'>Throwing the spear will do massive damage, break the spear, and stun the target.</span>")
|
||||
|
||||
/obj/item/clockwork/ratvarian_spear/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
var/impaling = FALSE
|
||||
if(attack_cooldown > world.time)
|
||||
user << "<span class='warning'>You can't attack right now, wait [max(round((attack_cooldown - world.time)*0.1, 0.1), 0)] seconds!</span>"
|
||||
to_chat(user, "<span class='warning'>You can't attack right now, wait [max(round((attack_cooldown - world.time)*0.1, 0.1), 0)] seconds!</span>")
|
||||
return
|
||||
if(user.pulling && ishuman(user.pulling) && user.pulling == target)
|
||||
if(impale_cooldown > world.time)
|
||||
user << "<span class='warning'>You can't impale [target] yet, wait [max(round((impale_cooldown - world.time)*0.1, 0.1), 0)] seconds!</span>"
|
||||
to_chat(user, "<span class='warning'>You can't impale [target] yet, wait [max(round((impale_cooldown - world.time)*0.1, 0.1), 0)] seconds!</span>")
|
||||
else
|
||||
impaling = TRUE
|
||||
attack_verb = list("impaled")
|
||||
force += 22 //40 damage if ratvar isn't alive, 50 if he is
|
||||
force += 22 //total 40 damage if ratvar isn't alive, 50 if he is
|
||||
armour_penetration += 10 //if you're impaling someone, armor sure isn't that useful
|
||||
user.stop_pulling()
|
||||
|
||||
@@ -78,19 +78,19 @@
|
||||
user.do_attack_animation(target)
|
||||
if(!target.attacked_by(src, user)) //TODO MAKE ATTACK() USE PROPER RETURN VALUES
|
||||
impaling = FALSE //if we got blocked, stop impaling
|
||||
else if(!target.null_rod_check())
|
||||
else if(!target.null_rod_check()) //if they don't have a null rod, we do bonus damage on a successful attack
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = target
|
||||
if(S.stat != DEAD)
|
||||
S.visible_message("<span class='warning'>[S] shudders violently at [src]'s touch!</span>", "<span class='userdanger'>ERROR: Temperature rising!</span>")
|
||||
S.adjustFireLoss(22)
|
||||
else if(iscultist(target) || isconstruct(target)) //Cultists take extra fire damage
|
||||
S.adjustFireLoss(22) //total 37 damage on borgs
|
||||
else if(iscultist(target) || isconstruct(target))
|
||||
var/mob/living/M = target
|
||||
if(M.stat != DEAD)
|
||||
M << "<span class='userdanger'>Your body flares with agony at [src]'s presence!</span>"
|
||||
M.adjustFireLoss(15)
|
||||
to_chat(M, "<span class='userdanger'>Your body flares with agony at [src]'s presence!</span>")
|
||||
M.adjustFireLoss(15) //total 30 damage on cultists
|
||||
else
|
||||
target.adjustFireLoss(3)
|
||||
target.adjustFireLoss(3) //anything else takes a total of 18
|
||||
add_logs(user, target, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -98,11 +98,11 @@
|
||||
ratvar_act()
|
||||
if(impaling)
|
||||
impale_cooldown = world.time + initial(impale_cooldown)
|
||||
attack_cooldown = world.time + initial(attack_cooldown)
|
||||
attack_cooldown = world.time + initial(attack_cooldown) //can't attack until we're done impaling
|
||||
if(target)
|
||||
new /obj/effect/overlay/temp/dir_setting/bloodsplatter(get_turf(target), get_dir(user, target))
|
||||
target.Stun(2)
|
||||
user << "<span class='brass'>You prepare to remove your ratvarian spear from [target]...</span>"
|
||||
target.Stun(2) //brief stun
|
||||
to_chat(user, "<span class='brass'>You prepare to remove your ratvarian spear from [target]...</span>")
|
||||
var/remove_verb = pick("pull", "yank", "drag")
|
||||
if(do_after(user, 10, 1, target))
|
||||
var/turf/T = get_turf(target)
|
||||
@@ -113,18 +113,18 @@
|
||||
user.visible_message("<span class='warning'>[user] [remove_verb]s [src] out of [target]!</span>", "<span class='warning'>You [remove_verb] your spear from [target]!</span>")
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] kicks [target] off of [src]!</span>", "<span class='warning'>You kick [target] off of [src]!</span>")
|
||||
target << "<span class='userdanger'>You scream in pain as you're kicked off of [src]!</span>"
|
||||
to_chat(target, "<span class='userdanger'>You scream in pain as you're kicked off of [src]!</span>")
|
||||
target.emote("scream")
|
||||
step(target, get_dir(user, target))
|
||||
T = get_turf(target)
|
||||
B.forceMove(T)
|
||||
target.Weaken(2)
|
||||
target.Weaken(2) //then weaken if we stayed next to them
|
||||
playsound(T, 'sound/weapons/thudswoosh.ogg', 50, 1)
|
||||
flash_color(target, flash_color="#911414", flash_time=8)
|
||||
else if(target) //it's a do_after, we gotta check again to make sure they didn't get deleted
|
||||
user.visible_message("<span class='warning'>[user] [remove_verb]s [src] out of [target]!</span>", "<span class='warning'>You [remove_verb] your spear from [target]!</span>")
|
||||
if(target.stat == CONSCIOUS)
|
||||
target << "<span class='userdanger'>You scream in pain as [src] is suddenly [remove_verb]ed out of you!</span>"
|
||||
to_chat(target, "<span class='userdanger'>You scream in pain as [src] is suddenly [remove_verb]ed out of you!</span>")
|
||||
target.emote("scream")
|
||||
flash_color(target, flash_color="#911414", flash_time=4)
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
/obj/item/device/mmi/posibrain/soul_vessel/attack_self(mob/living/user)
|
||||
if(!is_servant_of_ratvar(user))
|
||||
user << "<span class='warning'>You fiddle around with [src], to no avail.</span>"
|
||||
to_chat(user, "<span class='warning'>You fiddle around with [src], to no avail.</span>")
|
||||
return 0
|
||||
..()
|
||||
|
||||
@@ -57,35 +57,35 @@
|
||||
..()
|
||||
return
|
||||
if(used || (brainmob && brainmob.key))
|
||||
user << "<span class='nezbere'>\"This vessel is filled, friend. Provide it with a body.\"</span>"
|
||||
to_chat(user, "<span class='nezbere'>\"This vessel is filled, friend. Provide it with a body.\"</span>")
|
||||
return
|
||||
if(is_servant_of_ratvar(target))
|
||||
user << "<span class='nezbere'>\"It would be more wise to revive your allies, friend.\"</span>"
|
||||
to_chat(user, "<span class='nezbere'>\"It would be more wise to revive your allies, friend.\"</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/obj/item/bodypart/head/HE = H.get_bodypart("head")
|
||||
var/obj/item/organ/brain/B = H.getorgan(/obj/item/organ/brain)
|
||||
if(!HE)
|
||||
user << "<span class='warning'>[H] has no head, and thus no mind!</span>"
|
||||
return
|
||||
if(H.stat == CONSCIOUS)
|
||||
user << "<span class='warning'>[H] must be dead or unconscious for you to claim [H.p_their()] mind!</span>"
|
||||
to_chat(user, "<span class='warning'>[H] must be dead or unconscious for you to claim [H.p_their()] mind!</span>")
|
||||
return
|
||||
if(H.head)
|
||||
var/obj/item/I = H.head
|
||||
if(I.flags_inv & HIDEHAIR)
|
||||
user << "<span class='warning'>[H]'s head is covered, remove [H.head] first!</span>"
|
||||
if(I.flags_inv & HIDEHAIR) //they're wearing a hat that covers their skull
|
||||
to_chat(user, "<span class='warning'>[H]'s head is covered, remove [H.head] first!</span>")
|
||||
return
|
||||
if(H.wear_mask)
|
||||
var/obj/item/I = H.wear_mask
|
||||
if(I.flags_inv & HIDEHAIR)
|
||||
user << "<span class='warning'>[H]'s head is covered, remove [H.wear_mask] first!</span>"
|
||||
if(I.flags_inv & HIDEHAIR) //they're wearing a mask that covers their skull
|
||||
to_chat(user, "<span class='warning'>[H]'s head is covered, remove [H.wear_mask] first!</span>")
|
||||
return
|
||||
if(!B)
|
||||
user << "<span class='warning'>[H] has no brain, and thus no mind to claim!</span>"
|
||||
var/obj/item/bodypart/head/HE = H.get_bodypart("head")
|
||||
if(!HE) //literally headless
|
||||
to_chat(user, "<span class='warning'>[H] has no head, and thus no mind to claim!</span>")
|
||||
return
|
||||
if(!H.key)
|
||||
user << "<span class='warning'>[H] has no mind to claim!</span>"
|
||||
var/obj/item/organ/brain/B = H.getorgan(/obj/item/organ/brain)
|
||||
if(!B) //either somebody already got to them or robotics did
|
||||
to_chat(user, "<span class='warning'>[H] has no brain, and thus no mind to claim!</span>")
|
||||
return
|
||||
if(!H.key) //nobody's home
|
||||
to_chat(user, "<span class='warning'>[H] has no mind to claim!</span>")
|
||||
return
|
||||
playsound(H, 'sound/misc/splort.ogg', 60, 1, -1)
|
||||
playsound(H, 'sound/magic/clockwork/anima_fragment_attack.ogg', 40, 1, -1)
|
||||
|
||||
@@ -33,23 +33,23 @@
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(src == H.glasses && !up)
|
||||
if(H.disabilities & BLIND)
|
||||
H << "<span class='heavy_brass'>\"You're blind, idiot. Stop embarrassing yourself.\"</span>"
|
||||
to_chat(H, "<span class='heavy_brass'>\"You're blind, idiot. Stop embarrassing yourself.\"</span>")
|
||||
return
|
||||
if(blind_cultist(H))
|
||||
return
|
||||
if(is_servant_of_ratvar(H))
|
||||
H << "<span class='heavy_brass'>You push the spectacles down, and all is revealed to you.[ratvar_awakens ? "" : " Your eyes begin to itch - you cannot do this for long."]</span>"
|
||||
to_chat(H, "<span class='heavy_brass'>You push the spectacles down, and all is revealed to you.[ratvar_awakens ? "" : " Your eyes begin to itch - you cannot do this for long."]</span>")
|
||||
var/datum/status_effect/wraith_spectacles/WS = H.has_status_effect(STATUS_EFFECT_WRAITHSPECS)
|
||||
if(WS)
|
||||
WS.apply_eye_damage(H)
|
||||
H.apply_status_effect(STATUS_EFFECT_WRAITHSPECS)
|
||||
else
|
||||
H << "<span class='heavy_brass'>You push the spectacles down, but you can't see through the glass.</span>"
|
||||
to_chat(H, "<span class='heavy_brass'>You push the spectacles down, but you can't see through the glass.</span>")
|
||||
|
||||
/obj/item/clothing/glasses/wraith_spectacles/proc/blind_cultist(mob/living/victim)
|
||||
if(iscultist(victim))
|
||||
victim << "<span class='heavy_brass'>\"It looks like Nar-Sie's dogs really don't value their eyes.\"</span>"
|
||||
victim << "<span class='userdanger'>Your eyes explode with horrific pain!</span>"
|
||||
to_chat(victim, "<span class='heavy_brass'>\"It looks like Nar-Sie's dogs really don't value their eyes.\"</span>")
|
||||
to_chat(victim, "<span class='userdanger'>Your eyes explode with horrific pain!</span>")
|
||||
victim.emote("scream")
|
||||
victim.become_blind()
|
||||
victim.adjust_blurriness(30)
|
||||
@@ -77,25 +77,25 @@
|
||||
if(slot != slot_glasses || up)
|
||||
return
|
||||
if(user.disabilities & BLIND)
|
||||
user << "<span class='heavy_brass'>\"You're blind, idiot. Stop embarrassing yourself.\"</span>" //Ratvar with the sick burns yo
|
||||
to_chat(user, "<span class='heavy_brass'>\"You're blind, idiot. Stop embarrassing yourself.\"</span>" )
|
||||
return
|
||||
if(blind_cultist(user)) //Cultists instantly go blind
|
||||
return
|
||||
set_vision_vars(TRUE)
|
||||
if(is_servant_of_ratvar(user))
|
||||
user << "<span class='heavy_brass'>As you put on the spectacles, all is revealed to you.[ratvar_awakens ? "" : " Your eyes begin to itch - you cannot do this for long."]</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>As you put on the spectacles, all is revealed to you.[ratvar_awakens ? "" : " Your eyes begin to itch - you cannot do this for long."]</span>")
|
||||
var/datum/status_effect/wraith_spectacles/WS = user.has_status_effect(STATUS_EFFECT_WRAITHSPECS)
|
||||
if(WS)
|
||||
WS.apply_eye_damage(user)
|
||||
user.apply_status_effect(STATUS_EFFECT_WRAITHSPECS)
|
||||
else
|
||||
user << "<span class='heavy_brass'>You put on the spectacles, but you can't see through the glass.</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>You put on the spectacles, but you can't see through the glass.</span>")
|
||||
|
||||
//The effect that causes/repairs the damage the spectacles cause.
|
||||
/datum/status_effect/wraith_spectacles
|
||||
id = "wraith_spectacles"
|
||||
duration = -1 //remains until eye damage done reaches 0 while the glasses are not worn
|
||||
tick_interval = 2
|
||||
tick_interval = 20
|
||||
alert_type = /obj/screen/alert/status_effect/wraith_spectacles
|
||||
var/eye_damage_done = 0
|
||||
var/nearsight_breakpoint = 30
|
||||
@@ -160,9 +160,9 @@
|
||||
H.adjust_blurriness(2)
|
||||
if(eye_damage_done >= nearsight_breakpoint)
|
||||
if(H.become_nearsighted())
|
||||
H << "<span class='nzcrentr'>Your vision doubles, then trebles. Darkness begins to close in. You can't keep this up!</span>"
|
||||
to_chat(H, "<span class='nzcrentr'>Your vision doubles, then trebles. Darkness begins to close in. You can't keep this up!</span>")
|
||||
if(eye_damage_done >= blind_breakpoint)
|
||||
if(H.become_blind())
|
||||
H << "<span class='nzcrentr_large'>A piercing white light floods your vision. Suddenly, all goes dark!</span>"
|
||||
to_chat(H, "<span class='nzcrentr_large'>A piercing white light floods your vision. Suddenly, all goes dark!</span>")
|
||||
if(prob(min(20, 5 + eye_damage_done)))
|
||||
H << "<span class='nzcrentr_small'><i>Your eyes continue to burn.</i></span>"
|
||||
to_chat(H, "<span class='nzcrentr_small'><i>Your eyes continue to burn.</i></span>")
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
verb_exclaim = "proclaims"
|
||||
verb_yell = "harangues"
|
||||
bubble_icon = "clock"
|
||||
light_color = "#E42742"
|
||||
death_sound = 'sound/magic/clockwork/anima_fragment_death.ogg'
|
||||
var/playstyle_string = "<span class='heavy_brass'>You are a bug, yell at whoever spawned you!</span>"
|
||||
|
||||
@@ -26,7 +27,7 @@
|
||||
/mob/living/simple_animal/hostile/clockwork/Login()
|
||||
..()
|
||||
add_servant_of_ratvar(src, TRUE)
|
||||
src << playstyle_string
|
||||
to_chat(src, playstyle_string)
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/ratvar_act()
|
||||
fully_heal(TRUE)
|
||||
@@ -48,4 +49,4 @@
|
||||
msg += "</span>"
|
||||
msg += "*---------*</span>"
|
||||
|
||||
user << msg
|
||||
to_chat(user, msg)
|
||||
|
||||
@@ -14,21 +14,23 @@
|
||||
weather_immunities = list("lava")
|
||||
movement_type = FLYING
|
||||
playstyle_string = "<span class='heavy_brass'>You are an anima fragment</span><b>, a clockwork creation of Ratvar. As a fragment, you have decent health that very gradually regenerates, do \
|
||||
decent damage, and move at extreme speed in addition to being immune to extreme temperatures and pressures. Taking damage will temporarily slow you down, however.\n\
|
||||
decent damage, and move at extreme speed in addition to being immune to extreme temperatures and pressures. Taking damage, and slamming into non-Servants, will temporarily slow you down, however.\n\
|
||||
Your goal is to serve the Justiciar and his servants in any way you can. You yourself are one of these servants, and will be able to utilize anything they can, assuming it doesn't require \
|
||||
opposable thumbs.</b>"
|
||||
var/movement_delay_time //how long the fragment is slowed after being hit
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/fragment/New()
|
||||
/mob/living/simple_animal/hostile/clockwork/fragment/Initialize()
|
||||
..()
|
||||
SetLuminosity(2,1)
|
||||
set_light(2, 0.8)
|
||||
if(prob(1))
|
||||
name = "anime fragment"
|
||||
desc = "I-it's not like I want to show you the light of the Justiciar or anything, B-BAKA!"
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/fragment/Life()
|
||||
..()
|
||||
if(movement_delay_time > world.time)
|
||||
if(ratvar_awakens)
|
||||
adjustHealth(-5)
|
||||
else if(movement_delay_time > world.time)
|
||||
adjustHealth(-0.2)
|
||||
else
|
||||
adjustHealth(-1)
|
||||
@@ -46,11 +48,23 @@
|
||||
/mob/living/simple_animal/hostile/clockwork/fragment/Process_Spacemove(movement_dir = 0)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/fragment/Bump(atom/movable/AM)
|
||||
. = ..()
|
||||
if(movement_delay_time <= world.time && next_move <= world.time && isliving(AM) && !is_servant_of_ratvar(AM))
|
||||
var/mob/living/L = AM
|
||||
if(L.stat) //we don't want to attack them if they're unconscious or dead because that feels REALLY BAD for the player
|
||||
return
|
||||
var/previousattacktext = attacktext
|
||||
attacktext = "slams into"
|
||||
UnarmedAttack(L)
|
||||
attacktext = previousattacktext
|
||||
changeNext_move(CLICK_CD_MELEE)
|
||||
if(!ratvar_awakens)
|
||||
adjustHealth(4)
|
||||
adjust_movement_delay(10) //with the above damage, total of 20 movement delay plus speed = 0 due to damage
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/fragment/emp_act(severity)
|
||||
if(movement_delay_time > world.time)
|
||||
movement_delay_time = movement_delay_time + (50/severity)
|
||||
else
|
||||
movement_delay_time = world.time + (50/severity)
|
||||
adjust_movement_delay(50/severity)
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/fragment/movement_delay()
|
||||
. = ..()
|
||||
@@ -59,11 +73,16 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/fragment/adjustHealth(amount)
|
||||
. = ..()
|
||||
if(!ratvar_awakens && amount > 0) //if ratvar is up we ignore movement delay
|
||||
if(movement_delay_time > world.time)
|
||||
movement_delay_time = movement_delay_time + amount*2.5
|
||||
else
|
||||
movement_delay_time = world.time + amount*2.5
|
||||
if(amount > 0)
|
||||
adjust_movement_delay(amount*2.5)
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/fragment/proc/adjust_movement_delay(amount)
|
||||
if(ratvar_awakens) //if ratvar is up we ignore movement delay
|
||||
movement_delay_time = 0
|
||||
else if(movement_delay_time > world.time)
|
||||
movement_delay_time = movement_delay_time + amount
|
||||
else
|
||||
movement_delay_time = world.time + amount
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/fragment/updatehealth()
|
||||
..()
|
||||
|
||||
@@ -29,10 +29,10 @@
|
||||
Stay near your host to protect and heal them; being too far from your host will rapidly cause you massive damage. Recall to your host if you are too weak and believe you cannot continue \
|
||||
fighting safely. As a final note, you should probably avoid harming any fellow servants of Ratvar.</span>"
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/New()
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/Initialize()
|
||||
..()
|
||||
true_name = pick(possible_true_names)
|
||||
SetLuminosity(2,1)
|
||||
set_light(2, 1.1)
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/Life()
|
||||
..()
|
||||
@@ -51,8 +51,8 @@
|
||||
if(!recovering)
|
||||
heal_host() //also heal our host if inside of them and we aren't recovering
|
||||
else if(health == maxHealth)
|
||||
src << "<span class='userdanger'>Your strength has returned. You can once again come forward!</span>"
|
||||
host << "<span class='userdanger'>Your marauder is now strong enough to come forward again!</span>"
|
||||
to_chat(src, "<span class='userdanger'>Your strength has returned. You can once again come forward!</span>")
|
||||
to_chat(host, "<span class='userdanger'>Your marauder is now strong enough to come forward again!</span>")
|
||||
recovering = FALSE
|
||||
else
|
||||
if(ratvar_awakens) //If Ratvar is alive, marauders don't need a host and are downright impossible to kill
|
||||
@@ -64,7 +64,7 @@
|
||||
return
|
||||
if(host.stat == DEAD)
|
||||
adjustHealth(50)
|
||||
src << "<span class='userdanger'>Your host is dead!</span>"
|
||||
to_chat(src, "<span class='userdanger'>Your host is dead!</span>")
|
||||
return
|
||||
if(z && host.z && z == host.z)
|
||||
switch(get_dist(get_turf(src), get_turf(host)))
|
||||
@@ -82,13 +82,13 @@
|
||||
adjustHealth(9)
|
||||
if(8 to INFINITY)
|
||||
adjustHealth(15)
|
||||
src << "<span class='userdanger'>You're too far from your host and rapidly taking damage!</span>"
|
||||
to_chat(src, "<span class='userdanger'>You're too far from your host and rapidly taking damage!</span>")
|
||||
else //right next to or on top of host
|
||||
adjustHealth(-2)
|
||||
heal_host() //gradually heal host if nearby and host is very weak
|
||||
else //well then, you're not even in the same zlevel
|
||||
adjustHealth(15)
|
||||
src << "<span class='userdanger'>You're too far from your host and rapidly taking damage!</span>"
|
||||
to_chat(src, "<span class='userdanger'>You're too far from your host and rapidly taking damage!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/death(gibbed)
|
||||
emerge_from_host(FALSE, TRUE)
|
||||
@@ -156,7 +156,7 @@
|
||||
if(amount > 0)
|
||||
for(var/mob/living/L in view(2, src))
|
||||
if(L.is_holding_item_of_type(/obj/item/weapon/nullrod))
|
||||
src << "<span class='userdanger'>The presence of a brandished holy artifact weakens your armor!</span>"
|
||||
to_chat(src, "<span class='userdanger'>The presence of a brandished holy artifact weakens your armor!</span>")
|
||||
amount *= 4 //if a wielded null rod is nearby, it takes four times the health damage
|
||||
break
|
||||
. = ..()
|
||||
@@ -237,7 +237,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/attack_animal(mob/living/simple_animal/M)
|
||||
if(istype(M, /mob/living/simple_animal/hostile/clockwork/marauder) || !blockOrCounter(M, M))
|
||||
if(istype(M, /mob/living/simple_animal/hostile/clockwork/marauder) || !blockOrCounter(M, M)) //we don't want infinite blockcounter loops if fighting another marauder
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/attack_paw(mob/living/carbon/monkey/M)
|
||||
@@ -278,7 +278,7 @@
|
||||
counterchance = initial(counterchance)
|
||||
var/previousattacktext = attacktext
|
||||
attacktext = "counters"
|
||||
target.attack_animal(src)
|
||||
UnarmedAttack(target)
|
||||
attacktext = previousattacktext
|
||||
else
|
||||
counterchance = min(counterchance + initial(counterchance), 100)
|
||||
@@ -299,19 +299,19 @@
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/proc/marauder_comms(message)
|
||||
var/name_part = "<span class='sevtug'>[src] ([true_name])</span>"
|
||||
message = "<span class='sevtug_small'>\"[message]\"</span>" //Processed output
|
||||
src << "[name_part]<span class='sevtug_small'>:</span> [message]"
|
||||
host << "[name_part]<span class='sevtug_small'>:</span> [message]"
|
||||
to_chat(src, "[name_part]<span class='sevtug_small'>:</span> [message]")
|
||||
to_chat(host, "[name_part]<span class='sevtug_small'>:</span> [message]")
|
||||
for(var/M in mob_list)
|
||||
if(isobserver(M))
|
||||
var/link = FOLLOW_LINK(M, src)
|
||||
M << "[link] [name_part] <span class='sevtug_small'>(to</span> <span class='sevtug'>[findtextEx(host.name, host.real_name) ? "[host.name]" : "[host.real_name] (as [host.name])"]</span><span class='sevtug_small'>):</span> [message] "
|
||||
to_chat(M, "[link] [name_part] <span class='sevtug_small'>(to</span> <span class='sevtug'>[findtextEx(host.name, host.real_name) ? "[host.name]" : "[host.real_name] (as [host.name])"]</span><span class='sevtug_small'>):</span> [message] ")
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/proc/return_to_host()
|
||||
if(is_in_host())
|
||||
return FALSE
|
||||
if(!host)
|
||||
src << "<span class='warning'>You don't have a host!</span>"
|
||||
to_chat(src, "<span class='warning'>You don't have a host!</span>")
|
||||
return FALSE
|
||||
var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5)
|
||||
if(iscarbon(host))
|
||||
@@ -321,20 +321,20 @@
|
||||
forceMove(host)
|
||||
if(resulthealth > MARAUDER_EMERGE_THRESHOLD && health != maxHealth)
|
||||
recovering = TRUE
|
||||
src << "<span class='userdanger'>You have weakened and will need to recover before manifesting again!</span>"
|
||||
host << "<span class='sevtug'>[true_name] has weakened and will need to recover before manifesting again!</span>"
|
||||
to_chat(src, "<span class='userdanger'>You have weakened and will need to recover before manifesting again!</span>")
|
||||
to_chat(host, "<span class='sevtug'>[true_name] has weakened and will need to recover before manifesting again!</span>")
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/proc/try_emerge()
|
||||
if(!host)
|
||||
src << "<span class='warning'>You don't have a host!</span>"
|
||||
to_chat(src, "<span class='warning'>You don't have a host!</span>")
|
||||
return FALSE
|
||||
if(!ratvar_awakens)
|
||||
var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5)
|
||||
if(iscarbon(host))
|
||||
resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)
|
||||
if(host.stat != DEAD && resulthealth > MARAUDER_EMERGE_THRESHOLD) //if above 20 health, fails
|
||||
src << "<span class='warning'>Your host must be at [MARAUDER_EMERGE_THRESHOLD]% or less health to emerge like this!</span>"
|
||||
to_chat(src, "<span class='warning'>Your host must be at [MARAUDER_EMERGE_THRESHOLD]% or less health to emerge like this!</span>")
|
||||
return FALSE
|
||||
return emerge_from_host(FALSE)
|
||||
|
||||
@@ -343,16 +343,16 @@
|
||||
return FALSE
|
||||
if(!force && recovering)
|
||||
if(hostchosen)
|
||||
host << "<span class='sevtug'>[true_name] is too weak to come forth!</span>"
|
||||
to_chat(host, "<span class='sevtug'>[true_name] is too weak to come forth!</span>")
|
||||
else
|
||||
host << "<span class='sevtug'>[true_name] tries to emerge to protect you, but it's too weak!</span>"
|
||||
src << "<span class='userdanger'>You try to come forth, but you're too weak!</span>"
|
||||
to_chat(host, "<span class='sevtug'>[true_name] tries to emerge to protect you, but it's too weak!</span>")
|
||||
to_chat(src, "<span class='userdanger'>You try to come forth, but you're too weak!</span>")
|
||||
return FALSE
|
||||
if(!force)
|
||||
if(hostchosen) //marauder approved
|
||||
host << "<span class='sevtug'>Your words echo with power as [true_name] emerges from your body!</span>"
|
||||
to_chat(host, "<span class='sevtug'>Your words echo with power as [true_name] emerges from your body!</span>")
|
||||
else
|
||||
host << "<span class='sevtug'>[true_name] emerges from your body to protect you!</span>"
|
||||
to_chat(host, "<span class='sevtug'>[true_name] emerges from your body to protect you!</span>")
|
||||
forceMove(host.loc)
|
||||
visible_message("<span class='warning'>[host]'s skin glows red as [name] emerges from their body!</span>", "<span class='sevtug_small'>You exit the safety of [host]'s body!</span>")
|
||||
return TRUE
|
||||
@@ -415,14 +415,14 @@
|
||||
if(!owner || !message)
|
||||
return FALSE
|
||||
if(!linked_marauder)
|
||||
owner << "<span class='warning'>Your marauder seems to have been destroyed!</span>"
|
||||
to_chat(owner, "<span class='warning'>Your marauder seems to have been destroyed!</span>")
|
||||
return FALSE
|
||||
var/name_part = "<span class='sevtug'>Servant [findtextEx(owner.name, owner.real_name) ? "[owner.name]" : "[owner.real_name] (as [owner.name])"]</span>"
|
||||
message = "<span class='sevtug_small'>\"[message]\"</span>" //Processed output
|
||||
owner << "[name_part]<span class='sevtug_small'>:</span> [message]"
|
||||
linked_marauder << "[name_part]<span class='sevtug_small'>:</span> [message]"
|
||||
to_chat(owner, "[name_part]<span class='sevtug_small'>:</span> [message]")
|
||||
to_chat(linked_marauder, "[name_part]<span class='sevtug_small'>:</span> [message]")
|
||||
for(var/M in mob_list)
|
||||
if(isobserver(M))
|
||||
var/link = FOLLOW_LINK(M, src)
|
||||
M << "[link] [name_part] <span class='sevtug_small'>(to</span> <span class='sevtug'>[linked_marauder] ([linked_marauder.true_name])</span><span class='sevtug_small'>):</span> [message]"
|
||||
to_chat(M, "[link] [name_part] <span class='sevtug_small'>(to</span> <span class='sevtug'>[linked_marauder] ([linked_marauder.true_name])</span><span class='sevtug_small'>):</span> [message]")
|
||||
return TRUE
|
||||
|
||||
@@ -55,7 +55,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
var/successful = FALSE
|
||||
if(can_recite() && has_requirements())
|
||||
if(slab.busy)
|
||||
invoker << "<span class='warning'>[slab] refuses to work, displaying the message: \"[slab.busy]!\"</span>"
|
||||
to_chat(invoker, "<span class='warning'>[slab] refuses to work, displaying the message: \"[slab.busy]!\"</span>")
|
||||
return FALSE
|
||||
slab.busy = "Invocation ([name]) in progress"
|
||||
if(ratvar_awakens)
|
||||
@@ -96,7 +96,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
if(!invoker || !slab || invoker.get_active_held_item() != slab)
|
||||
return FALSE
|
||||
if(!invoker.can_speak_vocal())
|
||||
invoker << "<span class='warning'>You are unable to speak the words of the scripture!</span>"
|
||||
to_chat(invoker, "<span class='warning'>You are unable to speak the words of the scripture!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -115,7 +115,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
failed = TRUE
|
||||
if(failed)
|
||||
component_printout += "</span>"
|
||||
invoker << component_printout
|
||||
to_chat(invoker, component_printout)
|
||||
return FALSE
|
||||
if(multiple_invokers_used && !multiple_invokers_optional && !ratvar_awakens && !slab.no_cost)
|
||||
var/nearby_servants = 0
|
||||
@@ -123,7 +123,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
if(is_servant_of_ratvar(L) && L.stat == CONSCIOUS && L.can_speak_vocal())
|
||||
nearby_servants++
|
||||
if(nearby_servants < invokers_required)
|
||||
invoker << "<span class='warning'>There aren't enough non-mute servants nearby ([nearby_servants]/[invokers_required])!</span>"
|
||||
to_chat(invoker, "<span class='warning'>There aren't enough non-mute servants nearby ([nearby_servants]/[invokers_required])!</span>")
|
||||
return FALSE
|
||||
if(!check_special_requirements())
|
||||
return FALSE
|
||||
@@ -149,7 +149,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
if(message)
|
||||
if(prob(ratvarian_prob))
|
||||
message = text2ratvar(message)
|
||||
invoker << "<span class='[get_component_span(primary_component)]_large'>\"[message]\"</span>"
|
||||
to_chat(invoker, "<span class='[get_component_span(primary_component)]_large'>\"[message]\"</span>")
|
||||
invoker << 'sound/magic/clockwork/invoke_general.ogg'
|
||||
return TRUE
|
||||
|
||||
@@ -176,7 +176,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
else
|
||||
for(var/invocation in invocations)
|
||||
clockwork_say(invoker, text2ratvar(invocation), whispered)
|
||||
invoker << "<span class='brass'>You [channel_time <= 0 ? "recite" : "begin reciting"] a piece of scripture entitled \"[name]\".</span>"
|
||||
to_chat(invoker, "<span class='brass'>You [channel_time <= 0 ? "recite" : "begin reciting"] a piece of scripture entitled \"[name]\".</span>")
|
||||
if(!channel_time)
|
||||
return TRUE
|
||||
for(var/invocation in invocations)
|
||||
@@ -219,7 +219,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
/datum/clockwork_scripture/channeled/proc/chant_effects(chant_number) //The chant's periodic effects
|
||||
|
||||
/datum/clockwork_scripture/channeled/proc/chant_end_effects() //The chant's effect upon ending
|
||||
invoker << "<span class='brass'>You cease your chant.</span>"
|
||||
to_chat(invoker, "<span class='brass'>You cease your chant.</span>")
|
||||
|
||||
|
||||
//Creates an object at the invoker's feet
|
||||
@@ -239,10 +239,10 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
/datum/clockwork_scripture/create_object/check_special_requirements()
|
||||
var/turf/T = get_turf(invoker)
|
||||
if(!space_allowed && isspaceturf(T))
|
||||
invoker << "<span class='warning'>You need solid ground to place this object!</span>"
|
||||
to_chat(invoker, "<span class='warning'>You need solid ground to place this object!</span>")
|
||||
return FALSE
|
||||
if(one_per_tile && (locate(prevent_path) in T))
|
||||
invoker << "<span class='warning'>You can only place one of this object on each tile!</span>"
|
||||
to_chat(invoker, "<span class='warning'>You can only place one of this object on each tile!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -250,7 +250,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
if(creator_message && observer_message)
|
||||
invoker.visible_message(observer_message, creator_message)
|
||||
else if(creator_message)
|
||||
invoker << creator_message
|
||||
to_chat(invoker, creator_message)
|
||||
var/obj/O = new object_path (get_turf(invoker))
|
||||
O.ratvar_act() //update the new object so it gets buffed if ratvar is alive
|
||||
if(istype(O, /obj/item))
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
/datum/clockwork_scripture/memory_allocation/check_special_requirements()
|
||||
for(var/mob/living/simple_animal/hostile/clockwork/marauder/M in all_clockwork_mobs)
|
||||
if(M.host == invoker)
|
||||
invoker << "<span class='warning'>You can only house one marauder at a time!</span>"
|
||||
to_chat(invoker, "<span class='warning'>You can only house one marauder at a time!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
slab.busy = "Marauder Selection in progress"
|
||||
if(!check_special_requirements())
|
||||
return FALSE
|
||||
invoker << "<span class='warning'>The tendril shivers slightly as it selects a marauder...</span>"
|
||||
to_chat(invoker, "<span class='warning'>The tendril shivers slightly as it selects a marauder...</span>")
|
||||
var/list/marauder_candidates = pollCandidates("Do you want to play as the clockwork marauder of [invoker.real_name]?", ROLE_SERVANT_OF_RATVAR, null, FALSE, 50)
|
||||
if(!check_special_requirements())
|
||||
return FALSE
|
||||
@@ -214,7 +214,7 @@
|
||||
quickbind_desc = "Creates an Interdiction Lens, which drains power into nearby Sigils of Transmission."
|
||||
|
||||
|
||||
//Mending Motor: Creates a prism that will quickly heal mechanical servants/clockwork structures and consume power or replicant alloy.
|
||||
//Mending Motor: Creates a prism that will quickly heal mechanical servants/clockwork structures at a power cost
|
||||
/datum/clockwork_scripture/create_object/mending_motor
|
||||
descname = "Powered Structure, Repairs Other Structures"
|
||||
name = "Mending Motor"
|
||||
@@ -285,10 +285,10 @@
|
||||
if(is_servant_of_ratvar(L))
|
||||
servants++
|
||||
if(servants * 0.2 < clockwork_daemons)
|
||||
invoker << "<span class='nezbere'>\"Daemons are already disabled, making more of them would be a waste.\"</span>"
|
||||
to_chat(invoker, "<span class='nezbere'>\"Daemons are already disabled, making more of them would be a waste.\"</span>")
|
||||
return FALSE
|
||||
if(servants * 0.2 < clockwork_daemons+1)
|
||||
invoker << "<span class='nezbere'>\"This daemon would be useless, friend.\"</span>"
|
||||
to_chat(invoker, "<span class='nezbere'>\"This daemon would be useless, friend.\"</span>")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
/datum/clockwork_scripture/ranged_ability/linked_vanguard/check_special_requirements()
|
||||
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>"
|
||||
to_chat(invoker, "<span class='warning'>You are already shielded by a Vanguard!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -28,9 +28,9 @@
|
||||
C.apply_damage(noncultist_damage * 0.5, BURN, "r_leg")
|
||||
if(C.m_intent != MOVE_INTENT_WALK)
|
||||
if(!iscultist(C))
|
||||
C << "<span class='warning'>Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!</span>"
|
||||
to_chat(C, "<span class='warning'>Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!</span>")
|
||||
else //Cultists take extra burn damage
|
||||
C << "<span class='warning'>Your leg[number_legs > 1 ? "s burn":" burns"] with pain!</span>"
|
||||
to_chat(C, "<span class='warning'>Your leg[number_legs > 1 ? "s burn":" burns"] with pain!</span>")
|
||||
C.apply_damage(cultist_damage * 0.5, BURN, "l_leg")
|
||||
C.apply_damage(cultist_damage * 0.5, BURN, "r_leg")
|
||||
C.toggle_move_intent()
|
||||
@@ -75,7 +75,7 @@
|
||||
|
||||
/datum/clockwork_scripture/vanguard/check_special_requirements()
|
||||
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>"
|
||||
to_chat(invoker, "<span class='warning'>You are already shielded by a Vanguard!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -32,21 +32,21 @@
|
||||
/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>"
|
||||
to_chat(invoker, "<span class='big_brass'>\"I am already here, idiot.\"</span>")
|
||||
return FALSE
|
||||
for(var/obj/structure/destructible/clockwork/massive/celestial_gateway/G in all_clockwork_objects)
|
||||
var/area/gate_area = get_area(G)
|
||||
invoker << "<span class='userdanger'>There is already a gateway at [gate_area.map_name]!</span>"
|
||||
to_chat(invoker, "<span class='userdanger'>There is already a gateway at [gate_area.map_name]!</span>")
|
||||
return FALSE
|
||||
var/area/A = get_area(invoker)
|
||||
var/turf/T = get_turf(invoker)
|
||||
if(!T || T.z != ZLEVEL_STATION || istype(A, /area/shuttle) || !A.blob_allowed)
|
||||
invoker << "<span class='warning'>You must be on the station to activate the Ark!</span>"
|
||||
to_chat(invoker, "<span class='warning'>You must be on the station to activate the Ark!</span>")
|
||||
return FALSE
|
||||
if(clockwork_gateway_activated)
|
||||
if(ticker && ticker.mode && ticker.mode.clockwork_objective != CLOCKCULT_GATEWAY)
|
||||
invoker << "<span class='nezbere'>\"Look upon his works. Is it not glorious?\"</span>"
|
||||
to_chat(invoker, "<span class='nezbere'>\"Look upon his works. Is it not glorious?\"</span>")
|
||||
else
|
||||
invoker << "<span class='warning'>Ratvar's recent banishment renders him too weak to be wrung forth from Reebe!</span>"
|
||||
to_chat(invoker, "<span class='warning'>Ratvar's recent banishment renders him too weak to be wrung forth from Reebe!</span>")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
|
||||
/datum/clockwork_scripture/invoke_inathneq/check_special_requirements()
|
||||
if(!slab.no_cost && clockwork_generals_invoked["inath-neq"] > world.time)
|
||||
invoker << "<span class='inathneq'>\"[text2ratvar("I cannot lend you my aid yet, champion. Please be careful.")]\"</span>\n\
|
||||
<span class='warning'>Inath-neq has already been invoked recently! You must wait several minutes before calling upon the Resonant Cogwheel.</span>"
|
||||
to_chat(invoker, "<span class='inathneq'>\"[text2ratvar("I cannot lend you my aid yet, champion. Please be careful.")]\"</span>\n\
|
||||
<span class='warning'>Inath-neq has already been invoked recently! You must wait several minutes before calling upon the Resonant Cogwheel.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -57,12 +57,12 @@
|
||||
|
||||
/datum/clockwork_scripture/invoke_sevtug/check_special_requirements()
|
||||
if(!slab.no_cost && clockwork_generals_invoked["sevtug"] > world.time)
|
||||
invoker << "<span class='sevtug'>\"[text2ratvar("Is it really so hard - even for a simpleton like you - to grasp the concept of waiting?")]\"</span>\n\
|
||||
<span class='warning'>Sevtug has already been invoked recently! You must wait several minutes before calling upon the Formless Pariah.</span>"
|
||||
to_chat(invoker, "<span class='sevtug'>\"[text2ratvar("Is it really so hard - even for a simpleton like you - to grasp the concept of waiting?")]\"</span>\n\
|
||||
<span class='warning'>Sevtug has already been invoked recently! You must wait several minutes before calling upon the Formless Pariah.</span>")
|
||||
return FALSE
|
||||
if(!slab.no_cost && ratvar_awakens)
|
||||
invoker << "<span class='sevtug'>\"[text2ratvar("Do you really think anything I can do right now will compare to Engine's power?")]\"</span>\n\
|
||||
<span class='warning'>Sevtug will not grant his power while Ratvar's dwarfs his own!</span>"
|
||||
to_chat(invoker, "<span class='sevtug'>\"[text2ratvar("Do you really think anything I can do right now will compare to Engine's power?")]\"</span>\n\
|
||||
<span class='warning'>Sevtug will not grant his power while Ratvar's dwarfs his own!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -81,16 +81,16 @@
|
||||
var/minordistance = max(200 - distance*2, 5)
|
||||
var/majordistance = max(150 - distance*3, 5)
|
||||
if(H.null_rod_check())
|
||||
H << "<span class='sevtug'>[text2ratvar("Oh, a void weapon. How annoying, I may as well not bother.")]</span>\n\
|
||||
<span class='warning'>Your holy weapon glows a faint orange, defending your mind!</span>"
|
||||
to_chat(H, "<span class='sevtug'>[text2ratvar("Oh, a void weapon. How annoying, I may as well not bother.")]</span>\n\
|
||||
<span class='warning'>Your holy weapon glows a faint orange, defending your mind!</span>")
|
||||
continue
|
||||
else if(H.isloyal())
|
||||
visualsdistance = round(visualsdistance * 0.5) //half effect for shielded targets
|
||||
minordistance = round(minordistance * 0.5)
|
||||
majordistance = round(majordistance * 0.5)
|
||||
H << "<span class='sevtug'>[text2ratvar("Oh, look, a mindshield. Cute, I suppose I'll humor it.")]</span>"
|
||||
to_chat(H, "<span class='sevtug'>[text2ratvar("Oh, look, a mindshield. Cute, I suppose I'll humor it.")]</span>")
|
||||
else if(prob(visualsdistance))
|
||||
H << "<span class='sevtug'>[text2ratvar(pick(mindbreaksayings))]</span>"
|
||||
to_chat(H, "<span class='sevtug'>[text2ratvar(pick(mindbreaksayings))]</span>")
|
||||
H.playsound_local(T, hum, visualsdistance, 1)
|
||||
flash_color(H, flash_color="#AF0AAF", flash_time=visualsdistance*10)
|
||||
H.dizziness = minordistance + H.dizziness
|
||||
@@ -119,12 +119,12 @@
|
||||
|
||||
/datum/clockwork_scripture/invoke_nezbere/check_special_requirements()
|
||||
if(!slab.no_cost && clockwork_generals_invoked["nezbere"] > world.time)
|
||||
invoker << "<span class='nezbere'>\"[text2ratvar("Not just yet, friend. Patience is a virtue.")]\"</span>\n\
|
||||
<span class='warning'>Nezbere has already been invoked recently! You must wait several minutes before calling upon the Brass Eidolon.</span>"
|
||||
to_chat(invoker, "<span class='nezbere'>\"[text2ratvar("Not just yet, friend. Patience is a virtue.")]\"</span>\n\
|
||||
<span class='warning'>Nezbere has already been invoked recently! You must wait several minutes before calling upon the Brass Eidolon.</span>")
|
||||
return FALSE
|
||||
if(!slab.no_cost && ratvar_awakens)
|
||||
invoker << "<span class='nezbere'>\"[text2ratvar("Our master is here already. You do not require my help, friend.")]\"</span>\n\
|
||||
<span class='warning'>There is no need for Nezbere's assistance while Ratvar is risen!</span>"
|
||||
to_chat(invoker, "<span class='nezbere'>\"[text2ratvar("Our master is here already. You do not require my help, friend.")]\"</span>\n\
|
||||
<span class='warning'>There is no need for Nezbere's assistance while Ratvar is risen!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -159,8 +159,8 @@
|
||||
|
||||
/datum/clockwork_scripture/invoke_nzcrentr/check_special_requirements()
|
||||
if(!slab.no_cost && clockwork_generals_invoked["nzcrentr"] > world.time)
|
||||
invoker << "<span class='nzcrentr'>\"[text2ratvar("The boss says you have to wait. Hey, do you think he would mind if I killed you? ...He would? Ok.")]\"</span>\n\
|
||||
<span class='warning'>Nzcrentr has already been invoked recently! You must wait several minutes before calling upon the Eternal Thunderbolt.</span>"
|
||||
to_chat(invoker, "<span class='nzcrentr'>\"[text2ratvar("The boss says you have to wait. Hey, do you think he would mind if I killed you? ...He would? Ok.")]\"</span>\n\
|
||||
<span class='warning'>Nzcrentr has already been invoked recently! You must wait several minutes before calling upon the Eternal Thunderbolt.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
/datum/clockwork_scripture/create_object/ocular_warden/check_special_requirements()
|
||||
for(var/obj/structure/destructible/clockwork/ocular_warden/W in range(OCULAR_WARDEN_EXCLUSION_RANGE, invoker))
|
||||
invoker << "<span class='neovgre'>You sense another ocular warden too near this location. Placing another this close would cause them to fight.</span>" //fluff message
|
||||
to_chat(invoker, "<span class='neovgre'>You sense another ocular warden too near this location. Placing another this close would cause them to fight.</span>" )
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -146,7 +146,7 @@
|
||||
|
||||
/datum/clockwork_scripture/function_call/check_special_requirements()
|
||||
for(var/datum/action/innate/function_call/F in invoker.actions)
|
||||
invoker << "<span class='warning'>You have already bound a Ratvarian spear to yourself!</span>"
|
||||
to_chat(invoker, "<span class='warning'>You have already bound a Ratvarian spear to yourself!</span>")
|
||||
return FALSE
|
||||
return invoker.can_hold_items()
|
||||
|
||||
@@ -175,13 +175,13 @@
|
||||
|
||||
/datum/action/innate/function_call/Activate()
|
||||
if(!owner.get_empty_held_indexes())
|
||||
usr << "<span class='warning'>You need an empty hand to call forth your spear!</span>"
|
||||
to_chat(usr, "<span class='warning'>You need an empty hand to call forth your spear!</span>")
|
||||
return FALSE
|
||||
owner.visible_message("<span class='warning'>A strange spear materializes in [owner]'s hands!</span>", "<span class='brass'>You call forth your spear!</span>")
|
||||
var/obj/item/clockwork/ratvarian_spear/R = new(get_turf(usr))
|
||||
owner.put_in_hands(R)
|
||||
if(!ratvar_awakens)
|
||||
owner << "<span class='warning'>Your spear begins to break down in this plane of existence. You can't use it for long!</span>"
|
||||
to_chat(owner, "<span class='warning'>Your spear begins to break down in this plane of existence. You can't use it for long!</span>")
|
||||
cooldown = base_cooldown + world.time
|
||||
owner.update_action_buttons_icon()
|
||||
addtimer(CALLBACK(src, .proc/update_actions), base_cooldown)
|
||||
@@ -212,7 +212,7 @@
|
||||
|
||||
/datum/clockwork_scripture/spatial_gateway/check_special_requirements()
|
||||
if(!isturf(invoker.loc))
|
||||
invoker << "<span class='warning'>You must not be inside an object to use this scripture!</span>"
|
||||
to_chat(invoker, "<span class='warning'>You must not be inside an object to use this scripture!</span>")
|
||||
return FALSE
|
||||
var/other_servants = 0
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
@@ -221,7 +221,7 @@
|
||||
for(var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/O in all_clockwork_objects)
|
||||
other_servants++
|
||||
if(!other_servants)
|
||||
invoker << "<span class='warning'>There are no other servants or clockwork obelisks!</span>"
|
||||
to_chat(invoker, "<span class='warning'>There are no other servants or clockwork obelisks!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -284,7 +284,7 @@
|
||||
invoker.visible_message("<span class='warning'>[invoker] is struck by [invoker.p_their()] own [VH.name]!</span>", "<span class='userdanger'>You're struck by your own [VH.name]!</span>")
|
||||
invoker.adjustFireLoss(VH.damage) //you have to fail all five blasts to die to this
|
||||
playsound(invoker, 'sound/machines/defib_zap.ogg', VH.damage, 1, -1)
|
||||
invoker << "<span class='nzcrentr'>\"[text2ratvar(pick(nzcrentr_insults))]\"</span>"
|
||||
to_chat(invoker, "<span class='nzcrentr'>\"[text2ratvar(pick(nzcrentr_insults))]\"</span>")
|
||||
else
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
..()
|
||||
desc = initial(desc)
|
||||
if(unanchored_icon)
|
||||
user << "<span class='notice'>[src] is [anchored ? "":"not "]secured to the floor.</span>"
|
||||
to_chat(user, "<span class='notice'>[src] is [anchored ? "":"not "]secured to the floor.</span>")
|
||||
|
||||
/obj/structure/destructible/clockwork/examine_status(mob/user)
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
@@ -90,7 +90,7 @@
|
||||
/obj/structure/destructible/clockwork/can_be_unfasten_wrench(mob/user, silent)
|
||||
if(anchored && obj_integrity <= round(max_integrity * 0.25, 1))
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] is too damaged to unsecure!</span>")
|
||||
return FAILED_UNFASTEN
|
||||
return ..()
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
if(do_damage)
|
||||
playsound(src, break_sound, 10 * get_efficiency_mod(TRUE), 1)
|
||||
take_damage(round(max_integrity * 0.25, 1), BRUTE)
|
||||
user << "<span class='warning'>As you unsecure [src] from the floor, you see cracks appear in its surface!</span>"
|
||||
to_chat(user, "<span class='warning'>As you unsecure [src] from the floor, you see cracks appear in its surface!</span>")
|
||||
|
||||
/obj/structure/destructible/clockwork/emp_act(severity)
|
||||
if(anchored && unanchored_icon)
|
||||
@@ -167,8 +167,8 @@
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
var/powered = total_accessable_power()
|
||||
var/sigil_number = LAZYLEN(check_apc_and_sigils())
|
||||
user << "<span class='[powered ? "brass":"alloy"]'>It has access to <b>[powered == INFINITY ? "INFINITY":"[powered]"]W</b> of power, \
|
||||
and <b>[sigil_number]</b> Sigil[sigil_number == 1 ? "":"s"] of Transmission [sigil_number == 1 ? "is":"are"] in range.</span>"
|
||||
to_chat(user, "<span class='[powered ? "brass":"alloy"]'>It has access to <b>[powered == INFINITY ? "INFINITY":"[powered]"]W</b> of power, \
|
||||
and <b>[sigil_number]</b> Sigil[sigil_number == 1 ? "":"s"] of Transmission [sigil_number == 1 ? "is":"are"] in range.</span>")
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/Destroy()
|
||||
SSfastprocess.processing -= src
|
||||
@@ -189,7 +189,7 @@
|
||||
/obj/structure/destructible/clockwork/powered/can_be_unfasten_wrench(mob/user, silent)
|
||||
if(active)
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[src] needs to be disabled before it can be unsecured!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] needs to be disabled before it can be unsecured!</span>")
|
||||
return FAILED_UNFASTEN
|
||||
return ..()
|
||||
|
||||
@@ -198,7 +198,7 @@
|
||||
if(!is_servant_of_ratvar(user))
|
||||
return FALSE
|
||||
if(!anchored && !active)
|
||||
user << "<span class='warning'>[src] needs to be secured to the floor before it can be activated!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] needs to be secured to the floor before it can be activated!</span>")
|
||||
return FALSE
|
||||
visible_message("<span class='notice'>[user] [active ? "dis" : "en"]ables [src].</span>", "<span class='brass'>You [active ? "dis" : "en"]able [src].</span>")
|
||||
active = !active
|
||||
|
||||
@@ -128,11 +128,11 @@
|
||||
var/obj/item/clockwork/component/C = I
|
||||
if(required_components[C.component_id])
|
||||
required_components[C.component_id]--
|
||||
user << "<span class='notice'>You add [C] to [src].</span>"
|
||||
to_chat(user, "<span class='notice'>You add [C] to [src].</span>")
|
||||
user.drop_item()
|
||||
qdel(C)
|
||||
else
|
||||
user << "<span class='notice'>[src] has enough [get_component_name(C.component_id)][C.component_id != REPLICANT_ALLOY ? "s":""].</span>"
|
||||
to_chat(user, "<span class='notice'>[src] has enough [get_component_name(C.component_id)][C.component_id != REPLICANT_ALLOY ? "s":""].</span>")
|
||||
return 1
|
||||
else if(istype(I, /obj/item/clockwork/slab))
|
||||
var/obj/item/clockwork/slab/S = I
|
||||
@@ -173,34 +173,34 @@
|
||||
icon_state = initial(icon_state)
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
if(still_needs_components())
|
||||
user << "<span class='big'><b>Components required until activation:</b></span>"
|
||||
to_chat(user, "<span class='big'><b>Components required until activation:</b></span>")
|
||||
for(var/i in required_components)
|
||||
if(required_components[i])
|
||||
user << "<span class='[get_component_span(i)]'>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</span> \
|
||||
<span class='[get_component_span(i)]_large'>[required_components[i]]</span>"
|
||||
to_chat(user, "<span class='[get_component_span(i)]'>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</span> \
|
||||
<span class='[get_component_span(i)]_large'>[required_components[i]]</span>")
|
||||
else
|
||||
user << "<span class='big'><b>Seconds until [ratvar_portal ? "Ratvar's arrival":"Proselytization"]:</b> [get_arrival_text(TRUE)]</span>"
|
||||
to_chat(user, "<span class='big'><b>Seconds until [ratvar_portal ? "Ratvar's arrival":"Proselytization"]:</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>"
|
||||
to_chat(user, "<span class='heavy_brass'>It's still opening.</span>")
|
||||
if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
|
||||
user << "<span class='heavy_brass'>It's reached the Celestial Derelict and is drawing power from it.</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>It's reached the Celestial Derelict and is drawing power from it.</span>")
|
||||
if(GATEWAY_RATVAR_COMING to INFINITY)
|
||||
user << "<span class='heavy_brass'>[ratvar_portal ? "Ratvar is coming through the gateway":"The gateway is glowing with massed power"]!</span>"
|
||||
to_chat(user, "<span class='heavy_brass'>[ratvar_portal ? "Ratvar is coming through the gateway":"The gateway is glowing with massed power"]!</span>")
|
||||
else
|
||||
switch(progress_in_seconds)
|
||||
if(-INFINITY to GATEWAY_REEBE_FOUND)
|
||||
user << "<span class='warning'>It's a swirling mass of blackness.</span>"
|
||||
to_chat(user, "<span class='warning'>It's a swirling mass of blackness.</span>")
|
||||
if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
|
||||
user << "<span class='warning'>It seems to be leading somewhere.</span>"
|
||||
to_chat(user, "<span class='warning'>It seems to be leading somewhere.</span>")
|
||||
if(GATEWAY_RATVAR_COMING to INFINITY)
|
||||
user << "<span class='boldwarning'>[ratvar_portal ? "Something is coming through":"It's glowing brightly"]!</span>"
|
||||
to_chat(user, "<span class='boldwarning'>[ratvar_portal ? "Something is coming through":"It's glowing brightly"]!</span>")
|
||||
|
||||
/obj/structure/destructible/clockwork/massive/celestial_gateway/process()
|
||||
if(!first_sound_played || prob(7))
|
||||
for(var/M in player_list)
|
||||
if(M && !isnewplayer(M))
|
||||
M << "<span class='warning'><b>You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]...</span>"
|
||||
to_chat(M, "<span class='warning'><b>You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]...</span>")
|
||||
if(!obj_integrity)
|
||||
return 0
|
||||
var/convert_dist = 1 + (round(Floor(progress_in_seconds, 15) * 0.067))
|
||||
@@ -315,3 +315,10 @@
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
layer = BELOW_OPEN_DOOR_LAYER
|
||||
light_range = 2
|
||||
light_power = 4
|
||||
light_color = "#6A4D2F"
|
||||
|
||||
/obj/effect/clockwork/overlay/gateway_glow/New()
|
||||
..()
|
||||
update_light()
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
return 0
|
||||
var/obj/item/device/mmi/posibrain/soul_vessel/S = I
|
||||
if(!S.brainmob)
|
||||
user << "<span class='warning'>[S] is inactive! Turn it on or capture a mind first.</span>"
|
||||
to_chat(user, "<span class='warning'>[S] is inactive! Turn it on or capture a mind first.</span>")
|
||||
return 0
|
||||
if(S.brainmob && (!S.brainmob.client || !S.brainmob.mind))
|
||||
user << "<span class='warning'>[S]'s trapped consciousness appears inactive!</span>"
|
||||
to_chat(user, "<span class='warning'>[S]'s trapped consciousness appears inactive!</span>")
|
||||
return 0
|
||||
user.visible_message("<span class='notice'>[user] places [S] in [src], where it fuses to the shell.</span>", "<span class='brass'>You place [S] in [src], fusing it to the shell.</span>")
|
||||
var/mob/living/simple_animal/A = new mobtype(get_turf(src))
|
||||
|
||||
@@ -24,12 +24,12 @@
|
||||
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/examine(mob/user)
|
||||
..()
|
||||
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>"
|
||||
to_chat(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, silent)
|
||||
if(active)
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[src] is currently sustaining a gateway!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] is currently sustaining a gateway!</span>")
|
||||
return FAILED_UNFASTEN
|
||||
return ..()
|
||||
|
||||
@@ -44,40 +44,40 @@
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/attack_hand(mob/living/user)
|
||||
if(!is_servant_of_ratvar(user) || total_accessable_power() < hierophant_cost || !anchored)
|
||||
user << "<span class='warning'>You place your hand on the obelisk, but it doesn't react.</span>"
|
||||
to_chat(user, "<span class='warning'>You place your hand on the obelisk, but it doesn't react.</span>")
|
||||
return
|
||||
var/choice = alert(user,"You place your hand on the obelisk...",,"Hierophant Broadcast","Spatial Gateway","Cancel")
|
||||
switch(choice)
|
||||
if("Hierophant Broadcast")
|
||||
if(active)
|
||||
user << "<span class='warning'>The obelisk is sustaining a gateway and cannot broadcast!</span>"
|
||||
to_chat(user, "<span class='warning'>The obelisk is sustaining a gateway and cannot broadcast!</span>")
|
||||
return
|
||||
if(!user.can_speak_vocal())
|
||||
user << "<span class='warning'>You cannot speak through the obelisk!</span>"
|
||||
to_chat(user, "<span class='warning'>You cannot speak through the obelisk!</span>")
|
||||
return
|
||||
var/input = stripped_input(usr, "Please choose a message to send over the Hierophant Network.", "Hierophant Broadcast", "")
|
||||
if(!is_servant_of_ratvar(user) || !input || !user.canUseTopic(src, !issilicon(user)))
|
||||
return
|
||||
if(active)
|
||||
user << "<span class='warning'>The obelisk is sustaining a gateway and cannot broadcast!</span>"
|
||||
to_chat(user, "<span class='warning'>The obelisk is sustaining a gateway and cannot broadcast!</span>")
|
||||
return
|
||||
if(!try_use_power(hierophant_cost))
|
||||
user << "<span class='warning'>The obelisk lacks the power to broadcast!</span>"
|
||||
to_chat(user, "<span class='warning'>The obelisk lacks the power to broadcast!</span>")
|
||||
return
|
||||
if(!user.can_speak_vocal())
|
||||
user << "<span class='warning'>You cannot speak through the obelisk!</span>"
|
||||
to_chat(user, "<span class='warning'>You cannot speak through the obelisk!</span>")
|
||||
return
|
||||
clockwork_say(user, text2ratvar("Hierophant Broadcast, activate! [html_decode(input)]"))
|
||||
titled_hierophant_message(user, input, "big_brass", "large_brass")
|
||||
if("Spatial Gateway")
|
||||
if(active)
|
||||
user << "<span class='warning'>The obelisk is already sustaining a gateway!</span>"
|
||||
to_chat(user, "<span class='warning'>The obelisk is already sustaining a gateway!</span>")
|
||||
return
|
||||
if(!try_use_power(gateway_cost))
|
||||
user << "<span class='warning'>The obelisk lacks the power to open a gateway!</span>"
|
||||
to_chat(user, "<span class='warning'>The obelisk lacks the power to open a gateway!</span>")
|
||||
return
|
||||
if(!user.can_speak_vocal())
|
||||
user << "<span class='warning'>You need to be able to speak to open a gateway!</span>"
|
||||
to_chat(user, "<span class='warning'>You need to be able to speak to open a gateway!</span>")
|
||||
return
|
||||
if(procure_gateway(user, round(100 * get_efficiency_mod(), 1), round(5 * get_efficiency_mod(), 1), 1) && !active)
|
||||
clockwork_say(user, text2ratvar("Spatial Gateway, activate!"))
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
clockwork_desc = "A binding ring around a target, preventing them from taking action while they're being converted."
|
||||
max_integrity = 25
|
||||
obj_integrity = 25
|
||||
light_color = "#AF0AAF"
|
||||
density = FALSE
|
||||
immune_to_servant_attacks = TRUE
|
||||
icon = 'icons/effects/clockwork_effects.dmi'
|
||||
@@ -19,6 +20,10 @@
|
||||
var/can_resist = FALSE
|
||||
var/mob_layer = MOB_LAYER
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/New()
|
||||
..()
|
||||
set_light(2, 0.5)
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/examine(mob/user)
|
||||
icon_state = "geisbinding_full"
|
||||
..()
|
||||
|
||||
@@ -19,24 +19,28 @@
|
||||
var/interdiction_range = 14 //how large an area it drains and disables in
|
||||
var/static/list/rage_messages = list("...", "Disgusting.", "Die.", "Foul.", "Worthless.", "Mortal.", "Unfit.", "Weak.", "Fragile.", "Useless.", "Leave my sight!")
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/interdiction_lens/New()
|
||||
..()
|
||||
set_light(1.4, 0.8, "#F42B9D")
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/interdiction_lens/examine(mob/user)
|
||||
..()
|
||||
user << "<span class='[recharging > world.time ? "neovgre_small":"brass"]'>Its gemstone [recharging > world.time ? "has been breached by writhing tendrils of blackness that cover the totem" \
|
||||
: "vibrates in place and thrums with power"].</span>"
|
||||
to_chat(user, "<span class='[recharging > world.time ? "neovgre_small":"brass"]'>Its gemstone [recharging > world.time ? "has been breached by writhing tendrils of blackness that cover the totem" \
|
||||
: "vibrates in place and thrums with power"].</span>")
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
user << "<span class='neovgre_small'>If it fails to drain any electronics or has nothing to return power to, it will disable itself for <b>[round(recharge_time/600, 1)]</b> minutes.</span>"
|
||||
to_chat(user, "<span class='neovgre_small'>If it fails to drain any electronics or has nothing to return power to, it will disable itself for <b>[round(recharge_time/600, 1)]</b> minutes.</span>")
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/interdiction_lens/toggle(fast_process, mob/living/user)
|
||||
. = ..()
|
||||
if(active)
|
||||
SetLuminosity(4, 2)
|
||||
set_light(2, 1.6, "#EE54EE")
|
||||
else
|
||||
SetLuminosity(0)
|
||||
set_light(1.4, 0.8, "#F42B9D")
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/interdiction_lens/attack_hand(mob/living/user)
|
||||
if(user.canUseTopic(src, !issilicon(user), NO_DEXTERY))
|
||||
if(disabled)
|
||||
user << "<span class='warning'>As you place your hand on the gemstone, cold tendrils of black matter crawl up your arm. You quickly pull back.</span>"
|
||||
to_chat(user, "<span class='warning'>As you place your hand on the gemstone, cold tendrils of black matter crawl up your arm. You quickly pull back.</span>")
|
||||
return 0
|
||||
toggle(0, user)
|
||||
|
||||
@@ -49,7 +53,7 @@
|
||||
recharging = world.time + recharge_time
|
||||
flick("interdiction_lens_discharged", src)
|
||||
icon_state = "interdiction_lens_inactive"
|
||||
SetLuminosity(2,1)
|
||||
set_light(2, 1.6, "#151200")
|
||||
disabled = TRUE
|
||||
return TRUE
|
||||
|
||||
@@ -92,7 +96,7 @@
|
||||
power_drained += Floor(A.power_drain(TRUE) * efficiency, MIN_CLOCKCULT_POWER)
|
||||
|
||||
if(prob(1 * rage_modifier))
|
||||
A << "<span class='neovgre'>\"[text2ratvar(pick(rage_messages))]\"</span>"
|
||||
to_chat(A, "<span class='neovgre'>\"[text2ratvar(pick(rage_messages))]\"</span>")
|
||||
|
||||
if(prob(100 * (efficiency * efficiency)))
|
||||
if(istype(A, /obj/machinery/camera) && unconverted_ai)
|
||||
|
||||
@@ -8,9 +8,10 @@
|
||||
inactive_icon = "mania_motor_inactive"
|
||||
unanchored_icon = "mania_motor_unwrenched"
|
||||
construction_value = 20
|
||||
break_message = "<span class='warning'>The antenna break off, leaving a pile of shards!</span>"
|
||||
max_integrity = 100
|
||||
obj_integrity = 100
|
||||
break_message = "<span class='warning'>The antenna break off, leaving a pile of shards!</span>"
|
||||
light_color = "#AF0AAF"
|
||||
debris = list(/obj/item/clockwork/alloy_shards/large = 2, \
|
||||
/obj/item/clockwork/alloy_shards/small = 2, \
|
||||
/obj/item/clockwork/component/geis_capacitor/antennae = 1)
|
||||
@@ -30,7 +31,7 @@
|
||||
/obj/structure/destructible/clockwork/powered/mania_motor/examine(mob/user)
|
||||
..()
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
user << "<span class='sevtug_small'>It requires <b>[mania_cost]W</b> to run, and at least <b>[convert_cost]W</b> to attempt to convert humans adjacent to it.</span>"
|
||||
to_chat(user, "<span class='sevtug_small'>It requires <b>[mania_cost]W</b> to run, and at least <b>[convert_cost]W</b> to attempt to convert humans adjacent to it.</span>")
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/mania_motor/forced_disable(bad_effects)
|
||||
if(active)
|
||||
@@ -44,16 +45,16 @@
|
||||
/obj/structure/destructible/clockwork/powered/mania_motor/attack_hand(mob/living/user)
|
||||
if(user.canUseTopic(src, !issilicon(user), NO_DEXTERY) && is_servant_of_ratvar(user))
|
||||
if(!total_accessable_power() >= mania_cost)
|
||||
user << "<span class='warning'>[src] needs more power to function!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] needs more power to function!</span>")
|
||||
return 0
|
||||
toggle(0, user)
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/mania_motor/toggle(fast_process, mob/living/user)
|
||||
. = ..()
|
||||
if(active)
|
||||
SetLuminosity(2, 1)
|
||||
set_light(2, 0.9)
|
||||
else
|
||||
SetLuminosity(0)
|
||||
set_light(0)
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/mania_motor/process()
|
||||
if(!try_use_power(mania_cost))
|
||||
@@ -81,10 +82,10 @@
|
||||
var/sound_distance = falloff_distance * 0.5
|
||||
var/targetbrainloss = H.getBrainLoss()
|
||||
if(distance > 3 && prob(falloff_distance * 0.5))
|
||||
H << "<span class='sevtug_small'>\"[text2ratvar(pick(mania_messages))]\"</span>"
|
||||
to_chat(H, "<span class='sevtug_small'>\"[text2ratvar(pick(mania_messages))]\"</span>")
|
||||
if(distance <= 1)
|
||||
if(!H.Adjacent(src))
|
||||
H << "<span class='sevtug'>\"[text2ratvar(pick(close_messages))]\"</span>"
|
||||
to_chat(H, "<span class='sevtug'>\"[text2ratvar(pick(close_messages))]\"</span>")
|
||||
H.playsound_local(T, hum, sound_distance, 1)
|
||||
else if(!try_use_power(convert_cost))
|
||||
visible_message("<span class='warning'>[src]'s antennae fizzle quietly.</span>")
|
||||
@@ -98,7 +99,7 @@
|
||||
else
|
||||
H.Paralyse(3)
|
||||
else if(is_eligible_servant(H))
|
||||
H << "<span class='sevtug'>\"[text2ratvar("You are mine and his, now.")]\"</span>"
|
||||
to_chat(H, "<span class='sevtug'>\"[text2ratvar("You are mine and his, now.")]\"</span>")
|
||||
add_servant_of_ratvar(H)
|
||||
H.Paralyse(5)
|
||||
else
|
||||
@@ -107,9 +108,9 @@
|
||||
if(0 to 3)
|
||||
if(prob(falloff_distance * 0.5))
|
||||
if(prob(falloff_distance))
|
||||
H << "<span class='sevtug_small'>\"[text2ratvar(pick(mania_messages))]\"</span>"
|
||||
to_chat(H, "<span class='sevtug_small'>\"[text2ratvar(pick(mania_messages))]\"</span>")
|
||||
else
|
||||
H << "<span class='sevtug'>\"[text2ratvar(pick(compel_messages))]\"</span>"
|
||||
to_chat(H, "<span class='sevtug'>\"[text2ratvar(pick(compel_messages))]\"</span>")
|
||||
if(targetbrainloss <= 40)
|
||||
H.adjustBrainLoss(3 * efficiency)
|
||||
H.adjust_drugginess(Clamp(7 * efficiency, 0, 50 - H.druggy))
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
/obj/structure/destructible/clockwork/powered/mending_motor/examine(mob/user)
|
||||
..()
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
user << "<span class='inathneq_small'>It requires at least <b>[heal_cost]W</b> to attempt to repair clockwork mobs, structures, or converted silicons.</span>"
|
||||
to_chat(user, "<span class='inathneq_small'>It requires at least <b>[heal_cost]W</b> to attempt to repair clockwork mobs, structures, or converted silicons.</span>")
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/mending_motor/forced_disable(bad_effects)
|
||||
if(active)
|
||||
@@ -45,7 +45,7 @@
|
||||
/obj/structure/destructible/clockwork/powered/mending_motor/attack_hand(mob/living/user)
|
||||
if(user.canUseTopic(src, !issilicon(user), NO_DEXTERY) && is_servant_of_ratvar(user))
|
||||
if(total_accessable_power() < MIN_CLOCKCULT_POWER)
|
||||
user << "<span class='warning'>[src] needs more power to function!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] needs more power to function!</span>")
|
||||
return 0
|
||||
toggle(0, user)
|
||||
|
||||
@@ -64,10 +64,10 @@
|
||||
S.adjustHealth(-(8 * efficiency))
|
||||
new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
|
||||
else
|
||||
S << "<span class='inathneq'>\"[text2ratvar(pick(heal_failure_messages))]\"</span>"
|
||||
to_chat(S, "<span class='inathneq'>\"[text2ratvar(pick(heal_failure_messages))]\"</span>")
|
||||
break
|
||||
else
|
||||
S << "<span class='inathneq'>\"[text2ratvar(pick(heal_finish_messages))]\"</span>"
|
||||
to_chat(S, "<span class='inathneq'>\"[text2ratvar(pick(heal_finish_messages))]\"</span>")
|
||||
break
|
||||
else if(is_type_in_typecache(M, mending_motor_typecache))
|
||||
T = get_turf(M)
|
||||
@@ -97,10 +97,10 @@
|
||||
S.heal_ordered_damage(8 * efficiency, damage_heal_order)
|
||||
new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
|
||||
else
|
||||
S << "<span class='inathneq'>\"[text2ratvar(pick(heal_failure_messages))]\"</span>"
|
||||
to_chat(S, "<span class='inathneq'>\"[text2ratvar(pick(heal_failure_messages))]\"</span>")
|
||||
break
|
||||
else
|
||||
S << "<span class='inathneq'>\"[text2ratvar(pick(heal_finish_messages))]\"</span>"
|
||||
to_chat(S, "<span class='inathneq'>\"[text2ratvar(pick(heal_finish_messages))]\"</span>")
|
||||
break
|
||||
. = ..()
|
||||
if(. < heal_cost)
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
/obj/structure/destructible/clockwork/ocular_warden/examine(mob/user)
|
||||
..()
|
||||
user << "<span class='brass'>[target ? "<b>It's fixated on [target]!</b>" : "Its gaze is wandering aimlessly."]</span>"
|
||||
to_chat(user, "<span class='brass'>[target ? "<b>It's fixated on [target]!</b>" : "Its gaze is wandering aimlessly."]</span>")
|
||||
|
||||
/obj/structure/destructible/clockwork/ocular_warden/hulk_damage()
|
||||
return 25
|
||||
@@ -36,12 +36,12 @@
|
||||
if(anchored)
|
||||
if(obj_integrity <= max_integrity * 0.25)
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
|
||||
to_chat(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(OCULAR_WARDEN_EXCLUSION_RANGE, src))
|
||||
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>"
|
||||
to_chat(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
|
||||
|
||||
@@ -97,10 +97,10 @@
|
||||
visible_message("<span class='warning'>[src] swivels to face [target]!</span>")
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
L << "<span class='heavy_brass'>\"I SEE YOU!\"</span>\n<span class='userdanger'>[src]'s gaze [ratvar_awakens ? "melts you alive" : "burns you"]!</span>"
|
||||
to_chat(L, "<span class='heavy_brass'>\"I SEE YOU!\"</span>\n<span class='userdanger'>[src]'s gaze [ratvar_awakens ? "melts you alive" : "burns you"]!</span>")
|
||||
else if(istype(target,/obj/mecha))
|
||||
var/obj/mecha/M = target
|
||||
M.occupant << "<span class='heavy_brass'>\"I SEE YOU!\"</span>" //heeeellooooooo, person in mech.
|
||||
to_chat(M.occupant, "<span class='heavy_brass'>\"I SEE YOU!\"</span>" )
|
||||
else if(prob(0.5)) //Extremely low chance because of how fast the subsystem it uses processes
|
||||
if(prob(50))
|
||||
visible_message("<span class='notice'>[src][pick(idle_messages)]</span>")
|
||||
@@ -113,7 +113,7 @@
|
||||
var/obj/item/weapon/storage/book/bible/B = L.bible_check()
|
||||
if(B)
|
||||
if(!(B.resistance_flags & ON_FIRE))
|
||||
L << "<span class='warning'>Your [B.name] bursts into flames!</span>"
|
||||
to_chat(L, "<span class='warning'>Your [B.name] bursts into flames!</span>")
|
||||
for(var/obj/item/weapon/storage/book/bible/BI in L.GetAllContents())
|
||||
if(!(BI.resistance_flags & ON_FIRE))
|
||||
BI.fire_act()
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
pixel_y = -248
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
appearance_flags = 0
|
||||
light_power = 0.7
|
||||
light_range = 15
|
||||
light_color = rgb(190, 135, 0)
|
||||
var/atom/prey //Whatever Ratvar is chasing
|
||||
var/clashing = FALSE //If Ratvar is FUCKING FIGHTING WITH NAR-SIE
|
||||
var/proselytize_range = 10
|
||||
@@ -73,13 +76,13 @@
|
||||
meals += L
|
||||
if(meals.len)
|
||||
prey = pick(meals)
|
||||
prey << "<span class='heavy_brass'><font size=5>\"You will do.\"</font></span>\n\
|
||||
<span class='userdanger'>Something very large and very malevolent begins lumbering its way towards you...</span>"
|
||||
to_chat(prey, "<span class='heavy_brass'><font size=5>\"You will do.\"</font></span>\n\
|
||||
<span class='userdanger'>Something very large and very malevolent begins lumbering its way towards you...</span>")
|
||||
prey << 'sound/effects/ratvar_reveal.ogg'
|
||||
else
|
||||
if((!istype(prey, /obj/singularity/narsie) && prob(10)) || is_servant_of_ratvar(prey) || prey.z != z)
|
||||
prey << "<span class='heavy_brass'><font size=5>\"How dull. Leave me.\"</font></span>\n\
|
||||
<span class='userdanger'>You feel tremendous relief as a set of horrible eyes loses sight of you...</span>"
|
||||
to_chat(prey, "<span class='heavy_brass'><font size=5>\"How dull. Leave me.\"</font></span>\n\
|
||||
<span class='userdanger'>You feel tremendous relief as a set of horrible eyes loses sight of you...</span>")
|
||||
prey = null
|
||||
else
|
||||
dir_to_step_in = get_dir(src, prey) //Unlike Nar-Sie, Ratvar ruthlessly chases down his target
|
||||
@@ -89,8 +92,8 @@
|
||||
if(clashing)
|
||||
return FALSE
|
||||
clashing = TRUE
|
||||
world << "<span class='heavy_brass'><font size=5>\"[pick("BLOOD GOD!!!", "NAR-SIE!!!", "AT LAST, YOUR TIME HAS COME!")]\"</font></span>"
|
||||
world << "<span class='cult'><font size=5>\"<b>Ratvar?! How?!</b>\"</font></span>"
|
||||
to_chat(world, "<span class='heavy_brass'><font size=5>\"[pick("BLOOD GOD!!!", "NAR-SIE!!!", "AT LAST, YOUR TIME HAS COME!")]\"</font></span>")
|
||||
to_chat(world, "<span class='cult'><font size=5>\"<b>Ratvar?! How?!</b>\"</font></span>")
|
||||
for(var/obj/singularity/narsie/N in range(15, src))
|
||||
if(N.clashing)
|
||||
continue
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
break_message = "<span class='warning'>The cache's fire winks out before it falls in on itself!</span>"
|
||||
max_integrity = 80
|
||||
obj_integrity = 80
|
||||
light_color = "#C2852F"
|
||||
var/wall_generation_cooldown
|
||||
var/turf/closed/wall/clockwork/linkedwall //if we've got a linked wall and are producing
|
||||
|
||||
@@ -18,7 +19,7 @@
|
||||
START_PROCESSING(SSobj, src)
|
||||
clockwork_caches++
|
||||
update_slab_info()
|
||||
SetLuminosity(2,1)
|
||||
set_light(2, 0.7)
|
||||
|
||||
/obj/structure/destructible/clockwork/cache/Destroy()
|
||||
clockwork_caches--
|
||||
@@ -54,18 +55,18 @@
|
||||
if(istype(I, /obj/item/clockwork/component))
|
||||
var/obj/item/clockwork/component/C = I
|
||||
if(!anchored)
|
||||
user << "<span class='warning'>[src] needs to be secured to place [C] into it!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] needs to be secured to place [C] into it!</span>")
|
||||
else
|
||||
clockwork_component_cache[C.component_id]++
|
||||
update_slab_info()
|
||||
user << "<span class='notice'>You add [C] to [src].</span>"
|
||||
to_chat(user, "<span class='notice'>You add [C] to [src].</span>")
|
||||
user.drop_item()
|
||||
qdel(C)
|
||||
return 1
|
||||
else if(istype(I, /obj/item/clockwork/slab))
|
||||
var/obj/item/clockwork/slab/S = I
|
||||
if(!anchored)
|
||||
user << "<span class='warning'>[src] needs to be secured to offload your slab's components into it!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] needs to be secured to offload your slab's components into it!</span>")
|
||||
else
|
||||
for(var/i in S.stored_components)
|
||||
clockwork_component_cache[i] += S.stored_components[i]
|
||||
@@ -76,27 +77,34 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/cache/update_anchored(mob/user, do_damage)
|
||||
..()
|
||||
if(anchored)
|
||||
set_light(2, 0.7)
|
||||
else
|
||||
set_light(0)
|
||||
|
||||
/obj/structure/destructible/clockwork/cache/attack_hand(mob/living/user)
|
||||
..()
|
||||
if(is_servant_of_ratvar(user))
|
||||
if(linkedwall)
|
||||
if(wall_generation_cooldown > world.time)
|
||||
var/temp_time = (wall_generation_cooldown - world.time) * 0.1
|
||||
user << "<span class='alloy'>[src] will produce a component in <b>[temp_time]</b> second[temp_time == 1 ? "":"s"].</span>"
|
||||
to_chat(user, "<span class='alloy'>[src] will produce a component in <b>[temp_time]</b> second[temp_time == 1 ? "":"s"].</span>")
|
||||
else
|
||||
user << "<span class='brass'>[src] is about to produce a component!</span>"
|
||||
to_chat(user, "<span class='brass'>[src] is about to produce a component!</span>")
|
||||
else if(anchored)
|
||||
user << "<span class='alloy'>[src] is unlinked! Construct a Clockwork Wall nearby to generate components!</span>"
|
||||
to_chat(user, "<span class='alloy'>[src] is unlinked! Construct a Clockwork Wall nearby to generate components!</span>")
|
||||
else
|
||||
user << "<span class='alloy'>[src] needs to be secured to generate components!</span>"
|
||||
to_chat(user, "<span class='alloy'>[src] needs to be secured to generate components!</span>")
|
||||
|
||||
/obj/structure/destructible/clockwork/cache/examine(mob/user)
|
||||
..()
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
if(linkedwall)
|
||||
user << "<span class='brass'>It is linked to a Clockwork Wall and will generate a component every <b>[round((CACHE_PRODUCTION_TIME * 0.1) * get_efficiency_mod(TRUE), 0.1)]</b> seconds!</span>"
|
||||
to_chat(user, "<span class='brass'>It is linked to a Clockwork Wall and will generate a component every <b>[round((CACHE_PRODUCTION_TIME * 0.1) * get_efficiency_mod(TRUE), 0.1)]</b> seconds!</span>")
|
||||
else
|
||||
user << "<span class='alloy'>It is unlinked! Construct a Clockwork Wall nearby to generate components!</span>"
|
||||
user << "<b>Stored components:</b>"
|
||||
to_chat(user, "<span class='alloy'>It is unlinked! Construct a Clockwork Wall nearby to generate components!</span>")
|
||||
to_chat(user, "<b>Stored components:</b>")
|
||||
for(var/i in clockwork_component_cache)
|
||||
user << "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[clockwork_component_cache[i]]</b></span>"
|
||||
to_chat(user, "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[clockwork_component_cache[i]]</b></span>")
|
||||
|
||||
@@ -43,12 +43,12 @@
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
if(active)
|
||||
if(component_id_to_produce)
|
||||
user << "<span class='[get_component_span(component_id_to_produce)]_small'>It is currently producing [get_component_name(component_id_to_produce)][component_id_to_produce != REPLICANT_ALLOY ? "s":""].</span>"
|
||||
to_chat(user, "<span class='[get_component_span(component_id_to_produce)]_small'>It is currently producing [get_component_name(component_id_to_produce)][component_id_to_produce != REPLICANT_ALLOY ? "s":""].</span>")
|
||||
else
|
||||
user << "<span class='brass'>It is currently producing random components.</span>"
|
||||
user << "<span class='nezbere_small'>It will produce a component every <b>[round((production_cooldown*0.1) * get_efficiency_mod(TRUE), 0.1)]</b> seconds and requires at least the following power for each component type:</span>"
|
||||
to_chat(user, "<span class='brass'>It is currently producing random components.</span>")
|
||||
to_chat(user, "<span class='nezbere_small'>It will produce a component every <b>[round((production_cooldown*0.1) * get_efficiency_mod(TRUE), 0.1)]</b> seconds and requires at least the following power for each component type:</span>")
|
||||
for(var/i in clockwork_component_cache)
|
||||
user << "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)]:</i> <b>[get_component_cost(i)]W</b> <i>([clockwork_component_cache[i]] exist[clockwork_component_cache[i] == 1 ? "s" : ""])</i></span>"
|
||||
to_chat(user, "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)]:</i> <b>[get_component_cost(i)]W</b> <i>([clockwork_component_cache[i]] exist[clockwork_component_cache[i] == 1 ? "s" : ""])</i></span>")
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/tinkerers_daemon/forced_disable(bad_effects)
|
||||
if(active)
|
||||
@@ -63,23 +63,23 @@
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/tinkerers_daemon/attack_hand(mob/living/user)
|
||||
if(!is_servant_of_ratvar(user))
|
||||
user << "<span class='warning'>You place your hand on the daemon, but nothing happens.</span>"
|
||||
to_chat(user, "<span class='warning'>You place your hand on the daemon, but nothing happens.</span>")
|
||||
return
|
||||
if(active)
|
||||
toggle(0, user)
|
||||
else
|
||||
if(!anchored)
|
||||
user << "<span class='warning'>[src] needs to be secured to the floor before it can be activated!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] needs to be secured to the floor before it can be activated!</span>")
|
||||
return FALSE
|
||||
var/servants = 0
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
if(is_servant_of_ratvar(L))
|
||||
servants++
|
||||
if(servants * 0.2 < clockwork_daemons)
|
||||
user << "<span class='nezbere'>\"There are too few servants for this daemon to work.\"</span>"
|
||||
to_chat(user, "<span class='nezbere'>\"There are too few servants for this daemon to work.\"</span>")
|
||||
return
|
||||
if(!clockwork_caches)
|
||||
user << "<span class='nezbere'>\"You require a cache for this daemon to operate. Get to it.\"</span>"
|
||||
to_chat(user, "<span class='nezbere'>\"You require a cache for this daemon to operate. Get to it.\"</span>")
|
||||
return
|
||||
var/min_power_usable = 0
|
||||
for(var/i in clockwork_component_cache)
|
||||
@@ -88,7 +88,7 @@
|
||||
else
|
||||
min_power_usable = min(min_power_usable, get_component_cost(i))
|
||||
if(total_accessable_power() < min_power_usable)
|
||||
user << "<span class='nezbere'>\"You need more power to activate this daemon, friend.\"</span>"
|
||||
to_chat(user, "<span class='nezbere'>\"You need more power to activate this daemon, friend.\"</span>")
|
||||
return
|
||||
var/choice = alert(user,"Activate Daemon...",,"Specific Component","Random Component","Cancel")
|
||||
switch(choice)
|
||||
@@ -105,10 +105,10 @@
|
||||
if(!is_servant_of_ratvar(user) || !user.canUseTopic(src, !issilicon(user), NO_DEXTERY) || active || !clockwork_caches || servants * 0.2 < clockwork_daemons)
|
||||
return
|
||||
if(!component_id_to_produce)
|
||||
user << "<span class='warning'>You decide not to select a component and activate the daemon.</span>"
|
||||
to_chat(user, "<span class='warning'>You decide not to select a component and activate the daemon.</span>")
|
||||
return
|
||||
if(total_accessable_power() < get_component_cost(component_id_to_produce))
|
||||
user << "<span class='warning'>There is too little power to produce this type of component!</span>"
|
||||
to_chat(user, "<span class='warning'>There is too little power to produce this type of component!</span>")
|
||||
return
|
||||
toggle(0, user)
|
||||
if("Random Component")
|
||||
@@ -130,10 +130,10 @@
|
||||
component_glow.color = component_color
|
||||
add_overlay(component_glow)
|
||||
production_time = world.time + production_cooldown //don't immediately produce when turned on after being off
|
||||
SetLuminosity(2, 1)
|
||||
set_light(2, 0.9, get_component_color_bright(component_id_to_produce))
|
||||
else
|
||||
cut_overlays()
|
||||
SetLuminosity(0)
|
||||
set_light(0)
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/tinkerers_daemon/proc/get_component_cost(id)
|
||||
return max(MIN_CLOCKCULT_POWER*2, (MIN_CLOCKCULT_POWER*2) * (1 + round(clockwork_component_cache[id] * 0.2)))
|
||||
|
||||
@@ -30,30 +30,30 @@
|
||||
return 1
|
||||
else if(istype(I, /obj/item/weapon/screwdriver))
|
||||
if(anchored)
|
||||
user << "<span class='warning'>[src] needs to be unsecured to disassemble it!</span>"
|
||||
to_chat(user, "<span class='warning'>[src] needs to be unsecured to disassemble it!</span>")
|
||||
else
|
||||
playsound(src, I.usesound, 100, 1)
|
||||
user.visible_message("<span class='warning'>[user] starts to disassemble [src].</span>", "<span class='notice'>You start to disassemble [src]...</span>")
|
||||
if(do_after(user, 30*I.toolspeed, target = src) && !anchored)
|
||||
user << "<span class='notice'>You disassemble [src].</span>"
|
||||
to_chat(user, "<span class='notice'>You disassemble [src].</span>")
|
||||
deconstruct(TRUE)
|
||||
return 1
|
||||
else if(istype(I, /obj/item/stack/tile/brass))
|
||||
var/obj/item/stack/tile/brass/W = I
|
||||
if(W.get_amount() < 1)
|
||||
user << "<span class='warning'>You need one brass sheet to do this!</span>"
|
||||
to_chat(user, "<span class='warning'>You need one brass sheet to do this!</span>")
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
if(iswallturf(T))
|
||||
user << "<span class='warning'>There is already a wall present!</span>"
|
||||
to_chat(user, "<span class='warning'>There is already a wall present!</span>")
|
||||
return
|
||||
if(!isfloorturf(T))
|
||||
user << "<span class='warning'>A floor must be present to build a [anchored ? "false ":""]wall!</span>"
|
||||
to_chat(user, "<span class='warning'>A floor must be present to build a [anchored ? "false ":""]wall!</span>")
|
||||
return
|
||||
if(locate(/obj/structure/falsewall) in T.contents)
|
||||
user << "<span class='warning'>There is already a false wall present!</span>"
|
||||
to_chat(user, "<span class='warning'>There is already a false wall present!</span>")
|
||||
return
|
||||
user << "<span class='notice'>You start adding [W] to [src]...</span>"
|
||||
to_chat(user, "<span class='notice'>You start adding [W] to [src]...</span>")
|
||||
if(do_after(user, 20, target = src))
|
||||
var/brass_floor = FALSE
|
||||
if(istype(T, /turf/open/floor/clockwork)) //if the floor is already brass, costs less to make(conservation of masssssss)
|
||||
@@ -66,7 +66,7 @@
|
||||
new /obj/structure/falsewall/brass(T)
|
||||
qdel(src)
|
||||
else
|
||||
user << "<span class='warning'>You need more brass to make a [anchored ? "false ":""]wall!</span>"
|
||||
to_chat(user, "<span class='warning'>You need more brass to make a [anchored ? "false ":""]wall!</span>")
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -36,9 +36,9 @@
|
||||
antag_flag = ROLE_CULTIST
|
||||
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
|
||||
protected_jobs = list()
|
||||
required_players = 10
|
||||
required_enemies = 2
|
||||
recommended_enemies = 2
|
||||
required_players = 24
|
||||
required_enemies = 4
|
||||
recommended_enemies = 4
|
||||
enemy_minimum_age = 14
|
||||
|
||||
announce_span = "cult"
|
||||
@@ -49,7 +49,7 @@
|
||||
var/finished = 0
|
||||
var/eldergod = 1 //for the summon god objective
|
||||
|
||||
var/acolytes_needed = 5 //for the survive objective
|
||||
var/acolytes_needed = 10 //for the survive objective
|
||||
var/acolytes_survived = 0
|
||||
|
||||
var/datum/mind/sacrifice_target = null//The target to be sacrificed
|
||||
@@ -95,7 +95,7 @@
|
||||
explanation = "Free objective."
|
||||
if("eldergod")
|
||||
explanation = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie' with nine acolytes on it. You must do this after sacrificing your target."
|
||||
cult_mind.current << "<B>Objective #[obj_count]</B>: [explanation]"
|
||||
to_chat(cult_mind.current, "<B>Objective #[obj_count]</B>: [explanation]")
|
||||
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
|
||||
|
||||
/datum/game_mode/cult/post_setup()
|
||||
@@ -116,7 +116,7 @@
|
||||
for(var/datum/mind/cult_mind in cultists_to_cult)
|
||||
equip_cultist(cult_mind.current)
|
||||
update_cult_icons_added(cult_mind)
|
||||
cult_mind.current << "<span class='userdanger'>You are a member of the cult!</span>"
|
||||
to_chat(cult_mind.current, "<span class='userdanger'>You are a member of the cult!</span>")
|
||||
add_cultist(cult_mind, 0)
|
||||
..()
|
||||
|
||||
@@ -125,14 +125,14 @@
|
||||
return
|
||||
if (mob.mind)
|
||||
if (mob.mind.assigned_role == "Clown")
|
||||
mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
|
||||
to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
|
||||
mob.dna.remove_mutation(CLOWNMUT)
|
||||
|
||||
if(tome)
|
||||
. += cult_give_item(/obj/item/weapon/tome, mob)
|
||||
else
|
||||
. += cult_give_item(/obj/item/weapon/paper/talisman/supply, mob)
|
||||
mob << "These will help you start the cult on this station. Use them well, and remember - you are not the only one.</span>"
|
||||
to_chat(mob, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.</span>")
|
||||
|
||||
/datum/game_mode/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
|
||||
var/list/slots = list(
|
||||
@@ -145,10 +145,10 @@
|
||||
var/item_name = initial(item_path.name)
|
||||
var/where = mob.equip_in_one_of_slots(T, slots)
|
||||
if(!where)
|
||||
mob << "<span class='userdanger'>Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).</span>"
|
||||
to_chat(mob, "<span class='userdanger'>Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).</span>")
|
||||
return 0
|
||||
else
|
||||
mob << "<span class='danger'>You have a [item_name] in your [where]."
|
||||
to_chat(mob, "<span class='danger'>You have a [item_name] in your [where].")
|
||||
if(where == "backpack")
|
||||
var/obj/item/weapon/storage/B = mob.back
|
||||
B.orient2hud(mob)
|
||||
@@ -220,11 +220,11 @@
|
||||
if(!check_cult_victory())
|
||||
feedback_set_details("round_end_result","win - cult win")
|
||||
feedback_set("round_end_result",acolytes_survived)
|
||||
world << "<span class='greentext'>The cult has succeeded! Nar-sie has snuffed out another torch in the void!</span>"
|
||||
to_chat(world, "<span class='greentext'>The cult has succeeded! Nar-sie has snuffed out another torch in the void!</span>")
|
||||
else
|
||||
feedback_set_details("round_end_result","loss - staff stopped the cult")
|
||||
feedback_set("round_end_result",acolytes_survived)
|
||||
world << "<span class='redtext'>The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!</span>"
|
||||
to_chat(world, "<span class='redtext'>The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!</span>")
|
||||
|
||||
var/text = ""
|
||||
|
||||
@@ -264,7 +264,7 @@
|
||||
ticker.news_report = CULT_FAILURE
|
||||
|
||||
text += "<br><B>Objective #[obj_count]</B>: [explanation]"
|
||||
world << text
|
||||
to_chat(world, text)
|
||||
..()
|
||||
return 1
|
||||
|
||||
@@ -277,4 +277,4 @@
|
||||
|
||||
text += "<br>"
|
||||
|
||||
world << text
|
||||
to_chat(world, text)
|
||||
|
||||
@@ -24,22 +24,17 @@
|
||||
return
|
||||
if(!ishuman(user))
|
||||
user.say("O bidai nabora se[pick("'","`")]sma!")
|
||||
else
|
||||
user.whisper("O bidai nabora se[pick("'","`")]sma!")
|
||||
sleep(10)
|
||||
if(!user)
|
||||
return
|
||||
if(!ishuman(user))
|
||||
user.say(html_decode(message))
|
||||
else
|
||||
user.whisper("O bidai nabora se[pick("'","`")]sma!")
|
||||
user.whisper(html_decode(message))
|
||||
var/my_message = "<span class='cultitalic'><b>[(ishuman(user) ? "Acolyte" : "Construct")] [findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]:</b> [message]</span>"
|
||||
for(var/mob/M in mob_list)
|
||||
if(iscultist(M))
|
||||
M << my_message
|
||||
to_chat(M, my_message)
|
||||
else if(M in dead_mob_list)
|
||||
var/link = FOLLOW_LINK(M, user)
|
||||
M << "[link] [my_message]"
|
||||
to_chat(M, "[link] [my_message]")
|
||||
|
||||
log_say("[user.real_name]/[user.key] : [message]")
|
||||
|
||||
|
||||
@@ -30,12 +30,12 @@
|
||||
..()
|
||||
if(!iscultist(user))
|
||||
if(!is_servant_of_ratvar(user))
|
||||
user << "<span class='cultlarge'>\"I wouldn't advise that.\"</span>"
|
||||
user << "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>"
|
||||
to_chat(user, "<span class='cultlarge'>\"I wouldn't advise that.\"</span>")
|
||||
to_chat(user, "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>")
|
||||
user.Dizzy(120)
|
||||
else
|
||||
user << "<span class='cultlarge'>\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\"</span>"
|
||||
user << "<span class='userdanger'>A horrible force yanks at your arm!</span>"
|
||||
to_chat(user, "<span class='cultlarge'>\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\"</span>")
|
||||
to_chat(user, "<span class='userdanger'>A horrible force yanks at your arm!</span>")
|
||||
user.emote("scream")
|
||||
user.apply_damage(30, BRUTE, pick("l_arm", "r_arm"))
|
||||
user.dropItemToGround(src)
|
||||
@@ -177,14 +177,14 @@
|
||||
..()
|
||||
if(!iscultist(user))
|
||||
if(!is_servant_of_ratvar(user))
|
||||
user << "<span class='cultlarge'>\"I wouldn't advise that.\"</span>"
|
||||
user << "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>"
|
||||
to_chat(user, "<span class='cultlarge'>\"I wouldn't advise that.\"</span>")
|
||||
to_chat(user, "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>")
|
||||
user.dropItemToGround(src, TRUE)
|
||||
user.Dizzy(30)
|
||||
user.Weaken(5)
|
||||
else
|
||||
user << "<span class='cultlarge'>\"Trying to use things you don't own is bad, you know.\"</span>"
|
||||
user << "<span class='userdanger'>The armor squeezes at your body!</span>"
|
||||
to_chat(user, "<span class='cultlarge'>\"Trying to use things you don't own is bad, you know.\"</span>")
|
||||
to_chat(user, "<span class='userdanger'>The armor squeezes at your body!</span>")
|
||||
user.emote("scream")
|
||||
user.adjustBruteLoss(25)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
@@ -229,14 +229,14 @@
|
||||
..()
|
||||
if(!iscultist(user))
|
||||
if(!is_servant_of_ratvar(user))
|
||||
user << "<span class='cultlarge'>\"I wouldn't advise that.\"</span>"
|
||||
user << "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>"
|
||||
to_chat(user, "<span class='cultlarge'>\"I wouldn't advise that.\"</span>")
|
||||
to_chat(user, "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>")
|
||||
user.dropItemToGround(src, TRUE)
|
||||
user.Dizzy(30)
|
||||
user.Weaken(5)
|
||||
else
|
||||
user << "<span class='cultlarge'>\"Trying to use things you don't own is bad, you know.\"</span>"
|
||||
user << "<span class='userdanger'>The robes squeeze at your body!</span>"
|
||||
to_chat(user, "<span class='cultlarge'>\"Trying to use things you don't own is bad, you know.\"</span>")
|
||||
to_chat(user, "<span class='userdanger'>The robes squeeze at your body!</span>")
|
||||
user.emote("scream")
|
||||
user.adjustBruteLoss(25)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
@@ -252,7 +252,7 @@
|
||||
/obj/item/clothing/glasses/night/cultblind/equipped(mob/user, slot)
|
||||
..()
|
||||
if(!iscultist(user))
|
||||
user << "<span class='cultlarge'>\"You want to be blind, do you?\"</span>"
|
||||
to_chat(user, "<span class='cultlarge'>\"You want to be blind, do you?\"</span>")
|
||||
user.dropItemToGround(src, TRUE)
|
||||
user.Dizzy(30)
|
||||
user.Weaken(5)
|
||||
@@ -276,16 +276,16 @@
|
||||
if(!iscultist(user))
|
||||
user.dropItemToGround(src, TRUE)
|
||||
user.Weaken(5)
|
||||
user << "<span class='warning'>A powerful force shoves you away from [src]!</span>"
|
||||
to_chat(user, "<span class='warning'>A powerful force shoves you away from [src]!</span>")
|
||||
return
|
||||
if(curselimit > 1)
|
||||
user << "<span class='notice'>We have exhausted our ability to curse the shuttle.</span>"
|
||||
to_chat(user, "<span class='notice'>We have exhausted our ability to curse the shuttle.</span>")
|
||||
return
|
||||
if(SSshuttle.emergency.mode == SHUTTLE_CALL)
|
||||
var/cursetime = 1800
|
||||
var/timer = SSshuttle.emergency.timeLeft(1) + cursetime
|
||||
SSshuttle.emergency.setTimer(timer)
|
||||
user << "<span class='danger'>You shatter the orb! A dark essence spirals into the air, then disappears.</span>"
|
||||
to_chat(user, "<span class='danger'>You shatter the orb! A dark essence spirals into the air, then disappears.</span>")
|
||||
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 50, 1)
|
||||
qdel(src)
|
||||
sleep(20)
|
||||
@@ -311,9 +311,9 @@
|
||||
/obj/item/device/cult_shift/examine(mob/user)
|
||||
..()
|
||||
if(uses)
|
||||
user << "<span class='cult'>It has [uses] uses remaining.</span>"
|
||||
to_chat(user, "<span class='cult'>It has [uses] uses remaining.</span>")
|
||||
else
|
||||
user << "<span class='cult'>It seems drained.</span>"
|
||||
to_chat(user, "<span class='cult'>It seems drained.</span>")
|
||||
|
||||
/obj/item/device/cult_shift/proc/handle_teleport_grab(turf/T, mob/user)
|
||||
var/mob/living/carbon/C = user
|
||||
@@ -324,12 +324,12 @@
|
||||
|
||||
/obj/item/device/cult_shift/attack_self(mob/user)
|
||||
if(!uses || !iscarbon(user))
|
||||
user << "<span class='warning'>\The [src] is dull and unmoving in your hands.</span>"
|
||||
to_chat(user, "<span class='warning'>\The [src] is dull and unmoving in your hands.</span>")
|
||||
return
|
||||
if(!iscultist(user))
|
||||
user.dropItemToGround(src, TRUE)
|
||||
step(src, pick(alldirs))
|
||||
user << "<span class='warning'>\The [src] flickers out of your hands, your connection to this dimension is too strong!</span>"
|
||||
to_chat(user, "<span class='warning'>\The [src] flickers out of your hands, your connection to this dimension is too strong!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/C = user
|
||||
@@ -353,7 +353,7 @@
|
||||
playsound(destination, "sparks", 50, 1)
|
||||
|
||||
else
|
||||
C << "<span class='danger'>The veil cannot be torn here!</span>"
|
||||
to_chat(C, "<span class='danger'>The veil cannot be torn here!</span>")
|
||||
|
||||
/obj/item/device/flashlight/flare/culttorch
|
||||
name = "void torch"
|
||||
@@ -382,26 +382,26 @@
|
||||
if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
|
||||
return
|
||||
if(!cultist_to_receive)
|
||||
user << "<span class='cultitalic'>You require a destination!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You require a destination!</span>")
|
||||
log_game("Void torch failed - no target")
|
||||
return
|
||||
if(cultist_to_receive.stat == DEAD)
|
||||
user << "<span class='cultitalic'>[cultist_to_receive] has died!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>[cultist_to_receive] has died!</span>")
|
||||
log_game("Void torch failed - target died")
|
||||
return
|
||||
if(!iscultist(cultist_to_receive))
|
||||
user << "<span class='cultitalic'>[cultist_to_receive] is not a follower of the Geometer!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>[cultist_to_receive] is not a follower of the Geometer!</span>")
|
||||
log_game("Void torch failed - target was deconverted")
|
||||
return
|
||||
user << "<span class='cultitalic'>You ignite [A] with \the [src], turning it to ash, but through the torch's flames you see that [A] has reached [cultist_to_receive]!"
|
||||
to_chat(user, "<span class='cultitalic'>You ignite [A] with \the [src], turning it to ash, but through the torch's flames you see that [A] has reached [cultist_to_receive]!")
|
||||
cultist_to_receive.put_in_hands(A)
|
||||
charges--
|
||||
user << "\The [src] now has [charges] charge\s."
|
||||
to_chat(user, "\The [src] now has [charges] charge\s.")
|
||||
if(charges == 0)
|
||||
qdel(src)
|
||||
|
||||
else
|
||||
..()
|
||||
user << "<span class='warning'>\The [src] can only transport items!</span>"
|
||||
to_chat(user, "<span class='warning'>\The [src] can only transport items!</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
|
||||
/obj/structure/destructible/cult/examine(mob/user)
|
||||
..()
|
||||
user << "<span class='notice'>\The [src] is [anchored ? "":"not "]secured to the floor.</span>"
|
||||
to_chat(user, "<span class='notice'>\The [src] is [anchored ? "":"not "]secured to the floor.</span>")
|
||||
if((iscultist(user) || isobserver(user)) && cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is too weak, [p_they()] will be ready to use again in [getETA()].</span>"
|
||||
to_chat(user, "<span class='cultitalic'>The magic in [src] is too weak, [p_they()] will be ready to use again in [getETA()].</span>")
|
||||
|
||||
/obj/structure/destructible/cult/examine_status(mob/user)
|
||||
if(iscultist(user) || isobserver(user))
|
||||
@@ -28,14 +28,14 @@
|
||||
M.visible_message("<span class='danger'>[M] repairs \the <b>[src]</b>.</span>", \
|
||||
"<span class='cult'>You repair <b>[src]</b>, leaving [p_they()] at <b>[round(obj_integrity * 100 / max_integrity)]%</b> stability.</span>")
|
||||
else
|
||||
M << "<span class='cult'>You cannot repair [src], as [p_they()] [p_are()] undamaged!</span>"
|
||||
to_chat(M, "<span class='cult'>You cannot repair [src], as [p_they()] [p_are()] undamaged!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/structure/destructible/cult/attackby(obj/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
|
||||
anchored = !anchored
|
||||
user << "<span class='notice'>You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.</span>"
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.</span>")
|
||||
if(!anchored)
|
||||
icon_state = "[initial(icon_state)]_off"
|
||||
else
|
||||
@@ -66,13 +66,13 @@
|
||||
|
||||
/obj/structure/destructible/cult/talisman/attack_hand(mob/living/user)
|
||||
if(!iscultist(user))
|
||||
user << "<span class='warning'>You're pretty sure you know exactly what this is used for and you can't seem to touch it.</span>"
|
||||
to_chat(user, "<span class='warning'>You're pretty sure you know exactly what this is used for and you can't seem to touch it.</span>")
|
||||
return
|
||||
if(!anchored)
|
||||
user << "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>")
|
||||
return
|
||||
if(cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
|
||||
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>")
|
||||
return
|
||||
var/choice = alert(user,"You study the schematics etched into the forge...",,"Eldritch Whetstone","Zealot's Blindfold","Flask of Unholy Water")
|
||||
var/pickedtype
|
||||
@@ -86,25 +86,26 @@
|
||||
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
cooldowntime = world.time + 2400
|
||||
var/obj/item/N = new pickedtype(get_turf(src))
|
||||
user << "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with an [N]!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with an [N]!</span>")
|
||||
|
||||
|
||||
/obj/structure/destructible/cult/forge
|
||||
name = "daemon forge"
|
||||
desc = "A forge used in crafting the unholy weapons used by the armies of Nar-Sie."
|
||||
icon_state = "forge"
|
||||
luminosity = 3
|
||||
light_range = 3
|
||||
light_color = LIGHT_COLOR_LAVA
|
||||
break_message = "<span class='warning'>The force breaks apart into shards with a howling scream!</span>"
|
||||
|
||||
/obj/structure/destructible/cult/forge/attack_hand(mob/living/user)
|
||||
if(!iscultist(user))
|
||||
user << "<span class='warning'>The heat radiating from [src] pushes you back.</span>"
|
||||
to_chat(user, "<span class='warning'>The heat radiating from [src] pushes you back.</span>")
|
||||
return
|
||||
if(!anchored)
|
||||
user << "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>")
|
||||
return
|
||||
if(cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
|
||||
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>")
|
||||
return
|
||||
var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Nar-Sien Hardsuit")
|
||||
var/pickedtype
|
||||
@@ -118,7 +119,7 @@
|
||||
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
cooldowntime = world.time + 2400
|
||||
var/obj/item/N = new pickedtype(get_turf(src))
|
||||
user << "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating [N]!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating [N]!</span>")
|
||||
|
||||
|
||||
var/list/blacklisted_pylon_turfs = typecacheof(list(
|
||||
@@ -132,7 +133,8 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
|
||||
name = "pylon"
|
||||
desc = "A floating crystal that slowly heals those faithful to Nar'Sie."
|
||||
icon_state = "pylon"
|
||||
luminosity = 5
|
||||
light_range = 5
|
||||
light_color = LIGHT_COLOR_RED
|
||||
break_sound = 'sound/effects/Glassbr2.ogg'
|
||||
break_message = "<span class='warning'>The blood-red crystal falls to the floor and shatters!</span>"
|
||||
var/heal_delay = 25
|
||||
@@ -198,18 +200,19 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
|
||||
name = "archives"
|
||||
desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl."
|
||||
icon_state = "tomealtar"
|
||||
luminosity = 1
|
||||
light_range = 1.4
|
||||
light_color = LIGHT_COLOR_FIRE
|
||||
break_message = "<span class='warning'>The books and tomes of the archives burn into ash as the desk shatters!</span>"
|
||||
|
||||
/obj/structure/destructible/cult/tome/attack_hand(mob/living/user)
|
||||
if(!iscultist(user))
|
||||
user << "<span class='warning'>All of these books seem to be gibberish.</span>"
|
||||
to_chat(user, "<span class='warning'>All of these books seem to be gibberish.</span>")
|
||||
return
|
||||
if(!anchored)
|
||||
user << "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>")
|
||||
return
|
||||
if(cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
|
||||
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>")
|
||||
return
|
||||
var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Walker Set")
|
||||
var/list/pickedtype = list()
|
||||
@@ -225,7 +228,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
|
||||
cooldowntime = world.time + 2400
|
||||
for(var/N in pickedtype)
|
||||
var/obj/item/D = new N(get_turf(src))
|
||||
user << "<span class='cultitalic'>You summon [D] from the archives!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You summon [D] from the archives!</span>")
|
||||
|
||||
/obj/effect/gateway
|
||||
name = "gateway"
|
||||
|
||||
@@ -24,10 +24,10 @@ This file contains the arcane tome files.
|
||||
/obj/item/weapon/tome/examine(mob/user)
|
||||
..()
|
||||
if(iscultist(user) || isobserver(user))
|
||||
user << "<span class='cult'>The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie.</span>"
|
||||
user << "<span class='cult'>Striking a cult structure will unanchor or reanchor it.</span>"
|
||||
user << "<span class='cult'>Striking another cultist with it will purge holy water from them.</span>"
|
||||
user << "<span class='cult'>Striking a noncultist, however, will sear their flesh.</span>"
|
||||
to_chat(user, "<span class='cult'>The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie.</span>")
|
||||
to_chat(user, "<span class='cult'>Striking a cult structure will unanchor or reanchor it.</span>")
|
||||
to_chat(user, "<span class='cult'>Striking another cultist with it will purge holy water from them.</span>")
|
||||
to_chat(user, "<span class='cult'>Striking a noncultist, however, will sear their flesh.</span>")
|
||||
|
||||
/obj/item/weapon/tome/attack(mob/living/M, mob/living/user)
|
||||
if(!istype(M))
|
||||
@@ -36,7 +36,7 @@ This file contains the arcane tome files.
|
||||
return ..()
|
||||
if(iscultist(M))
|
||||
if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion
|
||||
user << "<span class='cult'>You remove the taint from [M].</span>" // fucking ow
|
||||
to_chat(user, "<span class='cult'>You remove the taint from [M].</span>" )
|
||||
var/holy2unholy = M.reagents.get_reagent_amount("holywater")
|
||||
M.reagents.del_reagent("holywater")
|
||||
M.reagents.add_reagent("unholywater",holy2unholy)
|
||||
@@ -52,7 +52,7 @@ This file contains the arcane tome files.
|
||||
|
||||
/obj/item/weapon/tome/attack_self(mob/user)
|
||||
if(!iscultist(user))
|
||||
user << "<span class='warning'>[src] seems full of unintelligible shapes, scribbles, and notes. Is this some sort of joke?</span>"
|
||||
to_chat(user, "<span class='warning'>[src] seems full of unintelligible shapes, scribbles, and notes. Is this some sort of joke?</span>")
|
||||
return
|
||||
open_tome(user)
|
||||
|
||||
@@ -199,20 +199,20 @@ This file contains the arcane tome files.
|
||||
if(ticker.mode.name == "cult")
|
||||
var/datum/game_mode/cult/cult_mode = ticker.mode
|
||||
if(!("eldergod" in cult_mode.cult_objectives))
|
||||
user << "<span class='warning'>Nar-Sie does not wish to be summoned!</span>"
|
||||
to_chat(user, "<span class='warning'>Nar-Sie does not wish to be summoned!</span>")
|
||||
return
|
||||
if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed))
|
||||
user << "<span class='warning'>The sacrifice is not complete. The portal would lack the power to open if you tried!</span>"
|
||||
to_chat(user, "<span class='warning'>The sacrifice is not complete. The portal would lack the power to open if you tried!</span>")
|
||||
return
|
||||
if(!cult_mode.eldergod)
|
||||
user << "<span class='cultlarge'>\"I am already here. There is no need to try to summon me now.\"</span>"
|
||||
to_chat(user, "<span class='cultlarge'>\"I am already here. There is no need to try to summon me now.\"</span>")
|
||||
return
|
||||
if((loc.z && loc.z != ZLEVEL_STATION) || !A.blob_allowed)
|
||||
user << "<span class='warning'>The Geometer is not interested in lesser locations; the station is the prize!</span>"
|
||||
to_chat(user, "<span class='warning'>The Geometer is not interested in lesser locations; the station is the prize!</span>")
|
||||
return
|
||||
var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No")
|
||||
if(confirm_final == "No")
|
||||
user << "<span class='cult'>You decide to prepare further before scribing the rune.</span>"
|
||||
to_chat(user, "<span class='cult'>You decide to prepare further before scribing the rune.</span>")
|
||||
return
|
||||
Turf = get_turf(user)
|
||||
A = get_area(src)
|
||||
@@ -223,7 +223,7 @@ This file contains the arcane tome files.
|
||||
var/obj/structure/emergency_shield/sanguine/N = new(B)
|
||||
shields += N
|
||||
else
|
||||
user << "<span class='warning'>Nar-Sie does not wish to be summoned!</span>"
|
||||
to_chat(user, "<span class='warning'>Nar-Sie does not wish to be summoned!</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] [user.blood_volume ? "cuts open their arm and begins writing in their own blood":"begins sketching out a strange design"]!</span>", \
|
||||
"<span class='cult'>You [user.blood_volume ? "slice open your arm and ":""]begin drawing a sigil of the Geometer.</span>")
|
||||
@@ -244,26 +244,26 @@ This file contains the arcane tome files.
|
||||
if(S && !QDELETED(S))
|
||||
qdel(S)
|
||||
var/obj/effect/rune/R = new rune_to_scribe(Turf, chosen_keyword)
|
||||
user << "<span class='cult'>The [lowertext(R.cultist_name)] rune [R.cultist_desc]</span>"
|
||||
to_chat(user, "<span class='cult'>The [lowertext(R.cultist_name)] rune [R.cultist_desc]</span>")
|
||||
feedback_add_details("cult_runes_scribed", R.cultist_name)
|
||||
|
||||
/obj/item/weapon/tome/proc/check_rune_turf(turf/T, mob/user)
|
||||
var/area/A = get_area(T)
|
||||
|
||||
if(isspaceturf(T))
|
||||
user << "<span class='warning'>You cannot scribe runes in space!</span>"
|
||||
to_chat(user, "<span class='warning'>You cannot scribe runes in space!</span>")
|
||||
return FALSE
|
||||
|
||||
if(locate(/obj/effect/rune) in T)
|
||||
user << "<span class='cult'>There is already a rune here.</span>"
|
||||
to_chat(user, "<span class='cult'>There is already a rune here.</span>")
|
||||
return FALSE
|
||||
|
||||
if(T.z != ZLEVEL_STATION && T.z != ZLEVEL_MINING)
|
||||
user << "<span class='warning'>The veil is not weak enough here."
|
||||
to_chat(user, "<span class='warning'>The veil is not weak enough here.")
|
||||
return FALSE
|
||||
|
||||
if(istype(A, /area/shuttle))
|
||||
user << "<span class='warning'>Interference from hyperspace engines disrupts the Geometer's power on shuttles.</span>"
|
||||
to_chat(user, "<span class='warning'>Interference from hyperspace engines disrupts the Geometer's power on shuttles.</span>")
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -48,27 +48,27 @@ To draw a rune, use an arcane tome.
|
||||
/obj/effect/rune/examine(mob/user)
|
||||
..()
|
||||
if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects
|
||||
user << "<b>Name:</b> [cultist_name]"
|
||||
user << "<b>Effects:</b> [capitalize(cultist_desc)]"
|
||||
user << "<b>Required Acolytes:</b> [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]"
|
||||
to_chat(user, "<b>Name:</b> [cultist_name]")
|
||||
to_chat(user, "<b>Effects:</b> [capitalize(cultist_desc)]")
|
||||
to_chat(user, "<b>Required Acolytes:</b> [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]")
|
||||
if(req_keyword && keyword)
|
||||
user << "<b>Keyword:</b> [keyword]"
|
||||
to_chat(user, "<b>Keyword:</b> [keyword]")
|
||||
|
||||
/obj/effect/rune/attackby(obj/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
|
||||
user << "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>"
|
||||
to_chat(user, "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/nullrod))
|
||||
user.say("BEGONE FOUL MAGIKS!!")
|
||||
user << "<span class='danger'>You disrupt the magic of [src] with [I].</span>"
|
||||
to_chat(user, "<span class='danger'>You disrupt the magic of [src] with [I].</span>")
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/rune/attack_hand(mob/living/user)
|
||||
if(!iscultist(user))
|
||||
user << "<span class='warning'>You aren't able to understand the words of [src].</span>"
|
||||
to_chat(user, "<span class='warning'>You aren't able to understand the words of [src].</span>")
|
||||
return
|
||||
var/list/invokers = can_invoke(user)
|
||||
if(invokers.len >= req_cultists)
|
||||
@@ -81,7 +81,7 @@ To draw a rune, use an arcane tome.
|
||||
if(construct_invoke || !iscultist(M)) //if you're not a cult construct we want the normal fail message
|
||||
attack_hand(M)
|
||||
else
|
||||
M << "<span class='warning'>You are unable to invoke the rune!</span>"
|
||||
to_chat(M, "<span class='warning'>You are unable to invoke the rune!</span>")
|
||||
|
||||
/obj/effect/rune/proc/talismanhide() //for talisman of revealing/hiding
|
||||
visible_message("<span class='danger'>[src] fades away.</span>")
|
||||
@@ -173,7 +173,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
..()
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
L << "<span class='cultitalic'><b>You feel your life force draining. The Geometer is displeased.</b></span>"
|
||||
to_chat(L, "<span class='cultitalic'><b>You feel your life force draining. The Geometer is displeased.</b></span>")
|
||||
L.apply_damage(30, BRUTE)
|
||||
qdel(src)
|
||||
|
||||
@@ -204,12 +204,12 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
var/obj/item/weapon/paper/talisman/talisman_type
|
||||
var/list/possible_talismans = list()
|
||||
if(!papers_on_rune.len)
|
||||
user << "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>")
|
||||
fail_invoke()
|
||||
log_game("Talisman Creation rune failed - no blank papers on rune")
|
||||
return
|
||||
if(rune_in_use)
|
||||
user << "<span class='cultitalic'>[src] can only support one ritual at a time!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>[src] can only support one ritual at a time!</span>")
|
||||
fail_invoke()
|
||||
log_game("Talisman Creation rune failed - already in use")
|
||||
return
|
||||
@@ -225,7 +225,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
return
|
||||
papers_on_rune = checkpapers()
|
||||
if(!papers_on_rune.len)
|
||||
user << "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>")
|
||||
fail_invoke()
|
||||
log_game("Talisman Creation rune failed - no blank papers on rune")
|
||||
return
|
||||
@@ -233,7 +233,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
..()
|
||||
visible_message("<span class='warning'>Dark power begins to channel into the paper!</span>")
|
||||
rune_in_use = 1
|
||||
if(!do_after(user, 100, target = paper_to_imbue))
|
||||
if(!do_after(user, initial(talisman_type.creation_time), target = paper_to_imbue))
|
||||
rune_in_use = 0
|
||||
return
|
||||
new talisman_type(get_turf(src))
|
||||
@@ -278,13 +278,13 @@ var/list/teleport_runes = list()
|
||||
potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
|
||||
|
||||
if(!potential_runes.len)
|
||||
user << "<span class='warning'>There are no valid runes to teleport to!</span>"
|
||||
to_chat(user, "<span class='warning'>There are no valid runes to teleport to!</span>")
|
||||
log_game("Teleport rune failed - no other teleport runes")
|
||||
fail_invoke()
|
||||
return
|
||||
|
||||
if(user.z > ZLEVEL_SPACEMAX)
|
||||
user << "<span class='cultitalic'>You are not in the right dimension!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You are not in the right dimension!</span>")
|
||||
log_game("Teleport rune failed - user in away mission")
|
||||
fail_invoke()
|
||||
return
|
||||
@@ -298,7 +298,7 @@ var/list/teleport_runes = list()
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/target = get_turf(actual_selected_rune)
|
||||
if(is_blocked_turf(target, TRUE))
|
||||
user << "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>"
|
||||
to_chat(user, "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>")
|
||||
fail_invoke()
|
||||
return
|
||||
var/movedsomething = 0
|
||||
@@ -314,7 +314,7 @@ var/list/teleport_runes = list()
|
||||
if(movedsomething)
|
||||
..()
|
||||
visible_message("<span class='warning'>There is a sharp crack of inrushing air, and everything above the rune disappears!</span>")
|
||||
user << "<span class='cult'>You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].</span>"
|
||||
to_chat(user, "<span class='cult'>You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].</span>")
|
||||
if(moveuserlater)
|
||||
user.forceMove(target)
|
||||
else
|
||||
@@ -376,12 +376,12 @@ var/list/teleport_runes = list()
|
||||
/obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers)
|
||||
if(invokers.len < 2)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>You need more invokers to convert [convertee]!</span>"
|
||||
to_chat(M, "<span class='warning'>You need more invokers to convert [convertee]!</span>")
|
||||
log_game("Offer rune failed - tried conversion with one invoker")
|
||||
return 0
|
||||
if(convertee.null_rod_check())
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>Something is shielding [convertee]'s mind!</span>"
|
||||
to_chat(M, "<span class='warning'>Something is shielding [convertee]'s mind!</span>")
|
||||
log_game("Offer rune failed - convertee had null rod")
|
||||
return 0
|
||||
var/brutedamage = convertee.getBruteLoss()
|
||||
@@ -395,16 +395,16 @@ var/list/teleport_runes = list()
|
||||
ticker.mode.add_cultist(convertee.mind, 1)
|
||||
new /obj/item/weapon/tome(get_turf(src))
|
||||
convertee.mind.special_role = "Cultist"
|
||||
convertee << "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
|
||||
and something evil takes root.</b></span>"
|
||||
convertee << "<span class='cultitalic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
|
||||
</b></span>"
|
||||
to_chat(convertee, "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
|
||||
and something evil takes root.</b></span>")
|
||||
to_chat(convertee, "<span class='cultitalic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
|
||||
</b></span>")
|
||||
return 1
|
||||
|
||||
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers)
|
||||
if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='cultitalic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>"
|
||||
to_chat(M, "<span class='cultitalic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>")
|
||||
log_game("Offer rune failed - not enough acolytes and target is living or sac target")
|
||||
return FALSE
|
||||
var/sacrifice_fulfilled = FALSE
|
||||
@@ -419,12 +419,12 @@ var/list/teleport_runes = list()
|
||||
new /obj/effect/overlay/temp/cult/sac(get_turf(src))
|
||||
for(var/M in invokers)
|
||||
if(sacrifice_fulfilled)
|
||||
M << "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>"
|
||||
to_chat(M, "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>")
|
||||
else
|
||||
if(ishuman(sacrificial) || iscyborg(sacrificial))
|
||||
M << "<span class='cultlarge'>\"I accept this sacrifice.\"</span>"
|
||||
to_chat(M, "<span class='cultlarge'>\"I accept this sacrifice.\"</span>")
|
||||
else
|
||||
M << "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>"
|
||||
to_chat(M, "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>")
|
||||
|
||||
var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
|
||||
if(sacrificial.mind)
|
||||
@@ -481,14 +481,14 @@ var/list/teleport_runes = list()
|
||||
|
||||
if(!cult_mode && !ignore_gamemode)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>Nar-Sie does not respond!</span>"
|
||||
to_chat(M, "<span class='warning'>Nar-Sie does not respond!</span>")
|
||||
fail_invoke()
|
||||
log_game("Summon Nar-Sie rune failed - gametype is not cult")
|
||||
return
|
||||
|
||||
if(locate(/obj/singularity/narsie) in poi_list)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>Nar-Sie is already on this plane!</span>"
|
||||
to_chat(M, "<span class='warning'>Nar-Sie is already on this plane!</span>")
|
||||
log_game("Summon Nar-Sie rune failed - already summoned")
|
||||
return
|
||||
//BEGIN THE SUMMONING
|
||||
@@ -533,7 +533,7 @@ var/list/teleport_runes = list()
|
||||
var/revive_number = 0
|
||||
if(sacrificed.len)
|
||||
revive_number = sacrificed.len - revives_used
|
||||
user << "<b>Revives Remaining:</b> [revive_number]"
|
||||
to_chat(user, "<b>Revives Remaining:</b> [revive_number]")
|
||||
|
||||
/obj/effect/rune/raise_dead/invoke(var/list/invokers)
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -546,12 +546,12 @@ var/list/teleport_runes = list()
|
||||
if(iscultist(M) && M.stat == DEAD)
|
||||
potential_revive_mobs |= M
|
||||
if(!potential_revive_mobs.len)
|
||||
user << "<span class='cultitalic'>There are no dead cultists on the rune!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>There are no dead cultists on the rune!</span>")
|
||||
log_game("Raise Dead rune failed - no corpses to revive")
|
||||
fail_invoke()
|
||||
return
|
||||
if(!sacrificed.len || sacrificed.len <= revives_used)
|
||||
user << "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>"
|
||||
to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
|
||||
fail_invoke()
|
||||
return
|
||||
if(potential_revive_mobs.len > 1)
|
||||
@@ -569,7 +569,7 @@ var/list/teleport_runes = list()
|
||||
revives_used++
|
||||
mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it!
|
||||
mob_to_revive.grab_ghost()
|
||||
mob_to_revive << "<span class='cultlarge'>\"PASNAR SAVRAE YAM'TOTH. Arise.\"</span>"
|
||||
to_chat(mob_to_revive, "<span class='cultlarge'>\"PASNAR SAVRAE YAM'TOTH. Arise.\"</span>")
|
||||
mob_to_revive.visible_message("<span class='warning'>[mob_to_revive] draws in a huge breath, red light shining from [mob_to_revive.p_their()] eyes.</span>", \
|
||||
"<span class='cultlarge'>You awaken suddenly from the void. You're alive!</span>")
|
||||
rune_in_use = 0
|
||||
@@ -584,18 +584,18 @@ var/list/teleport_runes = list()
|
||||
fail_invoke()
|
||||
return 0
|
||||
if(!(target_mob in T.contents))
|
||||
user << "<span class='cultitalic'>The cultist to revive has been moved!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>The cultist to revive has been moved!</span>")
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - revival target moved")
|
||||
return 0
|
||||
var/mob/dead/observer/ghost = target_mob.get_ghost(TRUE)
|
||||
if(!ghost && (!target_mob.mind || !target_mob.mind.active))
|
||||
user << "<span class='cultitalic'>The corpse to revive has no spirit!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>The corpse to revive has no spirit!</span>")
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - revival target has no ghost")
|
||||
return 0
|
||||
if(!sacrificed.len || sacrificed.len <= revives_used)
|
||||
user << "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>"
|
||||
to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - too few sacrificed")
|
||||
return 0
|
||||
@@ -625,16 +625,16 @@ var/list/teleport_runes = list()
|
||||
if(1 to 2)
|
||||
playsound(E, 'sound/items/Welder2.ogg', 25, 1)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>You feel a minute vibration pass through you...</span>"
|
||||
to_chat(M, "<span class='warning'>You feel a minute vibration pass through you...</span>")
|
||||
if(3 to 6)
|
||||
playsound(E, 'sound/magic/Disable_Tech.ogg', 50, 1)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='danger'>Your hair stands on end as a shockwave eminates from the rune!</span>"
|
||||
to_chat(M, "<span class='danger'>Your hair stands on end as a shockwave eminates from the rune!</span>")
|
||||
if(7 to INFINITY)
|
||||
playsound(E, 'sound/magic/Disable_Tech.ogg', 100, 1)
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
L << "<span class='userdanger'>You chant in unison and a colossal burst of energy knocks you backward!</span>"
|
||||
to_chat(L, "<span class='userdanger'>You chant in unison and a colossal burst of energy knocks you backward!</span>")
|
||||
L.Weaken(2)
|
||||
qdel(src) //delete before pulsing because it's a delay reee
|
||||
empulse(E, 9*invokers.len, 12*invokers.len) // Scales now, from a single room to most of the station depending on # of chanters
|
||||
@@ -653,16 +653,16 @@ var/list/teleport_runes = list()
|
||||
/obj/effect/rune/astral/examine(mob/user)
|
||||
..()
|
||||
if(affecting)
|
||||
user << "<span class='cultitalic'>A translucent field encases [user] above the rune!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>A translucent field encases [user] above the rune!</span>")
|
||||
|
||||
/obj/effect/rune/astral/can_invoke(mob/living/user)
|
||||
if(rune_in_use)
|
||||
user << "<span class='cultitalic'>[src] cannot support more than one body!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>[src] cannot support more than one body!</span>")
|
||||
log_game("Astral Communion rune failed - more than one user")
|
||||
return list()
|
||||
var/turf/T = get_turf(src)
|
||||
if(!(user in T))
|
||||
user << "<span class='cultitalic'>You must be standing on top of [src]!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You must be standing on top of [src]!</span>")
|
||||
log_game("Astral Communion rune failed - user not standing on rune")
|
||||
return list()
|
||||
return ..()
|
||||
@@ -699,13 +699,13 @@ var/list/teleport_runes = list()
|
||||
if(user.stat == UNCONSCIOUS)
|
||||
if(prob(1))
|
||||
var/mob/dead/observer/G = user.get_ghost()
|
||||
G << "<span class='cultitalic'>You feel the link between you and your body weakening... you must hurry!</span>"
|
||||
to_chat(G, "<span class='cultitalic'>You feel the link between you and your body weakening... you must hurry!</span>")
|
||||
if(user.stat == DEAD)
|
||||
user.color = initial(user.color)
|
||||
rune_in_use = 0
|
||||
affecting = null
|
||||
var/mob/dead/observer/G = user.get_ghost()
|
||||
G << "<span class='cultitalic'><b>You suddenly feel your physical form pass on. [src]'s exertion has killed you!</b></span>"
|
||||
to_chat(G, "<span class='cultitalic'><b>You suddenly feel your physical form pass on. [src]'s exertion has killed you!</b></span>")
|
||||
return
|
||||
sleep(1)
|
||||
rune_in_use = 0
|
||||
@@ -730,7 +730,7 @@ var/list/wall_runes = list()
|
||||
/obj/effect/rune/wall/examine(mob/user)
|
||||
..()
|
||||
if(density)
|
||||
user << "<span class='cultitalic'>There is a barely perceptible shimmering of the air above [src].</span>"
|
||||
to_chat(user, "<span class='cultitalic'>There is a barely perceptible shimmering of the air above [src].</span>")
|
||||
|
||||
/obj/effect/rune/wall/Destroy()
|
||||
density = 0
|
||||
@@ -813,22 +813,22 @@ var/list/wall_runes = list()
|
||||
if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
|
||||
return
|
||||
if(!cultist_to_summon)
|
||||
user << "<span class='cultitalic'>You require a summoning target!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You require a summoning target!</span>")
|
||||
fail_invoke()
|
||||
log_game("Summon Cultist rune failed - no target")
|
||||
return
|
||||
if(cultist_to_summon.stat == DEAD)
|
||||
user << "<span class='cultitalic'>[cultist_to_summon] has died!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>[cultist_to_summon] has died!</span>")
|
||||
fail_invoke()
|
||||
log_game("Summon Cultist rune failed - target died")
|
||||
return
|
||||
if(!iscultist(cultist_to_summon))
|
||||
user << "<span class='cultitalic'>[cultist_to_summon] is not a follower of the Geometer!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>[cultist_to_summon] is not a follower of the Geometer!</span>")
|
||||
fail_invoke()
|
||||
log_game("Summon Cultist rune failed - target was deconverted")
|
||||
return
|
||||
if(cultist_to_summon.z > ZLEVEL_SPACEMAX)
|
||||
user << "<span class='cultitalic'>[cultist_to_summon] is not in our dimension!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>[cultist_to_summon] is not in our dimension!</span>")
|
||||
fail_invoke()
|
||||
log_game("Summon Cultist rune failed - target in away mission")
|
||||
return
|
||||
@@ -847,6 +847,7 @@ var/list/wall_runes = list()
|
||||
invocation = "Dedo ol'btoh!"
|
||||
icon_state = "4"
|
||||
color = "#C80000"
|
||||
light_color = LIGHT_COLOR_LAVA
|
||||
req_cultists = 3
|
||||
construct_invoke = 0
|
||||
var/tick_damage = 25
|
||||
@@ -862,21 +863,21 @@ var/list/wall_runes = list()
|
||||
rune_in_use = TRUE
|
||||
var/turf/T = get_turf(src)
|
||||
visible_message("<span class='warning'>[src] turns a bright, glowing orange!</span>")
|
||||
SetLuminosity(6)
|
||||
set_light(6)
|
||||
color = "#FC9B54"
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
L.apply_damage(10, BRUTE, pick("l_arm", "r_arm"))
|
||||
L << "<span class='cultitalic'>[src] saps your strength!</span>"
|
||||
to_chat(L, "<span class='cultitalic'>[src] saps your strength!</span>")
|
||||
for(var/mob/living/L in viewers(T))
|
||||
if(!iscultist(L) && L.blood_volume)
|
||||
var/obj/item/weapon/nullrod/N = L.null_rod_check()
|
||||
if(N)
|
||||
L << "<span class='userdanger'>\The [N] suddenly burns hotly before returning to normal!</span>"
|
||||
to_chat(L, "<span class='userdanger'>\The [N] suddenly burns hotly before returning to normal!</span>")
|
||||
continue
|
||||
L << "<span class='cultlarge'>Your blood boils in your veins!</span>"
|
||||
to_chat(L, "<span class='cultlarge'>Your blood boils in your veins!</span>")
|
||||
if(is_servant_of_ratvar(L))
|
||||
L << "<span class='userdanger'>You feel an unholy darkness dimming the Justiciar's light!</span>"
|
||||
to_chat(L, "<span class='userdanger'>You feel an unholy darkness dimming the Justiciar's light!</span>")
|
||||
animate(src, color = "#FCB56D", time = 4)
|
||||
sleep(4)
|
||||
if(!src)
|
||||
@@ -923,7 +924,7 @@ var/list/wall_runes = list()
|
||||
if(M.stat != DEAD)
|
||||
potential_targets += M
|
||||
if(!potential_targets.len)
|
||||
user << "<span class='cultitalic'>There must be at least one valid target on the rune!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>There must be at least one valid target on the rune!</span>")
|
||||
log_game("Leeching rune failed - no valid targets")
|
||||
return list()
|
||||
return ..()
|
||||
@@ -938,7 +939,7 @@ var/list/wall_runes = list()
|
||||
var/drained_amount = rand(10,20)
|
||||
M.apply_damage(drained_amount, BRUTE, "chest")
|
||||
user.adjustBruteLoss(-drained_amount)
|
||||
M << "<span class='cultitalic'>You feel extremely weak.</span>"
|
||||
to_chat(M, "<span class='cultitalic'>You feel extremely weak.</span>")
|
||||
user.Beam(T,icon_state="drainbeam",time=5)
|
||||
user.visible_message("<span class='warning'>Blood flows from the rune into [user]!</span>", \
|
||||
"<span class='cult'>Blood flows into you, healing your wounds and revitalizing your spirit.</span>")
|
||||
@@ -959,7 +960,7 @@ var/list/wall_runes = list()
|
||||
|
||||
/obj/effect/rune/manifest/can_invoke(mob/living/user)
|
||||
if(!(user in get_turf(src)))
|
||||
user << "<span class='cultitalic'>You must be standing on [src]!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You must be standing on [src]!</span>")
|
||||
fail_invoke()
|
||||
log_game("Manifest rune failed - user not standing on rune")
|
||||
return list()
|
||||
@@ -968,7 +969,7 @@ var/list/wall_runes = list()
|
||||
if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
|
||||
ghosts_on_rune |= O
|
||||
if(!ghosts_on_rune.len)
|
||||
user << "<span class='cultitalic'>There are no spirits near [src]!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>There are no spirits near [src]!</span>")
|
||||
fail_invoke()
|
||||
log_game("Manifest rune failed - no nearby ghosts")
|
||||
return list()
|
||||
@@ -986,13 +987,13 @@ var/list/wall_runes = list()
|
||||
new_human.alpha = 150 //Makes them translucent
|
||||
..()
|
||||
visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a man.</span>")
|
||||
user << "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>"
|
||||
to_chat(user, "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>")
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/structure/emergency_shield/invoker/N = new(T)
|
||||
|
||||
new_human.key = ghost_to_spawn.key
|
||||
ticker.mode.add_cultist(new_human.mind, 0)
|
||||
new_human << "<span class='cultitalic'><b>You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs.</b></span>"
|
||||
to_chat(new_human, "<span class='cultitalic'><b>You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs.</b></span>")
|
||||
|
||||
while(user in T)
|
||||
if(user.stat)
|
||||
|
||||
@@ -4,18 +4,19 @@
|
||||
var/invocation = "Naise meam!"
|
||||
var/uses = 1
|
||||
var/health_cost = 0 //The amount of health taken from the user when invoking the talisman
|
||||
var/creation_time = 100 //how long it takes an imbue rune to make this type of talisman
|
||||
|
||||
/obj/item/weapon/paper/talisman/examine(mob/user)
|
||||
if(iscultist(user) || user.stat == DEAD)
|
||||
user << "<b>Name:</b> [cultist_name]"
|
||||
user << "<b>Effect:</b> [cultist_desc]"
|
||||
user << "<b>Uses Remaining:</b> [uses]"
|
||||
to_chat(user, "<b>Name:</b> [cultist_name]")
|
||||
to_chat(user, "<b>Effect:</b> [cultist_desc]")
|
||||
to_chat(user, "<b>Uses Remaining:</b> [uses]")
|
||||
else
|
||||
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
|
||||
/obj/item/weapon/paper/talisman/attack_self(mob/living/user)
|
||||
if(!iscultist(user))
|
||||
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
return
|
||||
if(invoke(user))
|
||||
uses--
|
||||
@@ -39,7 +40,7 @@
|
||||
invocation = "Ra'sha yoka!"
|
||||
|
||||
/obj/item/weapon/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1)
|
||||
user << "<span class='cultitalic'>You feel a pain in your head. The Geometer is displeased.</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You feel a pain in your head. The Geometer is displeased.</span>")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.apply_damage(10, BRUTE, "head")
|
||||
@@ -119,6 +120,7 @@
|
||||
color = "#551A8B" // purple
|
||||
invocation = "Sas'so c'arta forbici!"
|
||||
health_cost = 5
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1)
|
||||
var/list/potential_runes = list()
|
||||
@@ -128,12 +130,12 @@
|
||||
potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
|
||||
|
||||
if(!potential_runes.len)
|
||||
user << "<span class='warning'>There are no valid runes to teleport to!</span>"
|
||||
to_chat(user, "<span class='warning'>There are no valid runes to teleport to!</span>")
|
||||
log_game("Teleport talisman failed - no other teleport runes")
|
||||
return ..(user, 0)
|
||||
|
||||
if(user.z > ZLEVEL_SPACEMAX)
|
||||
user << "<span class='cultitalic'>You are not in the right dimension!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You are not in the right dimension!</span>")
|
||||
log_game("Teleport talisman failed - user in away mission")
|
||||
return ..(user, 0)
|
||||
|
||||
@@ -143,7 +145,7 @@
|
||||
return ..(user, 0)
|
||||
var/turf/target = get_turf(actual_selected_rune)
|
||||
if(is_blocked_turf(target, TRUE))
|
||||
user << "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>"
|
||||
to_chat(user, "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>")
|
||||
return ..(user, 0)
|
||||
user.visible_message("<span class='warning'>Dust flows from [user]'s hand, and [user.p_they()] disappear in a flash of red light!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman and find yourself somewhere else!</span>")
|
||||
@@ -157,6 +159,7 @@
|
||||
color = "#512727" // red-black
|
||||
invocation = "N'ath reth sh'yro eth d'raggathnor!"
|
||||
health_cost = 1
|
||||
creation_time = 30
|
||||
|
||||
/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
@@ -172,6 +175,7 @@
|
||||
color = "#9c9c9c" // grey
|
||||
invocation = "Kla'atu barada nikt'o!"
|
||||
health_cost = 1
|
||||
creation_time = 30
|
||||
uses = 2
|
||||
var/revealing = FALSE //if it reveals or not
|
||||
|
||||
@@ -196,6 +200,7 @@
|
||||
cultist_desc = "A talisman that will make nearby runes appear fake."
|
||||
color = "#ff80d5" // honk
|
||||
invocation = "By'o nar'nar!"
|
||||
creation_time = 20
|
||||
|
||||
/obj/item/weapon/paper/talisman/make_runes_fake/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
@@ -232,9 +237,9 @@
|
||||
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
|
||||
return ..()
|
||||
if(iscultist(user))
|
||||
user << "<span class='warning'>To use this talisman, attack the target directly.</span>"
|
||||
to_chat(user, "<span class='warning'>To use this talisman, attack the target directly.</span>")
|
||||
else
|
||||
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/stun/attack(mob/living/target, mob/living/user, successfuluse = 1)
|
||||
@@ -273,6 +278,7 @@
|
||||
cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to."
|
||||
color = "#33cc33" // green
|
||||
invocation = "N'ath reth sh'yro eth draggathnor!"
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
@@ -301,15 +307,16 @@
|
||||
cultist_desc = "A talisman that will break the mind of the victim with nightmarish hallucinations."
|
||||
color = "#ffb366" // light orange
|
||||
invocation = "Lo'Nab Na'Dm!"
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/horror/attack(mob/living/target, mob/living/user)
|
||||
if(iscultist(user))
|
||||
user << "<span class='cultitalic'>You disturb [target] with visons of the end!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>You disturb [target] with visons of the end!</span>")
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/H = target
|
||||
H.reagents.add_reagent("mindbreaker", 25)
|
||||
if(is_servant_of_ratvar(target))
|
||||
target << "<span class='userdanger'>You see a brief but horrible vision of Ratvar, rusted and scrapped, being torn apart.</span>"
|
||||
to_chat(target, "<span class='userdanger'>You see a brief but horrible vision of Ratvar, rusted and scrapped, being torn apart.</span>")
|
||||
target.emote("scream")
|
||||
target.confused = max(0, target.confused + 3)
|
||||
target.flash_act()
|
||||
@@ -323,17 +330,18 @@
|
||||
invocation = "Ethra p'ni dedol!"
|
||||
color = "#000000" // black
|
||||
uses = 25
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/attack_self(mob/living/user)
|
||||
if(iscultist(user))
|
||||
user << "<span class='warning'>To use this talisman, place it upon a stack of metal sheets.</span>"
|
||||
to_chat(user, "<span class='warning'>To use this talisman, place it upon a stack of metal sheets.</span>")
|
||||
else
|
||||
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/attack(obj/M,mob/living/user)
|
||||
if(iscultist(user))
|
||||
user << "<span class='cultitalic'>This talisman will only work on a stack of metal or plasteel sheets!</span>"
|
||||
to_chat(user, "<span class='cultitalic'>This talisman will only work on a stack of metal or plasteel sheets!</span>")
|
||||
log_game("Construct talisman failed - not a valid target")
|
||||
else
|
||||
..()
|
||||
@@ -345,24 +353,24 @@
|
||||
if(istype(target, /obj/item/stack/sheet/metal))
|
||||
if(target.use(25))
|
||||
new /obj/structure/constructshell(T)
|
||||
user << "<span class='warning'>The talisman clings to the metal and twists it into a construct shell!</span>"
|
||||
to_chat(user, "<span class='warning'>The talisman clings to the metal and twists it into a construct shell!</span>")
|
||||
user << sound('sound/effects/magic.ogg',0,1,25)
|
||||
invoke(user, 1)
|
||||
qdel(src)
|
||||
else
|
||||
user << "<span class='warning'>You need more metal to produce a construct shell!</span>"
|
||||
to_chat(user, "<span class='warning'>You need more metal to produce a construct shell!</span>")
|
||||
else if(istype(target, /obj/item/stack/sheet/plasteel))
|
||||
var/quantity = min(target.amount, uses)
|
||||
uses -= quantity
|
||||
new /obj/item/stack/sheet/runed_metal(T,quantity)
|
||||
target.use(quantity)
|
||||
user << "<span class='warning'>The talisman clings to the plasteel, transforming it into runed metal!</span>"
|
||||
to_chat(user, "<span class='warning'>The talisman clings to the plasteel, transforming it into runed metal!</span>")
|
||||
user << sound('sound/effects/magic.ogg',0,1,25)
|
||||
invoke(user, 1)
|
||||
if(uses <= 0)
|
||||
qdel(src)
|
||||
else
|
||||
user << "<span class='warning'>The talisman must be used on metal or plasteel!</span>"
|
||||
to_chat(user, "<span class='warning'>The talisman must be used on metal or plasteel!</span>")
|
||||
|
||||
|
||||
//Talisman of Shackling: Applies special cuffs directly from the talisman
|
||||
@@ -377,9 +385,9 @@
|
||||
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
|
||||
return ..()
|
||||
if(iscultist(user))
|
||||
user << "<span class='warning'>To use this talisman, attack the target directly.</span>"
|
||||
to_chat(user, "<span class='warning'>To use this talisman, attack the target directly.</span>")
|
||||
else
|
||||
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user)
|
||||
@@ -401,15 +409,15 @@
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/cult/used(C)
|
||||
C.update_handcuffed()
|
||||
user << "<span class='notice'>You shackle [C].</span>"
|
||||
to_chat(user, "<span class='notice'>You shackle [C].</span>")
|
||||
add_logs(user, C, "handcuffed")
|
||||
uses--
|
||||
else
|
||||
user << "<span class='warning'>[C] is already bound.</span>"
|
||||
to_chat(user, "<span class='warning'>[C] is already bound.</span>")
|
||||
else
|
||||
user << "<span class='warning'>You fail to shackle [C].</span>"
|
||||
to_chat(user, "<span class='warning'>You fail to shackle [C].</span>")
|
||||
else
|
||||
user << "<span class='warning'>[C] is already bound.</span>"
|
||||
to_chat(user, "<span class='warning'>[C] is already bound.</span>")
|
||||
if(uses <= 0)
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
/datum/game_mode/devil/post_setup()
|
||||
for(var/datum/mind/devil in devils)
|
||||
spawn(rand(10,100))
|
||||
finalize_devil(devil, objective_count)
|
||||
finalize_devil(devil, TRUE)
|
||||
spawn(100)
|
||||
add_devil_objectives(devil, objective_count) //This has to be in a separate loop, as we need devil names to be generated before we give objectives in devil agent.
|
||||
devil.announceDevilLaws()
|
||||
|
||||
@@ -94,6 +94,7 @@ var/global/list/lawlorify = list (
|
||||
/obj/effect/proc_holder/spell/targeted/summon_contract,
|
||||
/obj/effect/proc_holder/spell/targeted/conjure_item/violin,
|
||||
/obj/effect/proc_holder/spell/targeted/summon_dancefloor)
|
||||
var/ascendable = FALSE
|
||||
|
||||
|
||||
/datum/devilinfo/New()
|
||||
@@ -156,11 +157,11 @@ var/global/list/lawlorify = list (
|
||||
return
|
||||
soulsOwned += soul
|
||||
owner.current.nutrition = NUTRITION_LEVEL_FULL
|
||||
owner.current << "<span class='warning'>You feel satiated as you received a new soul.</span>"
|
||||
to_chat(owner.current, "<span class='warning'>You feel satiated as you received a new soul.</span>")
|
||||
update_hud()
|
||||
switch(SOULVALUE)
|
||||
if(0)
|
||||
owner.current << "<span class='warning'>Your hellish powers have been restored."
|
||||
to_chat(owner.current, "<span class='warning'>Your hellish powers have been restored.")
|
||||
give_base_spells()
|
||||
if(BLOOD_THRESHOLD)
|
||||
increase_blood_lizard()
|
||||
@@ -172,7 +173,7 @@ var/global/list/lawlorify = list (
|
||||
/datum/devilinfo/proc/remove_soul(datum/mind/soul)
|
||||
if(soulsOwned.Remove(soul))
|
||||
check_regression()
|
||||
owner.current << "<span class='warning'>You feel as though a soul has slipped from your grasp.</span>"
|
||||
to_chat(owner.current, "<span class='warning'>You feel as though a soul has slipped from your grasp.</span>")
|
||||
update_hud()
|
||||
|
||||
/datum/devilinfo/proc/check_regression()
|
||||
@@ -185,19 +186,10 @@ var/global/list/lawlorify = list (
|
||||
regress_humanoid()
|
||||
if(SOULVALUE < 0)
|
||||
remove_spells()
|
||||
owner.current << "<span class='warning'>As punishment for your failures, all of your powers except contract creation have been revoked."
|
||||
|
||||
/datum/devilinfo/proc/increase_form()
|
||||
switch(form)
|
||||
if(BASIC_DEVIL)
|
||||
increase_blood_lizard()
|
||||
if(BLOOD_LIZARD)
|
||||
increase_true_devil()
|
||||
if(TRUE_DEVIL)
|
||||
increase_arch_devil()
|
||||
to_chat(owner.current, "<span class='warning'>As punishment for your failures, all of your powers except contract creation have been revoked.")
|
||||
|
||||
/datum/devilinfo/proc/regress_humanoid()
|
||||
owner.current << "<span class='warning'>Your powers weaken, have more contracts be signed to regain power."
|
||||
to_chat(owner.current, "<span class='warning'>Your powers weaken, have more contracts be signed to regain power.")
|
||||
if(ishuman(owner.current))
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
H.set_species(/datum/species/human, 1)
|
||||
@@ -209,7 +201,7 @@ var/global/list/lawlorify = list (
|
||||
|
||||
/datum/devilinfo/proc/regress_blood_lizard()
|
||||
var/mob/living/carbon/true_devil/D = owner.current
|
||||
D << "<span class='warning'>Your powers weaken, have more contracts be signed to regain power."
|
||||
to_chat(D, "<span class='warning'>Your powers weaken, have more contracts be signed to regain power.")
|
||||
D.oldform.loc = D.loc
|
||||
owner.transfer_to(D.oldform)
|
||||
give_lizard_spells()
|
||||
@@ -219,7 +211,7 @@ var/global/list/lawlorify = list (
|
||||
|
||||
|
||||
/datum/devilinfo/proc/increase_blood_lizard()
|
||||
owner.current << "<span class='warning'>You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard."
|
||||
to_chat(owner.current, "<span class='warning'>You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard.")
|
||||
sleep(50)
|
||||
if(ishuman(owner.current))
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
@@ -237,7 +229,7 @@ var/global/list/lawlorify = list (
|
||||
|
||||
|
||||
/datum/devilinfo/proc/increase_true_devil()
|
||||
owner.current << "<span class='warning'>You feel as though your current form is about to shed. You will soon turn into a true devil."
|
||||
to_chat(owner.current, "<span class='warning'>You feel as though your current form is about to shed. You will soon turn into a true devil.")
|
||||
sleep(50)
|
||||
var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(owner.current.loc)
|
||||
A.faction |= "hell"
|
||||
@@ -251,8 +243,10 @@ var/global/list/lawlorify = list (
|
||||
|
||||
|
||||
/datum/devilinfo/proc/increase_arch_devil()
|
||||
if(!ascendable)
|
||||
return
|
||||
var/mob/living/carbon/true_devil/D = owner.current
|
||||
D << "<span class='warning'>You feel as though your form is about to ascend."
|
||||
to_chat(D, "<span class='warning'>You feel as though your form is about to ascend.")
|
||||
sleep(50)
|
||||
if(!D)
|
||||
return
|
||||
@@ -271,19 +265,19 @@ var/global/list/lawlorify = list (
|
||||
sleep(40)
|
||||
if(!D)
|
||||
return
|
||||
D << "<i><b>Yes!</b></i>"
|
||||
to_chat(D, "<i><b>Yes!</b></i>")
|
||||
sleep(10)
|
||||
if(!D)
|
||||
return
|
||||
D << "<i><b><span class='big'>YES!!</span></b></i>"
|
||||
to_chat(D, "<i><b><span class='big'>YES!!</span></b></i>")
|
||||
sleep(10)
|
||||
if(!D)
|
||||
return
|
||||
D << "<i><b><span class='reallybig'>YE--</span></b></i>"
|
||||
to_chat(D, "<i><b><span class='reallybig'>YE--</span></b></i>")
|
||||
sleep(1)
|
||||
if(!D)
|
||||
return
|
||||
world << "<font size=5><span class='danger'><b>\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"</font></span>"
|
||||
to_chat(world, "<font size=5><span class='danger'><b>\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"</font></span>")
|
||||
world << 'sound/hallucinations/veryfar_noise.ogg'
|
||||
give_arch_spells()
|
||||
D.convert_to_archdevil()
|
||||
@@ -339,23 +333,23 @@ var/global/list/lawlorify = list (
|
||||
|
||||
/datum/devilinfo/proc/beginResurrectionCheck(mob/living/body)
|
||||
if(SOULVALUE>0)
|
||||
owner.current<< "<span class='userdanger'>Your body has been damaged to the point that you may no longer use it. At the cost of some of your power, you will return to life soon. Remain in your body.</span>"
|
||||
to_chat(owner.current, "<span class='userdanger'>Your body has been damaged to the point that you may no longer use it. At the cost of some of your power, you will return to life soon. Remain in your body.</span>")
|
||||
sleep(DEVILRESURRECTTIME)
|
||||
if (!body || body.stat == DEAD)
|
||||
if(SOULVALUE>0)
|
||||
if(check_banishment(body))
|
||||
owner.current<< "<span class='userdanger'>Unfortunately, the mortals have finished a ritual that prevents your resurrection.</span>"
|
||||
to_chat(owner.current, "<span class='userdanger'>Unfortunately, the mortals have finished a ritual that prevents your resurrection.</span>")
|
||||
return -1
|
||||
else
|
||||
owner.current<< "<span class='userdanger'>WE LIVE AGAIN!</span>"
|
||||
to_chat(owner.current, "<span class='userdanger'>WE LIVE AGAIN!</span>")
|
||||
return hellish_resurrection(body)
|
||||
else
|
||||
owner.current<< "<span class='userdanger'>Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect.</span>"
|
||||
to_chat(owner.current, "<span class='userdanger'>Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect.</span>")
|
||||
return -1
|
||||
else
|
||||
owner.current << "<span class='danger'> You seem to have resurrected without your hellish powers.</span>"
|
||||
to_chat(owner.current, "<span class='danger'> You seem to have resurrected without your hellish powers.</span>")
|
||||
else
|
||||
owner.current << "<span class='userdanger'>Your hellish powers are too weak to resurrect yourself.</span>"
|
||||
to_chat(owner.current, "<span class='userdanger'>Your hellish powers are too weak to resurrect yourself.</span>")
|
||||
|
||||
/datum/devilinfo/proc/check_banishment(mob/living/body)
|
||||
switch(banish)
|
||||
@@ -403,7 +397,7 @@ var/global/list/lawlorify = list (
|
||||
|
||||
/datum/devilinfo/proc/hellish_resurrection(mob/living/body)
|
||||
message_admins("[owner.name] (true name is: [truename]) is resurrecting using hellish energy.</a>")
|
||||
if(SOULVALUE <= ARCH_THRESHOLD) // once ascended, arch devils do not go down in power by any means.
|
||||
if(SOULVALUE < ARCH_THRESHOLD && ascendable) // once ascended, arch devils do not go down in power by any means.
|
||||
reviveNumber += LOSS_PER_DEATH
|
||||
update_hud()
|
||||
if(body)
|
||||
@@ -414,41 +408,50 @@ var/global/list/lawlorify = list (
|
||||
var/mob/living/carbon/true_devil/D = body
|
||||
if(D.oldform)
|
||||
D.oldform.revive(1,0) // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body.
|
||||
if(body.stat == DEAD)
|
||||
create_new_body()
|
||||
else
|
||||
if(blobstart.len > 0)
|
||||
var/turf/targetturf = get_turf(pick(blobstart))
|
||||
var/mob/currentMob = owner.current
|
||||
if(!currentMob)
|
||||
currentMob = owner.get_ghost()
|
||||
if(!currentMob)
|
||||
message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.")
|
||||
return -1 //
|
||||
if(currentMob.mind != owner)
|
||||
message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.")
|
||||
return -1
|
||||
currentMob.change_mob_type( /mob/living/carbon/human , targetturf, null, 1)
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
give_summon_contract()
|
||||
if(SOULVALUE >= BLOOD_THRESHOLD)
|
||||
H.set_species(/datum/species/lizard, 1)
|
||||
H.underwear = "Nude"
|
||||
H.undershirt = "Nude"
|
||||
H.socks = "Nude"
|
||||
H.dna.features["mcolor"] = "511"
|
||||
H.regenerate_icons()
|
||||
if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough.
|
||||
var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf)
|
||||
A.faction |= "hell"
|
||||
H.forceMove(A)
|
||||
A.oldform = H
|
||||
A.set_name()
|
||||
owner.transfer_to(A)
|
||||
if(SOULVALUE >= ARCH_THRESHOLD)
|
||||
A.convert_to_archdevil()
|
||||
else
|
||||
throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
|
||||
create_new_body()
|
||||
check_regression()
|
||||
|
||||
/datum/devilinfo/proc/create_new_body()
|
||||
if(blobstart.len > 0)
|
||||
var/turf/targetturf = get_turf(pick(blobstart))
|
||||
var/mob/currentMob = owner.current
|
||||
if(!currentMob)
|
||||
currentMob = owner.get_ghost()
|
||||
if(!currentMob)
|
||||
message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.")
|
||||
return -1
|
||||
if(currentMob.mind != owner)
|
||||
message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.")
|
||||
return -1
|
||||
currentMob.change_mob_type( /mob/living/carbon/human, targetturf, null, 1)
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_hands)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_l_store)
|
||||
if(SOULVALUE >= BLOOD_THRESHOLD)
|
||||
H.set_species(/datum/species/lizard, 1)
|
||||
H.underwear = "Nude"
|
||||
H.undershirt = "Nude"
|
||||
H.socks = "Nude"
|
||||
H.dna.features["mcolor"] = "511"
|
||||
H.regenerate_icons()
|
||||
if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough.
|
||||
var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf)
|
||||
A.faction |= "hell"
|
||||
H.forceMove(A)
|
||||
A.oldform = H
|
||||
A.set_name()
|
||||
owner.transfer_to(A)
|
||||
if(SOULVALUE >= ARCH_THRESHOLD && ascendable)
|
||||
A.convert_to_archdevil()
|
||||
else
|
||||
throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
|
||||
|
||||
|
||||
/datum/devilinfo/proc/update_hud()
|
||||
if(istype(owner.current, /mob/living/carbon))
|
||||
var/mob/living/C = owner.current
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
text += printobjectives(sintouched_mind)
|
||||
text += "<br>"
|
||||
text += "<br>"
|
||||
world << text
|
||||
to_chat(world, text)
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_devils()
|
||||
/var/text = ""
|
||||
@@ -27,14 +27,15 @@
|
||||
text += printobjectives(devil)
|
||||
text += "<br>"
|
||||
text += "<br>"
|
||||
world << text
|
||||
to_chat(world, text)
|
||||
|
||||
|
||||
/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind)
|
||||
/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind, ascendable = FALSE)
|
||||
|
||||
var/trueName= randomDevilName()
|
||||
|
||||
devil_mind.devilinfo = devilInfo(trueName, 1)
|
||||
devil_mind.devilinfo.ascendable = ascendable
|
||||
devil_mind.store_memory("Your devilic true name is [devil_mind.devilinfo.truename]<br>[lawlorify[LAW][devil_mind.devilinfo.ban]]<br>You may not use violence to coerce someone into selling their soul.<br>You may not directly and knowingly physically harm a devil, other than yourself.<br>[lawlorify[LAW][devil_mind.devilinfo.bane]]<br>[lawlorify[LAW][devil_mind.devilinfo.obligation]]<br>[lawlorify[LAW][devil_mind.devilinfo.banish]]<br>")
|
||||
devil_mind.devilinfo.owner = devil_mind
|
||||
devil_mind.devilinfo.give_base_spells(1)
|
||||
@@ -42,7 +43,7 @@
|
||||
devil_mind.devilinfo.update_hud()
|
||||
if(devil_mind.assigned_role == "Clown" && ishuman(devil_mind.current))
|
||||
var/mob/living/carbon/human/S = devil_mind.current
|
||||
S << "<span class='notice'>Your infernal nature has allowed you to overcome your clownishness.</span>"
|
||||
to_chat(S, "<span class='notice'>Your infernal nature has allowed you to overcome your clownishness.</span>")
|
||||
S.dna.remove_mutation(CLOWNMUT)
|
||||
if(issilicon(devil_mind.current))
|
||||
add_law_sixsixsix(devil_mind.current)
|
||||
@@ -62,15 +63,15 @@
|
||||
/datum/mind/proc/announceDevilLaws()
|
||||
if(!devilinfo)
|
||||
return
|
||||
current << "<span class='warning'><b>You remember your link to the infernal. You are [src.devilinfo.truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.</b></span>"
|
||||
current << "<span class='warning'><b>However, your infernal form is not without weaknesses.</b></span>"
|
||||
current << "You may not use violence to coerce someone into selling their soul."
|
||||
current << "You may not directly and knowingly physically harm a devil, other than yourself."
|
||||
current << lawlorify[LAW][src.devilinfo.bane]
|
||||
current << lawlorify[LAW][src.devilinfo.ban]
|
||||
current << lawlorify[LAW][src.devilinfo.obligation]
|
||||
current << lawlorify[LAW][src.devilinfo.banish]
|
||||
current << "<br/><br/><span class='warning'>Remember, the crew can research your weaknesses if they find out your devil name.</span><br>"
|
||||
to_chat(current, "<span class='warning'><b>You remember your link to the infernal. You are [src.devilinfo.truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.</b></span>")
|
||||
to_chat(current, "<span class='warning'><b>However, your infernal form is not without weaknesses.</b></span>")
|
||||
to_chat(current, "You may not use violence to coerce someone into selling their soul.")
|
||||
to_chat(current, "You may not directly and knowingly physically harm a devil, other than yourself.")
|
||||
to_chat(current, lawlorify[LAW][src.devilinfo.bane])
|
||||
to_chat(current, lawlorify[LAW][src.devilinfo.ban])
|
||||
to_chat(current, lawlorify[LAW][src.devilinfo.obligation])
|
||||
to_chat(current, lawlorify[LAW][src.devilinfo.banish])
|
||||
to_chat(current, "<br/><br/><span class='warning'>Remember, the crew can research your weaknesses if they find out your devil name.</span><br>")
|
||||
|
||||
/datum/game_mode/proc/printdevilinfo(datum/mind/ply)
|
||||
if(!ply.devilinfo)
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \
|
||||
of intentionally harming a fellow devil.</B>"
|
||||
|
||||
/mob/living/simple_animal/imp/New()
|
||||
/mob/living/simple_animal/imp/Initialize()
|
||||
..()
|
||||
boost = world.time + 30
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/true_devil/New()
|
||||
/mob/living/carbon/true_devil/Initialize()
|
||||
create_bodyparts() //initialize bodyparts
|
||||
|
||||
create_internal_organs()
|
||||
@@ -87,7 +87,7 @@
|
||||
else if(health < (maxHealth/2))
|
||||
msg += "<span class='warning'>You can see hellfire inside its wounds.</span>\n"
|
||||
msg += "*---------*</span>"
|
||||
user << msg
|
||||
to_chat(user, msg)
|
||||
|
||||
|
||||
/mob/living/carbon/true_devil/IsAdvancedToolUser()
|
||||
@@ -151,8 +151,8 @@
|
||||
var/datum/objective/newobjective = new
|
||||
newobjective.explanation_text = "Try to get a promotion to a higher devilic rank."
|
||||
S.mind.objectives += newobjective
|
||||
S << S.playstyle_string
|
||||
S << "<B>Objective #[1]</B>: [newobjective.explanation_text]"
|
||||
to_chat(S, S.playstyle_string)
|
||||
to_chat(S, "<B>Objective #[1]</B>: [newobjective.explanation_text]")
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -46,14 +46,14 @@
|
||||
|
||||
|
||||
/datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description.
|
||||
world << "<b>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>"
|
||||
world << "<b>[announce_text]</b>"
|
||||
to_chat(world, "<b>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>")
|
||||
to_chat(world, "<b>[announce_text]</b>")
|
||||
|
||||
|
||||
///Checks to see if the game can be setup and ran with the current number of players or whatnot.
|
||||
/datum/game_mode/proc/can_start()
|
||||
var/playerC = 0
|
||||
for(var/mob/new_player/player in player_list)
|
||||
for(var/mob/dead/new_player/player in player_list)
|
||||
if((player.client)&&(player.ready))
|
||||
playerC++
|
||||
if(!Debug2)
|
||||
@@ -103,7 +103,7 @@
|
||||
return
|
||||
|
||||
|
||||
///Allows rounds to basically be "rerolled" should the initial premise fall through
|
||||
///Allows rounds to basically be "rerolled" should the initial premise fall through. Also known as mulligan antags.
|
||||
/datum/game_mode/proc/convert_roundtype()
|
||||
var/list/living_crew = list()
|
||||
|
||||
@@ -156,9 +156,9 @@
|
||||
if(config.protect_assistant_from_antagonist)
|
||||
replacementmode.restricted_jobs += "Assistant"
|
||||
|
||||
message_admins("The roundtype will be converted. If you have other plans for the station or think the round should end <A HREF='?_src_=holder;toggle_midround_antag=\ref[usr]'>stop the creation of antags</A> or <A HREF='?_src_=holder;end_round=\ref[usr]'>end the round now</A>.")
|
||||
message_admins("The roundtype will be converted. If you have other plans for the station or feel the station is too messed up to inhabit <A HREF='?_src_=holder;toggle_midround_antag=\ref[usr]'>stop the creation of antags</A> or <A HREF='?_src_=holder;end_round=\ref[usr]'>end the round now</A>.")
|
||||
|
||||
spawn(rand(1200,3000)) //somewhere between 2 and 5 minutes from now
|
||||
spawn(rand(600,1800)) //somewhere between 1 and 3 minutes from now
|
||||
if(!config.midround_antag[ticker.mode.config_tag])
|
||||
round_converted = 0
|
||||
return 1
|
||||
@@ -289,7 +289,7 @@
|
||||
G.on_report()
|
||||
intercepttext += G.get_report()
|
||||
|
||||
print_command_report(intercepttext, "Central Command Status Summary")
|
||||
print_command_report(intercepttext, "Central Command Status Summary", announce=FALSE)
|
||||
priority_announce("A summary has been copied and printed to all communications consoles.", "Enemy communication intercepted. Security level elevated.", 'sound/AI/intercept.ogg')
|
||||
if(security_level < SEC_LEVEL_BLUE)
|
||||
set_security_level(SEC_LEVEL_BLUE)
|
||||
@@ -302,7 +302,7 @@
|
||||
var/datum/mind/applicant = null
|
||||
|
||||
// Ultimate randomizing code right here
|
||||
for(var/mob/new_player/player in player_list)
|
||||
for(var/mob/dead/new_player/player in player_list)
|
||||
if(player.client && player.ready)
|
||||
players += player
|
||||
|
||||
@@ -310,7 +310,7 @@
|
||||
// Goodbye antag dante
|
||||
players = shuffle(players)
|
||||
|
||||
for(var/mob/new_player/player in players)
|
||||
for(var/mob/dead/new_player/player in players)
|
||||
if(player.client && player.ready)
|
||||
if(role in player.client.prefs.be_special)
|
||||
if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
|
||||
@@ -324,7 +324,7 @@
|
||||
candidates -= player
|
||||
|
||||
if(candidates.len < recommended_enemies)
|
||||
for(var/mob/new_player/player in players)
|
||||
for(var/mob/dead/new_player/player in players)
|
||||
if(player.client && player.ready)
|
||||
if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a seperate list of people who don't want to be one
|
||||
if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
|
||||
@@ -349,7 +349,7 @@
|
||||
break
|
||||
/*
|
||||
if(candidates.len < recommended_enemies && override_jobbans) //If we still don't have enough people, we're going to start drafting banned people.
|
||||
for(var/mob/new_player/player in players)
|
||||
for(var/mob/dead/new_player/player in players)
|
||||
if (player.client && player.ready)
|
||||
if(jobban_isbanned(player, "Syndicate") || jobban_isbanned(player, roletext)) //Nodrak/Carn: Antag Job-bans
|
||||
drafted += player.mind
|
||||
@@ -377,7 +377,7 @@
|
||||
// Less if there are not enough valid players in the game entirely to make recommended_enemies.
|
||||
|
||||
/*
|
||||
/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/new_player/player)
|
||||
/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/dead/new_player/player)
|
||||
if(player.preferences.be_special & role)
|
||||
return 1
|
||||
return 0
|
||||
@@ -385,7 +385,7 @@
|
||||
|
||||
/datum/game_mode/proc/num_players()
|
||||
. = 0
|
||||
for(var/mob/new_player/P in player_list)
|
||||
for(var/mob/dead/new_player/P in player_list)
|
||||
if(P.client && P.ready)
|
||||
. ++
|
||||
|
||||
@@ -479,7 +479,7 @@
|
||||
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.client && M.client.holder)
|
||||
M << msg
|
||||
to_chat(M, msg)
|
||||
|
||||
/datum/game_mode/proc/printplayer(datum/mind/ply, fleecheck)
|
||||
var/text = "<br><b>[ply.key]</b> was <b>[ply.name]</b> the <b>[ply.assigned_role]</b> and"
|
||||
@@ -531,7 +531,7 @@
|
||||
var/mob/dead/observer/theghost = null
|
||||
if(candidates.len)
|
||||
theghost = pick(candidates)
|
||||
M << "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!"
|
||||
to_chat(M, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!")
|
||||
message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)]) to replace a jobbaned player.")
|
||||
M.ghostize(0)
|
||||
M.key = theghost.key
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
/obj/machinery/dominator/New()
|
||||
..()
|
||||
SetLuminosity(2)
|
||||
set_light(2)
|
||||
poi_list |= src
|
||||
spark_system = new
|
||||
spark_system.set_up(5, 1, src)
|
||||
@@ -36,12 +36,12 @@
|
||||
if(gang && gang.is_dominating)
|
||||
time = gang.domination_time_remaining()
|
||||
if(time > 0)
|
||||
user << "<span class='notice'>Hostile Takeover in progress. Estimated [time] seconds remain.</span>"
|
||||
to_chat(user, "<span class='notice'>Hostile Takeover in progress. Estimated [time] seconds remain.</span>")
|
||||
else
|
||||
user << "<span class='notice'>Hostile Takeover of [station_name()] successful. Have a great day.</span>"
|
||||
to_chat(user, "<span class='notice'>Hostile Takeover of [station_name()] successful. Have a great day.</span>")
|
||||
else
|
||||
user << "<span class='notice'>System on standby.</span>"
|
||||
user << "<span class='danger'>System Integrity: [round((obj_integrity/max_integrity)*100,1)]%</span>"
|
||||
to_chat(user, "<span class='notice'>System on standby.</span>")
|
||||
to_chat(user, "<span class='danger'>System Integrity: [round((obj_integrity/max_integrity)*100,1)]%</span>")
|
||||
|
||||
/obj/machinery/dominator/process()
|
||||
..()
|
||||
@@ -117,7 +117,7 @@
|
||||
|
||||
gang.message_gangtools("Hostile takeover cancelled: Dominator is no longer operational.[gang.dom_attempts ? " You have [gang.dom_attempts] attempt remaining." : " The station network will have likely blocked any more attempts by us."]",1,1)
|
||||
|
||||
SetLuminosity(0)
|
||||
set_light(0)
|
||||
icon_state = "dominator-broken"
|
||||
cut_overlays()
|
||||
operating = 0
|
||||
@@ -153,11 +153,11 @@
|
||||
return
|
||||
|
||||
if(tempgang.is_dominating)
|
||||
user << "<span class='warning'>Error: Hostile Takeover is already in progress.</span>"
|
||||
to_chat(user, "<span class='warning'>Error: Hostile Takeover is already in progress.</span>")
|
||||
return
|
||||
|
||||
if(!tempgang.dom_attempts)
|
||||
user << "<span class='warning'>Error: Unable to breach station network. Firewall has logged our signature and is blocking all further attempts.</span>"
|
||||
to_chat(user, "<span class='warning'>Error: Unable to breach station network. Firewall has logged our signature and is blocking all further attempts.</span>")
|
||||
return
|
||||
|
||||
var/time = round(determine_domination_time(tempgang)/60,0.1)
|
||||
@@ -180,14 +180,10 @@
|
||||
countdown.color = gang.color_hex
|
||||
countdown.start()
|
||||
|
||||
SetLuminosity(3)
|
||||
set_light(3)
|
||||
START_PROCESSING(SSmachine, src)
|
||||
|
||||
gang.message_gangtools("Hostile takeover in progress: Estimated [time] minutes until victory.[gang.dom_attempts ? "" : " This is your final attempt."]")
|
||||
for(var/datum/gang/G in ticker.mode.gangs)
|
||||
if(G != gang)
|
||||
G.message_gangtools("Enemy takeover attempt detected in [locname]: Estimated [time] minutes until our defeat.",1,1)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
|
||||
|
||||
/datum/game_mode/proc/greet_gang(datum/mind/boss_mind, you_are=1)
|
||||
if (you_are)
|
||||
boss_mind.current << "<FONT size=3 color=red><B>You are the Boss of the [boss_mind.gang_datum.name] Gang!</B></FONT>"
|
||||
to_chat(boss_mind.current, "<FONT size=3 color=red><B>You are the Boss of the [boss_mind.gang_datum.name] Gang!</B></FONT>")
|
||||
boss_mind.announce_objectives()
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@@ -104,7 +104,7 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
|
||||
|
||||
if (mob.mind)
|
||||
if (mob.mind.assigned_role == "Clown")
|
||||
mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
|
||||
to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
|
||||
mob.dna.remove_mutation(CLOWNMUT)
|
||||
|
||||
var/obj/item/device/gangtool/gangtool = new(mob)
|
||||
@@ -122,33 +122,33 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
|
||||
|
||||
var/where = mob.equip_in_one_of_slots(gangtool, slots)
|
||||
if (!where)
|
||||
mob << "Your Syndicate benefactors were unfortunately unable to get you a Gangtool."
|
||||
to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a Gangtool.")
|
||||
. += 1
|
||||
else
|
||||
gangtool.register_device(mob)
|
||||
mob << "The <b>Gangtool</b> in your [where] will allow you to purchase weapons and equipment, send messages to your gang, and recall the emergency shuttle from anywhere on the station."
|
||||
mob << "As the gang boss, you can also promote your gang members to <b>lieutenant</b>. Unlike regular gangsters, Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools."
|
||||
to_chat(mob, "The <b>Gangtool</b> in your [where] will allow you to purchase weapons and equipment, send messages to your gang, and recall the emergency shuttle from anywhere on the station.")
|
||||
to_chat(mob, "As the gang boss, you can also promote your gang members to <b>lieutenant</b>. Unlike regular gangsters, Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools.")
|
||||
|
||||
var/where2 = mob.equip_in_one_of_slots(T, slots)
|
||||
if (!where2)
|
||||
mob << "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start."
|
||||
to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start.")
|
||||
. += 1
|
||||
else
|
||||
mob << "The <b>recruitment pen</b> in your [where2] will help you get your gang started. Stab unsuspecting crew members with it to recruit them."
|
||||
to_chat(mob, "The <b>recruitment pen</b> in your [where2] will help you get your gang started. Stab unsuspecting crew members with it to recruit them.")
|
||||
|
||||
var/where3 = mob.equip_in_one_of_slots(SC, slots)
|
||||
if (!where3)
|
||||
mob << "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start."
|
||||
to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start.")
|
||||
. += 1
|
||||
else
|
||||
mob << "The <b>territory spraycan</b> in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. All gangsters can use these, so distribute them to grow your influence faster."
|
||||
to_chat(mob, "The <b>territory spraycan</b> in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. All gangsters can use these, so distribute them to grow your influence faster.")
|
||||
|
||||
var/where4 = mob.equip_in_one_of_slots(C, slots)
|
||||
if (!where4)
|
||||
mob << "Your Syndicate benefactors were unfortunately unable to get you a chameleon security HUD."
|
||||
to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a chameleon security HUD.")
|
||||
. += 1
|
||||
else
|
||||
mob << "The <b>chameleon security HUD</b> in your [where4] will help you keep track of who is mindshield-implanted, and unable to be recruited."
|
||||
to_chat(mob, "The <b>chameleon security HUD</b> in your [where4] will help you keep track of who is mindshield-implanted, and unable to be recruited.")
|
||||
return .
|
||||
|
||||
|
||||
@@ -169,12 +169,12 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
|
||||
carbon_mob.flash_act(1, 1)
|
||||
gangster_mind.current.Stun(5)
|
||||
if(G.is_deconvertible)
|
||||
gangster_mind.current << "<FONT size=3 color=red><B>You are now a member of the [G.name] Gang!</B></FONT>"
|
||||
gangster_mind.current << "<font color='red'>Help your bosses take over the station by claiming territory with <b>special spraycans</b> only they can provide. Simply spray on any unclaimed area of the station.</font>"
|
||||
gangster_mind.current << "<font color='red'>Their ultimate objective is to take over the station with a Dominator machine.</font>"
|
||||
gangster_mind.current << "<font color='red'>You can identify your bosses by their <b>large, bright [G.color] \[G\] icon</b>.</font>"
|
||||
to_chat(gangster_mind.current, "<FONT size=3 color=red><B>You are now a member of the [G.name] Gang!</B></FONT>")
|
||||
to_chat(gangster_mind.current, "<font color='red'>Help your bosses take over the station by claiming territory with <b>special spraycans</b> only they can provide. Simply spray on any unclaimed area of the station.</font>")
|
||||
to_chat(gangster_mind.current, "<font color='red'>Their ultimate objective is to take over the station with a Dominator machine.</font>")
|
||||
to_chat(gangster_mind.current, "<font color='red'>You can identify your bosses by their <b>large, bright [G.color] \[G\] icon</b>.</font>")
|
||||
gangster_mind.store_memory("You are a member of the [G.name] Gang!")
|
||||
gangster_mind.current.attack_log += "\[[time_stamp()]\] <font color='red'>Has been converted to the [G.name] Gang!</font>"
|
||||
gangster_mind.current.log_message("<font color='red'>Has been converted to the [G.name] Gang!</font>", INDIVIDUAL_ATTACK_LOG)
|
||||
gangster_mind.special_role = "[G.name] Gangster"
|
||||
|
||||
G.add_gang_hud(gangster_mind)
|
||||
@@ -208,18 +208,18 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
|
||||
gangster_mind.gang_datum = null
|
||||
|
||||
if(silent < 2)
|
||||
gangster_mind.current.attack_log += "\[[time_stamp()]\] <font color='red'>Has reformed and defected from the [gang.name] Gang!</font>"
|
||||
gangster_mind.current.log_message("<font color='red'>Has reformed and defected from the [gang.name] Gang!</font>", INDIVIDUAL_ATTACK_LOG)
|
||||
|
||||
if(beingborged)
|
||||
if(!silent)
|
||||
gangster_mind.current.visible_message("The frame beeps contentedly from the MMI before initalizing it.")
|
||||
gangster_mind.current << "<FONT size=3 color=red><B>The frame's firmware detects and deletes your criminal behavior! You are no longer a gangster!</B></FONT>"
|
||||
to_chat(gangster_mind.current, "<FONT size=3 color=red><B>The frame's firmware detects and deletes your criminal behavior! You are no longer a gangster!</B></FONT>")
|
||||
message_admins("[ADMIN_LOOKUPFLW(gangster_mind.current)] has been borged while being a member of the [gang.name] Gang. They are no longer a gangster.")
|
||||
else
|
||||
if(!silent)
|
||||
gangster_mind.current.Paralyse(5)
|
||||
gangster_mind.current.visible_message("<FONT size=3><B>[gangster_mind.current] looks like they've given up the life of crime!<B></font>")
|
||||
gangster_mind.current << "<FONT size=3 color=red><B>You have been reformed! You are no longer a gangster!</B><BR>You try as hard as you can, but you can't seem to recall any of the identities of your former gangsters...</FONT>"
|
||||
to_chat(gangster_mind.current, "<FONT size=3 color=red><B>You have been reformed! You are no longer a gangster!</B><BR>You try as hard as you can, but you can't seem to recall any of the identities of your former gangsters...</FONT>")
|
||||
gangster_mind.memory = ""
|
||||
|
||||
gang.remove_gang_hud(gangster_mind)
|
||||
@@ -258,12 +258,12 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
|
||||
if(!gangs.len)
|
||||
return
|
||||
if(!winner)
|
||||
world << "<span class='redtext'>The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]</span><br>"
|
||||
to_chat(world, "<span class='redtext'>The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]</span><br>")
|
||||
feedback_set_details("round_end_result","loss - gangs failed takeover")
|
||||
|
||||
ticker.news_report = GANG_LOSS
|
||||
else
|
||||
world << "<span class='redtext'>The [winner.name] Gang successfully performed a hostile takeover of the station!</span><br>"
|
||||
to_chat(world, "<span class='redtext'>The [winner.name] Gang successfully performed a hostile takeover of the station!</span><br>")
|
||||
feedback_set_details("round_end_result","win - gang domination complete")
|
||||
|
||||
ticker.news_report = GANG_TAKEOVER
|
||||
@@ -277,7 +277,7 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
|
||||
for(var/datum/mind/gangster in G.gangsters)
|
||||
text += printplayer(gangster, 1)
|
||||
text += "<br>"
|
||||
world << text
|
||||
to_chat(world, text)
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
//Handles influence, territories, and the victory checks//
|
||||
|
||||
@@ -159,7 +159,7 @@
|
||||
var/mob/living/mob = get(tool.loc,/mob/living)
|
||||
if(mob && mob.mind && mob.stat == CONSCIOUS)
|
||||
if(mob.mind.gang_datum == src)
|
||||
mob << "<span class='[warning ? "warning" : "notice"]'>\icon[tool] [message]</span>"
|
||||
to_chat(mob, "<span class='[warning ? "warning" : "notice"]'>\icon[tool] [message]</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@
|
||||
gang_outfit = outfit
|
||||
|
||||
if(gang_outfit)
|
||||
gangster << "<span class='notice'>The [src] Gang's influence grows as you wear [gang_outfit].</span>"
|
||||
to_chat(gangster, "<span class='notice'>The [src] Gang's influence grows as you wear [gang_outfit].</span>")
|
||||
uniformed ++
|
||||
|
||||
//Calculate and report influence growth
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
var/obj/item/O = new item_path(user.loc)
|
||||
user.put_in_hands(O)
|
||||
if(spawn_msg)
|
||||
user << spawn_msg
|
||||
to_chat(user, spawn_msg)
|
||||
|
||||
/datum/gang_item/proc/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
|
||||
return gang && (gang.points >= get_cost(user, gang, gangtool)) && can_see(user, gang, gangtool)
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
/datum/gang_item/function/outfit/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
|
||||
if(gang && gang.gang_outfit(user, gangtool))
|
||||
user << "<span class='notice'><b>Gang Outfits</b> can act as armor with moderate protection against ballistic and melee attacks. Every gangster wearing one will also help grow your gang's influence.</span>"
|
||||
to_chat(user, "<span class='notice'><b>Gang Outfits</b> can act as armor with moderate protection against ballistic and melee attacks. Every gangster wearing one will also help grow your gang's influence.</span>")
|
||||
if(gangtool)
|
||||
gangtool.outfits -= 1
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
var/obj/item/O = new item_path(user.loc, gang) //we need to override this whole proc for this one argument
|
||||
user.put_in_hands(O)
|
||||
if(spawn_msg)
|
||||
user << spawn_msg
|
||||
to_chat(user, spawn_msg)
|
||||
|
||||
/datum/gang_item/equipment/pen
|
||||
name = "Recruitment Pen"
|
||||
@@ -235,7 +235,7 @@
|
||||
if(gang && isboss(user, gang))
|
||||
item_type = /obj/item/device/gangtool/spare/lt
|
||||
if(gang.bosses.len < 3)
|
||||
user << "<span class='notice'><b>Gangtools</b> allow you to promote a gangster to be your Lieutenant, enabling them to recruit and purchase items like you. Simply have them register the gangtool. You may promote up to [3-gang.bosses.len] more Lieutenants</span>"
|
||||
to_chat(user, "<span class='notice'><b>Gangtools</b> allow you to promote a gangster to be your Lieutenant, enabling them to recruit and purchase items like you. Simply have them register the gangtool. You may promote up to [3-gang.bosses.len] more Lieutenants</span>")
|
||||
else
|
||||
item_type = /obj/item/device/gangtool/spare
|
||||
var/obj/item/device/gangtool/spare/tool = new item_type(user.loc)
|
||||
@@ -277,16 +277,16 @@
|
||||
var/area/usrarea = get_area(user.loc)
|
||||
var/usrturf = get_turf(user.loc)
|
||||
if(initial(usrarea.name) == "Space" || isspaceturf(usrturf) || usr.z != 1)
|
||||
user << "<span class='warning'>You can only use this on the station!</span>"
|
||||
to_chat(user, "<span class='warning'>You can only use this on the station!</span>")
|
||||
return FALSE
|
||||
|
||||
for(var/obj/obj in usrturf)
|
||||
if(obj.density)
|
||||
user << "<span class='warning'>There's not enough room here!</span>"
|
||||
to_chat(user, "<span class='warning'>There's not enough room here!</span>")
|
||||
return FALSE
|
||||
|
||||
if(!(usrarea.type in gang.territory|gang.territory_new))
|
||||
user << "<span class='warning'>The <b>dominator</b> can be spawned only on territory controlled by your gang!</span>"
|
||||
to_chat(user, "<span class='warning'>The <b>dominator</b> can be spawned only on territory controlled by your gang!</span>")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
if(user.mind && (user.mind in ticker.mode.get_gang_bosses()))
|
||||
if(..(M,user,1))
|
||||
if(cooldown)
|
||||
user << "<span class='warning'>[src] needs more time to recharge before it can be used.</span>"
|
||||
to_chat(user, "<span class='warning'>[src] needs more time to recharge before it can be used.</span>")
|
||||
return
|
||||
if(M.client)
|
||||
M.mind_initialize() //give them a mind datum if they don't have one.
|
||||
@@ -29,9 +29,9 @@
|
||||
M.Paralyse(5)
|
||||
cooldown(G)
|
||||
if(1)
|
||||
user << "<span class='warning'>This mind is resistant to recruitment!</span>"
|
||||
to_chat(user, "<span class='warning'>This mind is resistant to recruitment!</span>")
|
||||
else
|
||||
user << "<span class='warning'>This mind has already been recruited into a gang!</span>"
|
||||
to_chat(user, "<span class='warning'>This mind has already been recruited into a gang!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -56,4 +56,4 @@
|
||||
cooldown = 0
|
||||
icon_state = "pen"
|
||||
var/mob/M = get(src, /mob)
|
||||
M << "<span class='notice'>\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.</span>"
|
||||
to_chat(M, "<span class='notice'>\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.</span>")
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
if(!message || !can_use(user))
|
||||
return
|
||||
if(user.z > 2)
|
||||
user << "<span class='info'>\icon[src]Error: Station out of range.</span>"
|
||||
to_chat(user, "<span class='info'>\icon[src]Error: Station out of range.</span>")
|
||||
return
|
||||
var/list/members = list()
|
||||
members += gang.gangsters
|
||||
@@ -129,10 +129,10 @@
|
||||
var/ping = "<span class='danger'><B><i>[gang.name] [gang_rank]</i>: [message]</B></span>"
|
||||
for(var/datum/mind/ganger in members)
|
||||
if(ganger.current && (ganger.current.z <= 2) && (ganger.current.stat == CONSCIOUS))
|
||||
ganger.current << ping
|
||||
to_chat(ganger.current, ping)
|
||||
for(var/mob/M in dead_mob_list)
|
||||
var/link = FOLLOW_LINK(M, user)
|
||||
M << "[link] [ping]"
|
||||
to_chat(M, "[link] [ping]")
|
||||
log_game("[key_name(user)] Messaged [gang.name] Gang: [message].")
|
||||
|
||||
|
||||
@@ -152,53 +152,53 @@
|
||||
log_game("[key_name(user)] has been promoted to Lieutenant in the [gang.name] Gang")
|
||||
free_pen = 1
|
||||
gang.message_gangtools("[user] has been promoted to Lieutenant.")
|
||||
user << "<FONT size=3 color=red><B>You have been promoted to Lieutenant!</B></FONT>"
|
||||
to_chat(user, "<FONT size=3 color=red><B>You have been promoted to Lieutenant!</B></FONT>")
|
||||
ticker.mode.forge_gang_objectives(user.mind)
|
||||
ticker.mode.greet_gang(user.mind,0)
|
||||
user << "The <b>Gangtool</b> you registered will allow you to purchase weapons and equipment, and send messages to your gang."
|
||||
user << "Unlike regular gangsters, you may use <b>recruitment pens</b> to add recruits to your gang. Use them on unsuspecting crew members to recruit them. Don't forget to get your one free pen from the gangtool."
|
||||
to_chat(user, "The <b>Gangtool</b> you registered will allow you to purchase weapons and equipment, and send messages to your gang.")
|
||||
to_chat(user, "Unlike regular gangsters, you may use <b>recruitment pens</b> to add recruits to your gang. Use them on unsuspecting crew members to recruit them. Don't forget to get your one free pen from the gangtool.")
|
||||
else
|
||||
usr << "<span class='warning'>ACCESS DENIED: Unauthorized user.</span>"
|
||||
to_chat(usr, "<span class='warning'>ACCESS DENIED: Unauthorized user.</span>")
|
||||
|
||||
/obj/item/device/gangtool/proc/recall(mob/user)
|
||||
if(!can_use(user))
|
||||
return 0
|
||||
|
||||
if(recalling)
|
||||
usr << "<span class='warning'>Error: Recall already in progress.</span>"
|
||||
to_chat(usr, "<span class='warning'>Error: Recall already in progress.</span>")
|
||||
return 0
|
||||
|
||||
gang.message_gangtools("[usr] is attempting to recall the emergency shuttle.")
|
||||
recalling = 1
|
||||
loc << "<span class='info'>\icon[src]Generating shuttle recall order with codes retrieved from last call signal...</span>"
|
||||
to_chat(loc, "<span class='info'>\icon[src]Generating shuttle recall order with codes retrieved from last call signal...</span>")
|
||||
|
||||
sleep(rand(100,300))
|
||||
|
||||
if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station
|
||||
user << "<span class='warning'>\icon[src]Emergency shuttle cannot be recalled at this time.</span>"
|
||||
to_chat(user, "<span class='warning'>\icon[src]Emergency shuttle cannot be recalled at this time.</span>")
|
||||
recalling = 0
|
||||
return 0
|
||||
loc << "<span class='info'>\icon[src]Shuttle recall order generated. Accessing station long-range communication arrays...</span>"
|
||||
to_chat(loc, "<span class='info'>\icon[src]Shuttle recall order generated. Accessing station long-range communication arrays...</span>")
|
||||
|
||||
sleep(rand(100,300))
|
||||
|
||||
if(!gang.dom_attempts)
|
||||
user << "<span class='warning'>\icon[src]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.</span>"
|
||||
to_chat(user, "<span class='warning'>\icon[src]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.</span>")
|
||||
recalling = 0
|
||||
return 0
|
||||
|
||||
var/turf/userturf = get_turf(user)
|
||||
if(userturf.z != 1) //Shuttle can only be recalled while on station
|
||||
user << "<span class='warning'>\icon[src]Error: Device out of range of station communication arrays.</span>"
|
||||
to_chat(user, "<span class='warning'>\icon[src]Error: Device out of range of station communication arrays.</span>")
|
||||
recalling = 0
|
||||
return 0
|
||||
var/datum/station_state/end_state = new /datum/station_state()
|
||||
end_state.count()
|
||||
if((100 * start_state.score(end_state)) < 80) //Shuttle cannot be recalled if the station is too damaged
|
||||
user << "<span class='warning'>\icon[src]Error: Station communication systems compromised. Unable to establish connection.</span>"
|
||||
to_chat(user, "<span class='warning'>\icon[src]Error: Station communication systems compromised. Unable to establish connection.</span>")
|
||||
recalling = 0
|
||||
return 0
|
||||
loc << "<span class='info'>\icon[src]Comm arrays accessed. Broadcasting recall signal...</span>"
|
||||
to_chat(loc, "<span class='info'>\icon[src]Comm arrays accessed. Broadcasting recall signal...</span>")
|
||||
|
||||
sleep(rand(100,300))
|
||||
|
||||
@@ -210,7 +210,7 @@
|
||||
if(SSshuttle.cancelEvac(user))
|
||||
return 1
|
||||
|
||||
loc << "<span class='info'>\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.</span>"
|
||||
to_chat(loc, "<span class='info'>\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.</span>")
|
||||
return 0
|
||||
|
||||
/obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user)
|
||||
|
||||
@@ -31,10 +31,10 @@
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
if(!istype(T) || T.z != ZLEVEL_STATION)
|
||||
src << "<span class='warning'>You cannot activate the doomsday device while off-station!</span>"
|
||||
to_chat(src, "<span class='warning'>You cannot activate the doomsday device while off-station!</span>")
|
||||
return
|
||||
|
||||
src << "<span class='notice'>Doomsday device armed.</span>"
|
||||
to_chat(src, "<span class='notice'>Doomsday device armed.</span>")
|
||||
priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/AI/aimalf.ogg')
|
||||
set_security_level("delta")
|
||||
nuking = 1
|
||||
@@ -117,9 +117,9 @@
|
||||
continue
|
||||
if(issilicon(L))
|
||||
continue
|
||||
L << "<span class='userdanger'>The blast wave from [src] tears you atom from atom!</span>"
|
||||
to_chat(L, "<span class='userdanger'>The blast wave from [src] tears you atom from atom!</span>")
|
||||
L.dust()
|
||||
world << "<B>The AI cleansed the station of life with the doomsday device!</B>"
|
||||
to_chat(world, "<B>The AI cleansed the station of life with the doomsday device!</B>")
|
||||
ticker.force_ending = 1
|
||||
|
||||
/datum/AI_Module/large/upgrade_turrets
|
||||
@@ -144,7 +144,7 @@
|
||||
turret.obj_integrity += 30
|
||||
turret.lethal_projectile = /obj/item/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR.
|
||||
turret.lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
src << "<span class='notice'>Turrets upgraded.</span>"
|
||||
to_chat(src, "<span class='notice'>Turrets upgraded.</span>")
|
||||
|
||||
/datum/AI_Module/large/lockdown
|
||||
module_name = "Hostile Station Lockdown"
|
||||
@@ -174,7 +174,7 @@
|
||||
|
||||
verbs -= /mob/living/silicon/ai/proc/lockdown
|
||||
minor_announce("Hostile runtime detected in door controllers. Isolation Lockdown protocols are now in effect. Please remain calm.","Network Alert:", 1)
|
||||
src << "<span class = 'warning'>Lockdown Initiated. Network reset in 90 seconds.</span>"
|
||||
to_chat(src, "<span class = 'warning'>Lockdown Initiated. Network reset in 90 seconds.</span>")
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/minor_announce,
|
||||
"Automatic system reboot complete. Have a secure day.",
|
||||
"Network reset:"), 900)
|
||||
@@ -201,7 +201,7 @@
|
||||
var/obj/item/weapon/rcd/RCD = I
|
||||
RCD.detonate_pulse()
|
||||
|
||||
src << "<span class='warning'>RCD detonation pulse emitted.</span>"
|
||||
to_chat(src, "<span class='warning'>RCD detonation pulse emitted.</span>")
|
||||
malf_cooldown = 1
|
||||
spawn(100)
|
||||
malf_cooldown = 0
|
||||
@@ -223,7 +223,7 @@
|
||||
if(stat)
|
||||
return
|
||||
can_dominate_mechs = 1 //Yep. This is all it does. Honk!
|
||||
src << "Virus package compiled. Select a target mech at any time. <b>You must remain on the station at all times. Loss of signal will result in total system lockout.</b>"
|
||||
to_chat(src, "Virus package compiled. Select a target mech at any time. <b>You must remain on the station at all times. Loss of signal will result in total system lockout.</b>")
|
||||
verbs -= /mob/living/silicon/ai/proc/mech_takeover
|
||||
|
||||
/datum/AI_Module/large/break_fire_alarms
|
||||
@@ -247,7 +247,7 @@
|
||||
if(F.z != ZLEVEL_STATION)
|
||||
continue
|
||||
F.emagged = 1
|
||||
src << "<span class='notice'>All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.</span>"
|
||||
to_chat(src, "<span class='notice'>All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.</span>")
|
||||
src.verbs -= /mob/living/silicon/ai/proc/break_fire_alarms
|
||||
|
||||
/datum/AI_Module/large/break_air_alarms
|
||||
@@ -271,7 +271,7 @@
|
||||
if(AA.z != ZLEVEL_STATION)
|
||||
continue
|
||||
AA.emagged = 1
|
||||
src << "<span class='notice'>All air alarm safeties on the station have been overriden. Air alarms may now use the Flood environmental mode."
|
||||
to_chat(src, "<span class='notice'>All air alarm safeties on the station have been overriden. Air alarms may now use the Flood environmental mode.")
|
||||
src.verbs -= /mob/living/silicon/ai/proc/break_air_alarms
|
||||
|
||||
/datum/AI_Module/small/overload_machine
|
||||
@@ -295,13 +295,13 @@
|
||||
if(overload.uses > 0)
|
||||
overload.uses --
|
||||
M.audible_message("<span class='userdanger'>You hear a loud electrical buzzing sound coming from [M]!</span>")
|
||||
src << "<span class='warning'>Overloading machine circuitry...</span>"
|
||||
to_chat(src, "<span class='warning'>Overloading machine circuitry...</span>")
|
||||
spawn(50)
|
||||
if(M)
|
||||
explosion(get_turf(M), 0,2,3,0)
|
||||
qdel(M)
|
||||
else src << "<span class='notice'>Out of uses.</span>"
|
||||
else src << "<span class='notice'>That's not a machine.</span>"
|
||||
else to_chat(src, "<span class='notice'>Out of uses.</span>")
|
||||
else to_chat(src, "<span class='notice'>That's not a machine.</span>")
|
||||
|
||||
/datum/AI_Module/small/override_machine
|
||||
module_name = "Machine Override"
|
||||
@@ -322,17 +322,17 @@
|
||||
|
||||
if (istype(M, /obj/machinery))
|
||||
if(!M.can_be_overridden())
|
||||
src << "Can't override this device."
|
||||
to_chat(src, "Can't override this device.")
|
||||
for(var/datum/AI_Module/small/override_machine/override in current_modules)
|
||||
if(override.uses > 0)
|
||||
override.uses --
|
||||
M.audible_message("<span class='userdanger'>You hear a loud electrical buzzing sound!</span>")
|
||||
src << "<span class='warning'>Reprogramming machine behaviour...</span>"
|
||||
to_chat(src, "<span class='warning'>Reprogramming machine behaviour...</span>")
|
||||
spawn(50)
|
||||
if(M && !QDELETED(M))
|
||||
new /mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(M), M, src, 1)
|
||||
else src << "<span class='notice'>Out of uses.</span>"
|
||||
else src << "<span class='notice'>That's not a machine.</span>"
|
||||
else to_chat(src, "<span class='notice'>Out of uses.</span>")
|
||||
else to_chat(src, "<span class='notice'>That's not a machine.</span>")
|
||||
|
||||
/datum/AI_Module/large/place_cyborg_transformer
|
||||
module_name = "Robotic Factory (Removes Shunting)"
|
||||
@@ -363,7 +363,7 @@
|
||||
var/datum/AI_Module/large/place_cyborg_transformer/PCT = locate() in current_modules
|
||||
PCT.uses --
|
||||
can_shunt = 0
|
||||
src << "<span class='warning'>You cannot shunt anymore.</span>"
|
||||
to_chat(src, "<span class='warning'>You cannot shunt anymore.</span>")
|
||||
|
||||
/mob/living/silicon/ai/proc/canPlaceTransformer()
|
||||
if(!eyeobj || !isturf(src.loc) || !canUseTopic())
|
||||
@@ -427,8 +427,8 @@
|
||||
if(prob(30*apc.overload))
|
||||
apc.overload_lighting()
|
||||
else apc.overload++
|
||||
src << "<span class='notice'>Overcurrent applied to the powernet.</span>"
|
||||
else src << "<span class='notice'>Out of uses.</span>"
|
||||
to_chat(src, "<span class='notice'>Overcurrent applied to the powernet.</span>")
|
||||
else to_chat(src, "<span class='notice'>Out of uses.</span>")
|
||||
|
||||
/datum/AI_Module/small/reactivate_cameras
|
||||
module_name = "Reactivate Camera Network"
|
||||
@@ -462,10 +462,10 @@
|
||||
fixedcams++
|
||||
//If a camera is both deactivated and has bad focus, it will cost two uses to fully fix!
|
||||
else
|
||||
src << "<span class='warning'>Out of uses.</span>"
|
||||
to_chat(src, "<span class='warning'>Out of uses.</span>")
|
||||
verbs -= /mob/living/silicon/ai/proc/reactivate_cameras //It is useless now, clean it up.
|
||||
break
|
||||
src << "<span class='notice'>Diagnostic complete! Operations completed: [fixedcams].</span>"
|
||||
to_chat(src, "<span class='notice'>Diagnostic complete! Operations completed: [fixedcams].</span>")
|
||||
|
||||
malf_cooldown = 1
|
||||
spawn(30) //Lag protection
|
||||
@@ -509,7 +509,7 @@
|
||||
if(upgraded)
|
||||
upgradedcams++
|
||||
|
||||
src << "<span class='notice'>OTA firmware distribution complete! Cameras upgraded: [upgradedcams]. Light amplification system online.</span>"
|
||||
to_chat(src, "<span class='notice'>OTA firmware distribution complete! Cameras upgraded: [upgradedcams]. Light amplification system online.</span>")
|
||||
verbs -= /mob/living/silicon/ai/proc/upgrade_cameras
|
||||
|
||||
/datum/module_picker
|
||||
@@ -604,5 +604,5 @@
|
||||
|
||||
if(eyeobj)
|
||||
eyeobj.relay_speech = TRUE
|
||||
src << "<span class='notice'>OTA firmware distribution complete! Cameras upgraded: Enhanced surveillance package online.</span>"
|
||||
to_chat(src, "<span class='notice'>OTA firmware distribution complete! Cameras upgraded: Enhanced surveillance package online.</span>")
|
||||
verbs -= /mob/living/silicon/ai/proc/surveillance
|
||||
|
||||
@@ -46,9 +46,9 @@
|
||||
|
||||
|
||||
if(survivors)
|
||||
world << "<span class='boldnotice'>The following survived the meteor storm</span>:[text]"
|
||||
to_chat(world, "<span class='boldnotice'>The following survived the meteor storm</span>:[text]")
|
||||
else
|
||||
world << "<span class='boldnotice'>Nobody survived the meteor storm!</span>"
|
||||
to_chat(world, "<span class='boldnotice'>Nobody survived the meteor storm!</span>")
|
||||
|
||||
feedback_set_details("round_end_result","end - evacuation")
|
||||
feedback_set("round_end_result",survivors)
|
||||
|
||||
@@ -19,10 +19,10 @@
|
||||
var/finished = 0
|
||||
|
||||
/datum/game_mode/abduction/announce()
|
||||
world << "<B>The current game mode is - Abduction!</B>"
|
||||
world << "There are alien <b>abductors</b> sent to [station_name()] to perform nefarious experiments!"
|
||||
world << "<b>Abductors</b> - kidnap the crew and replace their organs with experimental ones."
|
||||
world << "<b>Crew</b> - don't get abducted and stop the abductors."
|
||||
to_chat(world, "<B>The current game mode is - Abduction!</B>")
|
||||
to_chat(world, "There are alien <b>abductors</b> sent to [station_name()] to perform nefarious experiments!")
|
||||
to_chat(world, "<b>Abductors</b> - kidnap the crew and replace their organs with experimental ones.")
|
||||
to_chat(world, "<b>Crew</b> - don't get abducted and stop the abductors.")
|
||||
|
||||
/datum/game_mode/abduction/pre_setup()
|
||||
abductor_teams = max(1, min(max_teams,round(num_players()/config.abductor_scaling_coeff)))
|
||||
@@ -184,9 +184,9 @@
|
||||
abductor.objectives += team_objectives[team_number]
|
||||
var/team_name = team_names[team_number]
|
||||
|
||||
abductor.current << "<span class='notice'>You are an agent of [team_name]!</span>"
|
||||
abductor.current << "<span class='notice'>With the help of your teammate, kidnap and experiment on station crew members!</span>"
|
||||
abductor.current << "<span class='notice'>Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve.</span>"
|
||||
to_chat(abductor.current, "<span class='notice'>You are an agent of [team_name]!</span>")
|
||||
to_chat(abductor.current, "<span class='notice'>With the help of your teammate, kidnap and experiment on station crew members!</span>")
|
||||
to_chat(abductor.current, "<span class='notice'>Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve.</span>")
|
||||
|
||||
abductor.announce_objectives()
|
||||
|
||||
@@ -194,9 +194,9 @@
|
||||
abductor.objectives += team_objectives[team_number]
|
||||
var/team_name = team_names[team_number]
|
||||
|
||||
abductor.current << "<span class='notice'>You are a scientist of [team_name]!</span>"
|
||||
abductor.current << "<span class='notice'>With the help of your teammate, kidnap and experiment on station crew members!</span>"
|
||||
abductor.current << "<span class='notice'>Use your tool and ship consoles to support the agent and retrieve human specimens.</span>"
|
||||
to_chat(abductor.current, "<span class='notice'>You are a scientist of [team_name]!</span>")
|
||||
to_chat(abductor.current, "<span class='notice'>With the help of your teammate, kidnap and experiment on station crew members!</span>")
|
||||
to_chat(abductor.current, "<span class='notice'>Use your tool and ship consoles to support the agent and retrieve human specimens.</span>")
|
||||
|
||||
abductor.announce_objectives()
|
||||
|
||||
@@ -269,9 +269,9 @@
|
||||
var/datum/objective/objective = team_objectives[team_number]
|
||||
var/team_name = team_names[team_number]
|
||||
if(console.experiment.points >= objective.target_amount)
|
||||
world << "<span class='greenannounce'>[team_name] team fulfilled its mission!</span>"
|
||||
to_chat(world, "<span class='greenannounce'>[team_name] team fulfilled its mission!</span>")
|
||||
else
|
||||
world << "<span class='boldannounce'>[team_name] team failed its mission.</span>"
|
||||
to_chat(world, "<span class='boldannounce'>[team_name] team failed its mission.</span>")
|
||||
..()
|
||||
return 1
|
||||
|
||||
@@ -289,22 +289,13 @@
|
||||
text += printplayer(abductee_mind)
|
||||
text += printobjectives(abductee_mind)
|
||||
text += "<br>"
|
||||
world << text
|
||||
to_chat(world, text)
|
||||
|
||||
//Landmarks
|
||||
// TODO: Split into seperate landmarks for prettier ships
|
||||
/obj/effect/landmark/abductor
|
||||
var/team = 1
|
||||
|
||||
/obj/effect/landmark/abductor/console/New()
|
||||
var/obj/machinery/abductor/console/c = new /obj/machinery/abductor/console(src.loc)
|
||||
c.team = team
|
||||
|
||||
spawn(5) // I'd do this properly when i got some time, temporary hack for mappers
|
||||
c.Setup()
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/effect/landmark/abductor/agent
|
||||
/obj/effect/landmark/abductor/scientist
|
||||
|
||||
|
||||
@@ -56,7 +56,8 @@
|
||||
M.name_override = disguise.name
|
||||
M.icon = disguise.icon
|
||||
M.icon_state = disguise.icon_state
|
||||
M.copy_overlays(disguise, TRUE)
|
||||
M.cut_overlays()
|
||||
M.add_overlay(disguise.overlays)
|
||||
M.update_inv_hands()
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth()
|
||||
@@ -91,7 +92,7 @@
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline()
|
||||
if(ishuman(loc))
|
||||
if(combat_cooldown != initial(combat_cooldown))
|
||||
loc << "<span class='warning'>Combat injection is still recharging.</span>"
|
||||
to_chat(loc, "<span class='warning'>Combat injection is still recharging.</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/M = loc
|
||||
M.adjustStaminaLoss(-75)
|
||||
@@ -109,7 +110,7 @@
|
||||
/obj/item/device/abductor/proc/AbductorCheck(user)
|
||||
if(isabductor(user))
|
||||
return TRUE
|
||||
user << "<span class='warning'>You can't figure how this works!</span>"
|
||||
to_chat(user, "<span class='warning'>You can't figure how this works!</span>")
|
||||
return FALSE
|
||||
|
||||
/obj/item/device/abductor/proc/ScientistCheck(user)
|
||||
@@ -132,7 +133,7 @@
|
||||
if(!AbductorCheck(user))
|
||||
return
|
||||
if(!ScientistCheck(user))
|
||||
user << "<span class='warning'>You're not trained to use this!</span>"
|
||||
to_chat(user, "<span class='warning'>You're not trained to use this!</span>")
|
||||
return
|
||||
if(mode == GIZMO_SCAN)
|
||||
mode = GIZMO_MARK
|
||||
@@ -140,13 +141,13 @@
|
||||
else
|
||||
mode = GIZMO_SCAN
|
||||
icon_state = "gizmo_scan"
|
||||
user << "<span class='notice'>You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE</span>"
|
||||
to_chat(user, "<span class='notice'>You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE</span>")
|
||||
|
||||
/obj/item/device/abductor/gizmo/attack(mob/living/M, mob/user)
|
||||
if(!AbductorCheck(user))
|
||||
return
|
||||
if(!ScientistCheck(user))
|
||||
user << "<span class='notice'>You're not trained to use this</span>"
|
||||
to_chat(user, "<span class='notice'>You're not trained to use this</span>")
|
||||
return
|
||||
switch(mode)
|
||||
if(GIZMO_SCAN)
|
||||
@@ -161,7 +162,7 @@
|
||||
if(!AbductorCheck(user))
|
||||
return
|
||||
if(!ScientistCheck(user))
|
||||
user << "<span class='notice'>You're not trained to use this</span>"
|
||||
to_chat(user, "<span class='notice'>You're not trained to use this</span>")
|
||||
return
|
||||
switch(mode)
|
||||
if(GIZMO_SCAN)
|
||||
@@ -173,16 +174,16 @@
|
||||
if(ishuman(target))
|
||||
if(console!=null)
|
||||
console.AddSnapshot(target)
|
||||
user << "<span class='notice'>You scan [target] and add them to the database.</span>"
|
||||
to_chat(user, "<span class='notice'>You scan [target] and add them to the database.</span>")
|
||||
|
||||
/obj/item/device/abductor/gizmo/proc/mark(atom/target, mob/living/user)
|
||||
if(marked == target)
|
||||
user << "<span class='warning'>This specimen is already marked!</span>"
|
||||
to_chat(user, "<span class='warning'>This specimen is already marked!</span>")
|
||||
return
|
||||
if(ishuman(target))
|
||||
if(isabductor(target))
|
||||
marked = target
|
||||
user << "<span class='notice'>You mark [target] for future retrieval.</span>"
|
||||
to_chat(user, "<span class='notice'>You mark [target] for future retrieval.</span>")
|
||||
else
|
||||
prepare(target,user)
|
||||
else
|
||||
@@ -190,12 +191,12 @@
|
||||
|
||||
/obj/item/device/abductor/gizmo/proc/prepare(atom/target, mob/living/user)
|
||||
if(get_dist(target,user)>1)
|
||||
user << "<span class='warning'>You need to be next to the specimen to prepare it for transport!</span>"
|
||||
to_chat(user, "<span class='warning'>You need to be next to the specimen to prepare it for transport!</span>")
|
||||
return
|
||||
user << "<span class='notice'>You begin preparing [target] for transport...</span>"
|
||||
to_chat(user, "<span class='notice'>You begin preparing [target] for transport...</span>")
|
||||
if(do_after(user, 100, target = target))
|
||||
marked = target
|
||||
user << "<span class='notice'>You finish preparing [target] for transport.</span>"
|
||||
to_chat(user, "<span class='notice'>You finish preparing [target] for transport.</span>")
|
||||
|
||||
|
||||
/obj/item/device/abductor/silencer
|
||||
@@ -228,7 +229,7 @@
|
||||
for(M in view(2,targloc))
|
||||
if(M == user)
|
||||
continue
|
||||
user << "<span class='notice'>You silence [M]'s radio devices.</span>"
|
||||
to_chat(user, "<span class='notice'>You silence [M]'s radio devices.</span>")
|
||||
radio_off_mob(M)
|
||||
|
||||
/obj/item/device/abductor/silencer/proc/radio_off_mob(mob/living/carbon/human/M)
|
||||
@@ -322,7 +323,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
if(BATON_PROBE)
|
||||
txt = "probing"
|
||||
|
||||
usr << "<span class='notice'>You switch the baton to [txt] mode.</span>"
|
||||
to_chat(usr, "<span class='notice'>You switch the baton to [txt] mode.</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/abductor_baton/update_icon()
|
||||
@@ -401,7 +402,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
add_logs(user, L, "put to sleep")
|
||||
else
|
||||
L.drowsyness += 1
|
||||
user << "<span class='warning'>Sleep inducement works fully only on stunned specimens! </span>"
|
||||
to_chat(user, "<span class='warning'>Sleep inducement works fully only on stunned specimens! </span>")
|
||||
L.visible_message("<span class='danger'>[user] tried to induce sleep in [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>You suddenly feel drowsy!</span>")
|
||||
|
||||
@@ -418,12 +419,12 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(C)
|
||||
C.update_handcuffed()
|
||||
user << "<span class='notice'>You handcuff [C].</span>"
|
||||
to_chat(user, "<span class='notice'>You handcuff [C].</span>")
|
||||
add_logs(user, C, "handcuffed")
|
||||
else
|
||||
user << "<span class='warning'>You fail to handcuff [C].</span>"
|
||||
to_chat(user, "<span class='warning'>You fail to handcuff [C].</span>")
|
||||
else
|
||||
user << "<span class='warning'>[C] doesn't have two hands...</span>"
|
||||
to_chat(user, "<span class='warning'>[C] doesn't have two hands...</span>")
|
||||
|
||||
/obj/item/weapon/abductor_baton/proc/ProbeAttack(mob/living/L,mob/living/user)
|
||||
L.visible_message("<span class='danger'>[user] probes [L] with [src]!</span>", \
|
||||
@@ -443,8 +444,8 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
else
|
||||
helptext = "<span class='notice'>Subject suitable for experiments.</span>"
|
||||
|
||||
user << "<span class='notice'>Probing result:</span>[species]"
|
||||
user << "[helptext]"
|
||||
to_chat(user, "<span class='notice'>Probing result:</span>[species]")
|
||||
to_chat(user, "[helptext]")
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy
|
||||
name = "hard-light energy field"
|
||||
@@ -476,7 +477,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
if(BATON_CUFF)
|
||||
user <<"<span class='warning'>The baton is in restraining mode.</span>"
|
||||
if(BATON_PROBE)
|
||||
user << "<span class='warning'>The baton is in probing mode.</span>"
|
||||
to_chat(user, "<span class='warning'>The baton is in probing mode.</span>")
|
||||
|
||||
|
||||
/obj/item/weapon/scalpel/alien
|
||||
@@ -550,7 +551,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
|
||||
/obj/structure/table_frame/abductor/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/wrench))
|
||||
user << "<span class='notice'>You start disassembling [src]...</span>"
|
||||
to_chat(user, "<span class='notice'>You start disassembling [src]...</span>")
|
||||
playsound(src.loc, I.usesound, 50, 1)
|
||||
if(do_after(user, 30*I.toolspeed, target = src))
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
@@ -561,9 +562,9 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
if(istype(I, /obj/item/stack/sheet/mineral/abductor))
|
||||
var/obj/item/stack/sheet/P = I
|
||||
if(P.get_amount() < 1)
|
||||
user << "<span class='warning'>You need one alien alloy sheet to do this!</span>"
|
||||
to_chat(user, "<span class='warning'>You need one alien alloy sheet to do this!</span>")
|
||||
return
|
||||
user << "<span class='notice'>You start adding [P] to [src]...</span>"
|
||||
to_chat(user, "<span class='notice'>You start adding [P] to [src]...</span>")
|
||||
if(do_after(user, 50, target = src))
|
||||
P.use(1)
|
||||
new /obj/structure/table/abductor(src.loc)
|
||||
@@ -572,10 +573,9 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
if(istype(I, /obj/item/stack/sheet/mineral/silver))
|
||||
var/obj/item/stack/sheet/P = I
|
||||
if(P.get_amount() < 1)
|
||||
user << "<span class='warning'>You need one sheet of silver to do \
|
||||
this!</span>"
|
||||
to_chat(user, "<span class='warning'>You need one sheet of silver to do this!</span>")
|
||||
return
|
||||
user << "<span class='notice'>You start adding [P] to [src]...</span>"
|
||||
to_chat(user, "<span class='notice'>You start adding [P] to [src]...</span>")
|
||||
if(do_after(user, 50, target = src))
|
||||
P.use(1)
|
||||
new /obj/structure/table/optable/abductor(src.loc)
|
||||
@@ -612,7 +612,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
. = ..()
|
||||
if(iscarbon(AM))
|
||||
START_PROCESSING(SSobj, src)
|
||||
AM << "<span class='danger'>You feel a series of tiny pricks!</span>"
|
||||
to_chat(AM, "<span class='danger'>You feel a series of tiny pricks!</span>")
|
||||
|
||||
/obj/structure/table/optable/abductor/process()
|
||||
. = PROCESS_KILL
|
||||
@@ -654,7 +654,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
if( !WT.isOn() )
|
||||
return
|
||||
user << "<span class='notice'>You disassemble the airlock assembly.</span>"
|
||||
to_chat(user, "<span class='notice'>You disassemble the airlock assembly.</span>")
|
||||
new /obj/item/stack/sheet/mineral/abductor(get_turf(src), 4)
|
||||
qdel(src)
|
||||
else
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
IC.Remove(target)
|
||||
return 1
|
||||
else
|
||||
user << "<span class='warning'>You don't find anything in [target]'s [target_zone]!</span>"
|
||||
to_chat(user, "<span class='warning'>You don't find anything in [target]'s [target_zone]!</span>")
|
||||
return 1
|
||||
|
||||
/datum/surgery_step/gland_insert
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
icon_state = "health"
|
||||
|
||||
/obj/item/organ/heart/gland/heals/activate()
|
||||
owner << "<span class='notice'>You feel curiously revitalized.</span>"
|
||||
to_chat(owner, "<span class='notice'>You feel curiously revitalized.</span>")
|
||||
owner.adjustBruteLoss(-20)
|
||||
owner.adjustOxyLoss(-20)
|
||||
owner.adjustFireLoss(-20)
|
||||
@@ -74,7 +74,7 @@
|
||||
icon_state = "slime"
|
||||
|
||||
/obj/item/organ/heart/gland/slime/activate()
|
||||
owner << "<span class='warning'>You feel nauseous!</span>"
|
||||
to_chat(owner, "<span class='warning'>You feel nauseous!</span>")
|
||||
owner.vomit(20)
|
||||
|
||||
var/mob/living/simple_animal/slime/Slime
|
||||
@@ -90,13 +90,13 @@
|
||||
icon_state = "mindshock"
|
||||
|
||||
/obj/item/organ/heart/gland/mindshock/activate()
|
||||
owner << "<span class='notice'>You get a headache.</span>"
|
||||
to_chat(owner, "<span class='notice'>You get a headache.</span>")
|
||||
|
||||
var/turf/T = get_turf(owner)
|
||||
for(var/mob/living/carbon/H in orange(4,T))
|
||||
if(H == owner)
|
||||
continue
|
||||
H << "<span class='alien'>You hear a buzz in your head.</span>"
|
||||
to_chat(H, "<span class='alien'>You hear a buzz in your head.</span>")
|
||||
H.confused += 20
|
||||
|
||||
/obj/item/organ/heart/gland/pop
|
||||
@@ -107,7 +107,7 @@
|
||||
icon_state = "species"
|
||||
|
||||
/obj/item/organ/heart/gland/pop/activate()
|
||||
owner << "<span class='notice'>You feel unlike yourself.</span>"
|
||||
to_chat(owner, "<span class='notice'>You feel unlike yourself.</span>")
|
||||
var/species = pick(list(/datum/species/lizard,/datum/species/jelly/slime,/datum/species/pod,/datum/species/fly,/datum/species/jelly))
|
||||
owner.set_species(species)
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
icon_state = "vent"
|
||||
|
||||
/obj/item/organ/heart/gland/ventcrawling/activate()
|
||||
owner << "<span class='notice'>You feel very stretchy.</span>"
|
||||
to_chat(owner, "<span class='notice'>You feel very stretchy.</span>")
|
||||
owner.ventcrawler = VENTCRAWLER_ALWAYS
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
icon_state = "viral"
|
||||
|
||||
/obj/item/organ/heart/gland/viral/activate()
|
||||
owner << "<span class='warning'>You feel sick.</span>"
|
||||
to_chat(owner, "<span class='warning'>You feel sick.</span>")
|
||||
var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis)
|
||||
var/datum/disease/D = new virus_type()
|
||||
D.carrier = 1
|
||||
@@ -148,7 +148,7 @@
|
||||
icon_state = "emp"
|
||||
|
||||
/obj/item/organ/heart/gland/emp/activate()
|
||||
owner << "<span class='warning'>You feel a spike of pain in your head.</span>"
|
||||
to_chat(owner, "<span class='warning'>You feel a spike of pain in your head.</span>")
|
||||
empulse(get_turf(owner), 2, 5, 1)
|
||||
|
||||
/obj/item/organ/heart/gland/spiderman
|
||||
@@ -158,7 +158,7 @@
|
||||
icon_state = "spider"
|
||||
|
||||
/obj/item/organ/heart/gland/spiderman/activate()
|
||||
owner << "<span class='warning'>You feel something crawling in your skin.</span>"
|
||||
to_chat(owner, "<span class='warning'>You feel something crawling in your skin.</span>")
|
||||
owner.faction |= "spiders"
|
||||
new /obj/structure/spider/spiderling(owner.loc)
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
icon_state = "egg"
|
||||
|
||||
/obj/item/organ/heart/gland/egg/activate()
|
||||
owner << "<span class='boldannounce'>You lay an egg!</span>"
|
||||
to_chat(owner, "<span class='boldannounce'>You lay an egg!</span>")
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/egg/egg = new(owner.loc)
|
||||
egg.reagents.add_reagent("sacid",20)
|
||||
egg.desc += " It smells bad."
|
||||
@@ -197,7 +197,7 @@
|
||||
uses = 1
|
||||
|
||||
/obj/item/organ/heart/gland/bodysnatch/activate()
|
||||
owner << "<span class='warning'>You feel something moving around inside you...</span>"
|
||||
to_chat(owner, "<span class='warning'>You feel something moving around inside you...</span>")
|
||||
//spawn cocoon with clone greytide snpc inside
|
||||
if(ishuman(owner))
|
||||
var/obj/structure/spider/cocoon/abductor/C = new (get_turf(owner))
|
||||
@@ -239,10 +239,10 @@
|
||||
uses = -1
|
||||
|
||||
/obj/item/organ/heart/gland/plasma/activate()
|
||||
owner << "<span class='warning'>You feel bloated.</span>"
|
||||
to_chat(owner, "<span class='warning'>You feel bloated.</span>")
|
||||
sleep(150)
|
||||
if(!owner) return
|
||||
owner << "<span class='userdanger'>A massive stomachache overcomes you.</span>"
|
||||
to_chat(owner, "<span class='userdanger'>A massive stomachache overcomes you.</span>")
|
||||
sleep(50)
|
||||
if(!owner) return
|
||||
owner.visible_message("<span class='danger'>[owner] vomits a cloud of plasma!</span>")
|
||||
|
||||
@@ -4,18 +4,6 @@
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
var/team = 0
|
||||
|
||||
/obj/machinery/abductor/proc/IsAgent(mob/living/carbon/human/H)
|
||||
if(H.dna.species.id == "abductor")
|
||||
var/datum/species/abductor/S = H.dna.species
|
||||
return S.agent
|
||||
return 0
|
||||
|
||||
/obj/machinery/abductor/proc/IsScientist(mob/living/carbon/human/H)
|
||||
if(H.dna.species.id == "abductor")
|
||||
var/datum/species/abductor/S = H.dna.species
|
||||
return S.scientist
|
||||
return 0
|
||||
|
||||
//Console
|
||||
|
||||
/obj/machinery/abductor/console
|
||||
@@ -23,8 +11,8 @@
|
||||
desc = "Ship command center."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "console"
|
||||
density = 1
|
||||
anchored = 1
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/obj/item/device/abductor/gizmo/gizmo
|
||||
var/obj/item/clothing/suit/armor/abductor/vest/vest
|
||||
var/obj/machinery/abductor/experiment/experiment
|
||||
@@ -36,7 +24,7 @@
|
||||
if(..())
|
||||
return
|
||||
if(!isabductor(user))
|
||||
user << "<span class='warning'>You start mashing alien buttons at random!</span>"
|
||||
to_chat(user, "<span class='warning'>You start mashing alien buttons at random!</span>")
|
||||
if(do_after(user,100, target = src))
|
||||
TeleporterSend()
|
||||
return
|
||||
@@ -86,7 +74,6 @@
|
||||
dat += "<span class='bad'>NO AGENT VEST DETECTED</span>"
|
||||
var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/abductor/console/Topic(href, href_list)
|
||||
@@ -116,7 +103,7 @@
|
||||
Dispense(/obj/item/device/abductor/gizmo)
|
||||
if("vest")
|
||||
Dispense(/obj/item/clothing/suit/armor/abductor/vest)
|
||||
src.updateUsrDialog()
|
||||
updateUsrDialog()
|
||||
|
||||
|
||||
/obj/machinery/abductor/console/proc/TeleporterRetrieve()
|
||||
@@ -131,30 +118,29 @@
|
||||
if(vest!=null)
|
||||
vest.flip_mode()
|
||||
|
||||
/obj/machinery/abductor/console/proc/SelectDisguise(remote=0)
|
||||
var/list/entries = list()
|
||||
var/tempname
|
||||
var/datum/icon_snapshot/temp
|
||||
for(var/i = 1; i <= disguises.len; i++)
|
||||
temp = disguises[i]
|
||||
tempname = temp.name
|
||||
entries["[tempname]"] = disguises[i]
|
||||
var/entry_name = input( "Choose Disguise", "Disguise") in entries
|
||||
var/datum/icon_snapshot/chosen = entries[entry_name]
|
||||
/obj/machinery/abductor/console/proc/SelectDisguise(remote = 0)
|
||||
var/entry_name = input( "Choose Disguise", "Disguise") as null|anything in disguises
|
||||
var/datum/icon_snapshot/chosen = disguises[entry_name]
|
||||
if(chosen && (remote || in_range(usr,src)))
|
||||
vest.SetDisguise(chosen)
|
||||
|
||||
/obj/machinery/abductor/console/proc/SetDroppoint(turf/open/location,user)
|
||||
if(!istype(location))
|
||||
user << "<span class='warning'>That place is not safe for the specimen.</span>"
|
||||
to_chat(user, "<span class='warning'>That place is not safe for the specimen.</span>")
|
||||
return
|
||||
|
||||
if(pad)
|
||||
pad.teleport_target = location
|
||||
user << "<span class='notice'>Location marked as test subject release point.</span>"
|
||||
to_chat(user, "<span class='notice'>Location marked as test subject release point.</span>")
|
||||
|
||||
|
||||
/obj/machinery/abductor/console/proc/Setup()
|
||||
/obj/machinery/abductor/console/Initialize(mapload)
|
||||
if(mapload)
|
||||
return TRUE //wait for machines list
|
||||
..()
|
||||
|
||||
if(!team)
|
||||
return
|
||||
|
||||
for(var/obj/machinery/abductor/pad/p in machines)
|
||||
if(p.team == team)
|
||||
@@ -177,22 +163,21 @@
|
||||
entry.icon = target.icon
|
||||
entry.icon_state = target.icon_state
|
||||
entry.overlays = target.get_overlays_copy(list(HANDS_LAYER)) //ugh
|
||||
for(var/i=1,i<=disguises.len,i++)
|
||||
var/datum/icon_snapshot/temp = disguises[i]
|
||||
if(temp.name == entry.name)
|
||||
disguises[i] = entry
|
||||
return
|
||||
disguises.Add(entry)
|
||||
//Update old disguise instead of adding new one
|
||||
if(disguises[entry.name])
|
||||
disguises[entry.name] = entry
|
||||
return
|
||||
disguises[entry.name] = entry
|
||||
|
||||
/obj/machinery/abductor/console/attackby(obj/O, mob/user, params)
|
||||
if(istype(O, /obj/item/device/abductor/gizmo))
|
||||
var/obj/item/device/abductor/gizmo/G = O
|
||||
user << "<span class='notice'>You link the tool to the console.</span>"
|
||||
to_chat(user, "<span class='notice'>You link the tool to the console.</span>")
|
||||
gizmo = G
|
||||
G.console = src
|
||||
else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest))
|
||||
var/obj/item/clothing/suit/armor/abductor/vest/V = O
|
||||
user << "<span class='notice'>You link the vest to the console.</span>"
|
||||
to_chat(user, "<span class='notice'>You link the vest to the console.</span>")
|
||||
if(istype(vest))
|
||||
if(vest.flags & NODROP)
|
||||
toggle_vest()
|
||||
@@ -208,7 +193,7 @@
|
||||
flick("alien-pad", pad)
|
||||
new item(pad.loc)
|
||||
else
|
||||
new item(src.loc)
|
||||
new item(loc)
|
||||
else
|
||||
say("Insufficent data!")
|
||||
|
||||
@@ -216,5 +201,4 @@
|
||||
vest.flags ^= NODROP
|
||||
var/mob/M = vest.loc
|
||||
if(istype(M))
|
||||
M << "<span class='notice'>[src] is now \
|
||||
[vest.flags & NODROP ? "locked" : "unlocked"].</span>"
|
||||
to_chat(M, "<span class='notice'>[src] is now [vest.flags & NODROP ? "locked" : "unlocked"].</span>")
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200)
|
||||
popup.add_head_content(box_css)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
return
|
||||
|
||||
@@ -77,7 +76,7 @@
|
||||
|
||||
if(href_list["dispense"])
|
||||
Dispense(text2num(href_list["dispense"]))
|
||||
src.updateUsrDialog()
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/abductor/gland_dispenser/proc/Dispense(count)
|
||||
if(amounts[count]>0)
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
var/breakout_time = 600
|
||||
user.changeNext_move(CLICK_CD_BREAKOUT)
|
||||
user.last_special = world.time + CLICK_CD_BREAKOUT
|
||||
user << "<span class='notice'>You lean on the back of [src] and start pushing the door open... (this will take about a minute.)</span>"
|
||||
to_chat(user, "<span class='notice'>You lean on the back of [src] and start pushing the door open... (this will take about a minute.)</span>")
|
||||
user.visible_message("<span class='italics'>You hear a metallic creaking from [src]!</span>")
|
||||
|
||||
if(do_after(user,(breakout_time), target = src))
|
||||
@@ -54,7 +54,7 @@
|
||||
return
|
||||
|
||||
visible_message("<span class='warning'>[user] successfully broke out of [src]!</span>")
|
||||
user << "<span class='notice'>You successfully break out of [src]!</span>"
|
||||
to_chat(user, "<span class='notice'>You successfully break out of [src]!</span>")
|
||||
|
||||
open_machine()
|
||||
|
||||
@@ -171,13 +171,13 @@
|
||||
sleep(5)
|
||||
switch(text2num(type))
|
||||
if(1)
|
||||
H << "<span class='warning'>You feel violated.</span>"
|
||||
to_chat(H, "<span class='warning'>You feel violated.</span>")
|
||||
if(2)
|
||||
H << "<span class='warning'>You feel yourself being sliced apart and put back together.</span>"
|
||||
to_chat(H, "<span class='warning'>You feel yourself being sliced apart and put back together.</span>")
|
||||
if(3)
|
||||
H << "<span class='warning'>You feel intensely watched.</span>"
|
||||
to_chat(H, "<span class='warning'>You feel intensely watched.</span>")
|
||||
sleep(5)
|
||||
H << "<span class='warning'><b>Your mind snaps!</b></span>"
|
||||
to_chat(H, "<span class='warning'><b>Your mind snaps!</b></span>")
|
||||
var/objtype = pick(subtypesof(/datum/objective/abductee/))
|
||||
var/datum/objective/abductee/O = new objtype()
|
||||
ticker.mode.abductees += H.mind
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
for(var/mob/living/target in loc)
|
||||
target.forceMove(teleport_target)
|
||||
new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir)
|
||||
to_chat(target, "<span class='warning'>The instability of the warp leaves you disoriented!</span>")
|
||||
target.Stun(3)
|
||||
|
||||
/obj/machinery/abductor/pad/proc/Retrieve(mob/living/target)
|
||||
flick("alien-pad", src)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user