IOERJIOREGJEIORGWJEIORHJWIOEHJI
IOJWIEOJWEGMWIEGOMW84MGJRIGHJKSAHGSJKDHGJKDHGLJRGWRJGKJRG
@@ -1,8 +1,9 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
var/global/list/all_cults = list()
|
||||
|
||||
/datum/game_mode
|
||||
var/list/datum/mind/cult = list()
|
||||
var/list/allwords = list("travel","self","see","hell","blood","join","tech","destroy", "other", "hide")
|
||||
|
||||
|
||||
/proc/iscultist(mob/living/M as mob)
|
||||
return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult)
|
||||
@@ -21,64 +22,32 @@ var/global/list/all_cults = list()
|
||||
var/mob/living/carbon/human/H = mind.current
|
||||
if(isloyal(H))
|
||||
return 0
|
||||
if(issilicon(mind.current))
|
||||
return 0 //can't convert machines, that's ratvar's thing
|
||||
if(isguardian(mind.current))
|
||||
var/mob/living/simple_animal/hostile/guardian/G = mind.current
|
||||
if(!iscultist(G.summoner))
|
||||
return 0 //can't convert it unless the owner is converted
|
||||
return 1
|
||||
|
||||
/proc/is_sacrifice_target(datum/mind/mind)
|
||||
if(istype(ticker.mode.name, "cult"))
|
||||
var/datum/game_mode/cult/cult_mode = ticker.mode
|
||||
if(mind == cult_mode.sacrifice_target)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/game_mode/cult
|
||||
name = "cult"
|
||||
config_tag = "cult"
|
||||
restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Security Officer", "Warden", "Detective", "Security Pod Pilot", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician")
|
||||
restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Security Officer", "Warden", "Detective", "Security Pod Pilot", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer")
|
||||
protected_jobs = list()
|
||||
required_players = 1//30
|
||||
required_enemies = 1//3
|
||||
recommended_enemies = 1//4
|
||||
required_players = 30
|
||||
required_enemies = 3
|
||||
recommended_enemies = 4
|
||||
|
||||
var/datum/mind/sacrifice_target = null
|
||||
var/finished = 0
|
||||
|
||||
var/list/startwords = list("blood","join","self","hell")
|
||||
|
||||
var/list/objectives = list()
|
||||
|
||||
var/eldergod = 1 //for the summon god objective
|
||||
var/demons_summoned = 0
|
||||
|
||||
var/acolytes_needed = 4 //for the survive objective - base number of acolytes, increased by 1 for every 10 players
|
||||
var/const/min_cultists_to_start = 3
|
||||
var/const/max_cultists_to_start = 4
|
||||
var/acolytes_survived = 0
|
||||
|
||||
var/narsie_condition_cleared = 0 //allows Nar-Sie to be summonned during cult rounds. set to 1 once the cult reaches the second phase.
|
||||
var/current_objective = 1 //equals the number of cleared objectives + 1
|
||||
var/prenarsie_objectives = 2 //how many objectives at most before the cult gets to summon narsie
|
||||
var/list/bloody_floors = list()
|
||||
var/spilltarget = 100 //how many floor tiles must be covered in blood to complete the bloodspill objective
|
||||
var/convert_target = 0 //how many members the cult needs to reach to complete the convert objective
|
||||
var/harvested = 0
|
||||
|
||||
var/list/sacrificed = list() //contains the mind of the sacrifice target ONCE the sacrifice objective has been completed
|
||||
var/mass_convert = 0 //set to 1 if the convert objective has been accomplised once that round
|
||||
var/spilled_blood = 0 //set to 1 if the bloodspill objective has been accomplised once that round
|
||||
var/max_spilled_blood = 0 //highest quantity of blood covered tiles during the round
|
||||
var/bonus = 0 //set to 1 if the cult has completed the bonus (third phase) objective (harvest, hijack, massacre)
|
||||
|
||||
var/harvest_target = 10
|
||||
var/massacre_target = 5
|
||||
|
||||
var/escaped_shuttle = 0
|
||||
var/escaped_pod = 0
|
||||
var/survivors = 0
|
||||
|
||||
/datum/game_mode/cult/announce()
|
||||
to_chat(world, "<B>The current game mode is - Cult!</B>")
|
||||
@@ -86,9 +55,16 @@ var/global/list/all_cults = list()
|
||||
|
||||
|
||||
/datum/game_mode/cult/pre_setup()
|
||||
if(prob(50))
|
||||
objectives += "survive"
|
||||
objectives += "sacrifice"
|
||||
else
|
||||
objectives += "eldergod"
|
||||
objectives += "sacrifice"
|
||||
|
||||
if(config.protect_roles_from_antagonist)
|
||||
restricted_jobs += protected_jobs
|
||||
..()
|
||||
|
||||
var/list/cultists_possible = get_players_for_role(ROLE_CULTIST)
|
||||
|
||||
for(var/cultists_number = 1 to max_cultists_to_start)
|
||||
@@ -116,13 +92,10 @@ var/global/list/all_cults = list()
|
||||
|
||||
for(var/datum/mind/cult_mind in cult)
|
||||
equip_cultist(cult_mind.current)
|
||||
cult_mind.current.faction |= "cult"
|
||||
var/datum/action/cultcomm/C = new()
|
||||
C.Grant(cult_mind.current)
|
||||
grant_runeword(cult_mind.current)
|
||||
update_cult_icons_added(cult_mind)
|
||||
to_chat(cult_mind.current, "<span class='cultitalic'>You catch a glimpse of the Realm of [ticker.mode.cultdat.entity_name], [ticker.mode.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.mode.cultdat.entity_name].</span>")
|
||||
|
||||
first_phase()
|
||||
to_chat(cult_mind.current, "\blue You are a member of the cult!")
|
||||
memorize_cult_objectives(cult_mind)
|
||||
|
||||
..()
|
||||
|
||||
@@ -133,30 +106,30 @@ var/global/list/all_cults = list()
|
||||
switch(objectives[obj_count])
|
||||
if("survive")
|
||||
explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station."
|
||||
if("convert")
|
||||
explanation = "We must increase our influence before we can summon [ticker.mode.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions."
|
||||
if("bloodspill")
|
||||
explanation = "We must prepare this place for [ticker.mode.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles."
|
||||
if("sacrifice")
|
||||
if(sacrifice_target)
|
||||
explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune and three acolytes to do so."
|
||||
explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune (hell blood join) and three acolytes to do so."
|
||||
else
|
||||
explanation = "Free objective."
|
||||
if("eldergod")
|
||||
explanation = "Summon [ticker.mode.cultdat.entity_name]. It will only work if nine cultists stand on and around it."
|
||||
explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it."
|
||||
to_chat(cult_mind.current, "<B>Objective #[obj_count]</B>: [explanation]")
|
||||
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
|
||||
to_chat(cult_mind.current, "The convert rune is join blood self")
|
||||
cult_mind.memory += "The convert rune is join blood self<BR>"
|
||||
|
||||
|
||||
/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob)
|
||||
if(!istype(mob))
|
||||
return
|
||||
|
||||
if (mob.mind)
|
||||
if (mob.mind.assigned_role == "Clown")
|
||||
if(mob.mind)
|
||||
if(mob.mind.assigned_role == "Clown")
|
||||
to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
|
||||
mob.mutations.Remove(CLUMSY)
|
||||
|
||||
add_cult_viewpoint(mob) // give them a viewpoint
|
||||
|
||||
var/obj/item/weapon/paper/talisman/supply/T = new(mob)
|
||||
var/list/slots = list (
|
||||
"backpack" = slot_in_backpack,
|
||||
@@ -166,31 +139,55 @@ var/global/list/all_cults = list()
|
||||
"right hand" = slot_r_hand,
|
||||
)
|
||||
var/where = mob.equip_in_one_of_slots(T, slots)
|
||||
if (!where)
|
||||
to_chat(mob, "<span class='danger'>Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately.</span>")
|
||||
if(!where)
|
||||
to_chat(mob, "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately.")
|
||||
else
|
||||
to_chat(mob, "<span class='cult'>You have a talisman in your [where], one that will help you start the cult on this station. Use it well and remember - there are others.</span>")
|
||||
to_chat(mob, "You have a talisman in your [where], one that will help you start the cult on this station. Use it well and remember - there are others.")
|
||||
mob.update_icons()
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/cult/grant_runeword(mob/living/carbon/human/cult_mob, var/word)
|
||||
if(!word)
|
||||
if(startwords.len > 0)
|
||||
word=pick(startwords)
|
||||
startwords -= word
|
||||
return ..(cult_mob,word)
|
||||
|
||||
|
||||
/datum/game_mode/proc/grant_runeword(mob/living/carbon/human/cult_mob, var/word)
|
||||
if(!cultwords["travel"])
|
||||
runerandom()
|
||||
if(!word)
|
||||
word=pick(allwords)
|
||||
var/wordexp = "[cultwords[word]] is [word]..."
|
||||
to_chat(cult_mob, "\red [pick("You remember something from the dark teachings of your master","You hear a dark voice on the wind","Black blood oozes into your vision and forms into symbols","You have a vision of a [pick("crow","raven","vulture","parrot")] it squawks","You catch a brief glimmer of the otherside")]... [wordexp]")
|
||||
cult_mob.mind.store_memory("<B>You remember that</B> [wordexp]", 0, 0)
|
||||
|
||||
|
||||
/datum/game_mode/proc/add_cult_viewpoint(var/mob/target)
|
||||
for(var/obj/cult_viewpoint/viewpoint in target)
|
||||
return
|
||||
var/obj/cult_viewpoint/viewpoint = new(target)
|
||||
viewpoint.loc = target
|
||||
return viewpoint
|
||||
|
||||
|
||||
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE
|
||||
if (!istype(cult_mind))
|
||||
if(!istype(cult_mind))
|
||||
return 0
|
||||
if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind))
|
||||
cult += cult_mind
|
||||
cult_mind.current.faction |= "cult"
|
||||
var/datum/action/cultcomm/C = new()
|
||||
C.Grant(cult_mind.current)
|
||||
add_cult_viewpoint(cult_mind.current)
|
||||
update_cult_icons_added(cult_mind)
|
||||
cult_mind.current.attack_log += "\[[time_stamp()]\] <span class='danger'>Has been converted to the cult!</span>"
|
||||
if(jobban_isbanned(cult_mind.current, ROLE_CULTIST))
|
||||
replace_jobbaned_player(cult_mind.current, ROLE_CULTIST)
|
||||
update_cult_icons_added(cult_mind)
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/cult/add_cultist(datum/mind/cult_mind) //INHERIT
|
||||
if (!..(cult_mind))
|
||||
if(!..(cult_mind))
|
||||
return
|
||||
memorize_cult_objectives(cult_mind)
|
||||
|
||||
@@ -199,18 +196,40 @@ var/global/list/all_cults = list()
|
||||
if(cult_mind in cult)
|
||||
cult -= cult_mind
|
||||
to_chat(cult_mind.current, "\red <FONT size = 3><B>An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it.</B></FONT>")
|
||||
cult_mind.current.faction -= "cult"
|
||||
cult_mind.memory = ""
|
||||
cult_mind.special_role = null
|
||||
for(var/datum/action/cultcomm/C in cult_mind.current.actions)
|
||||
qdel(C)
|
||||
// remove the cult viewpoint object
|
||||
var/obj/viewpoint = getCultViewpoint(cult_mind.current)
|
||||
qdel(viewpoint)
|
||||
|
||||
update_cult_icons_removed(cult_mind)
|
||||
if(show_message)
|
||||
for(var/mob/M in viewers(cult_mind.current))
|
||||
to_chat(M, "<FONT size = 3>[cult_mind.current] looks like they just reverted to their old faith!</FONT>")
|
||||
|
||||
|
||||
/datum/game_mode/proc/add_cult_icon_to_spirit(mob/spirit/currentSpirit)
|
||||
if(!istype(currentSpirit))
|
||||
return FALSE
|
||||
if(currentSpirit.client)
|
||||
var/datum/atom_hud/antag/maskhud = huds[ANTAG_HUD_CULT]
|
||||
maskhud.join_hud(currentSpirit)
|
||||
set_antag_hud(currentSpirit,"hudcultist")
|
||||
|
||||
|
||||
/datum/game_mode/proc/remove_cult_icon_from_spirit(mob/spirit/currentSpirit)
|
||||
if(!istype(currentSpirit))
|
||||
return FALSE
|
||||
if(currentSpirit.client)
|
||||
var/datum/atom_hud/antag/maskhud = huds[ANTAG_HUD_CULT]
|
||||
maskhud.leave_hud(currentSpirit)
|
||||
set_antag_hud(currentSpirit, null)
|
||||
|
||||
|
||||
/datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind)
|
||||
for(var/mob/spirit/currentSpirit in spirits)
|
||||
add_cult_icon_to_spirit(currentSpirit,cult_mind)
|
||||
|
||||
var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT]
|
||||
culthud.join_hud(cult_mind.current)
|
||||
set_antag_hud(cult_mind.current, "hudcultist")
|
||||
@@ -218,6 +237,9 @@ var/global/list/all_cults = list()
|
||||
|
||||
/datum/game_mode/proc/update_cult_icons_removed(datum/mind/cult_mind)
|
||||
|
||||
for(var/mob/spirit/currentSpirit in spirits)
|
||||
remove_cult_icon_from_spirit(currentSpirit,cult_mind)
|
||||
|
||||
var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT]
|
||||
culthud.leave_hud(cult_mind.current)
|
||||
set_antag_hud(cult_mind.current, null)
|
||||
@@ -237,18 +259,9 @@ var/global/list/all_cults = list()
|
||||
cult_fail += check_survive() //the proc returns 1 if there are not enough cultists on the shuttle, 0 otherwise
|
||||
if(objectives.Find("eldergod"))
|
||||
cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once
|
||||
if(objectives.Find("slaughter"))
|
||||
if(!demons_summoned)
|
||||
cult_fail++
|
||||
if(objectives.Find("sacrifice"))
|
||||
if(sacrifice_target && !(sacrifice_target in sacrificed)) //if the target has been sacrificed, ignore this step. otherwise, add 1 to cult_fail
|
||||
cult_fail++
|
||||
if(objectives.Find("convert"))
|
||||
if(cult.len < convert_target)
|
||||
cult_fail++
|
||||
if(objectives.Find("bloodspill"))
|
||||
if(max_spilled_blood < spilltarget)
|
||||
cult_fail++
|
||||
|
||||
return cult_fail //if any objectives aren't met, failure
|
||||
|
||||
@@ -256,9 +269,9 @@ var/global/list/all_cults = list()
|
||||
/datum/game_mode/cult/proc/check_survive()
|
||||
acolytes_survived = 0
|
||||
for(var/datum/mind/cult_mind in cult)
|
||||
if (cult_mind.current && cult_mind.current.stat!=2)
|
||||
if(cult_mind.current && cult_mind.current.stat!=2)
|
||||
var/area/A = get_area(cult_mind.current )
|
||||
if ( is_type_in_list(A, centcom_areas))
|
||||
if( is_type_in_list(A, centcom_areas))
|
||||
acolytes_survived++
|
||||
else if(A == shuttle_master.emergency.areaInstance && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) //snowflaked into objectives because shitty bay shuttles had areas to auto-determine this
|
||||
acolytes_survived++
|
||||
@@ -274,7 +287,6 @@ var/global/list/all_cults = list()
|
||||
|
||||
|
||||
/datum/game_mode/cult/declare_completion()
|
||||
bonus_check()
|
||||
|
||||
if(!check_cult_victory())
|
||||
feedback_set_details("round_end_result","win - cult win")
|
||||
@@ -312,59 +324,11 @@ var/global/list/all_cults = list()
|
||||
feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED")
|
||||
if("eldergod")
|
||||
if(!eldergod)
|
||||
explanation = "Summon [ticker.mode.cultdat.entity_name]. <font color='green'><B>Success!</B></font>"
|
||||
explanation = "Summon Nar-Sie. <font color='green'><B>Success!</B></font>"
|
||||
feedback_add_details("cult_objective","cult_narsie|SUCCESS")
|
||||
else
|
||||
explanation = "Summon [ticker.mode.cultdat.entity_name]. <font color='red'>Fail.</font>"
|
||||
explanation = "Summon Nar-Sie. <font color='red'>Fail.</font>"
|
||||
feedback_add_details("cult_objective","cult_narsie|FAIL")
|
||||
if("slaughter")
|
||||
if(demons_summoned)
|
||||
explanation = "Bring the Slaughter. <span class='greenannounce'>Success!</span>"
|
||||
feedback_add_details("cult_objective","cult_demons|SUCCESS")
|
||||
else
|
||||
explanation = "Bring the Slaughter. <span class='boldannounce'>Fail.</span>"
|
||||
feedback_add_details("cult_objective","cult_demons|FAIL")
|
||||
|
||||
if("convert")//convert half the crew
|
||||
if(obj_count < objectives.len)
|
||||
explanation = "Convert [convert_target] crewmembers ([cult.len] cultists at round end). <font color='green'><B>Success!</B></font>"
|
||||
feedback_add_details("cult_objective","cult_convertion|SUCCESS")
|
||||
else
|
||||
explanation = "Convert [convert_target] crewmembers ([cult.len] total cultists). <font color='red'><B>Fail!</B></font>"
|
||||
feedback_add_details("cult_objective","cult_convertion|FAIL")
|
||||
|
||||
if("bloodspill")//cover a large portion of the station in blood
|
||||
if(obj_count < objectives.len)
|
||||
explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). <font color='green'><B>Success!</B></font>"
|
||||
feedback_add_details("cult_objective","cult_bloodspill|SUCCESS")
|
||||
else
|
||||
explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). <font color='red'><B>Fail!</B></font>"
|
||||
feedback_add_details("cult_objective","cult_bloodspill|FAIL")
|
||||
|
||||
if("harvest")
|
||||
if(harvested > harvest_target)
|
||||
explanation = "Offer [harvest_target] humans for [ticker.mode.cultdat.entity_name]'s first meal of the day. ([harvested] eaten) <font color='green'><B>Success!</B></font>"
|
||||
feedback_add_details("cult_objective","cult_harvest|SUCCESS")
|
||||
else
|
||||
explanation = "Offer [harvest_target] humans for [ticker.mode.cultdat.entity_name]'s first meal of the day. ([harvested] eaten) <font color='red'><B>Fail!</B></font>"
|
||||
feedback_add_details("cult_objective","cult_harvest|FAIL")
|
||||
|
||||
if("hijack")
|
||||
if(!escaped_shuttle)
|
||||
explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) <font color='green'><B>Success!</B></font>"
|
||||
feedback_add_details("cult_objective","cult_hijack|SUCCESS")
|
||||
else
|
||||
explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) <font color='red'><B>Fail!</B></font>"
|
||||
feedback_add_details("cult_objective","cult_hijack|FAIL")
|
||||
|
||||
if("massacre")
|
||||
if(survivors < massacre_target)
|
||||
explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humans left alive) <font color='green'><B>Success!</B></font>"
|
||||
feedback_add_details("cult_objective","cult_massacre|SUCCESS")
|
||||
else
|
||||
explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humans left alive) <font color='red'><B>Fail!</B></font>"
|
||||
feedback_add_details("cult_objective","cult_massacre|FAIL")
|
||||
|
||||
text += "<br><B>Objective #[obj_count]</B>: [explanation]"
|
||||
|
||||
to_chat(world, text)
|
||||
|
||||
@@ -1,67 +1,41 @@
|
||||
/obj/item/weapon/melee/cultblade
|
||||
name = "Cult Blade"
|
||||
desc = "An arcane weapon wielded by the followers of a cult."
|
||||
desc = "An arcane weapon wielded by the followers of Nar-Sie"
|
||||
icon_state = "cultblade"
|
||||
item_state = "cultblade"
|
||||
w_class = 4
|
||||
force = 30
|
||||
throwforce = 10
|
||||
sharp = 1
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
|
||||
/obj/item/weapon/melee/cultblade/attack(mob/living/target as mob, mob/living/carbon/human/user as mob)
|
||||
if(!iscultist(user))
|
||||
user.Weaken(5)
|
||||
user.unEquip(src, 1)
|
||||
user.visible_message("<span class='warning'>A powerful force shoves [user] away from [target]!</span>", \
|
||||
"<span class='cultlarge'>\"You shouldn't play with sharp things. You'll poke someone's eye out.\"</span>")
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.apply_damage(rand(force/2, force), BRUTE, pick("l_arm", "r_arm"))
|
||||
else
|
||||
user.adjustBruteLoss(rand(force/2,force))
|
||||
return
|
||||
..()
|
||||
if(iscultist(user))
|
||||
return ..()
|
||||
else
|
||||
user.Paralyse(5)
|
||||
to_chat(user, "\red An unexplicable force powerfully repels the sword from [target]!")
|
||||
var/organ = ((user.hand ? "l_":"r_") + "arm")
|
||||
var/obj/item/organ/external/affecting = user.get_organ(organ)
|
||||
if(affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade.
|
||||
user.UpdateDamageIcon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/melee/cultblade/pickup(mob/living/user)
|
||||
/obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob)
|
||||
..()
|
||||
if(!iscultist(user))
|
||||
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>")
|
||||
to_chat(user, "\red An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly.")
|
||||
user.Dizzy(120)
|
||||
|
||||
/obj/item/weapon/melee/cultblade/dagger
|
||||
name = "sacrificial dagger"
|
||||
desc = "A strange dagger said to be used by sinister groups for \"preparing\" a corpse before sacrificing it to their dark gods."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "render"
|
||||
w_class = 2
|
||||
force = 15
|
||||
throwforce = 25
|
||||
|
||||
/obj/item/weapon/melee/cultblade/dagger/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
..()
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.drip(500)
|
||||
|
||||
|
||||
/obj/item/weapon/legcuffs/bolas/cult
|
||||
name = "runed bola"
|
||||
desc = "A strong bola, bound with dark magic. Throw it to trip and slow your victim."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "bola_cult"
|
||||
breakouttime = 45
|
||||
|
||||
/obj/item/clothing/head/culthood
|
||||
name = "cult hood"
|
||||
icon_state = "culthood"
|
||||
desc = "A hood worn by the followers of a cult."
|
||||
desc = "A hood worn by the followers of Nar-Sie."
|
||||
flags_inv = HIDEFACE
|
||||
flags = HEADCOVERSEYES
|
||||
armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0)
|
||||
armor = list(melee = 30, bullet = 10, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 0)
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
|
||||
|
||||
@@ -70,18 +44,20 @@
|
||||
icon_state = "cult_hoodalt"
|
||||
item_state = "cult_hoodalt"
|
||||
|
||||
/obj/item/clothing/suit/cultrobes/alt
|
||||
/obj/item/clothing/suit/hooded/cultrobes/alt
|
||||
icon_state = "cultrobesalt"
|
||||
item_state = "cultrobesalt"
|
||||
hoodtype = /obj/item/clothing/head/culthood/alt
|
||||
|
||||
/obj/item/clothing/suit/cultrobes
|
||||
/obj/item/clothing/suit/hooded/cultrobes
|
||||
name = "cult robes"
|
||||
desc = "A set of armored robes worn by the followers of a cult."
|
||||
desc = "A set of armored robes worn by the followers of Nar-Sie"
|
||||
icon_state = "cultrobes"
|
||||
item_state = "cultrobes"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
hoodtype = /obj/item/clothing/head/culthood
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
|
||||
/obj/item/clothing/head/magus
|
||||
@@ -91,7 +67,7 @@
|
||||
desc = "A helm worn by the followers of Nar-Sie."
|
||||
flags_inv = HIDEFACE
|
||||
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
|
||||
armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0)
|
||||
armor = list(melee = 30, bullet = 30, laser = 30, energy = 20, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/magusred
|
||||
name = "magus robes"
|
||||
@@ -100,15 +76,15 @@
|
||||
item_state = "magusred"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0)
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
|
||||
/obj/item/clothing/head/helmet/space/cult
|
||||
name = "cult helmet"
|
||||
desc = "A space worthy helmet used by the followers of a cult."
|
||||
desc = "A space worthy helmet used by the followers of Nar-Sie"
|
||||
icon_state = "cult_helmet"
|
||||
item_state = "cult_helmet"
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
|
||||
/obj/item/clothing/suit/space/cult
|
||||
name = "cult armour"
|
||||
@@ -117,150 +93,4 @@
|
||||
desc = "A bulky suit of armour, bristling with spikes. It looks space proof."
|
||||
w_class = 3
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank)
|
||||
slowdown = 1
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
|
||||
/obj/item/clothing/suit/cultrobes/berserker
|
||||
name = "flagellant's robes"
|
||||
desc = "Blood-soaked robes infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
|
||||
icon_state = "hardsuit-beserker"
|
||||
item_state = "hardsuit-beserker"
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
armor = list(melee = -100, bullet = -100, laser = -100,energy = -100, bomb = -100, bio = -100, rad = -100)
|
||||
slowdown = -1
|
||||
|
||||
/obj/item/clothing/head/berserkerhood
|
||||
name = "flagellant's robes"
|
||||
desc = "Blood-soaked garb infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
|
||||
icon_state = "culthood"
|
||||
flags_inv = HIDEFACE
|
||||
flags = HEADCOVERSEYES
|
||||
armor = list(melee = -100, bullet = -100, laser = -100,energy = -100, bomb = -100, bio = -100, rad = -100)
|
||||
|
||||
/obj/item/weapon/whetstone/cult
|
||||
name = "eldritch whetstone"
|
||||
desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
|
||||
icon = 'icons/obj/cult.dmi'
|
||||
icon_state = "cultstone"
|
||||
used = 0
|
||||
increment = 5
|
||||
max = 40
|
||||
prefix = "darkened"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
|
||||
name = "flask of unholy water"
|
||||
desc = "Toxic to nonbelievers; this water renews and reinvigorates the faithful of a cult."
|
||||
icon_state = "holyflask"
|
||||
color = "#333333"
|
||||
list_reagents = list("unholywater" = 40)
|
||||
|
||||
/obj/item/clothing/glasses/night/cultblind
|
||||
desc = "May the master guide you through the darkness and shield you from the light."
|
||||
name = "zealot's blindfold"
|
||||
icon_state = "blindfold"
|
||||
item_state = "blindfold"
|
||||
darkness_view = 8
|
||||
flash_protect = 1
|
||||
|
||||
/obj/item/clothing/glasses/night/cultblind/equipped(mob/user, slot)
|
||||
..()
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "<span class='cultlarge'>\"You want to be blind, do you?\"</span>")
|
||||
user.unEquip(src, 1)
|
||||
user.Dizzy(30)
|
||||
user.Weaken(5)
|
||||
user.eye_blind = 30
|
||||
|
||||
/obj/item/device/shuttle_curse
|
||||
name = "cursed orb"
|
||||
desc = "You peer within this smokey orb and glimpse terrible fates befalling the escape shuttle."
|
||||
icon = 'icons/obj/projectiles.dmi'
|
||||
icon_state ="bluespace"
|
||||
color = "#ff0000"
|
||||
var/static/curselimit = 0
|
||||
|
||||
/obj/item/device/shuttle_curse/attack_self(mob/user)
|
||||
if(!iscultist(user))
|
||||
user.unEquip(src, 1)
|
||||
user.Weaken(5)
|
||||
to_chat(user, "<span class='warning'>A powerful force shoves you away from [src]!</span>")
|
||||
return
|
||||
if(curselimit > 1)
|
||||
to_chat(user, "<span class='notice'>We have exhausted our ability to curse the shuttle.</span>")
|
||||
return
|
||||
if(shuttle_master.emergency.mode == SHUTTLE_CALL)
|
||||
var/cursetime = 1500
|
||||
var/timer = shuttle_master.emergency.timeLeft(1) + cursetime
|
||||
shuttle_master.emergency.setTimer(timer)
|
||||
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)
|
||||
var/global/list/curses
|
||||
if(!curses)
|
||||
curses = list("A fuel technician just slit his own throat and begged for death. The shuttle will be delayed by two minutes.",
|
||||
"The shuttle's navigation programming was replaced by a file containing two words, IT COMES. The shuttle will be delayed by two minutes.",
|
||||
"The shuttle's custodian tore out his guts and began painting strange shapes on the floor. The shuttle will be delayed by two minutes.",
|
||||
"A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh. The shuttle will be delayed by two minutes.",
|
||||
"A shuttle inspector started laughing madly over the radio and then threw herself into an engine turbine. The shuttle will be delayed by two minutes.",
|
||||
"The shuttle dispatcher was found dead with bloody symbols carved into their flesh. The shuttle will be delayed by two minutes.",
|
||||
"Steve repeatedly touched a lightbulb until his hands fell off. The shuttle will be delayed by two minutes.")
|
||||
var/message = pick(curses)
|
||||
command_announcement.Announce("[message]", "System Failure", 'sound/misc/notice1.ogg')
|
||||
curselimit++
|
||||
|
||||
/obj/item/device/cult_shift
|
||||
name = "veil shifter"
|
||||
desc = "This relic teleports you forward a medium distance."
|
||||
icon = 'icons/obj/cult.dmi'
|
||||
icon_state ="shifter"
|
||||
var/uses = 2
|
||||
|
||||
/obj/item/device/cult_shift/examine(mob/user)
|
||||
..()
|
||||
if(uses)
|
||||
to_chat(user, "<span class='cult'>It has [uses] uses remaining.</span>")
|
||||
else
|
||||
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
|
||||
if(C.pulling)
|
||||
var/atom/movable/pulled = C.pulling
|
||||
pulled.forceMove(T)
|
||||
. = pulled
|
||||
|
||||
/obj/item/device/cult_shift/attack_self(mob/user)
|
||||
if(!uses || !iscarbon(user))
|
||||
to_chat(user, "<span class='warning'>\The [src] is dull and unmoving in your hands.</span>")
|
||||
return
|
||||
if(!iscultist(user))
|
||||
user.unEquip(src, 1)
|
||||
step(src, pick(alldirs))
|
||||
to_chat(user, "<span class='warning'>\The [src] flickers out of your hands, too eager to move!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/C = user
|
||||
var/turf/mobloc = get_turf(C)
|
||||
var/turf/destination = get_teleport_loc(mobloc,C,9,1,3,1,0,1)
|
||||
|
||||
if(destination)
|
||||
uses--
|
||||
if(uses <= 0)
|
||||
icon_state ="shifter_drained"
|
||||
playsound(mobloc, "sparks", 50, 1)
|
||||
new /obj/effect/overlay/temp/cult/phase/out(mobloc)
|
||||
|
||||
var/atom/movable/pulled = handle_teleport_grab(destination, C)
|
||||
C.forceMove(destination)
|
||||
if(pulled)
|
||||
C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull
|
||||
|
||||
new /obj/effect/overlay/temp/cult/phase(destination)
|
||||
playsound(destination, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(destination, "sparks", 50, 1)
|
||||
|
||||
else
|
||||
to_chat(C, "<span class='danger'>The veil cannot be torn here!</span>")
|
||||
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
|
||||
@@ -1,278 +1,686 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
var/cultwords = list()
|
||||
var/rune_to_english = list()
|
||||
var/runedec = 0
|
||||
var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", "self", "see", "other", "hide")
|
||||
|
||||
/client/proc/check_words() // -- Urist
|
||||
set category = "Special Verbs"
|
||||
set name = "Check Rune Words"
|
||||
set desc = "Check the rune-word meaning"
|
||||
if(!cultwords["travel"])
|
||||
runerandom()
|
||||
for(var/word in engwords)
|
||||
to_chat(usr, "[cultwords[word]] is [word]")
|
||||
|
||||
/proc/runerandom() //randomizes word meaning
|
||||
var/list/runewords=list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri") ///"orkan" and "allaq" removed.
|
||||
for(var/word in engwords)
|
||||
var/runeword = pick(runewords)
|
||||
cultwords[word] = runeword
|
||||
rune_to_english[runeword] = word
|
||||
runewords-=cultwords[word]
|
||||
|
||||
|
||||
/obj/effect/rune
|
||||
desc = ""
|
||||
anchored = 1
|
||||
icon = 'icons/obj/rune.dmi'
|
||||
icon_state = "1"
|
||||
var/visibility = 0
|
||||
var/view_range = 7
|
||||
unacidable = 1
|
||||
layer = TURF_LAYER
|
||||
|
||||
var/word1
|
||||
var/word2
|
||||
var/word3
|
||||
// Places these combos are mentioned: this file - twice in the rune code, once in imbued tome, once in tome's HTML runes.dm - in the imbue rune code. If you change a combination - dont forget to change it everywhere.
|
||||
|
||||
// travel self [word] - Teleport to random [rune with word destination matching]
|
||||
// travel other [word] - Portal to rune with word destination matching - kinda doesnt work. At least the icon. No idea why.
|
||||
// see blood Hell - Create a new tome
|
||||
// join blood self - Incorporate person over the rune into the group
|
||||
// Hell join self - Summon TERROR
|
||||
// destroy see technology - EMP rune
|
||||
// travel blood self - Drain blood
|
||||
// see Hell join - See invisible
|
||||
// blood join Hell - Raise dead
|
||||
|
||||
// hide see blood - Hide nearby runes
|
||||
// blood see hide - Reveal nearby runes - The point of this rune is that its reversed obscure rune. So you always know the words to reveal the rune once oyu have obscured it.
|
||||
|
||||
// Hell travel self - Leave your body and ghost around
|
||||
// blood see travel - Manifest a ghost into a mortal body
|
||||
// Hell tech join - Imbue a rune into a talisman
|
||||
// Hell blood join - Sacrifice rune
|
||||
// destroy travel self - Wall rune
|
||||
// join other self - Summon cultist rune
|
||||
// travel technology other - Freeing rune // other blood travel was freedom join other
|
||||
|
||||
// hide other see - Deafening rune // was destroy see hear
|
||||
// destroy see other - Blinding rune
|
||||
// destroy see blood - BLOOD BOIL
|
||||
|
||||
// self other technology - Communication rune //was other hear blood
|
||||
// join hide technology - stun rune. Rune color: bright pink.
|
||||
|
||||
/obj/effect/rune/New()
|
||||
..()
|
||||
var/image/blood = image(loc = src)
|
||||
blood.override = 1
|
||||
for(var/mob/living/silicon/ai/AI in player_list)
|
||||
AI.client.images += blood
|
||||
cult_viewpoints += src
|
||||
|
||||
/obj/effect/rune/Destroy()
|
||||
cult_viewpoints -= src
|
||||
return ..()
|
||||
|
||||
/obj/effect/rune/examine(mob/user)
|
||||
..(user)
|
||||
if(!iscultist(user) && !isSpirit(user))
|
||||
to_chat(user, "A strange collection of symbols drawn in blood.")
|
||||
return
|
||||
if(!desc)
|
||||
to_chat(user, "A spell circle drawn in blood. It reads: <i>[word1] [word2] [word3]</i>.")
|
||||
else
|
||||
to_chat(user, "Explosive Runes inscription in blood. It reads: <i>[desc]</i>.")
|
||||
|
||||
|
||||
/obj/effect/rune/attackby(I as obj, user as mob, params)
|
||||
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
|
||||
to_chat(user, "You retrace your steps, carefully undoing the lines of the rune.")
|
||||
qdel(src)
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/nullrod))
|
||||
to_chat(user, "\blue You disrupt the vile magic with the deadening field of \the [I]!")
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
/obj/effect/rune/proc/get_word_string()
|
||||
if(word1 == cultwords["travel"])
|
||||
if(word2 == cultwords["self"])
|
||||
return "teleport"
|
||||
if(word2 == cultwords["other"])
|
||||
return "itemport"
|
||||
return "[rune_to_english[word1]]_[rune_to_english[word2]]_[rune_to_english[word3]]"
|
||||
|
||||
|
||||
/obj/effect/rune
|
||||
var/list/effect_dictionary = list( "teleport"=/obj/effect/rune/proc/teleportRune,
|
||||
"itemport"=/obj/effect/rune/proc/itemportRune,
|
||||
"see_blood_hell"=/obj/effect/rune/proc/tomesummon,
|
||||
"hell_destroy_other"=/obj/effect/rune/proc/armor,
|
||||
"join_blood_self"=/obj/effect/rune/proc/convert,
|
||||
"hell_join_self"=/obj/effect/rune/proc/tearreality,
|
||||
"destroy_see_technology"=/obj/effect/rune/proc/empRune,
|
||||
"travel_blood_self"=/obj/effect/rune/proc/drain,
|
||||
"see_hell_join"=/obj/effect/rune/proc/seer,
|
||||
"blood_join_hell"=/obj/effect/rune/proc/raise,
|
||||
"hide_see_blood"=/obj/effect/rune/proc/obscureRune,
|
||||
"hell_travel_self"=/obj/effect/rune/proc/ajourney,
|
||||
"blood_see_travel"=/obj/effect/rune/proc/manifest,
|
||||
"hell_technology_join"=/obj/effect/rune/proc/talisman,
|
||||
"hell_blood_join"=/obj/effect/rune/proc/sacrifice,
|
||||
"blood_see_hide"=/obj/effect/rune/proc/revealrunesrune,
|
||||
"destroy_travel_self"=/obj/effect/rune/proc/wall,
|
||||
"travel_technology_other"=/obj/effect/rune/proc/freedom,
|
||||
"join_other_self"=/obj/effect/rune/proc/cultsummon,
|
||||
"hide_other_see"=/obj/effect/rune/proc/deafen,
|
||||
"destroy_see_other"=/obj/effect/rune/proc/blind,
|
||||
"destroy_see_blood"=/obj/effect/rune/proc/bloodboil,
|
||||
"self_other_technology"=/obj/effect/rune/proc/communicate,
|
||||
"join_hide_technology"=/obj/effect/rune/proc/runestun )
|
||||
|
||||
/obj/effect/rune/attack_hand(mob/living/user as mob)
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "You can't mouth the arcane scratchings without fumbling over them.")
|
||||
return
|
||||
if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
to_chat(user, "You are unable to speak the words of the rune.")
|
||||
return
|
||||
if(user.silent) // checking if we've been muted somehow
|
||||
to_chat(user, "You are unable to speak at all! You cannot say the words of the rune.")
|
||||
if(!word1 || !word2 || !word3 || prob(user.getBrainLoss()))
|
||||
return fizzle()
|
||||
|
||||
var/word_string = get_word_string()
|
||||
if(word_string in effect_dictionary)
|
||||
cult_log("of type [effect_dictionary[word_string]] activated by [key_name_admin(user)].")
|
||||
return call(src,effect_dictionary[word_string])()
|
||||
return fizzle()
|
||||
|
||||
|
||||
/obj/effect/rune/proc/fizzle()
|
||||
if(istype(src,/obj/effect/rune))
|
||||
usr.say(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix."))
|
||||
else
|
||||
usr.whisper(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix."))
|
||||
for (var/mob/V in viewers(src))
|
||||
for(var/mob/V in viewers(src))
|
||||
V.show_message("\red The markings pulse with a small burst of light, then fall dark.", 3, "\red You hear a faint fizzle.", 2)
|
||||
return
|
||||
|
||||
/obj/effect/rune/proc/check_icon()
|
||||
icon = get_uristrune_cult(invocation)
|
||||
icon = get_uristrune_cult(word1, word2, word3)
|
||||
|
||||
/obj/item/weapon/tome
|
||||
name = "arcane tome"
|
||||
desc = "An old, dusty tome with frayed edges and a sinister-looking cover."
|
||||
icon_state ="tome"
|
||||
throw_speed = 2
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 2
|
||||
var/scribereduct = 0
|
||||
var/canbypass = 0 //ADMINBUS
|
||||
var/notedat = ""
|
||||
var/tomedat = ""
|
||||
var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri")
|
||||
|
||||
/obj/item/weapon/tome/accursed
|
||||
name = "accursed tome"
|
||||
desc = "An arcane tome still empowered with a shadow of its former consecration."
|
||||
scribereduct = 30 //faster because it's made by corrupting a bible
|
||||
tomedat = {"<html>
|
||||
<head>
|
||||
<style>
|
||||
h1 {font-size: 25px; margin: 15px 0px 5px;}
|
||||
h2 {font-size: 20px; margin: 15px 0px 5px;}
|
||||
li {margin: 2px 0px 2px 15px;}
|
||||
ul {list-style: none; margin: 5px; padding: 0px;}
|
||||
ol {margin: 5px; padding: 0px 15px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood.</h1>
|
||||
|
||||
/obj/item/weapon/tome/imbued //Admin-only tome, allows instant drawing of runes
|
||||
name = "imbued arcane tome"
|
||||
desc = "An arcane tome granted by the Geometer itself."
|
||||
scribereduct = 50
|
||||
canbypass = 1
|
||||
<i>The book is written in an unknown dialect, there are lots of pictures of various complex geometric shapes. You find some notes in english that give you basic understanding of the many runes written in the book. The notes give you an understanding what the words for the runes should be. However, you do not know how to write all these words in this dialect.</i><br>
|
||||
<i>Below is the summary of the runes.</i> <br>
|
||||
|
||||
/obj/item/weapon/tome/examine(mob/user)
|
||||
..()
|
||||
if(iscultist(user) || user.stat == DEAD)
|
||||
to_chat(user, "<span class='cult'>The scriptures of [ticker.mode.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [ticker.mode.cultdat.entity_name].</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>")
|
||||
<h2>Contents</h2>
|
||||
<p>
|
||||
<b>Teleport self: </b>Travel Self (word)<br>
|
||||
<b>Teleport other: </b>Travel Other (word)<br>
|
||||
<b>Summon new tome: </b>See Blood Hell<br>
|
||||
<b>Convert a person: </b>Join Blood Self<br>
|
||||
<b>Summon Nar-Sie: </b>Hell Join Self<br>
|
||||
<b>Disable technology: </b>Destroy See Technology<br>
|
||||
<b>Drain blood: </b>Travel Blood Self<br>
|
||||
<b>Raise dead: </b>Blood Join Hell<br>
|
||||
<b>Hide runes: </b>Hide See Blood<br>
|
||||
<b>Reveal hidden runes: </b>Blood See Hide<br>
|
||||
<b>Leave your body: </b>Hell travel self<br>
|
||||
<b>Ghost Manifest: </b>Blood See Travel<br>
|
||||
<b>Imbue a talisman: </b>Hell Technology Join<br>
|
||||
<b>Sacrifice: </b>Hell Blood Join<br>
|
||||
<b>Create a wall: </b>Destroy Travel Self<br>
|
||||
<b>Summon cultist: </b>Join Other Self<br>
|
||||
<b>Free a cultist: </b>Travel technology other<br>
|
||||
<b>Deafen: </b>Hide Other See<br>
|
||||
<b>Blind: </b>Destroy See Other<br>
|
||||
<b>Blood Boil: </b>Destroy See Blood<br>
|
||||
<b>Communicate: </b>Self Other Technology<br>
|
||||
<b>Stun: </b>Join Hide Technology<br>
|
||||
<b>Summon Cultist Armor: </b>Hell Destroy Other<br>
|
||||
<b>See Invisible: </b>See Hell Join<br>
|
||||
</p>
|
||||
<h2>Rune Descriptions</h2>
|
||||
<h3>Teleport self</h3>
|
||||
Teleport rune is a special rune, as it only needs two words, with the third word being destination. Basically, when you have two runes with the same destination, invoking one will teleport you to the other one. If there are more than 2 runes, you will be teleported to a random one. Runes with different third words will create separate networks. You can imbue this rune into a talisman, giving you a great escape mechanism.<br>
|
||||
<h3>Teleport other</h3>
|
||||
Teleport other allows for teleportation for any movable object to another rune with the same third word. You need 3 cultists chanting the invocation for this rune to work.<br>
|
||||
<h3>Summon new tome</h3>
|
||||
Invoking this rune summons a new arcane tome.
|
||||
<h3>Convert a person</h3>
|
||||
This rune opens target's mind to the realm of Nar-Sie, which usually results in this person joining the cult. However, some people (mostly the ones who posess high authority) have strong enough will to stay true to their old ideals. <br>
|
||||
<h3>Summon Nar-Sie</h3>
|
||||
The ultimate rune. It summons the Avatar of Nar-Sie himself, tearing a huge hole in reality and consuming everything around it. Summoning it is the final goal of any cult.<br>
|
||||
<h3>Disable Technology</h3>
|
||||
Invoking this rune creates a strong electromagnetic pulse in a small radius, making it basically analogic to an EMP grenade. You can imbue this rune into a talisman, making it a decent defensive item.<br>
|
||||
<h3>Drain Blood</h3>
|
||||
This rune instantly heals you of some brute damage at the expense of a person placed on top of the rune. Whenever you invoke a drain rune, ALL drain runes on the station are activated, draining blood from anyone located on top of those runes. This includes yourself, though the blood you drain from yourself just comes back to you. This might help you identify this rune when studying words. One drain gives up to 25HP per each victim, but you can repeat it if you need more. Draining only works on living people, so you might need to recharge your "Battery" once its empty. Drinking too much blood at once might cause blood hunger.<br>
|
||||
<h3>Raise Dead</h3>
|
||||
This rune allows for the resurrection of any dead person. You will need a dead human body and a living human sacrifice. Make 2 raise dead runes. Put a living, awake human on top of one, and a dead body on the other one. When you invoke the rune, the life force of the living human will be transferred into the dead body, allowing a ghost standing on top of the dead body to enter it, instantly and fully healing it. Use other runes to ensure there is a ghost ready to be resurrected.<br>
|
||||
<h3>Hide runes</h3>
|
||||
This rune makes all nearby runes completely invisible. They are still there and will work if activated somehow, but you cannot invoke them directly if you do not see them.<br>
|
||||
<h3>Reveal runes</h3>
|
||||
This rune is made to reverse the process of hiding a rune. It reveals all hidden runes in a rather large area around it.
|
||||
<h3>Leave your body</h3>
|
||||
This rune gently rips your soul out of your body, leaving it intact. You can observe the surroundings as a ghost as well as communicate with other ghosts. Your body takes damage while you are there, so ensure your journey is not too long, or you might never come back.<br>
|
||||
<h3>Manifest a ghost</h3>
|
||||
Unlike the Raise Dead rune, this rune does not require any special preparations or vessels. Instead of using full lifeforce of a sacrifice, it will drain YOUR lifeforce. Stand on the rune and invoke it. If theres a ghost standing over the rune, it will materialise, and will live as long as you dont move off the rune or die. You can put a paper with a name on the rune to make the new body look like that person.<br>
|
||||
<h3>Imbue a talisman</h3>
|
||||
This rune allows you to imbue the magic of some runes into paper talismans. Create an imbue rune, then an appropriate rune beside it. Put an empty piece of paper on the imbue rune and invoke it. You will now have a one-use talisman with the power of the target rune. Using a talisman drains some health, so be careful with it. You can imbue a talisman with power of the following runes: summon tome, reveal, conceal, teleport, tisable technology, communicate, deafen, blind and stun.<br>
|
||||
<h3>Sacrifice</h3>
|
||||
Sacrifice rune allows you to sacrifice a living thing or a body to the Geometer of Blood. Monkeys and dead humans are the most basic sacrifices, they might or might not be enough to gain His favor. A living human is what a real sacrifice should be, however, you will need 3 people chanting the invocation to sacrifice a living person.
|
||||
<h3>Create a wall</h3>
|
||||
Invoking this rune solidifies the air above it, creating an an invisible wall. To remove the wall, simply invoke the rune again.
|
||||
<h3>Summon cultist</h3>
|
||||
This rune allows you to summon a fellow cultist to your location. The target cultist must be unhandcuffed ant not buckled to anything. You also need to have 3 people chanting at the rune to succesfully invoke it. Invoking it takes heavy strain on the bodies of all chanting cultists.<br>
|
||||
<h3>Free a cultist</h3>
|
||||
This rune unhandcuffs and unbuckles any cultist of your choice, no matter where he is. You need to have 3 people invoking the rune for it to work. Invoking it takes heavy strain on the bodies of all chanting cultists.<br>
|
||||
<h3>Deafen</h3>
|
||||
This rune temporarily deafens all non-cultists around you.<br>
|
||||
<h3>Blind</h3>
|
||||
This rune temporarily blinds all non-cultists around you. Very robust. Use together with the deafen rune to leave your enemies completely helpless.<br>
|
||||
<h3>Blood boil</h3>
|
||||
This rune boils the blood all non-cultists in visible range. The damage is enough to instantly critically hurt any person. You need 3 cultists invoking the rune for it to work. This rune is unreliable and may cause unpredicted effect when invoked. It also drains significant amount of your health when succesfully invoked.<br>
|
||||
<h3>Communicate</h3>
|
||||
Invoking this rune allows you to relay a message to all cultists on the station and nearby space objects.
|
||||
<h3>Stun</h3>
|
||||
Unlike other runes, this ons is supposed to be used in talisman form. When invoked directly, it simply releases some dark energy, briefly stunning everyone around. When imbued into a talisman, you can force all of its energy into one person, stunning him so hard he cant even speak. However, effect wears off rather fast.<br>
|
||||
<h3>Equip Armor</h3>
|
||||
When this rune is invoked, either from a rune or a talisman, it will equip the user with the armor of the followers of Nar-Sie. To use this rune to its fullest extent, make sure you are not wearing any form of headgear, armor, gloves or shoes, and make sure you are not holding anything in your hands.<br>
|
||||
<h3>See Invisible</h3>
|
||||
When invoked when standing on it, this rune allows the user to see the the world beyond as long as he does not move.<br>
|
||||
</body>
|
||||
</html>
|
||||
"}
|
||||
|
||||
/obj/item/weapon/tome/attack(mob/living/M, mob/living/user)
|
||||
if(!istype(M))
|
||||
return
|
||||
if(!iscultist(user))
|
||||
return ..()
|
||||
if(iscultist(M))
|
||||
if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion
|
||||
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)
|
||||
add_logs(user, M, "smacked", src, " removing the holy water from them")
|
||||
return
|
||||
M.take_organ_damage(0, 15) //Used to be a random between 5 and 20
|
||||
playsound(M, 'sound/weapons/sear.ogg', 50, 1)
|
||||
M.visible_message("<span class='danger'>[user] strikes [M] with the arcane tome!</span>", \
|
||||
"<span class='userdanger'>[user] strikes you with the tome, searing your flesh!</span>")
|
||||
flick("tome_attack", src)
|
||||
user.do_attack_animation(M)
|
||||
add_logs(user, M, "smacked", src)
|
||||
|
||||
/obj/item/weapon/tome/attack_self(mob/user)
|
||||
if(!iscultist(user))
|
||||
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)
|
||||
|
||||
/obj/item/weapon/tome/proc/open_tome(mob/user)
|
||||
var/choice = alert(user,"You open the tome...",,"Scribe Rune","More Information","Cancel")
|
||||
switch(choice)
|
||||
if("More Information")
|
||||
read_tome(user)
|
||||
if("Scribe Rune")
|
||||
scribe_rune(user)
|
||||
if("Cancel")
|
||||
Topic(href,href_list[])
|
||||
if(src.loc == usr)
|
||||
var/number = text2num(href_list["number"])
|
||||
if(usr.stat|| usr.restrained())
|
||||
return
|
||||
switch(href_list["action"])
|
||||
if("clear")
|
||||
words[words[number]] = words[number]
|
||||
if("change")
|
||||
words[words[number]] = input("Enter the translation for [words[number]]", "Word notes") in engwords
|
||||
for(var/w in words)
|
||||
if((words[w] == words[words[number]]) && (w != words[number]))
|
||||
words[w] = w
|
||||
notedat = {"
|
||||
<br><b>Word translation notes</b> <br>
|
||||
[words[1]] is <a href='byond://?src=\ref[src];number=1;action=change'>[words[words[1]]]</A> <A href='byond://?src=\ref[src];number=1;action=clear'>Clear</A><BR>
|
||||
[words[2]] is <A href='byond://?src=\ref[src];number=2;action=change'>[words[words[2]]]</A> <A href='byond://?src=\ref[src];number=2;action=clear'>Clear</A><BR>
|
||||
[words[3]] is <a href='byond://?src=\ref[src];number=3;action=change'>[words[words[3]]]</A> <A href='byond://?src=\ref[src];number=3;action=clear'>Clear</A><BR>
|
||||
[words[4]] is <a href='byond://?src=\ref[src];number=4;action=change'>[words[words[4]]]</A> <A href='byond://?src=\ref[src];number=4;action=clear'>Clear</A><BR>
|
||||
[words[5]] is <a href='byond://?src=\ref[src];number=5;action=change'>[words[words[5]]]</A> <A href='byond://?src=\ref[src];number=5;action=clear'>Clear</A><BR>
|
||||
[words[6]] is <a href='byond://?src=\ref[src];number=6;action=change'>[words[words[6]]]</A> <A href='byond://?src=\ref[src];number=6;action=clear'>Clear</A><BR>
|
||||
[words[7]] is <a href='byond://?src=\ref[src];number=7;action=change'>[words[words[7]]]</A> <A href='byond://?src=\ref[src];number=7;action=clear'>Clear</A><BR>
|
||||
[words[8]] is <a href='byond://?src=\ref[src];number=8;action=change'>[words[words[8]]]</A> <A href='byond://?src=\ref[src];number=8;action=clear'>Clear</A><BR>
|
||||
[words[9]] is <a href='byond://?src=\ref[src];number=9;action=change'>[words[words[9]]]</A> <A href='byond://?src=\ref[src];number=9;action=clear'>Clear</A><BR>
|
||||
[words[10]] is <a href='byond://?src=\ref[src];number=10;action=change'>[words[words[10]]]</A> <A href='byond://?src=\ref[src];number=10;action=clear'>Clear</A><BR>
|
||||
"}
|
||||
usr << browse("[notedat]", "window=notes")
|
||||
// call(/obj/item/weapon/tome/proc/edit_notes)()
|
||||
else
|
||||
usr << browse(null, "window=notes")
|
||||
return
|
||||
|
||||
/obj/item/weapon/tome/proc/read_tome(mob/user)
|
||||
var/text = ""
|
||||
text += "<center><font color='red' size=3><b><i>Archives of [ticker.mode.cultdat.entity_title1]</i></b></font></center><br><br><br>"
|
||||
text += "A rune's name and effects can be revealed by examining the rune.<<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Rite of Binding</b></font><br>This rune is one of the most important runes the cult has, being the only way to create new talismans. A blank sheet of paper must be on top of the rune. After \
|
||||
invoking it and choosing which talisman you desire, the paper will be converted, after some delay into a talisman.<br><br>"
|
||||
// proc/edit_notes() FUCK IT. Cant get it to work properly. - K0000
|
||||
// to_chat(world, "its been called! [usr]")
|
||||
// notedat = {"
|
||||
// <br><b>Word translation notes</b> <br>
|
||||
// [words[1]] is <a href='byond://?src=\ref[src];number=1;action=change'>[words[words[1]]]</A> <A href='byond://?src=\ref[src];number=1;action=clear'>Clear</A><BR>
|
||||
// [words[2]] is <A href='byond://?src=\ref[src];number=2;action=change'>[words[words[2]]]</A> <A href='byond://?src=\ref[src];number=2;action=clear'>Clear</A><BR>
|
||||
// [words[3]] is <a href='byond://?src=\ref[src];number=3;action=change'>[words[words[3]]]</A> <A href='byond://?src=\ref[src];number=3;action=clear'>Clear</A><BR>
|
||||
// [words[4]] is <a href='byond://?src=\ref[src];number=4;action=change'>[words[words[4]]]</A> <A href='byond://?src=\ref[src];number=4;action=clear'>Clear</A><BR>
|
||||
// [words[5]] is <a href='byond://?src=\ref[src];number=5;action=change'>[words[words[5]]]</A> <A href='byond://?src=\ref[src];number=5;action=clear'>Clear</A><BR>
|
||||
// [words[6]] is <a href='byond://?src=\ref[src];number=6;action=change'>[words[words[6]]]</A> <A href='byond://?src=\ref[src];number=6;action=clear'>Clear</A><BR>
|
||||
// [words[7]] is <a href='byond://?src=\ref[src];number=7;action=change'>[words[words[7]]]</A> <A href='byond://?src=\ref[src];number=7;action=clear'>Clear</A><BR>
|
||||
// [words[8]] is <a href='byond://?src=\ref[src];number=8;action=change'>[words[words[8]]]</A> <A href='byond://?src=\ref[src];number=8;action=clear'>Clear</A><BR>
|
||||
// [words[9]] is <a href='byond://?src=\ref[src];number=9;action=change'>[words[words[9]]]</A> <A href='byond://?src=\ref[src];number=9;action=clear'>Clear</A><BR>
|
||||
// [words[10]] is <a href='byond://?src=\ref[src];number=10;action=change'>[words[words[10]]]</A> <A href='byond://?src=\ref[src];number=10;action=clear'>Clear</A><BR>
|
||||
// "}
|
||||
// to_chat(usr, "whatev")
|
||||
// usr << browse(null, "window=tank")
|
||||
|
||||
text += "<font color='red'><b>Teleport</b></font><br>This rune is unique in that it requires a keyword before the scribing can begin. When invoked, it will find any other Teleport runes; \
|
||||
If any are found, the user can choose which rune to send to. Upon activation, the rune teleports everything above it to the selected rune.<br><br>"
|
||||
attack(mob/living/M as mob, mob/living/user as mob)
|
||||
|
||||
text += "<font color='red'><b>Rite of Enlightenment</b></font><br>This rune is critical to the success of the cult. It will allow you to convert normal crew members into cultists. \
|
||||
To do this, simply place the crew member upon the rune and invoke it. This rune requires two invokers to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \
|
||||
be unable to be converted. People [ticker.mode.cultdat.entity_title3] wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.<br> \
|
||||
Successful conversions will produce a tome for the new cultist.<br><br>"
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has had the [name] used on him by [key_name(user)]</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used [name] on [key_name(M)]</font>")
|
||||
msg_admin_attack("[key_name_admin(user)] used [name] on [key_name_admin(M)]")
|
||||
if(!iscarbon(M))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = user
|
||||
if(istype(M,/mob/dead))
|
||||
M.invisibility = 0
|
||||
user.visible_message( \
|
||||
"\red [user] drags the ghost to our plan of reality!", \
|
||||
"\red You drag the ghost to our plan of reality!" \
|
||||
)
|
||||
return
|
||||
if(!istype(M))
|
||||
return
|
||||
if(!iscultist(user))
|
||||
return ..()
|
||||
if(iscultist(M))
|
||||
if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion
|
||||
to_chat(user, "<span class='notice'>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)
|
||||
add_logs(M, user, "smacked", src, " removing the holy water from them")
|
||||
return
|
||||
M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit
|
||||
for(var/mob/O in viewers(M, null))
|
||||
O.show_message(text("\red <B>[] beats [] with the arcane tome!</B>", user, M), 1)
|
||||
to_chat(M, "\red You feel searing heat inside!")
|
||||
|
||||
text += "<font color='red'><b>Rite of Tribute</b></font><br><b>This rune is necessary to achieve your goals.</b> Simply place any dead creature upon the rune and invoke it (this will not \
|
||||
target cultists!). If this creature has a mind, a soulstone will be created and the creature's soul transported to it. Sacrificing the dead can be done alone, but sacrificing living crew <b>or your cult's target</b> will require 3 cultists. \
|
||||
Soulstones used on construct shells will move that soul into a powerful construct of your choice.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Rite of Resurrection</b></font><br>This rune requires two corpses. To perform the ritual, place the corpse you wish to revive onto \
|
||||
the rune and the offering body adjacent to it. When the rune is invoked, the body to be sacrificed will turn to dust, the life force flowing into the revival target. Assuming the target is not moved \
|
||||
within a few seconds, they will be brought back to life, healed of all ailments.<br><br>"
|
||||
attack_self(mob/living/user as mob)
|
||||
usr = user
|
||||
if(!usr.canmove || usr.stat || usr.restrained())
|
||||
return
|
||||
|
||||
text += "<font color='red'><b>Rite of Disruption</b></font><br>Robotic lifeforms have time and time again been the downfall of fledgling cults. This rune may allow you to gain the upper \
|
||||
hand against these pests. By using the rune, a large electromagnetic pulse will be emitted from the rune's location. The size of the EMP will grow significantly for each additional adjacent cultist when the \
|
||||
rune is activated.<br><br>"
|
||||
if(!cultwords["travel"])
|
||||
runerandom()
|
||||
if(iscultist(user))
|
||||
var/C = 0
|
||||
for(var/obj/effect/rune/N in world)
|
||||
C++
|
||||
if(!istype(user.loc,/turf))
|
||||
to_chat(user, "\red You do not have enough space to write a proper rune.")
|
||||
return
|
||||
|
||||
text += "<font color='red'><b>Astral Communion</b></font><br>This rune is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \
|
||||
user's spirit will be ripped from their body. In this state, the user's physical body will be locked in place to the rune itself - any attempts to move it will result in the rune pulling it back. \
|
||||
The body will also take constant damage while in this form, and may even die. The user's spirit will contain their consciousness, and will allow them to freely wander the station as a ghost. This may \
|
||||
also be used to commune with the dead.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Rite of the Corporeal Shield</b></font><br>While simple, this rune serves an important purpose in defense and hindering passage. When invoked, the \
|
||||
rune will draw a small amount of life force from the user and make the space above the rune completely dense, rendering it impassable to all but the most complex means. The rune may be invoked again to \
|
||||
undo this effect and allow passage again.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Rite of Joined Souls</b></font><br>This rune allows the cult to free other cultists with ease. When invoked, it will allow the user to summon a single cultist to the rune from \
|
||||
any location. It requires two invokers, and will damage each invoker slightly.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Blood Boil</b></font><br>When invoked, this rune will do a massive amount of damage to all non-cultist viewers, but it will also emit a small explosion upon invocation. \
|
||||
It requires three invokers.<br><br>"
|
||||
if(C>=26+runedec+ticker.mode.cult.len) //including the useless rune at the secret room, shouldn't count against the limit of 25 runes - Urist
|
||||
alert("The cloth of reality can't take that much of a strain. Remove some runes first!")
|
||||
return
|
||||
else
|
||||
switch(alert("You open the tome",,"Read it","Scribe a rune", "Notes")) //Fuck the "Cancel" option. Rewrite the whole tome interface yourself if you want it to work better. And input() is just ugly. - K0000
|
||||
if("Cancel")
|
||||
return
|
||||
if("Read it")
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
user << browse("[tomedat]", "window=Arcane Tome")
|
||||
return
|
||||
if("Notes")
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
notedat = {"
|
||||
<br><b>Word translation notes</b> <br>
|
||||
[words[1]] is <a href='byond://?src=\ref[src];number=1;action=change'>[words[words[1]]]</A> <A href='byond://?src=\ref[src];number=1;action=clear'>Clear</A><BR>
|
||||
[words[2]] is <A href='byond://?src=\ref[src];number=2;action=change'>[words[words[2]]]</A> <A href='byond://?src=\ref[src];number=2;action=clear'>Clear</A><BR>
|
||||
[words[3]] is <a href='byond://?src=\ref[src];number=3;action=change'>[words[words[3]]]</A> <A href='byond://?src=\ref[src];number=3;action=clear'>Clear</A><BR>
|
||||
[words[4]] is <a href='byond://?src=\ref[src];number=4;action=change'>[words[words[4]]]</A> <A href='byond://?src=\ref[src];number=4;action=clear'>Clear</A><BR>
|
||||
[words[5]] is <a href='byond://?src=\ref[src];number=5;action=change'>[words[words[5]]]</A> <A href='byond://?src=\ref[src];number=5;action=clear'>Clear</A><BR>
|
||||
[words[6]] is <a href='byond://?src=\ref[src];number=6;action=change'>[words[words[6]]]</A> <A href='byond://?src=\ref[src];number=6;action=clear'>Clear</A><BR>
|
||||
[words[7]] is <a href='byond://?src=\ref[src];number=7;action=change'>[words[words[7]]]</A> <A href='byond://?src=\ref[src];number=7;action=clear'>Clear</A><BR>
|
||||
[words[8]] is <a href='byond://?src=\ref[src];number=8;action=change'>[words[words[8]]]</A> <A href='byond://?src=\ref[src];number=8;action=clear'>Clear</A><BR>
|
||||
[words[9]] is <a href='byond://?src=\ref[src];number=9;action=change'>[words[words[9]]]</A> <A href='byond://?src=\ref[src];number=9;action=clear'>Clear</A><BR>
|
||||
[words[10]] is <a href='byond://?src=\ref[src];number=10;action=change'>[words[words[10]]]</A> <A href='byond://?src=\ref[src];number=10;action=clear'>Clear</A><BR>
|
||||
"}
|
||||
// call(/obj/item/weapon/tome/proc/edit_notes)()
|
||||
user << browse("[notedat]", "window=notes")
|
||||
return
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
|
||||
text += "<font color='red'><b>Rite of Spectral Manifestation</b></font><br>This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and [ticker.mode.cultdat.entity_title3]. \
|
||||
However, the spirit's link to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, all summoned spirits will dissipate, dropping their items to the ground. You may manifest \
|
||||
multiple spirits with one rune, but you will rapidly take damage in doing so.<br><br>"
|
||||
var/list/dictionary = list (
|
||||
"convert" = list("join","blood","self"),
|
||||
"wall" = list("destroy","travel","self"),
|
||||
"blood boil" = list("destroy","see","blood"),
|
||||
"blood drain" = list("travel","blood","self"),
|
||||
"raise dead" = list("blood","join","hell"),
|
||||
"summon narsie" = list("hell","join","self"),
|
||||
"communicate" = list("self","other","technology"),
|
||||
"emp" = list("destroy","see","technology"),
|
||||
"manifest" = list("blood","see","travel"),
|
||||
"summon tome" = list("see","blood","hell"),
|
||||
"see invisible" = list("see","hell","join"),
|
||||
"hide" = list("hide","see","blood"),
|
||||
"reveal" = list("blood","see","hide"),
|
||||
"astral journey" = list("hell","travel","self"),
|
||||
"imbue" = list("hell","technology","join"),
|
||||
"sacrifice" = list("hell","blood","join"),
|
||||
"summon cultist" = list("join","other","self"),
|
||||
"free cultist" = list("travel","technology","other"),
|
||||
"deafen" = list("hide","other","see"),
|
||||
"blind" = list("destroy","see","other"),
|
||||
"stun" = list("join","hide","technology"),
|
||||
"armor" = list("hell","destroy","other"),
|
||||
"teleport" = list("travel","self"),
|
||||
"teleport other" = list("travel","other")
|
||||
)
|
||||
|
||||
text += "<font color='red'><b><i>Ritual of Dimensional Rending</i></b></font><br><b>This rune is necessary to achieve your goals.</b> On attempting to scribe it, it will produce shields around you and alert everyone you are attempting to scribe it; it takes a very long time to scribe, \
|
||||
and does massive damage to the one attempting to scribe it.<br>Invoking it requires 9 invokers and the sacrifice of a specific crewmember, and once invoked, will summon [ticker.mode.cultdat.entity_title3], [ticker.mode.cultdat.entity_name]. \
|
||||
This will complete your objectives.<br><br><br>"
|
||||
var/list/english = list()
|
||||
|
||||
text += "<font color='red'><b>Talisman of Teleportation</b></font><br>The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once.<br><br>"
|
||||
var/list/scribewords = list("none")
|
||||
|
||||
text += "<font color='red'><b>Talisman of Fabrication</b></font><br>This talisman is the main way of creating construct shells. To use it, one must strike 30 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to recieve a soul to occupy it.<br><br>"
|
||||
for(var/entry in words)
|
||||
if(words[entry] != entry)
|
||||
english += list(words[entry] = entry)
|
||||
|
||||
text += "<font color='red'><b>Talisman of Tome Summoning</b></font><br>This talisman will produce a single tome at your feet.<br><br>"
|
||||
for(var/entry in dictionary)
|
||||
var/list/required = dictionary[entry]
|
||||
if(length(english&required) == required.len)
|
||||
scribewords += entry
|
||||
|
||||
text += "<font color='red'><b>Talisman of Veiling/Revealing</b></font><br>This talisman will hide runes on its first use, and on the second, will reveal runes.<br><br>"
|
||||
var/chosen_rune = null
|
||||
|
||||
text += "<font color='red'><b>Talisman of Disguising</b></font><br>This talisman will permanently disguise all nearby runes as crayon runes.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Talisman of Electromagnetic Pulse</b></font><br>This talisman will EMP anything else nearby. It disappears after one use.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Talisman of Stunning</b></font><br>Attacking a target will knock them down for a long duration in addition to inhibiting their speech. \
|
||||
Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Talisman of Armaments</b></font><br>The Talisman of Arming will equip the user with armored robes, a backpack, an eldritch longsword, an empowered bola, and a pair of boots. Any items that cannot \
|
||||
be equipped will not be summoned. Attacking a fellow cultist with it will instead equip them.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Talisman of Horrors</b></font><br>The Talisman of Horror must be applied directly to the victim, it will shatter your victim's mind with visions of the endtimes that may incapitate them.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Talisman of Shackling</b></font><br>The Talisman of Shackling must be applied directly to the victim, it has 4 uses and cuffs victims with magic shackles that disappear when removed.<br><br>"
|
||||
|
||||
text += "In addition to these runes, the cult has a small selection of equipment and constructs.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Equipment:</b></font><br><br>"
|
||||
|
||||
text += "<font color='red'><b>Cult Blade</b></font><br>Cult blades are sharp weapons that, notably, cannot be used by noncultists. These blades are produced by the Talisman of Arming.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Cult Bola</b></font><br>Cult bolas are strong bolas, useful for snaring targets. These bolas are produced by the Talisman of Arming.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Cult Robes</b></font><br>Cult robes are heavily armored robes. These robes are produced by the Talisman of Arming.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Soulstone</b></font><br>A soulstone is a simple piece of magic, produced either via the starter talisman or by sacrificing humans. Using it on an unconscious or dead human, or on a Shade, will trap their soul in the stone, allowing its use in construct shells. \
|
||||
<br>The soul within can also be released as a Shade by using it in-hand.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Construct Shell</b></font><br>A construct shell is useless on its own, but placing a filled soulstone within it allows you to produce your choice of a <b>Wraith</b>, a <b>Juggernaut</b>, or an <b>Artificer</b>. \
|
||||
<br>Each construct has uses, detailed below in Constructs. Construct shells can be produced via the starter talisman or the Rite of Fabrication.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Constructs:</b></font><br><br>"
|
||||
|
||||
text += "<font color='red'><b>Shade</b></font><br>While technically not a construct, the Shade is produced when released from a soulstone. It is quite fragile and has weak melee attacks, but is fully healed when recaptured by a soulstone.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Wraith</b></font><br>The Wraith is a fast, lethal melee attacker which can jaunt through walls. However, it is only slightly more durable than a shade.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Juggernaut</b></font><br>The Juggernaut is a slow, but durable, melee attacker which can produce temporary forcewalls. It will also reflect most lethal energy weapons.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Artificer</b></font><br>The Artificer is a weak and fragile construct, able to heal other constructs, produce more <font color='red'><b>soulstones</b></font> and <font color='red'><b>construct shells</b></font>, \
|
||||
construct fortifying cult walls and flooring, and finally, it can release a few indiscriminate stunning missiles.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Harvester</b></font><br>If you see one, know that you have done all you can and your life is void.<br><br>"
|
||||
|
||||
var/datum/browser/popup = new(user, "tome", "", 800, 600)
|
||||
popup.set_content(text)
|
||||
popup.open()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/tome/proc/scribe_rune(mob/living/user)
|
||||
var/turf/runeturf = get_turf(user)
|
||||
var/chosen_keyword
|
||||
var/obj/effect/rune/rune_to_scribe
|
||||
var/entered_rune_name
|
||||
var/list/possible_runes = list()
|
||||
var/list/shields = list()
|
||||
if(locate(/obj/effect/rune) in runeturf)
|
||||
to_chat(user, "<span class='cult'>There is already a rune here.</span>")
|
||||
return
|
||||
for(var/T in subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
|
||||
var/obj/effect/rune/R = T
|
||||
if(initial(R.cultist_name))
|
||||
possible_runes.Add(initial(R.cultist_name)) //This is to allow the menu to let cultists select runes by name rather than by object path. I don't know a better way to do this
|
||||
if(!possible_runes.len)
|
||||
return
|
||||
entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in possible_runes
|
||||
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
|
||||
return
|
||||
for(var/T in typesof(/obj/effect/rune))
|
||||
var/obj/effect/rune/R = T
|
||||
if(initial(R.cultist_name) == entered_rune_name)
|
||||
rune_to_scribe = R
|
||||
if(initial(R.req_keyword))
|
||||
var/the_keyword = stripped_input(usr, "Please enter a keyword for the rune.", "Enter Keyword", "")
|
||||
if(!the_keyword)
|
||||
if(usr)
|
||||
chosen_rune = input ("Choose a rune to scribe.") in scribewords
|
||||
if(!chosen_rune)
|
||||
return
|
||||
chosen_keyword = the_keyword
|
||||
break
|
||||
if(!rune_to_scribe)
|
||||
return
|
||||
runeturf = get_turf(user) //we may have moved. adjust as needed...
|
||||
if(locate(/obj/effect/rune) in runeturf)
|
||||
to_chat(user, "<span class='cult'>There is already a rune here.</span>")
|
||||
return
|
||||
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
|
||||
return
|
||||
if(ispath(rune_to_scribe, /obj/effect/rune/narsie) || ispath(rune_to_scribe, /obj/effect/rune/slaughter))//may need to change this - Fethas
|
||||
if(chosen_rune == "none")
|
||||
to_chat(user, "\red You decide against scribing a rune, perhaps you should take this time to study your notes.")
|
||||
return
|
||||
if(chosen_rune == "teleport")
|
||||
dictionary[chosen_rune] += input ("Choose a destination word") in english
|
||||
if(chosen_rune == "teleport other")
|
||||
dictionary[chosen_rune] += input ("Choose a destination word") in english
|
||||
|
||||
if(ticker.mode.name == "cult")
|
||||
if(!canbypass == 1)//not an admin-tome, check things
|
||||
var/datum/game_mode/cult/cult_mode = ticker.mode
|
||||
if(!("eldergod" in cult_mode.objectives) || !("slughter" in cult_mode.objectives))
|
||||
to_chat(user, "<span class='warning'>[cult_mode.cultdat.entity_name]'s power does not wish to be unleashed!</span>")
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
|
||||
for(var/mob/V in viewers(src))
|
||||
V.show_message("\red [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "\red You hear chanting.", 2)
|
||||
to_chat(user, "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world.")
|
||||
user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage
|
||||
if(do_after(user, 50, target = user))
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
if(!cult_mode.narsie_condition_cleared)
|
||||
to_chat(user, "<span class='warning'>There is still more to do before unleashing [cult_mode.cultdat.entity_name] power!</span>")
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/effect/rune/R = new /obj/effect/rune(user.loc)
|
||||
to_chat(user, "\red You finish drawing the arcane markings of the Geometer.")
|
||||
var/list/required = dictionary[chosen_rune]
|
||||
R.word1 = english[required[1]]
|
||||
R.word2 = english[required[2]]
|
||||
R.word3 = english[required[3]]
|
||||
R.check_icon()
|
||||
R.blood_DNA = list()
|
||||
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
|
||||
R.add_hiddenprint(H)
|
||||
return
|
||||
else
|
||||
to_chat(user, "The book seems full of illegible scribbles. Is this a joke?")
|
||||
return
|
||||
|
||||
attackby(obj/item/weapon/tome/T as obj, mob/living/user as mob, params)
|
||||
if(istype(T, /obj/item/weapon/tome)) // sanity check to prevent a runtime error
|
||||
switch(alert("Copy the runes from your tome?",,"Copy", "Cancel"))
|
||||
if("cancel")
|
||||
return
|
||||
if(!cult_mode.eldergod)
|
||||
to_chat(user, "<span class='cultlarge'>\"I am already here. There is no need to try to summon me now.\"</span>")
|
||||
return
|
||||
if(cult_mode.demons_summoned)
|
||||
to_chat(user, "<span class='cultlarge'>\"We are already here. There is no need to try to summon us now.\"</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")
|
||||
to_chat(user, "<span class='cult'>You decide to prepare further before scribing the rune.</span>")
|
||||
return
|
||||
command_announcement.Announce("Figments from an eldritch god are being summoned somwhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
|
||||
for(var/B in spiral_range_turfs(1, user, 1))
|
||||
var/turf/T = B
|
||||
var/obj/machinery/shield/N = new(T)
|
||||
N.name = "Rune-Scriber's Shield"
|
||||
N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual"
|
||||
N.icon_state = "shield-cult"
|
||||
N.health = 60
|
||||
shields |= N
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot")
|
||||
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
|
||||
user.visible_message("<span class='warning'>[user] cuts open their \the [affecting] and begins writing in their own blood!</span>", "<span class='cult'>You slice open your [affecting] and begin drawing a sigil of [ticker.mode.cultdat.entity_title3].</span>")
|
||||
user.apply_damage(initial(rune_to_scribe.scribe_damage), ticker.mode.cultdat.dam_type, affecting)
|
||||
if(!do_after(user, initial(rune_to_scribe.scribe_delay)-scribereduct, target = get_turf(user)))
|
||||
for(var/V in shields)
|
||||
var/obj/machinery/shield/S = V
|
||||
if(S && !qdeleted(S))
|
||||
qdel(S)
|
||||
return
|
||||
if(locate(/obj/effect/rune) in runeturf)
|
||||
to_chat(user, "<span class='cult'>There is already a rune here.</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] creates a strange circle in their own blood.</span>", \
|
||||
"<span class='cult'>You finish drawing the arcane markings of [ticker.mode.cultdat.entity_title3].</span>")
|
||||
for(var/V in shields)
|
||||
var/obj/machinery/shield/S = V
|
||||
if(S && !qdeleted(S))
|
||||
qdel(S)
|
||||
var/obj/effect/rune/R = new rune_to_scribe(runeturf, chosen_keyword)
|
||||
R.blood_DNA = list()
|
||||
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
|
||||
R.add_hiddenprint(H)
|
||||
to_chat(user, "<span class='cult'>The [lowertext(initial(rune_to_scribe.cultist_name))] rune [initial(rune_to_scribe.cultist_desc)]</span>")
|
||||
// var/list/nearby = viewers(1,src) //- Fuck this as well. No clue why this doesnt work. -K0000
|
||||
// if(T.loc != user)
|
||||
// return
|
||||
// for(var/mob/M in nearby)
|
||||
// if(M == user)
|
||||
for(var/entry in words)
|
||||
words[entry] = T.words[entry]
|
||||
to_chat(user, "You copy the translation notes from your tome.")
|
||||
|
||||
|
||||
examine(mob/user)
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "An old, dusty tome with frayed edges and a sinister looking cover.")
|
||||
else
|
||||
to_chat(user, "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though.")
|
||||
|
||||
/obj/item/weapon/tome/imbued //admin tome, spawns working runes without waiting
|
||||
w_class = 2
|
||||
var/cultistsonly = 1
|
||||
attack_self(mob/user as mob)
|
||||
if(src.cultistsonly && !iscultist(usr))
|
||||
return
|
||||
if(!cultwords["travel"])
|
||||
runerandom()
|
||||
if(user)
|
||||
var/r
|
||||
if(!istype(user.loc,/turf))
|
||||
to_chat(user, "\red You do not have enough space to write a proper rune.")
|
||||
var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun")
|
||||
r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable.
|
||||
var/obj/effect/rune/R = new /obj/effect/rune
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
R.blood_DNA = list()
|
||||
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
|
||||
switch(r)
|
||||
if("teleport")
|
||||
var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")
|
||||
var/beacon
|
||||
if(usr)
|
||||
beacon = input("Select the last rune", "Rune Scribing") in words
|
||||
R.word1=cultwords["travel"]
|
||||
R.word2=cultwords["self"]
|
||||
R.word3=beacon
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("itemport")
|
||||
var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")
|
||||
var/beacon
|
||||
if(usr)
|
||||
beacon = input("Select the last rune", "Rune Scribing") in words
|
||||
R.word1=cultwords["travel"]
|
||||
R.word2=cultwords["other"]
|
||||
R.word3=beacon
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("tome")
|
||||
R.word1=cultwords["see"]
|
||||
R.word2=cultwords["blood"]
|
||||
R.word3=cultwords["hell"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("armor")
|
||||
R.word1=cultwords["hell"]
|
||||
R.word2=cultwords["destroy"]
|
||||
R.word3=cultwords["other"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("convert")
|
||||
R.word1=cultwords["join"]
|
||||
R.word2=cultwords["blood"]
|
||||
R.word3=cultwords["self"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("tear in reality")
|
||||
R.word1=cultwords["hell"]
|
||||
R.word2=cultwords["join"]
|
||||
R.word3=cultwords["self"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("emp")
|
||||
R.word1=cultwords["destroy"]
|
||||
R.word2=cultwords["see"]
|
||||
R.word3=cultwords["technology"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("drain")
|
||||
R.word1=cultwords["travel"]
|
||||
R.word2=cultwords["blood"]
|
||||
R.word3=cultwords["self"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("seer")
|
||||
R.word1=cultwords["see"]
|
||||
R.word2=cultwords["hell"]
|
||||
R.word3=cultwords["join"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("raise")
|
||||
R.word1=cultwords["blood"]
|
||||
R.word2=cultwords["join"]
|
||||
R.word3=cultwords["hell"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("obscure")
|
||||
R.word1=cultwords["hide"]
|
||||
R.word2=cultwords["see"]
|
||||
R.word3=cultwords["blood"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("astral journey")
|
||||
R.word1=cultwords["hell"]
|
||||
R.word2=cultwords["travel"]
|
||||
R.word3=cultwords["self"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("manifest")
|
||||
R.word1=cultwords["blood"]
|
||||
R.word2=cultwords["see"]
|
||||
R.word3=cultwords["travel"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("imbue talisman")
|
||||
R.word1=cultwords["hell"]
|
||||
R.word2=cultwords["technology"]
|
||||
R.word3=cultwords["join"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("sacrifice")
|
||||
R.word1=cultwords["hell"]
|
||||
R.word2=cultwords["blood"]
|
||||
R.word3=cultwords["join"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("reveal")
|
||||
R.word1=cultwords["blood"]
|
||||
R.word2=cultwords["see"]
|
||||
R.word3=cultwords["hide"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("wall")
|
||||
R.word1=cultwords["destroy"]
|
||||
R.word2=cultwords["travel"]
|
||||
R.word3=cultwords["self"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("freedom")
|
||||
R.word1=cultwords["travel"]
|
||||
R.word2=cultwords["technology"]
|
||||
R.word3=cultwords["other"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("cultsummon")
|
||||
R.word1=cultwords["join"]
|
||||
R.word2=cultwords["other"]
|
||||
R.word3=cultwords["self"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("deafen")
|
||||
R.word1=cultwords["hide"]
|
||||
R.word2=cultwords["other"]
|
||||
R.word3=cultwords["see"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("blind")
|
||||
R.word1=cultwords["destroy"]
|
||||
R.word2=cultwords["see"]
|
||||
R.word3=cultwords["other"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("bloodboil")
|
||||
R.word1=cultwords["destroy"]
|
||||
R.word2=cultwords["see"]
|
||||
R.word3=cultwords["blood"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("communicate")
|
||||
R.word1=cultwords["self"]
|
||||
R.word2=cultwords["other"]
|
||||
R.word3=cultwords["technology"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("stun")
|
||||
R.word1=cultwords["join"]
|
||||
R.word2=cultwords["hide"]
|
||||
R.word3=cultwords["technology"]
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
|
||||
@@ -1,400 +1,255 @@
|
||||
/obj/item/weapon/paper/talisman
|
||||
var/cultist_name = "talisman"
|
||||
var/cultist_desc = "A basic talisman. It serves no purpose."
|
||||
var/invocation = "Naise meam!"
|
||||
icon_state = "paper_talisman"
|
||||
var/imbue = null
|
||||
var/uses = 0
|
||||
info = "<center><img src='talisman.png'></center><br/><br/>"
|
||||
var/uses = 1
|
||||
var/health_cost = 0 //The amount of health taken from the user when invoking the talisman
|
||||
|
||||
/obj/item/weapon/paper/talisman/examine(mob/user)
|
||||
if(iscultist(user) || user.stat == DEAD)
|
||||
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
|
||||
to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?")
|
||||
|
||||
/obj/item/weapon/paper/talisman/attack_self(mob/living/user)
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?")
|
||||
return
|
||||
if(invoke(user))
|
||||
uses--
|
||||
if(uses <= 0)
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/paper/talisman/proc/invoke(mob/living/user, successfuluse = 1)
|
||||
. = successfuluse
|
||||
if(successfuluse) //if the calling whatever says we succeed, do the fancy stuff
|
||||
if(invocation)
|
||||
user.whisper(invocation)
|
||||
if(health_cost && iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.apply_damage(health_cost, BRUTE, pick("l_arm", "r_arm"))
|
||||
|
||||
//Malformed Talisman: If something goes wrong.
|
||||
/obj/item/weapon/paper/talisman/malformed
|
||||
cultist_name = "malformed talisman"
|
||||
cultist_desc = "A talisman with gibberish scrawlings. No good can come from invoking this."
|
||||
invocation = "Ra'sha yoka!"
|
||||
|
||||
/obj/item/weapon/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1)
|
||||
to_chat(user, "<span class='cultitalic'>You feel a pain in your head. [ticker.mode.cultdat.entity_title3] is displeased.</span>")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.apply_damage(10, BRUTE, "head")
|
||||
|
||||
//Supply Talisman: Has a few unique effects. Granted only to starter cultists.
|
||||
/obj/item/weapon/paper/talisman/supply
|
||||
cultist_name = "Supply Talisman"
|
||||
cultist_desc = "A multi-use talisman that can create various objects. Intended to increase the cult's strength early on."
|
||||
invocation = null
|
||||
uses = 3
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/invoke(mob/living/user, successfuluse = 1)
|
||||
var/dat = "<B>There are [uses] bloody runes on the parchment.</B><BR>"
|
||||
dat += "Please choose the chant to be imbued into the fabric of reality.<BR>"
|
||||
dat += "<HR>"
|
||||
dat += "<A href='?src=\ref[src];rune=newtome'>N'ath reth sh'yro eth d'raggathnor!</A> - Summons an arcane tome, used to scribe runes and communicate with other cultists.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=teleport'>Sas'so c'arta forbici!</A> - Allows you to move to a selected teleportation rune.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=emp'>Ta'gh fara'qha fel d'amar det!</A> - Allows you to destroy technology in a short range.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=runestun'>Fuu ma'jin!</A> - Allows you to stun a person by attacking them with the talisman.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=veiling'>Kla'atu barada nikt'o!</A> - Two use talisman, first use makes all nearby runes invisible, second use reveals nearby hidden runes.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=soulstone'>Kal'om neth!</A> - Summons a soul stone, used to capure the spirits of dead or dying humans.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=construct'>Daa'ig osk!</A> - Summons a construct shell for use with soulstone-captured souls. It is too large to carry on your person.<BR>"
|
||||
var/datum/browser/popup = new(user, "talisman", "", 400, 400)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/Topic(href, href_list)
|
||||
if(src)
|
||||
if(usr.stat || usr.restrained() || !in_range(src, usr))
|
||||
return
|
||||
if(href_list["rune"])
|
||||
switch(href_list["rune"])
|
||||
attack_self(mob/living/user as mob)
|
||||
if(iscultist(user))
|
||||
var/delete = 1
|
||||
switch(imbue)
|
||||
if("newtome")
|
||||
var/obj/item/weapon/tome/T = new(usr)
|
||||
usr.put_in_hands(T)
|
||||
if("teleport")
|
||||
var/obj/item/weapon/paper/talisman/teleport/T = new(usr)
|
||||
usr.put_in_hands(T)
|
||||
call(/obj/effect/rune/proc/tomesummon)()
|
||||
if("armor")
|
||||
call(/obj/effect/rune/proc/armor)()
|
||||
if("emp")
|
||||
var/obj/item/weapon/paper/talisman/emp/T = new(usr)
|
||||
usr.put_in_hands(T)
|
||||
call(/obj/effect/rune/proc/emp)(usr.loc,3)
|
||||
if("conceal")
|
||||
call(/obj/effect/rune/proc/obscure)(2)
|
||||
if("revealrunes")
|
||||
call(/obj/effect/rune/proc/revealrunes)(src)
|
||||
if("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")
|
||||
call(/obj/effect/rune/proc/teleport)(imbue)
|
||||
if("communicate")
|
||||
//If the user cancels the talisman this var will be set to 0
|
||||
delete = call(/obj/effect/rune/proc/communicate)()
|
||||
if("deafen")
|
||||
call(/obj/effect/rune/proc/deafen)()
|
||||
if("blind")
|
||||
call(/obj/effect/rune/proc/blind)()
|
||||
if("runestun")
|
||||
var/obj/item/weapon/paper/talisman/stun/T = new(usr)
|
||||
usr.put_in_hands(T)
|
||||
if("soulstone")
|
||||
var/obj/item/device/soulstone/T = new(usr)
|
||||
usr.put_in_hands(T)
|
||||
if("construct")
|
||||
new /obj/structure/constructshell(get_turf(usr))
|
||||
if("veiling")
|
||||
var/obj/item/weapon/paper/talisman/true_sight/T = new(usr)
|
||||
usr.put_in_hands(T)
|
||||
uses--
|
||||
if(uses <= 0)
|
||||
if(iscarbon(usr))
|
||||
var/mob/living/carbon/C = usr
|
||||
C.drop_item()
|
||||
visible_message("<span class='warning'>[src] crumbles to dust.</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/weak
|
||||
uses = 2
|
||||
|
||||
//Rite of Translocation: Same as rune
|
||||
/obj/item/weapon/paper/talisman/teleport
|
||||
cultist_name = "Talisman of Teleportation"
|
||||
cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword."
|
||||
invocation = "Sas'so c'arta forbici!"
|
||||
health_cost = 5
|
||||
|
||||
/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1)
|
||||
var/list/potential_runes = list()
|
||||
var/list/teleportnames = list()
|
||||
var/list/duplicaterunecount = list()
|
||||
for(var/R in teleport_runes)
|
||||
var/obj/effect/rune/teleport/T = R
|
||||
var/resultkey = T.listkey
|
||||
if(resultkey in teleportnames)
|
||||
duplicaterunecount[resultkey]++
|
||||
resultkey = "[resultkey] ([duplicaterunecount[resultkey]])"
|
||||
else
|
||||
teleportnames.Add(resultkey)
|
||||
duplicaterunecount[resultkey] = 1
|
||||
potential_runes[resultkey] = T
|
||||
|
||||
if(!potential_runes.len)
|
||||
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 > MAX_Z)
|
||||
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)
|
||||
|
||||
var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked
|
||||
var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to?
|
||||
if(!actual_selected_rune)
|
||||
return ..(user, 0)
|
||||
user.visible_message("<span class='warning'>Dust flows from [user]'s hand, and 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>")
|
||||
user.forceMove(get_turf(actual_selected_rune))
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/summon_tome
|
||||
cultist_name = "Talisman of Tome Summoning"
|
||||
cultist_desc = "A one-use talisman that will call an untranslated tome from the archives of a cult."
|
||||
invocation = "N'ath reth sh'yro eth d'raggathnor!"
|
||||
health_cost = 1
|
||||
|
||||
/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
user.visible_message("<span class='warning'>[user]'s hand glows red for a moment.</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman!</span>")
|
||||
new /obj/item/weapon/tome(get_turf(user))
|
||||
user.visible_message("<span class='warning'>A tome appears at [user]'s feet!</span>", \
|
||||
"<span class='cultitalic'>An arcane tome materializes at your feet.</span>")
|
||||
|
||||
/obj/item/weapon/paper/talisman/true_sight
|
||||
cultist_name = "Talisman of Veiling"
|
||||
cultist_desc = "A multi-use talisman that hides nearby runes. On its second use, will reveal nearby runes."
|
||||
invocation = "Kla'atu barada nikt'o!"
|
||||
health_cost = 1
|
||||
uses = 2
|
||||
var/revealing = FALSE //if it reveals or not
|
||||
|
||||
/obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
if(!revealing)
|
||||
user.visible_message("<span class='warning'>Thin grey dust falls from [user]'s hand!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman, hiding nearby runes.</span>")
|
||||
invocation = "Nikt'o barada kla'atu!"
|
||||
revealing = TRUE
|
||||
for(var/obj/effect/rune/R in range(3,user))
|
||||
R.talismanhide()
|
||||
else
|
||||
user.visible_message("<span class='warning'>A flash of light shines from [user]'s hand!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman, revealing nearby runes.</span>")
|
||||
for(var/obj/effect/rune/R in range(3,user))
|
||||
R.talismanreveal()
|
||||
|
||||
//Rite of False Truths: Same as rune
|
||||
/obj/item/weapon/paper/talisman/make_runes_fake
|
||||
cultist_name = "Talisman of Disguising"
|
||||
cultist_desc = "A talisman that will make nearby runes appear fake."
|
||||
invocation = "By'o nar'nar!"
|
||||
|
||||
/obj/item/weapon/paper/talisman/make_runes_fake/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
user.visible_message("<span class='warning'>Dust flows from [user]s hand.</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman, making nearby runes appear fake.</span>")
|
||||
for(var/obj/effect/rune/R in orange(6,user))
|
||||
R.talismanfake()
|
||||
R.desc = "A rune drawn in crayon."
|
||||
|
||||
|
||||
//Rite of Disruption: Weaker than rune
|
||||
/obj/item/weapon/paper/talisman/emp
|
||||
cultist_name = "Talisman of Electromagnetic Pulse"
|
||||
cultist_desc = "A talisman that will cause a moderately-sized electromagnetic pulse."
|
||||
invocation = "Ta'gh fara'qha fel d'amar det!"
|
||||
health_cost = 5
|
||||
|
||||
/obj/item/weapon/paper/talisman/emp/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
user.visible_message("<span class='warning'>[user]'s hand flashes a bright blue!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman, emitting an EMP blast.</span>")
|
||||
empulse(src, 4, 8)
|
||||
|
||||
|
||||
//Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time
|
||||
/obj/item/weapon/paper/talisman/stun
|
||||
cultist_name = "Talisman of Stunning"
|
||||
cultist_desc = "A talisman that will stun and inhibit speech on a single target. To use, attack target directly."
|
||||
invocation = "Dream sign:Evil sealing talisman!"
|
||||
health_cost = 10
|
||||
|
||||
/obj/item/weapon/paper/talisman/stun/invoke(mob/living/user, successfuluse = 0)
|
||||
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
|
||||
return ..()
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='warning'>To use this talisman, attack the target directly.</span>")
|
||||
else
|
||||
to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?")
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/stun/attack(mob/living/target, mob/living/user, successfuluse = 1)
|
||||
if(iscultist(user))
|
||||
invoke(user, 1)
|
||||
user.visible_message("<span class='warning'>[user] holds up [src], which explodes in a flash of red light!</span>", \
|
||||
"<span class='cultitalic'>You stun [target] with the talisman!</span>")
|
||||
var/obj/item/weapon/nullrod/N = locate() in target
|
||||
if(N)
|
||||
target.visible_message("<span class='warning'>[target]'s holy weapon absorbs the talisman's light!</span>", \
|
||||
"<span class='userdanger'>Your holy weapon absorbs the blinding light!</span>")
|
||||
else
|
||||
target.Weaken(10)
|
||||
target.Stun(10)
|
||||
target.flash_eyes(1,1)
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = target
|
||||
S.emp_act(1)
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
C.silent += 5
|
||||
C.stuttering += 15
|
||||
C.cultslurring += 5
|
||||
C.Jitter(15)
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
//Rite of Arming: Equips cultist armor on the user, where available
|
||||
/obj/item/weapon/paper/talisman/armor
|
||||
cultist_name = "Talisman of Arming"
|
||||
cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to."
|
||||
invocation = "N'ath reth sh'yro eth draggathnor!"
|
||||
|
||||
/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
var/mob/living/carbon/human/H = user
|
||||
user.visible_message("<span class='warning'>Otherworldly armor suddenly appears on [user]!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman, arming yourself!</span>")
|
||||
H.equip_or_collect(new /obj/item/clothing/head/culthood/alt(user), slot_head)
|
||||
H.equip_or_collect(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
|
||||
H.drop_item()
|
||||
H.put_in_hands(new /obj/item/weapon/melee/cultblade(user))
|
||||
H.put_in_hands(new /obj/item/weapon/legcuffs/bolas/cult(user))
|
||||
|
||||
/obj/item/weapon/paper/talisman/armor/attack(mob/living/target, mob/living/user)
|
||||
if(iscultist(user) && iscultist(target))
|
||||
user.drop_item()
|
||||
invoke(target)
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
//Talisman of Horrors: Breaks the mind of the victim with nightmarish hallucinations
|
||||
/obj/item/weapon/paper/talisman/horror
|
||||
cultist_name = "Talisman of Horrors"
|
||||
cultist_desc = "A talisman that will break the mind of the victim with nightmarish hallucinations."
|
||||
invocation = "Lo'Nab Na'Dm!"
|
||||
|
||||
/obj/item/weapon/paper/talisman/horror/attack(mob/living/target, mob/living/user)
|
||||
if(iscultist(user))
|
||||
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("lsd", 10)
|
||||
qdel(src)
|
||||
|
||||
|
||||
//Talisman of Fabrication: Creates a construct shell out of 25 metal sheets.
|
||||
/obj/item/weapon/paper/talisman/construction
|
||||
cultist_name = "Talisman of Construction"
|
||||
cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell or on plasteel to make runed metal"
|
||||
invocation = "Ethra p'ni dedol!"
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/attack_self(mob/living/user)
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='warning'>To use this talisman, place it upon a stack of metal sheets.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You see strange symbols on the paper. Are they supposed to mean something?</span>")
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/attack(obj/M,mob/living/user)
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='cultitalic'>This talisman will only work on a stack of metal sheets!</span>")
|
||||
log_game("Construct talisman failed - not a valid target")
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters)
|
||||
..()
|
||||
if(proximity_flag && iscultist(user))
|
||||
if(istype(target, /obj/item/stack/sheet/metal))
|
||||
var/turf/T = get_turf(target)
|
||||
if(target.use(25))
|
||||
new /obj/structure/constructshell(T)
|
||||
to_chat(user, "<span class='warning'>The talisman clings to the metal and twists it into a construct shell!</span>")
|
||||
user << sound('sound/magic/Staff_Chaos.ogg',0,1,25)
|
||||
qdel(src)
|
||||
if(istype(target, /obj/item/stack/sheet/plasteel))
|
||||
var/quantity = target.amount
|
||||
var/turf/T = get_turf(target)
|
||||
new /obj/item/stack/sheet/runed_metal(T,quantity)
|
||||
target.use(quantity)
|
||||
to_chat(user, "<span class='warning'>The talisman clings to the plasteel, transforming it into runed metal!</span>")
|
||||
user << sound('sound/magic/Staff_Chaos.ogg',0,1,25)
|
||||
qdel(src)
|
||||
else
|
||||
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
|
||||
/obj/item/weapon/paper/talisman/shackle
|
||||
cultist_name = "Talisman of Shackling"
|
||||
cultist_desc = "Use this talisman on a victim to handcuff them with dark bindings."
|
||||
invocation = "In'totum Lig'abis!"
|
||||
uses = 4
|
||||
|
||||
/obj/item/weapon/paper/talisman/shackle/invoke(mob/living/user, successfuluse = 0)
|
||||
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
|
||||
return ..()
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='warning'>To use this talisman, attack the target directly.</span>")
|
||||
else
|
||||
to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?")
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user)
|
||||
if(iscultist(user) && istype(target))
|
||||
if(target.stat == DEAD)
|
||||
user.visible_message("<span class='cultitalic'>This talisman's magic does not affect the dead!</span>")
|
||||
to_chat(user, "\red To use this talisman, attack your target directly.")
|
||||
return
|
||||
if("supply")
|
||||
supply()
|
||||
user.take_organ_damage(5, 0)
|
||||
if(src && src.imbue!="supply" && src.imbue!="runestun")
|
||||
if(delete)
|
||||
qdel(src)
|
||||
return
|
||||
CuffAttack(target, user)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/paper/talisman/shackle/proc/CuffAttack(mob/living/carbon/C, mob/living/user)
|
||||
if(!C.handcuffed)
|
||||
invoke(user, 1)
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
|
||||
C.visible_message("<span class='danger'>[user] begins restraining [C] with dark magic!</span>", \
|
||||
"<span class='userdanger'>[user] begins shaping a dark magic around your wrists!</span>")
|
||||
if(do_mob(user, C, 30))
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/cult/used(C)
|
||||
C.update_handcuffed()
|
||||
to_chat(user, "<span class='notice'>You shackle [C].</span>")
|
||||
add_logs(user, C, "handcuffed")
|
||||
uses--
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[C] is already bound.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You fail to shackle [C].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[C] is already bound.</span>")
|
||||
if(uses <= 0)
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
return
|
||||
to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?")
|
||||
return
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy/cult //For the talisman of shackling
|
||||
name = "cult shackles"
|
||||
desc = "Shackles that bind the wrists with sinister magic."
|
||||
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
|
||||
origin_tech = "materials=2;magnets=5"
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy/cult/used/dropped(mob/user)
|
||||
user.visible_message("<span class='danger'>[user]'s shackles shatter in a discharge of dark magic!</span>", \
|
||||
"<span class='userdanger'>Your [src] shatters in a discharge of dark magic!</span>")
|
||||
qdel(src)
|
||||
attack(mob/living/carbon/T as mob, mob/living/user as mob)
|
||||
if(iscultist(user))
|
||||
if(imbue == "runestun")
|
||||
user.take_organ_damage(5, 0)
|
||||
call(/obj/effect/rune/proc/runestun)(T)
|
||||
qdel(src)
|
||||
else
|
||||
..() ///If its some other talisman, use the generic attack code, is this supposed to work this way?
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
proc/supply(var/key)
|
||||
if(!src.uses)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
var/dat = "<B>There are [src.uses] bloody runes on the parchment.</B><BR>"
|
||||
dat += "Please choose the chant to be imbued into the fabric of reality.<BR>"
|
||||
dat += "<HR>"
|
||||
dat += "<A href='?src=\ref[src];rune=newtome'>N'ath reth sh'yro eth d'raggathnor!</A> - Allows you to summon a new arcane tome.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=teleport'>Sas'so c'arta forbici!</A> - Allows you to move to a rune with the same last word.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=emp'>Ta'gh fara'qha fel d'amar det!</A> - Allows you to destroy technology in a short range.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=conceal'>Kla'atu barada nikt'o!</A> - Allows you to conceal the runes you placed on the floor.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=communicate'>O bidai nabora se'sma!</A> - Allows you to coordinate with others of your cult.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=runestun'>Fuu ma'jin</A> - Allows you to stun a person by attacking them with the talisman.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=armor'>Sa tatha najin</A> - Allows you to summon armoured robes and an unholy blade<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=soulstone'>Kal om neth</A> - Summons a soul stone<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=construct'>Da A'ig Osk</A> - Summons a construct shell for use with captured souls. It is too large to carry on your person.<BR>"
|
||||
usr << browse(dat, "window=id_com;size=350x200")
|
||||
return
|
||||
|
||||
|
||||
Topic(href, href_list)
|
||||
if(!src) return
|
||||
if(usr.stat || usr.restrained() || !in_range(src, usr)) return
|
||||
|
||||
if(href_list["rune"])
|
||||
if(istype(usr, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/M = usr
|
||||
|
||||
switch(href_list["rune"])
|
||||
if("newtome")
|
||||
|
||||
var/obj/item/weapon/paper/talisman/T = new(M)
|
||||
T.imbue = "newtome"
|
||||
|
||||
var/list/slots = list (
|
||||
"backpack" = slot_in_backpack,
|
||||
"left pocket" = slot_l_store,
|
||||
"right pocket" = slot_r_store,
|
||||
"left hand" = slot_l_hand,
|
||||
"right hand" = slot_r_hand,
|
||||
)
|
||||
|
||||
var/where = M.equip_in_one_of_slots(T, slots)
|
||||
if(!where)
|
||||
to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.")
|
||||
else
|
||||
to_chat(M, "The [href_list["rune"]] talisman in your [where]")
|
||||
M.update_icons()
|
||||
src.uses--
|
||||
supply()
|
||||
|
||||
|
||||
if("teleport")
|
||||
var/obj/item/weapon/paper/talisman/T = new(M)
|
||||
T.imbue = "[pick("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri", "orkan", "allaq")]"
|
||||
T.info = "[T.imbue]"
|
||||
|
||||
var/list/slots = list (
|
||||
"backpack" = slot_in_backpack,
|
||||
"left pocket" = slot_l_store,
|
||||
"right pocket" = slot_r_store,
|
||||
"left hand" = slot_l_hand,
|
||||
"right hand" = slot_r_hand,
|
||||
)
|
||||
|
||||
var/where = M.equip_in_one_of_slots(T, slots)
|
||||
if(!where)
|
||||
to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.")
|
||||
else
|
||||
to_chat(M, "The [href_list["rune"]] talisman in your [where]")
|
||||
M.update_icons()
|
||||
src.uses--
|
||||
supply()
|
||||
|
||||
if("emp")
|
||||
var/obj/item/weapon/paper/talisman/T = new(M)
|
||||
T.imbue = "emp"
|
||||
|
||||
var/list/slots = list (
|
||||
"backpack" = slot_in_backpack,
|
||||
"left pocket" = slot_l_store,
|
||||
"right pocket" = slot_r_store,
|
||||
"left hand" = slot_l_hand,
|
||||
"right hand" = slot_r_hand,
|
||||
)
|
||||
|
||||
var/where = M.equip_in_one_of_slots(T, slots)
|
||||
if(!where)
|
||||
to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.")
|
||||
else
|
||||
to_chat(M, "The [href_list["rune"]] talisman in your [where]")
|
||||
M.update_icons()
|
||||
src.uses--
|
||||
supply()
|
||||
|
||||
if("conceal")
|
||||
var/obj/item/weapon/paper/talisman/T = new(M)
|
||||
T.imbue = "conceal"
|
||||
|
||||
var/list/slots = list (
|
||||
"backpack" = slot_in_backpack,
|
||||
"left pocket" = slot_l_store,
|
||||
"right pocket" = slot_r_store,
|
||||
"left hand" = slot_l_hand,
|
||||
"right hand" = slot_r_hand,
|
||||
)
|
||||
|
||||
var/where = M.equip_in_one_of_slots(T, slots)
|
||||
if(!where)
|
||||
to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.")
|
||||
else
|
||||
to_chat(M, "The [href_list["rune"]] talisman in your [where]")
|
||||
M.update_icons()
|
||||
src.uses--
|
||||
supply()
|
||||
|
||||
if("communicate")
|
||||
var/obj/item/weapon/paper/talisman/T = new(M)
|
||||
T.imbue = "communicate"
|
||||
|
||||
var/list/slots = list (
|
||||
"backpack" = slot_in_backpack,
|
||||
"left pocket" = slot_l_store,
|
||||
"right pocket" = slot_r_store,
|
||||
"left hand" = slot_l_hand,
|
||||
"right hand" = slot_r_hand,
|
||||
)
|
||||
|
||||
var/where = M.equip_in_one_of_slots(T, slots)
|
||||
if(!where)
|
||||
to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.")
|
||||
else
|
||||
to_chat(M, "The [href_list["rune"]] talisman in your [where]")
|
||||
M.update_icons()
|
||||
src.uses--
|
||||
supply()
|
||||
|
||||
if("runestun")
|
||||
var/obj/item/weapon/paper/talisman/T = new(M)
|
||||
T.imbue = "runestun"
|
||||
|
||||
var/list/slots = list (
|
||||
"backpack" = slot_in_backpack,
|
||||
"left pocket" = slot_l_store,
|
||||
"right pocket" = slot_r_store,
|
||||
"left hand" = slot_l_hand,
|
||||
"right hand" = slot_r_hand,
|
||||
)
|
||||
|
||||
var/where = M.equip_in_one_of_slots(T, slots)
|
||||
if(!where)
|
||||
to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.")
|
||||
else
|
||||
to_chat(M, "The [href_list["rune"]] talisman in your [where]")
|
||||
M.update_icons()
|
||||
src.uses--
|
||||
supply()
|
||||
|
||||
if("armor")
|
||||
var/obj/item/weapon/paper/talisman/T = new(M)
|
||||
T.imbue = "armor"
|
||||
|
||||
var/list/slots = list (
|
||||
"backpack" = slot_in_backpack,
|
||||
"left pocket" = slot_l_store,
|
||||
"right pocket" = slot_r_store,
|
||||
"left hand" = slot_l_hand,
|
||||
"right hand" = slot_r_hand,
|
||||
)
|
||||
|
||||
var/where = M.equip_in_one_of_slots(T, slots)
|
||||
if(!where)
|
||||
to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.")
|
||||
else
|
||||
to_chat(M, "The [href_list["rune"]] talisman in your [where]")
|
||||
M.update_icons()
|
||||
src.uses--
|
||||
supply()
|
||||
|
||||
if("soulstone")
|
||||
new /obj/item/device/soulstone(get_turf(usr))
|
||||
src.uses--
|
||||
supply()
|
||||
if("construct")
|
||||
new /obj/structure/constructshell(get_turf(usr))
|
||||
src.uses--
|
||||
supply()
|
||||
else
|
||||
return
|
||||
|
||||
|
||||
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply
|
||||
imbue = "supply"
|
||||
uses = 5
|
||||
@@ -85,7 +85,7 @@
|
||||
icon = 'icons/obj/cloning.dmi'
|
||||
icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk.
|
||||
item_state = "card-id"
|
||||
w_class = 1.0
|
||||
w_class = 1
|
||||
var/datum/dna2/record/buf=null
|
||||
var/read_only = 0 //Well,it's still a floppy disk
|
||||
|
||||
@@ -124,19 +124,19 @@
|
||||
|
||||
//Find a dead mob with a brain and client.
|
||||
/proc/find_dead_player(var/find_key)
|
||||
if (isnull(find_key))
|
||||
if(isnull(find_key))
|
||||
return
|
||||
|
||||
var/mob/selected = null
|
||||
for(var/mob/M in player_list)
|
||||
//Dead people only thanks!
|
||||
if ((M.stat != 2) || (!M.client))
|
||||
if((M.stat != 2) || (!M.client))
|
||||
continue
|
||||
//They need a brain!
|
||||
if(istype(M, /mob/living/carbon/human) && !M.get_int_organ(/obj/item/organ/internal/brain))
|
||||
continue
|
||||
|
||||
if (M.ckey == find_key)
|
||||
if(M.ckey == find_key)
|
||||
selected = M
|
||||
break
|
||||
return selected
|
||||
@@ -163,13 +163,13 @@
|
||||
var/healthstring = ""
|
||||
|
||||
/obj/item/weapon/implant/health/proc/sensehealth()
|
||||
if (!implanted)
|
||||
if(!implanted)
|
||||
return "ERROR"
|
||||
else
|
||||
if(isliving(implanted))
|
||||
var/mob/living/L = implanted
|
||||
healthstring = "[round(L.getOxyLoss())] - [round(L.getFireLoss())] - [round(L.getToxLoss())] - [round(L.getBruteLoss())]"
|
||||
if (!healthstring)
|
||||
if(!healthstring)
|
||||
healthstring = "ERROR"
|
||||
return healthstring
|
||||
|
||||
@@ -177,11 +177,11 @@
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/clonepod/attack_hand(mob/user as mob)
|
||||
if ((isnull(occupant)) || (stat & NOPOWER))
|
||||
if((isnull(occupant)) || (stat & NOPOWER))
|
||||
if(mess)
|
||||
go_out()
|
||||
return
|
||||
if ((!isnull(occupant)) && (occupant.stat != 2))
|
||||
if((!isnull(occupant)) && (occupant.stat != 2))
|
||||
var/completion = (100 * ((occupant.health + 100) / (heal_level + 100)))
|
||||
to_chat(user, "Current clone cycle is [round(completion)]% complete.")
|
||||
return
|
||||
@@ -249,7 +249,8 @@
|
||||
ticker.mode.update_rev_icons_added() //So the icon actually appears
|
||||
if(H.mind in ticker.mode.syndicates)
|
||||
ticker.mode.update_synd_icons_added()
|
||||
if (H.mind in ticker.mode.cult)
|
||||
if(H.mind in ticker.mode.cult)
|
||||
ticker.mode.add_cult_viewpoint(H)
|
||||
ticker.mode.add_cultist(occupant.mind)
|
||||
ticker.mode.update_cult_icons_added() //So the icon actually appears
|
||||
if(("\ref[H.mind]" in ticker.mode.implanter) || (H.mind in ticker.mode.implanted))
|
||||
@@ -301,7 +302,7 @@
|
||||
visible_message("\The [src] sucks in and processes the nearby biomass.")
|
||||
|
||||
if(stat & NOPOWER) //Autoeject if power is lost
|
||||
if (occupant)
|
||||
if(occupant)
|
||||
locked = 0
|
||||
go_out()
|
||||
return
|
||||
@@ -323,7 +324,7 @@
|
||||
occupant.adjustBrainLoss(-((speed_coeff/20)*efficiency))
|
||||
|
||||
//So clones don't die of oxyloss in a running pod.
|
||||
if (occupant.reagents.get_reagent_amount("salbutamol") < 5)
|
||||
if(occupant.reagents.get_reagent_amount("salbutamol") < 5)
|
||||
occupant.reagents.add_reagent("salbutamol", 5)
|
||||
|
||||
//Also heal some oxyloss ourselves just in case!!
|
||||
@@ -338,9 +339,9 @@
|
||||
go_out()
|
||||
return
|
||||
|
||||
else if ((!occupant) || (occupant.loc != src))
|
||||
else if((!occupant) || (occupant.loc != src))
|
||||
occupant = null
|
||||
if (locked)
|
||||
if(locked)
|
||||
locked = 0
|
||||
//use_power(200)
|
||||
return
|
||||
@@ -349,7 +350,7 @@
|
||||
|
||||
//Let's unlock this early I guess. Might be too early, needs tweaking.
|
||||
/obj/machinery/clonepod/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
if (istype(W, /obj/item/weapon/screwdriver))
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
if(occupant || mess || locked)
|
||||
to_chat(user, "<span class='notice'>The maintenance panel is locked.</span>")
|
||||
return
|
||||
@@ -364,13 +365,13 @@
|
||||
default_deconstruction_crowbar(W)
|
||||
return
|
||||
|
||||
if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
|
||||
if (!check_access(W))
|
||||
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
|
||||
if(!check_access(W))
|
||||
to_chat(user, "\red Access Denied.")
|
||||
return
|
||||
if ((!locked) || (isnull(occupant)))
|
||||
if((!locked) || (isnull(occupant)))
|
||||
return
|
||||
if ((occupant.health < -20) && (occupant.stat != 2))
|
||||
if((occupant.health < -20) && (occupant.stat != 2))
|
||||
to_chat(user, "\red Access Refused.")
|
||||
return
|
||||
else
|
||||
@@ -378,13 +379,13 @@
|
||||
to_chat(user, "System unlocked.")
|
||||
|
||||
//Removing cloning pod biomass
|
||||
else if (istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
|
||||
else if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
|
||||
to_chat(user, "\blue \The [src] processes \the [W].")
|
||||
biomass += BIOMASS_MEAT_AMOUNT
|
||||
user.drop_item()
|
||||
qdel(W)
|
||||
return
|
||||
else if (istype(W, /obj/item/weapon/wrench))
|
||||
else if(istype(W, /obj/item/weapon/wrench))
|
||||
if(locked && (anchored || occupant))
|
||||
to_chat(user, "\red Can not do that while [src] is in use.")
|
||||
else
|
||||
@@ -408,7 +409,7 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/clonepod/emag_act(user as mob)
|
||||
if (isnull(occupant))
|
||||
if(isnull(occupant))
|
||||
return
|
||||
to_chat(user, "You force an emergency ejection.")
|
||||
locked = 0
|
||||
@@ -417,9 +418,9 @@
|
||||
|
||||
//Put messages in the connected computer's temp var for display.
|
||||
/obj/machinery/clonepod/proc/connected_message(var/message)
|
||||
if ((isnull(connected)) || (!istype(connected, /obj/machinery/computer/cloning)))
|
||||
if((isnull(connected)) || (!istype(connected, /obj/machinery/computer/cloning)))
|
||||
return 0
|
||||
if (!message)
|
||||
if(!message)
|
||||
return 0
|
||||
|
||||
connected.temp = "[name] : [message]"
|
||||
@@ -433,14 +434,14 @@
|
||||
|
||||
if(!usr)
|
||||
return
|
||||
if (usr.stat != 0)
|
||||
if(usr.stat != 0)
|
||||
return
|
||||
go_out(usr)
|
||||
add_fingerprint(usr)
|
||||
return
|
||||
|
||||
/obj/machinery/clonepod/proc/go_out(user)
|
||||
if (mess) //Clean that mess and dump those gibs!
|
||||
if(mess) //Clean that mess and dump those gibs!
|
||||
if(occupant)
|
||||
return
|
||||
mess = 0
|
||||
@@ -449,15 +450,15 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if (!(occupant))
|
||||
if(!(occupant))
|
||||
to_chat(user, "<span class=\"warning\">The cloning pod is empty!</span>")
|
||||
return
|
||||
|
||||
if (locked)
|
||||
if(locked)
|
||||
to_chat(user, "<span class=\"warning\">The cloning pod is locked!</span>")
|
||||
return
|
||||
|
||||
if (occupant.client)
|
||||
if(occupant.client)
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
occupant.forceMove(get_turf(src))
|
||||
@@ -480,13 +481,13 @@
|
||||
/obj/machinery/clonepod/update_icon()
|
||||
..()
|
||||
icon_state = "pod_0"
|
||||
if (occupant && !(stat & NOPOWER))
|
||||
if(occupant && !(stat & NOPOWER))
|
||||
icon_state = "pod_1"
|
||||
else if (mess && !panel_open)
|
||||
else if(mess && !panel_open)
|
||||
icon_state = "pod_g"
|
||||
|
||||
/obj/machinery/clonepod/relaymove(mob/user as mob)
|
||||
if (user.stat)
|
||||
if(user.stat)
|
||||
return
|
||||
go_out()
|
||||
return
|
||||
@@ -504,14 +505,14 @@
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
if(prob(50))
|
||||
for(var/atom/movable/A as mob|obj in src)
|
||||
A.forceMove(src.loc)
|
||||
A.ex_act(severity)
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(25))
|
||||
if(prob(25))
|
||||
for(var/atom/movable/A as mob|obj in src)
|
||||
A.forceMove(src.loc)
|
||||
A.ex_act(severity)
|
||||
|
||||
@@ -340,9 +340,9 @@
|
||||
if("coffee") M.change_mob_type( /mob/living/simple_animal/crab/Coffee , null, null, delmob, 1 )
|
||||
if("parrot") M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob, 1 )
|
||||
if("polyparrot") M.change_mob_type( /mob/living/simple_animal/parrot/Poly , null, null, delmob, 1 )
|
||||
if("constructarmoured") M.change_mob_type( /mob/living/simple_animal/hostile/construct/armoured , null, null, delmob, 1 )
|
||||
if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/hostile/construct/builder , null, null, delmob, 1 )
|
||||
if("constructwraith") M.change_mob_type( /mob/living/simple_animal/hostile/construct/wraith , null, null, delmob, 1 )
|
||||
if("constructarmoured") M.change_mob_type( /mob/living/simple_animal/construct/armoured , null, null, delmob, 1 )
|
||||
if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/construct/builder , null, null, delmob, 1 )
|
||||
if("constructwraith") M.change_mob_type( /mob/living/simple_animal/construct/wraith , null, null, delmob, 1 )
|
||||
if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob, 1 )
|
||||
|
||||
|
||||
@@ -877,7 +877,7 @@
|
||||
|
||||
else if(href_list["boot2"])
|
||||
var/mob/M = locate(href_list["boot2"])
|
||||
if (ismob(M))
|
||||
if(ismob(M))
|
||||
if(!check_if_greater_rights_than(M.client))
|
||||
return
|
||||
to_chat(M, "\red You have been kicked from the server")
|
||||
@@ -1094,7 +1094,7 @@
|
||||
else if(href_list["c_mode2"])
|
||||
if(!check_rights(R_ADMIN|R_SERVER)) return
|
||||
|
||||
if (ticker && ticker.mode)
|
||||
if(ticker && ticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
master_mode = href_list["c_mode2"]
|
||||
log_admin("[key_name(usr)] set the mode as [master_mode].")
|
||||
@@ -1124,6 +1124,8 @@
|
||||
if(!istype(H))
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
|
||||
return
|
||||
if(alert(usr, "Confirm make monkey?",, "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]")
|
||||
message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]", 1)
|
||||
@@ -1138,6 +1140,9 @@
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
|
||||
return
|
||||
|
||||
if(alert(usr, "Confirm make corgi?",, "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
log_admin("[key_name(usr)] attempting to corgize [key_name(H)]")
|
||||
message_admins("\blue [key_name_admin(usr)] attempting to corgize [key_name_admin(H)]", 1)
|
||||
H.corgize()
|
||||
@@ -1149,6 +1154,8 @@
|
||||
if(!istype(H))
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
|
||||
return
|
||||
if(alert(usr, "Confirm make pai?",, "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
var/painame = "Default"
|
||||
var/name = ""
|
||||
@@ -1407,10 +1414,26 @@
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
|
||||
return
|
||||
|
||||
if(alert(usr, "Confirm make ai?",, "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
message_admins("\red Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!", 1)
|
||||
log_admin("[key_name(usr)] AIized [key_name(H)]")
|
||||
H.AIize()
|
||||
|
||||
|
||||
else if(href_list["makemask"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
if(alert(usr, "Confirm make mask?",, "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
var/mob/currentMob = locate(href_list["makemask"])
|
||||
message_admins("\red Admin [key_name_admin(usr)] made [key_name_admin(currentMob)] into a Mask of Nar'Sie!", 1)
|
||||
log_admin("[key_name(usr)] made [key_name(currentMob)] into a Mask of Nar'Sie!")
|
||||
currentMob.make_into_mask(0,0)
|
||||
|
||||
|
||||
else if(href_list["makealien"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
@@ -1418,6 +1441,8 @@
|
||||
if(!istype(H))
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
|
||||
return
|
||||
if(alert(usr, "Confirm make alien?",, "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
usr.client.cmd_admin_alienize(H)
|
||||
|
||||
@@ -1428,6 +1453,8 @@
|
||||
if(!istype(H))
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
|
||||
return
|
||||
if(alert(usr, "Confirm make slime?",, "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
usr.client.cmd_admin_slimeize(H)
|
||||
|
||||
@@ -1439,6 +1466,9 @@
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
|
||||
return
|
||||
|
||||
if(alert(usr, "Confirm make superhero?",, "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
usr.client.cmd_admin_super(H)
|
||||
|
||||
else if(href_list["makerobot"])
|
||||
@@ -1448,6 +1478,8 @@
|
||||
if(!istype(H))
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
|
||||
return
|
||||
if(alert(usr, "Confirm make robot?",, "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
usr.client.cmd_admin_robotize(H)
|
||||
|
||||
@@ -1458,6 +1490,8 @@
|
||||
if(istype(M, /mob/new_player))
|
||||
to_chat(usr, "This cannot be used on instances of type /mob/new_player")
|
||||
return
|
||||
if(alert(usr, "Confirm make animal?",, "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
usr.client.cmd_admin_animalize(M)
|
||||
|
||||
@@ -1558,10 +1592,10 @@
|
||||
if(isliving(M))
|
||||
var/mob/living/L = M
|
||||
var/status
|
||||
switch (M.stat)
|
||||
if (0) status = "Alive"
|
||||
if (1) status = "<font color='orange'><b>Unconscious</b></font>"
|
||||
if (2) status = "<font color='red'><b>Dead</b></font>"
|
||||
switch(M.stat)
|
||||
if(0) status = "Alive"
|
||||
if(1) status = "<font color='orange'><b>Unconscious</b></font>"
|
||||
if(2) status = "<font color='red'><b>Dead</b></font>"
|
||||
health_description = "Status = [status]"
|
||||
health_description += "<BR>Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()]"
|
||||
else
|
||||
@@ -1673,7 +1707,7 @@
|
||||
if(!istype(H))
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
|
||||
return
|
||||
var/etypes = list("borging","corgifying","firedeath","braindeath","honktumor","demotion")
|
||||
var/etypes = list("Borgification","Corgification","Death By Fire","Total Brain Death","Honk Tumor","Cluwne","Demotion Notice")
|
||||
var/eviltype = input(src.owner, "Which type of evil fax do you wish to send [H]?","Its good to be baaaad...", "") as null|anything in etypes
|
||||
if(!(eviltype in etypes))
|
||||
return
|
||||
@@ -1684,7 +1718,7 @@
|
||||
var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"])
|
||||
|
||||
P.name = "Central Command - [customname]"
|
||||
P.info = "<b>A reminder: per the terms of your contract, stupid faxes will get you demoted, or worse.</b>"
|
||||
P.info = "<b>You <i>really</i> should've known better.</b>"
|
||||
P.myeffect = eviltype
|
||||
P.mytarget = H
|
||||
if(alert("Do you want the Evil Fax to activate automatically if [H] tries to ignore it?",,"Yes", "No") == "Yes")
|
||||
@@ -1724,19 +1758,23 @@
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(null)
|
||||
var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"])
|
||||
P.name = "Central Command - paper"
|
||||
var/stypes = list("handle it yourself","illegible","not signed","sorry, not right now","stop wasting our time")
|
||||
var/stypes = list("Handle it yourselves!","Illegible fax","Fax not signed","Not Right Now","You are wasting our time", "Keep up the good work", "ERT Instructions")
|
||||
var/stype = input(src.owner, "Which type of standard reply do you wish to send to [H]?","Choose your paperwork", "") as null|anything in stypes
|
||||
var/tmsg = "<font face='Verdana' color='black'><center><img src = 'ntlogo.png'><BR><BR><BR><font size='4'><B>NanoTrasen Science Station Cyberiad</B></font><BR><BR><BR><font size='4'>NAS Trurl Communications Department Report</font></center><BR><BR>"
|
||||
if(stype == "handle it yourself")
|
||||
tmsg += "Greetings, esteemed crewmember. Your fax has been <B><I>DECLINED</I></B> automatically by NAS Trurl Fax Registration.<BR><BR>Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention."
|
||||
else if(stype == "illegible")
|
||||
tmsg += "Greetings, esteemed crewmember. Your fax has been <B><I>DECLINED</I></B> automatically by NAS Trurl Fax Registration.<BR><BR>Your fax was too poorly written for our system to interpret."
|
||||
else if(stype == "not signed")
|
||||
tmsg += "Greetings, esteemed crewmember. Your fax has been <B><I>DECLINED</I></B> automatically by NAS Trurl Fax Registration.<BR><BR>Your fax was not properly signed and/or stamped."
|
||||
else if(stype == "sorry, not right now")
|
||||
tmsg += "Greetings, esteemed crewmember. Unfortunately, we are unable to spare the resources to assist you at this time."
|
||||
else if(stype == "stop wasting our time")
|
||||
tmsg += "Stop wasting our time."
|
||||
if(stype == "Handle it yourselves!")
|
||||
tmsg += "Greetings, esteemed crewmember. Your fax has been <B><I>DECLINED</I></B> automatically by NAS Trurl Fax Registration.<BR><BR>Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention.<BR><BR><i><small>This is an automatic message.</small>"
|
||||
else if(stype == "Illegible fax")
|
||||
tmsg += "Greetings, esteemed crewmember. Your fax has been <B><I>DECLINED</I></B> automatically by NAS Trurl Fax Registration.<BR><BR>Your fax's grammar, syntax and/or typography are of a sub-par level and do not allow us to understand the contents of the message.<BR><BR>Please consult your nearest dictionary and/or thesaurus and try again.<BR><BR><i><small>This is an automatic message.</small>"
|
||||
else if(stype == "Fax not signed")
|
||||
tmsg += "Greetings, esteemed crewmember. Your fax has been <B><I>DECLINED</I></B> automatically by NAS Trurl Fax Registration.<BR><BR>Your fax has not been correctly signed and, as such, we cannot verify your identity.<BR><BR>Please sign your faxes before sending them so that we may verify your identity.<BR><BR><i><small>This is an automatic message.</small>"
|
||||
else if(stype == "Not Right Now")
|
||||
tmsg += "Greetings, esteemed crewmember. Your fax has been <B><I>DECLINED</I></B> automatically by NAS Trurl Fax Registration.<BR><BR>Due to pressing concerns of a matter above your current paygrade, we are unable to provide assistance in whatever matter your fax referenced.<BR><BR>This can be either due to a power outage, bureaucratic audit, pest infestation, Ascendance Event, corgi outbreak, or any other situation that would affect the proper functioning of the NAS Trurl.<BR><BR>Please try again later.<BR><BR><i><small>This is an automatic message.</small>"
|
||||
else if(stype == "You are wasting our time")
|
||||
tmsg += "Greetings, esteemed crewmember. Your fax has been <B><I>DECLINED</I></B> automatically by NAS Trurl Fax Registration.<BR><BR>In the interest of preventing further mismanagement of company resources, please avoid wasting our time with such petty drivel.<BR><BR>Do kindly remember that we expect our workforce to maintain at least a semi-decent level of profesionalism. Do not test our patience.<BR><BR><i><small>This is an automatic message.</i></small>"
|
||||
else if(stype == "Keep up the good work")
|
||||
tmsg += "Greetings, esteemed crewmember. Your fax has been received successfully by NAS Trurl Fax Registration.<BR><BR>We at the NAS Trurl appreciate the good work that you have done here, and sincerely recommend that you continue such a display of dedication to the company.<BR><BR><i><small>This is absolutely not an automated message.</i></small>"
|
||||
else if(stype == "ERT Instructions")
|
||||
tmsg += "Greetings, esteemed crewmember. Your fax has been <B><I>DECLINED</I></B> automatically by NAS Trurl Fax Registration.<BR><BR>Please utilize the Card Swipers if you wish to call for an ERT.<BR><BR><i><small>This is an automated message.</i></small>"
|
||||
else
|
||||
return
|
||||
tmsg += "</font>"
|
||||
@@ -1820,7 +1858,7 @@
|
||||
|
||||
var/input = input(src.owner, "Please enter a reason for denying [key_name(H)]'s ERT request.","Outgoing message from CentComm", "")
|
||||
if(!input) return
|
||||
|
||||
ert_request_answered = 1
|
||||
to_chat(src.owner, "You sent [input] to [H] via a secure channel.")
|
||||
log_admin("[src.owner] denied [key_name(H)]'s ERT request with the message [input].")
|
||||
to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Your ERT request has been denied for the following reasons: [input]. Message ends.\"")
|
||||
@@ -1833,19 +1871,19 @@
|
||||
return
|
||||
|
||||
var/obj/item/fax = locate(href_list["AdminFaxView"])
|
||||
if (istype(fax, /obj/item/weapon/paper))
|
||||
if(istype(fax, /obj/item/weapon/paper))
|
||||
var/obj/item/weapon/paper/P = fax
|
||||
P.show_content(usr,1)
|
||||
else if (istype(fax, /obj/item/weapon/photo))
|
||||
else if(istype(fax, /obj/item/weapon/photo))
|
||||
var/obj/item/weapon/photo/H = fax
|
||||
H.show(usr)
|
||||
else if (istype(fax, /obj/item/weapon/paper_bundle))
|
||||
else if(istype(fax, /obj/item/weapon/paper_bundle))
|
||||
//having multiple people turning pages on a paper_bundle can cause issues
|
||||
//open a browse window listing the contents instead
|
||||
var/data = ""
|
||||
var/obj/item/weapon/paper_bundle/B = fax
|
||||
|
||||
for (var/page = 1, page <= B.amount + 1, page++)
|
||||
for(var/page = 1, page <= B.amount + 1, page++)
|
||||
var/obj/pageobj = B.contents[page]
|
||||
data += "<A href='?src=\ref[src];AdminFaxViewPage=[page];paper_bundle=\ref[B]'>Page [page] - [pageobj.name]</A><BR>"
|
||||
|
||||
@@ -1853,19 +1891,19 @@
|
||||
else
|
||||
to_chat(usr, "\red The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]")
|
||||
|
||||
else if (href_list["AdminFaxViewPage"])
|
||||
else if(href_list["AdminFaxViewPage"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/page = text2num(href_list["AdminFaxViewPage"])
|
||||
var/obj/item/weapon/paper_bundle/bundle = locate(href_list["paper_bundle"])
|
||||
|
||||
if (!bundle) return
|
||||
if(!bundle) return
|
||||
|
||||
if (istype(bundle.contents[page], /obj/item/weapon/paper))
|
||||
if(istype(bundle.contents[page], /obj/item/weapon/paper))
|
||||
var/obj/item/weapon/paper/P = bundle.contents[page]
|
||||
P.show_content(usr, 1)
|
||||
else if (istype(bundle.contents[page], /obj/item/weapon/photo))
|
||||
else if(istype(bundle.contents[page], /obj/item/weapon/photo))
|
||||
var/obj/item/weapon/photo/H = bundle.contents[page]
|
||||
H.show(usr)
|
||||
return
|
||||
@@ -2090,9 +2128,9 @@
|
||||
var/atom/loc = usr.loc
|
||||
|
||||
var/dirty_paths
|
||||
if (istext(href_list["object_list"]))
|
||||
if(istext(href_list["object_list"]))
|
||||
dirty_paths = list(href_list["object_list"])
|
||||
else if (istype(href_list["object_list"], /list))
|
||||
else if(istype(href_list["object_list"], /list))
|
||||
dirty_paths = href_list["object_list"]
|
||||
|
||||
var/paths = list()
|
||||
@@ -2126,22 +2164,22 @@
|
||||
|
||||
var/atom/target //Where the object will be spawned
|
||||
var/where = href_list["object_where"]
|
||||
if (!( where in list("onfloor","inhand","inmarked") ))
|
||||
if(!( where in list("onfloor","inhand","inmarked") ))
|
||||
where = "onfloor"
|
||||
|
||||
|
||||
switch(where)
|
||||
if("inhand")
|
||||
if (!iscarbon(usr) && !isrobot(usr))
|
||||
if(!iscarbon(usr) && !isrobot(usr))
|
||||
to_chat(usr, "Can only spawn in hand when you're a carbon mob or cyborg.")
|
||||
where = "onfloor"
|
||||
target = usr
|
||||
|
||||
if("onfloor")
|
||||
switch(href_list["offset_type"])
|
||||
if ("absolute")
|
||||
if("absolute")
|
||||
target = locate(0 + X,0 + Y,0 + Z)
|
||||
if ("relative")
|
||||
if("relative")
|
||||
target = locate(loc.x + X,loc.y + Y,loc.z + Z)
|
||||
if("inmarked")
|
||||
if(!marked_datum)
|
||||
@@ -2154,8 +2192,8 @@
|
||||
target = marked_datum
|
||||
|
||||
if(target)
|
||||
for (var/path in paths)
|
||||
for (var/i = 0; i < number; i++)
|
||||
for(var/path in paths)
|
||||
for(var/i = 0; i < number; i++)
|
||||
if(path in typesof(/turf))
|
||||
var/turf/O = target
|
||||
var/turf/N = O.ChangeTurf(path)
|
||||
@@ -2183,7 +2221,7 @@
|
||||
R.activate_module(I)
|
||||
R.module.fix_modules()
|
||||
|
||||
if (number == 1)
|
||||
if(number == 1)
|
||||
log_admin("[key_name(usr)] created a [english_list(paths)]")
|
||||
for(var/path in paths)
|
||||
if(ispath(path, /mob))
|
||||
@@ -2253,7 +2291,7 @@
|
||||
/* for(var/obj/machinery/vehicle/pod/O in world)
|
||||
for(var/mob/M in src)
|
||||
M.loc = src.loc
|
||||
if (M.client)
|
||||
if(M.client)
|
||||
M.client.perspective = MOB_PERSPECTIVE
|
||||
M.client.eye = M
|
||||
qdel(O)
|
||||
@@ -2351,9 +2389,9 @@
|
||||
continue
|
||||
//don't strip organs
|
||||
H.unEquip(W)
|
||||
if (H.client)
|
||||
if(H.client)
|
||||
H.client.screen -= W
|
||||
if (W)
|
||||
if(W)
|
||||
W.loc = H.loc
|
||||
W.dropped(H)
|
||||
W.layer = initial(W.layer)
|
||||
@@ -2405,9 +2443,9 @@
|
||||
feedback_add_details("admin_secrets_fun_used","BC")
|
||||
|
||||
var/newBombCap = input(usr,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be between 4 and 128)", "New Bomb Cap", MAX_EX_LIGHT_RANGE) as num|null
|
||||
if (newBombCap < 4)
|
||||
if(newBombCap < 4)
|
||||
return
|
||||
if (newBombCap > 128)
|
||||
if(newBombCap > 128)
|
||||
newBombCap = 128
|
||||
|
||||
MAX_EX_DEVESTATION_RANGE = round(newBombCap/4)
|
||||
@@ -2510,60 +2548,37 @@
|
||||
L.fix()
|
||||
message_admins("[key_name_admin(usr)] fixed all lights", 1)
|
||||
if("floorlava")
|
||||
if(floorIsLava)
|
||||
to_chat(usr, "The floor is lava already.")
|
||||
feedback_inc("admin_secrets_fun_used", 1)
|
||||
feedback_add_details("admin_secrets_fun_used", "LF")
|
||||
var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "Yes", "No")
|
||||
if(sure == "No")
|
||||
return
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","LF")
|
||||
|
||||
//Options
|
||||
var/length = input(usr, "How long will the lava last? (in seconds)", "Length", 180) as num
|
||||
length = min(abs(length), 1200)
|
||||
|
||||
var/damage = input(usr, "How deadly will the lava be?", "Damage", 2) as num
|
||||
damage = min(abs(damage), 100)
|
||||
|
||||
var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "YES!", "Nah")
|
||||
if(sure == "Nah")
|
||||
weather_master.run_weather("the floor is lava")
|
||||
message_admins("[key_name_admin(usr)] made the floor lava")
|
||||
if("fakelava")
|
||||
feedback_inc("admin_secrets_fun_used", 1)
|
||||
feedback_add_details("admin_secrets_fun_used", "LZ")
|
||||
var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "Yes", "No")
|
||||
if(sure == "No")
|
||||
return
|
||||
floorIsLava = 1
|
||||
|
||||
message_admins("[key_name_admin(usr)] made the floor LAVA! It'll last [length] seconds and it will deal [damage] damage to everyone.", 1)
|
||||
|
||||
for(var/turf/simulated/floor/F in world)
|
||||
if((F.z in config.station_levels))
|
||||
F.name = "lava"
|
||||
F.desc = "The floor is LAVA!"
|
||||
F.overlays += "lava"
|
||||
F.lava = 1
|
||||
|
||||
spawn(0)
|
||||
for(var/i = i, i < length, i++) // 180 = 3 minutes
|
||||
if(damage)
|
||||
for(var/mob/living/carbon/L in living_mob_list)
|
||||
if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?!
|
||||
var/turf/simulated/floor/F = L.loc
|
||||
if(F.lava)
|
||||
var/safe = 0
|
||||
for(var/obj/structure/O in F.contents)
|
||||
if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor!
|
||||
safe = 1
|
||||
break
|
||||
if(!safe)
|
||||
L.adjustFireLoss(damage)
|
||||
|
||||
|
||||
sleep(10)
|
||||
|
||||
for(var/turf/simulated/floor/F in world) // Reset everything.
|
||||
if((F.z in config.station_levels))
|
||||
F.name = initial(F.name)
|
||||
F.desc = initial(F.desc)
|
||||
F.overlays.Cut()
|
||||
F.lava = 0
|
||||
F.update_icon()
|
||||
floorIsLava = 0
|
||||
return
|
||||
weather_master.run_weather("fake lava")
|
||||
message_admins("[key_name_admin(usr)] made aesthetic lava on the floor")
|
||||
if("weatherashstorm")
|
||||
feedback_inc("admin_secrets_fun_used", 1)
|
||||
feedback_add_details("admin_secrets_fun_used", "WA")
|
||||
var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "Yes", "No")
|
||||
if(sure == "No")
|
||||
return
|
||||
weather_master.run_weather("ash storm")
|
||||
message_admins("[key_name_admin(usr)] spawned an ash storm on the mining asteroid")
|
||||
if("weatherdarkness")
|
||||
feedback_inc("admin_secrets_fun_used", 1)
|
||||
feedback_add_details("admin_secrets_fun_used", "WD")
|
||||
var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "Yes", "No")
|
||||
if(sure == "No")
|
||||
return
|
||||
weather_master.run_weather("advanced darkness")
|
||||
message_admins("[key_name_admin(usr)] made the station go through advanced darkness")
|
||||
if("retardify")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","RET")
|
||||
@@ -2589,7 +2604,7 @@
|
||||
W.item_state = "w_suit"
|
||||
W.item_color = "schoolgirl"
|
||||
message_admins("[key_name_admin(usr)] activated Japanese Animes mode")
|
||||
to_chat(world, sound('sound/AI/animes.ogg'))
|
||||
world << sound('sound/AI/animes.ogg')
|
||||
if("eagles")//SCRAW
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","EgL")
|
||||
@@ -2694,7 +2709,7 @@
|
||||
|
||||
if(usr)
|
||||
log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]")
|
||||
if (ok)
|
||||
if(ok)
|
||||
to_chat(world, text("<B>A secret has been activated by []!</B>", usr.key))
|
||||
|
||||
else if(href_list["secretsadmin"])
|
||||
@@ -2734,7 +2749,7 @@
|
||||
if("showgm")
|
||||
if(!ticker)
|
||||
alert("The game hasn't started yet!")
|
||||
else if (ticker.mode)
|
||||
else if(ticker.mode)
|
||||
alert("The game mode is [ticker.mode.name]")
|
||||
else alert("For some reason there's a ticker, but not a game mode")
|
||||
if("manifest")
|
||||
@@ -2769,9 +2784,9 @@
|
||||
dat += "</table>"
|
||||
usr << browse(dat, "window=fingerprints;size=440x410")
|
||||
else
|
||||
if (usr)
|
||||
if(usr)
|
||||
log_admin("[key_name(usr)] used secret [href_list["secretsadmin"]]")
|
||||
if (ok)
|
||||
if(ok)
|
||||
to_chat(world, text("<B>A secret has been activated by []!</B>", usr.key))
|
||||
|
||||
else if(href_list["secretscoder"])
|
||||
@@ -2787,12 +2802,12 @@
|
||||
usr << browse(dat, "window=admin_log")
|
||||
if("maint_access_brig")
|
||||
for(var/obj/machinery/door/airlock/maintenance/M in world)
|
||||
if (access_maint_tunnels in M.req_access)
|
||||
if(access_maint_tunnels in M.req_access)
|
||||
M.req_access = list(access_brig)
|
||||
message_admins("[key_name_admin(usr)] made all maint doors brig access-only.")
|
||||
if("maint_access_engiebrig")
|
||||
for(var/obj/machinery/door/airlock/maintenance/M in world)
|
||||
if (access_maint_tunnels in M.req_access)
|
||||
if(access_maint_tunnels in M.req_access)
|
||||
M.req_access = list()
|
||||
M.req_one_access = list(access_brig,access_engine)
|
||||
message_admins("[key_name_admin(usr)] made all maint doors engineering and brig access-only.")
|
||||
@@ -2809,7 +2824,7 @@
|
||||
|
||||
else if(href_list["ac_set_channel_name"])
|
||||
src.admincaster_feed_channel.channel_name = strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""))
|
||||
while (findtext(src.admincaster_feed_channel.channel_name," ") == 1)
|
||||
while(findtext(src.admincaster_feed_channel.channel_name," ") == 1)
|
||||
src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,lentext(src.admincaster_feed_channel.channel_name)+1)
|
||||
src.access_news_network()
|
||||
|
||||
@@ -2848,7 +2863,7 @@
|
||||
|
||||
else if(href_list["ac_set_new_message"])
|
||||
src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story", "Network Channel Handler", ""))
|
||||
while (findtext(src.admincaster_feed_message.body," ") == 1)
|
||||
while(findtext(src.admincaster_feed_message.body," ") == 1)
|
||||
src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,lentext(src.admincaster_feed_message.body)+1)
|
||||
src.access_news_network()
|
||||
|
||||
@@ -2902,13 +2917,13 @@
|
||||
|
||||
else if(href_list["ac_set_wanted_name"])
|
||||
src.admincaster_feed_message.author = adminscrub(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
|
||||
while (findtext(src.admincaster_feed_message.author," ") == 1)
|
||||
while(findtext(src.admincaster_feed_message.author," ") == 1)
|
||||
src.admincaster_feed_message.author = copytext(admincaster_feed_message.author,2,lentext(admincaster_feed_message.author)+1)
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["ac_set_wanted_desc"])
|
||||
src.admincaster_feed_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
|
||||
while (findtext(src.admincaster_feed_message.body," ") == 1)
|
||||
while(findtext(src.admincaster_feed_message.body," ") == 1)
|
||||
src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,lentext(src.admincaster_feed_message.body)+1)
|
||||
src.access_news_network()
|
||||
|
||||
@@ -2991,7 +3006,7 @@
|
||||
|
||||
else if(href_list["ac_setScreen"]) //Brings us to the main menu and resets all fields~
|
||||
src.admincaster_screen = text2num(href_list["ac_setScreen"])
|
||||
if (src.admincaster_screen == 0)
|
||||
if(src.admincaster_screen == 0)
|
||||
if(src.admincaster_feed_channel)
|
||||
src.admincaster_feed_channel = new /datum/feed_channel
|
||||
if(src.admincaster_feed_message)
|
||||
|
||||
@@ -28,7 +28,8 @@ var/list/department_radio_keys = list(
|
||||
":T" = "Syndicate", "#T" = "Syndicate", ".T" = "Syndicate",
|
||||
":U" = "Supply", "#U" = "Supply", ".U" = "Supply",
|
||||
":Z" = "Service", "#Z" = "Service", ".Z" = "Service",
|
||||
":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private"
|
||||
":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private",
|
||||
":-" = "Special Ops", "#-" = "Special Ops", ".-" = "Special Ops"
|
||||
)
|
||||
|
||||
|
||||
@@ -47,22 +48,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
return key
|
||||
|
||||
/mob/living/proc/binarycheck()
|
||||
|
||||
if (istype(src, /mob/living/silicon/pai))
|
||||
return
|
||||
|
||||
if (!ishuman(src))
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = src
|
||||
if (H.l_ear || H.r_ear)
|
||||
var/obj/item/device/radio/headset/dongle
|
||||
if(istype(H.l_ear,/obj/item/device/radio/headset))
|
||||
dongle = H.l_ear
|
||||
else
|
||||
dongle = H.r_ear
|
||||
if(!istype(dongle)) return
|
||||
if(dongle.translate_binary) return 1
|
||||
return FALSE
|
||||
|
||||
/mob/living/proc/get_default_language()
|
||||
return default_language
|
||||
@@ -93,15 +79,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
verb = "stammers"
|
||||
speech_problem_flag = 1
|
||||
|
||||
if(cultslurring)
|
||||
message = cultslur(message)
|
||||
verb = "slurs"
|
||||
speech_problem_flag = 1
|
||||
|
||||
if(GREY in mutations)
|
||||
message = "<span class='grey'>[message]</span>"
|
||||
|
||||
else if(COMIC in mutations)
|
||||
if(COMIC in mutations)
|
||||
message = "<span class='sans'>[message]</span>"
|
||||
|
||||
if(!IsVocal())
|
||||
@@ -130,27 +108,27 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name="")
|
||||
if(client)
|
||||
if(client.prefs.muted & MUTE_IC)
|
||||
to_chat(src, "\red You cannot speak in IC (Muted).")
|
||||
to_chat(src, "<span class='danger'>You cannot speak in IC (Muted).</span>")
|
||||
return
|
||||
|
||||
message = trim_strip_html_properly(message)
|
||||
|
||||
if(stat)
|
||||
if(stat == 2)
|
||||
if(stat == DEAD)
|
||||
return say_dead(message)
|
||||
return
|
||||
|
||||
var/message_mode = parse_message_mode(message, "headset")
|
||||
|
||||
if(copytext(message,1,2) == "*")
|
||||
return emote(copytext(message,2))
|
||||
if(copytext(message, 1, 2) == "*")
|
||||
return emote(copytext(message, 2))
|
||||
|
||||
//parse the radio code and consume it
|
||||
if (message_mode)
|
||||
if (message_mode == "headset")
|
||||
message = copytext(message,2) //it would be really nice if the parse procs could do this for us.
|
||||
if(message_mode)
|
||||
if(message_mode == "headset")
|
||||
message = copytext(message, 2) //it would be really nice if the parse procs could do this for us.
|
||||
else
|
||||
message = copytext(message,3)
|
||||
message = copytext(message, 3)
|
||||
|
||||
message = trim_left(message)
|
||||
|
||||
@@ -191,7 +169,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
if(!message || message == "")
|
||||
return 0
|
||||
|
||||
var/list/obj/item/used_radios = new
|
||||
var/list/used_radios = list()
|
||||
if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name))
|
||||
return 1
|
||||
|
||||
@@ -211,21 +189,24 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
var/msg
|
||||
if(!speaking || !(speaking.flags & NO_TALK_MSG))
|
||||
msg = "<span class='notice'>\The [src] talks into \the [used_radios[1]]</span>"
|
||||
for(var/mob/living/M in hearers(5, src))
|
||||
if((M != src) && msg)
|
||||
|
||||
if(msg)
|
||||
for(var/mob/living/M in hearers(5, src) - src)
|
||||
M.show_message(msg)
|
||||
if (speech_sound)
|
||||
sound_vol *= 0.5
|
||||
|
||||
if(speech_sound)
|
||||
sound_vol *= 0.5
|
||||
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
//handle nonverbal and sign languages here
|
||||
if (speaking)
|
||||
if (speaking.flags & NONVERBAL)
|
||||
if (prob(30))
|
||||
src.custom_emote(1, "[pick(speaking.signlang_verb)].")
|
||||
if(speaking)
|
||||
if(speaking.flags & NONVERBAL)
|
||||
if(prob(30))
|
||||
custom_emote(1, "[pick(speaking.signlang_verb)].")
|
||||
|
||||
if (speaking.flags & SIGNLANG)
|
||||
if(speaking.flags & SIGNLANG)
|
||||
return say_signlang(message, pick(speaking.signlang_verb), speaking)
|
||||
|
||||
var/list/listening = list()
|
||||
@@ -234,11 +215,11 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
if(T)
|
||||
//make sure the air can transmit speech - speaker's side
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
var/pressure = (environment)? environment.return_pressure() : 0
|
||||
var/pressure = environment ? environment.return_pressure() : 0
|
||||
if(pressure < SOUND_MINIMUM_PRESSURE)
|
||||
message_range = 1
|
||||
|
||||
if (pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
|
||||
if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
|
||||
italics = 1
|
||||
sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
|
||||
|
||||
@@ -246,26 +227,26 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
var/list/hearturfs = list()
|
||||
|
||||
for(var/I in hear)
|
||||
if(istype(I, /mob/))
|
||||
if(ismob(I))
|
||||
var/mob/M = I
|
||||
listening += M
|
||||
hearturfs += M.locs[1]
|
||||
hearturfs += get_turf(M)
|
||||
for(var/obj/O in M.contents)
|
||||
listening_obj |= O
|
||||
else if(istype(I, /obj/))
|
||||
if(isobj(I))
|
||||
var/obj/O = I
|
||||
hearturfs += O.locs[1]
|
||||
hearturfs += get_turf(O)
|
||||
listening_obj |= O
|
||||
|
||||
for(var/mob/M in player_list)
|
||||
if (!M.client)
|
||||
if(!M.client)
|
||||
continue //skip monkeys and leavers
|
||||
if (istype(M, /mob/new_player))
|
||||
if(isnewplayer(M))
|
||||
continue
|
||||
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS) && src.client) // src.client is so that ghosts don't have to listen to mice
|
||||
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS) && client) // client is so that ghosts don't have to listen to mice
|
||||
listening |= M
|
||||
continue
|
||||
if(M.loc && M.locs[1] in hearturfs)
|
||||
if(get_turf(M) in hearturfs)
|
||||
listening |= M
|
||||
|
||||
var/list/speech_bubble_recipients = list()
|
||||
@@ -291,7 +272,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
return 1
|
||||
|
||||
/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language)
|
||||
for (var/mob/O in viewers(src, null))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.hear_signlang(message, verb, language, src)
|
||||
return 1
|
||||
|
||||
@@ -301,6 +282,34 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
/mob/living/proc/GetVoice()
|
||||
return name
|
||||
|
||||
/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't
|
||||
if(stat) return 0 //already snowflaked to shit can call the parent and handle emoting sanely
|
||||
|
||||
if(..(act, type, message))
|
||||
return 1
|
||||
|
||||
if(act && type && message) //parent call
|
||||
log_emote("[name]/[key] : [message]")
|
||||
|
||||
for(var/mob/M in dead_mob_list)
|
||||
if(!M.client || istype(M, /mob/new_player))
|
||||
continue //skip monkeys, leavers and new players //who the hell knows why new players are in the dead mob list
|
||||
|
||||
if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
|
||||
M.show_message(message)
|
||||
|
||||
switch(type)
|
||||
if(1) //Visible
|
||||
visible_message(message)
|
||||
return 1
|
||||
if(2) //Audible
|
||||
audible_message(message)
|
||||
return 1
|
||||
|
||||
else //everything else failed, emote is probably invalid
|
||||
if(act == "help") return //except help, because help is handled individually
|
||||
to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.")
|
||||
|
||||
/mob/living/whisper(message as text)
|
||||
message = trim_strip_html_properly(message)
|
||||
|
||||
@@ -333,7 +342,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
return
|
||||
|
||||
if(stat)
|
||||
if(stat == 2)
|
||||
if(stat == DEAD)
|
||||
return say_dead(message)
|
||||
return
|
||||
|
||||
@@ -359,7 +368,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
verb = "[speaking.speech_verb] [adverb]"
|
||||
not_heard = "[speaking.speech_verb] something [adverb]"
|
||||
else
|
||||
not_heard = "[verb] something" //TODO get rid of the null language and just prevent speech if language is null
|
||||
not_heard = "[verb] something"
|
||||
|
||||
message = trim(message)
|
||||
|
||||
@@ -370,11 +379,12 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
speech_problem_flag = handle_s[3]
|
||||
if(verb == "yells loudly")
|
||||
verb = "slurs emphatically"
|
||||
|
||||
else if(speech_problem_flag)
|
||||
var/adverb = pick("quietly", "softly")
|
||||
verb = "[verb] [adverb]"
|
||||
|
||||
if(!message || message=="")
|
||||
if(!message)
|
||||
return
|
||||
|
||||
var/atom/whisper_loc = get_whisper_loc()
|
||||
@@ -391,7 +401,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
//Pass whispers on to anything inside the immediate listeners.
|
||||
for(var/mob/L in listening)
|
||||
for(var/mob/C in L.contents)
|
||||
if(istype(C,/mob/living))
|
||||
if(isliving(C))
|
||||
listening += C
|
||||
|
||||
//pass on the message to objects that can hear us.
|
||||
@@ -431,11 +441,11 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
flick_overlay(I, speech_bubble_recipients, 30)
|
||||
|
||||
if(watching.len)
|
||||
var/rendered = "<span class='game say'><span class='name'>[src.name]</span> [not_heard].</span>"
|
||||
for (var/mob/M in watching)
|
||||
var/rendered = "<span class='game say'><span class='name'>[name]</span> [not_heard].</span>"
|
||||
for(var/mob/M in watching)
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
log_whisper("[src.name]/[src.key] : [message]")
|
||||
log_whisper("[name]/[key] : [message]")
|
||||
return 1
|
||||
|
||||
/mob/living/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/construct
|
||||
/mob/living/simple_animal/construct
|
||||
name = "Construct"
|
||||
real_name = "Construct"
|
||||
desc = ""
|
||||
@@ -19,38 +19,27 @@
|
||||
faction = list("cult")
|
||||
flying = 1
|
||||
universal_speak = 1
|
||||
AIStatus = AI_OFF //normal constructs don't have AI
|
||||
var/const_type = "shade"
|
||||
var/list/construct_spells = list()
|
||||
var/playstyle_string = "<b>You are a generic construct! Your job is to not exist, and you should probably adminhelp this.</b>"
|
||||
loot = list(/obj/item/weapon/reagent_containers/food/snacks/ectoplasm)
|
||||
del_on_death = 1
|
||||
deathmessage = "collapses in a shattered heap."
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/New()
|
||||
/mob/living/simple_animal/construct/New()
|
||||
..()
|
||||
name = "[ticker.mode.cultdat.get_name(const_type)] ([rand(1, 1000)])"
|
||||
real_name = ticker.mode.cultdat.get_name(const_type)
|
||||
icon_state = ticker.mode.cultdat.get_icon(const_type)
|
||||
name = text("[initial(name)] ([rand(1, 1000)])")
|
||||
real_name = name
|
||||
for(var/spell in construct_spells)
|
||||
AddSpell(new spell(src))
|
||||
AddSpell(new spell(null))
|
||||
updateglow()
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/death()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm (src.loc)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if((M.client && !( M.blinded )))
|
||||
M.show_message("<span class='warning'>[src] collapses in a shattered heap.</span>")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/examine(mob/user)
|
||||
/mob/living/simple_animal/construct/examine(mob/user)
|
||||
to_chat(user, "<span class='info'>*---------*</span>")
|
||||
..(user)
|
||||
|
||||
var/msg = ""
|
||||
if (src.health < src.maxHealth)
|
||||
var/msg = "<span class='info'>"
|
||||
if(src.health < src.maxHealth)
|
||||
msg += "<span class='warning'>"
|
||||
if (src.health >= src.maxHealth/2)
|
||||
if(src.health >= src.maxHealth/2)
|
||||
msg += "It looks slightly dented.\n"
|
||||
else
|
||||
msg += "<B>It looks severely dented!</B>\n"
|
||||
@@ -59,34 +48,32 @@
|
||||
|
||||
to_chat(user, msg)
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M)
|
||||
if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
|
||||
if(health < maxHealth)
|
||||
adjustBruteLoss(-5)
|
||||
if(src != M)
|
||||
Beam(M,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=4)
|
||||
M.visible_message("<span class='danger'>[M] repairs some of \the <b>[src]'s</b> dents.</span>", \
|
||||
"<span class='cult'>You repair some of <b>[src]'s</b> dents, leaving <b>[src]</b> at <b>[health]/[maxHealth]</b> health.</span>")
|
||||
else
|
||||
M.visible_message("<span class='danger'>[M] repairs some of its own dents.</span>", \
|
||||
"<span class='cult'>You repair some of your own dents, leaving you at <b>[M.health]/[M.maxHealth]</b> health.</span>")
|
||||
/mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(istype(M, /mob/living/simple_animal/construct/builder))
|
||||
health += 5
|
||||
M.custom_emote(1,"mends some of \the <EM>[src]'s</EM> wounds.")
|
||||
else
|
||||
if(M.melee_damage_upper <= 0)
|
||||
M.custom_emote(1, "[M.friendly] \the <EM>[src]</EM>")
|
||||
else
|
||||
if(src != M)
|
||||
to_chat(M, "<span class='cult'>You cannot repair <b>[src]'s</b> dents, as it has none!</span>")
|
||||
else
|
||||
to_chat(M, "<span class='cult'>You cannot repair your own dents, as you have none!</span>")
|
||||
else if(src != M)
|
||||
..()
|
||||
M.do_attack_animation(src)
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("<span class='attack'>\The <EM>[M]</EM> [M.attacktext] \the <EM>[src]</EM>!</span>", 1)
|
||||
add_logs(M, src, "attacked")
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/narsie_act()
|
||||
/mob/living/simple_animal/construct/narsie_act()
|
||||
return
|
||||
|
||||
/////////////////Juggernaut///////////////
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/armoured
|
||||
/mob/living/simple_animal/construct/armoured
|
||||
name = "Juggernaut"
|
||||
real_name = "Juggernaut"
|
||||
desc = "A possessed suit of armour driven by the will of the restless dead"
|
||||
@@ -104,22 +91,15 @@
|
||||
environment_smash = 2
|
||||
attack_sound = 'sound/weapons/punch3.ogg'
|
||||
status_flags = 0
|
||||
const_type = "juggernaut"
|
||||
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall)
|
||||
force_threshold = 11
|
||||
playstyle_string = "<b>You are a Juggernaut. Though slow, your shell can withstand extreme punishment, \
|
||||
create shield walls, rip apart enemies and walls alike, and even deflect energy weapons.</b>"
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/armoured/hostile //actually hostile, will move around, hit things
|
||||
AIStatus = AI_ON
|
||||
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/armoured/Life()
|
||||
/mob/living/simple_animal/construct/armoured/Life()
|
||||
weakened = 0
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/armoured/bullet_act(var/obj/item/projectile/P)
|
||||
/mob/living/simple_animal/construct/armoured/bullet_act(var/obj/item/projectile/P)
|
||||
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
|
||||
var/reflectchance = 80 - round(P.damage/3)
|
||||
if(prob(reflectchance))
|
||||
@@ -152,7 +132,7 @@
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/wraith
|
||||
/mob/living/simple_animal/construct/wraith
|
||||
name = "Wraith"
|
||||
real_name = "Wraith"
|
||||
desc = "A wicked bladed shell contraption piloted by a bound spirit"
|
||||
@@ -166,19 +146,15 @@
|
||||
attacktext = "slashes"
|
||||
see_in_dark = 7
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
const_type = "wraith"
|
||||
construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift)
|
||||
retreat_distance = 2 //AI wraiths will move in and out of combat
|
||||
playstyle_string = "<b>You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.</b>"
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/wraith/hostile //actually hostile, will move around, hit things
|
||||
AIStatus = AI_ON
|
||||
|
||||
|
||||
/////////////////////////////Artificer/////////////////////////
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/builder
|
||||
/mob/living/simple_animal/construct/builder
|
||||
name = "Artificer"
|
||||
real_name = "Artificer"
|
||||
desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies"
|
||||
@@ -193,70 +169,18 @@
|
||||
melee_damage_upper = 5
|
||||
attacktext = "rams"
|
||||
environment_smash = 2
|
||||
retreat_distance = 10
|
||||
minimum_distance = 10 //AI artificers will flee like fuck
|
||||
attack_sound = 'sound/weapons/punch2.ogg'
|
||||
const_type = "builder"
|
||||
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser,
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/floor,
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/pylon,
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone,
|
||||
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser)
|
||||
|
||||
playstyle_string = "<b>You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, \
|
||||
use magic missile, repair allied constructs (by clicking on them), \
|
||||
<i>and, most important of all,</i> create new constructs by producing soulstones to capture souls, \
|
||||
and shells to place those soulstones into.</b>"
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/builder/Found(atom/A) //what have we found here?
|
||||
if(istype(A, /mob/living/simple_animal/hostile/construct)) //is it a construct?
|
||||
var/mob/living/simple_animal/hostile/construct/C = A
|
||||
if(C.health < C.maxHealth) //is it hurt? let's go heal it if it is
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
else
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/builder/CanAttack(atom/the_target)
|
||||
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
|
||||
return 0
|
||||
if(Found(the_target) || ..()) //If we Found it or Can_Attack it normally, we Can_Attack it as long as it wasn't invisible
|
||||
return 1 //as a note this shouldn't be added to base hostile mobs because it'll mess up retaliate hostile mobs
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/builder/MoveToTarget(var/list/possible_targets)
|
||||
..()
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(istype(L, /mob/living/simple_animal/hostile/construct) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it
|
||||
LoseTarget()
|
||||
return 0
|
||||
if(L.health <= melee_damage_lower+melee_damage_upper) //ey bucko you're hurt as fuck let's go hit you
|
||||
retreat_distance = null
|
||||
minimum_distance = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/builder/Aggro()
|
||||
..()
|
||||
if(istype(target, /mob/living/simple_animal/hostile/construct)) //oh the target is a construct no need to flee
|
||||
retreat_distance = null
|
||||
minimum_distance = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/builder/LoseAggro()
|
||||
..()
|
||||
retreat_distance = initial(retreat_distance)
|
||||
minimum_distance = initial(minimum_distance)
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/builder/hostile //actually hostile, will move around, hit things, heal other constructs
|
||||
AIStatus = AI_ON
|
||||
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
|
||||
|
||||
|
||||
/////////////////////////////Behemoth/////////////////////////
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/behemoth
|
||||
/mob/living/simple_animal/construct/behemoth
|
||||
name = "Behemoth"
|
||||
real_name = "Behemoth"
|
||||
desc = "The pinnacle of occult technology, Behemoths are the ultimate weapon in the Cult of Nar-Sie's arsenal."
|
||||
@@ -275,22 +199,13 @@
|
||||
environment_smash = 2
|
||||
attack_sound = 'sound/weapons/punch4.ogg'
|
||||
force_threshold = 11
|
||||
const_type = "behemoth"
|
||||
var/energy = 0
|
||||
var/max_energy = 1000
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/behemoth/hostile //actually hostile, will move around, hit things
|
||||
AIStatus = AI_ON
|
||||
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/behemoth/Life()
|
||||
weakened = 0
|
||||
return ..()
|
||||
|
||||
|
||||
/////////////////////////////Harvester/////////////////////////
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/harvester
|
||||
/mob/living/simple_animal/construct/harvester
|
||||
name = "Harvester"
|
||||
real_name = "Harvester"
|
||||
desc = "A harbinger of Nar-Sie's enlightenment. It'll be all over soon."
|
||||
@@ -304,25 +219,16 @@
|
||||
attacktext = "prods"
|
||||
speed = 0
|
||||
environment_smash = 1
|
||||
see_in_dark = 8
|
||||
see_in_dark = 7
|
||||
attack_sound = 'sound/weapons/tap.ogg'
|
||||
const_type = "harvester"
|
||||
construct_spells = list(/obj/effect/proc_holder/spell/targeted/smoke/disable)
|
||||
retreat_distance = 2 //AI harvesters will move in and out of combat, like wraiths, but shittier
|
||||
playstyle_string = "<B>You are a Harvester. You are not strong, but your powers of domination will assist you in your role: \
|
||||
Bring those who still cling to this world of illusion back to the master so they may know Truth.</B>"
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/harvester/Process_Spacemove(var/movement_dir = 0)
|
||||
/mob/living/simple_animal/construct/harvester/Process_Spacemove(var/movement_dir = 0)
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/harvester/hostile //actually hostile, will move around, hit things
|
||||
AIStatus = AI_ON
|
||||
|
||||
|
||||
////////////////Glow////////////////////
|
||||
/mob/living/simple_animal/hostile/construct/proc/updateglow()
|
||||
/mob/living/simple_animal/construct/proc/updateglow()
|
||||
overlays = 0
|
||||
var/overlay_layer = LIGHTING_LAYER + 1
|
||||
if(layer != MOB_LAYER)
|
||||
@@ -339,7 +245,7 @@
|
||||
set category = "Behemoth"
|
||||
set name = "Summon Cultist (300)"
|
||||
set desc = "Teleport a cultist to your location"
|
||||
if (istype(usr,/mob/living/simple_animal/hostile/constructbehemoth))
|
||||
if(istype(usr,/mob/living/simple_animal/constructbehemoth))
|
||||
|
||||
if(usr.energy<300)
|
||||
to_chat(usr, "\red You do not have enough power stored!")
|
||||
@@ -351,86 +257,12 @@
|
||||
usr.energy -= 300
|
||||
var/list/mob/living/cultists = new
|
||||
for(var/datum/mind/H in ticker.mode.cult)
|
||||
if (istype(H.current,/mob/living))
|
||||
if(istype(H.current,/mob/living))
|
||||
cultists+=H.current
|
||||
var/mob/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - usr)
|
||||
if(!cultist)
|
||||
return
|
||||
if (cultist == usr) //just to be sure.
|
||||
if(cultist == usr) //just to be sure.
|
||||
return
|
||||
cultist.loc = usr.loc
|
||||
usr.visible_message("/red [cultist] appears in a flash of red light as [usr] glows with power")*/
|
||||
|
||||
|
||||
///ui stuff
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/armoured/handle_hud_icons_health()
|
||||
..()
|
||||
if(healths)
|
||||
switch(health)
|
||||
if(250 to INFINITY) healths.icon_state = "juggernaut_health0"
|
||||
if(208 to 249) healths.icon_state = "juggernaut_health1"
|
||||
if(167 to 207) healths.icon_state = "juggernaut_health2"
|
||||
if(125 to 166) healths.icon_state = "juggernaut_health3"
|
||||
if(84 to 124) healths.icon_state = "juggernaut_health4"
|
||||
if(42 to 83) healths.icon_state = "juggernaut_health5"
|
||||
if(1 to 41) healths.icon_state = "juggernaut_health6"
|
||||
else healths.icon_state = "juggernaut_health7"
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/behemoth/handle_hud_icons_health()
|
||||
..()
|
||||
if(healths)
|
||||
switch(health)
|
||||
if(750 to INFINITY) healths.icon_state = "juggernaut_health0"
|
||||
if(625 to 749) healths.icon_state = "juggernaut_health1"
|
||||
if(500 to 624) healths.icon_state = "juggernaut_health2"
|
||||
if(375 to 499) healths.icon_state = "juggernaut_health3"
|
||||
if(250 to 374) healths.icon_state = "juggernaut_health4"
|
||||
if(125 to 249) healths.icon_state = "juggernaut_health5"
|
||||
if(1 to 124) healths.icon_state = "juggernaut_health6"
|
||||
else healths.icon_state = "juggernaut_health7"
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/builder/handle_hud_icons_health()
|
||||
..()
|
||||
if(healths)
|
||||
switch(health)
|
||||
if(50 to INFINITY) healths.icon_state = "artificer_health0"
|
||||
if(42 to 49) healths.icon_state = "artificer_health1"
|
||||
if(34 to 41) healths.icon_state = "artificer_health2"
|
||||
if(26 to 33) healths.icon_state = "artificer_health3"
|
||||
if(18 to 25) healths.icon_state = "artificer_health4"
|
||||
if(10 to 17) healths.icon_state = "artificer_health5"
|
||||
if(1 to 9) healths.icon_state = "artificer_health6"
|
||||
else healths.icon_state = "artificer_health7"
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/wraith/handle_hud_icons_health()
|
||||
|
||||
..()
|
||||
if(healths)
|
||||
switch(health)
|
||||
if(75 to INFINITY) healths.icon_state = "wraith_health0"
|
||||
if(62 to 74) healths.icon_state = "wraith_health1"
|
||||
if(50 to 61) healths.icon_state = "wraith_health2"
|
||||
if(37 to 49) healths.icon_state = "wraith_health3"
|
||||
if(25 to 36) healths.icon_state = "wraith_health4"
|
||||
if(12 to 24) healths.icon_state = "wraith_health5"
|
||||
if(1 to 11) healths.icon_state = "wraith_health6"
|
||||
else healths.icon_state = "wraith_health7"
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/harvester/handle_hud_icons_health()
|
||||
|
||||
..()
|
||||
if(healths)
|
||||
switch(health)
|
||||
if(150 to INFINITY) healths.icon_state = "harvester_health0"
|
||||
if(125 to 149) healths.icon_state = "harvester_health1"
|
||||
if(100 to 124) healths.icon_state = "harvester_health2"
|
||||
if(75 to 99) healths.icon_state = "harvester_health3"
|
||||
if(50 to 74) healths.icon_state = "harvester_health4"
|
||||
if(25 to 49) healths.icon_state = "harvester_health5"
|
||||
if(1 to 24) healths.icon_state = "harvester_health6"
|
||||
else healths.icon_state = "harvester_health7"
|
||||
@@ -2,18 +2,13 @@
|
||||
density = 1
|
||||
layer = 4.0
|
||||
animate_movement = 2
|
||||
// flags = NOREACT
|
||||
pressure_resistance = 8
|
||||
var/datum/mind/mind
|
||||
|
||||
var/stat = 0 //Whether a mob is alive or dead. TODO: Move this to living - Nodrak
|
||||
|
||||
//Not in use yet
|
||||
var/obj/effect/organstructure/organStructure = null
|
||||
|
||||
var/obj/screen/hands = null
|
||||
var/obj/screen/pullin = null
|
||||
var/obj/screen/internals = null
|
||||
var/obj/screen/i_select = null
|
||||
var/obj/screen/m_select = null
|
||||
var/obj/screen/healths = null
|
||||
@@ -35,24 +30,21 @@
|
||||
var/lastattacker = null
|
||||
var/lastattacked = null
|
||||
var/attack_log = list( )
|
||||
var/already_placed = 0.0
|
||||
var/obj/machinery/machine = null
|
||||
var/other_mobs = null
|
||||
var/memory = ""
|
||||
var/poll_answer = 0.0
|
||||
var/sdisabilities = 0 //Carbon
|
||||
var/disabilities = 0 //Carbon
|
||||
var/atom/movable/pulling = null
|
||||
var/next_move = null
|
||||
var/notransform = null //Carbon
|
||||
var/other = 0.0
|
||||
var/hand = null
|
||||
var/eye_blind = null //Carbon
|
||||
var/eye_blurry = null //Carbon
|
||||
var/ear_deaf = null //Carbon
|
||||
var/ear_damage = null //Carbon
|
||||
var/stuttering = null //Carbon
|
||||
var/slurring = null //Carbon
|
||||
var/eye_blind = 0 //Carbon
|
||||
var/eye_blurry = 0 //Carbon
|
||||
var/ear_deaf = 0 //Carbon
|
||||
var/ear_damage = 0 //Carbon
|
||||
var/stuttering = 0 //Carbon
|
||||
var/slurring = 0 //Carbon
|
||||
var/real_name = null
|
||||
var/flavor_text = ""
|
||||
var/med_record = ""
|
||||
@@ -64,8 +56,6 @@
|
||||
var/druggy = 0 //Carbon
|
||||
var/confused = 0 //Carbon
|
||||
var/drunk = 0
|
||||
var/antitoxs = null
|
||||
var/plasma = null
|
||||
var/sleeping = 0 //Carbon
|
||||
var/resting = 0 //Carbon
|
||||
var/lying = 0
|
||||
@@ -96,11 +86,11 @@
|
||||
var/nutrition = 400.0//Carbon
|
||||
|
||||
var/overeatduration = 0 // How long this guy is overeating //Carbon
|
||||
var/paralysis = 0.0
|
||||
var/stunned = 0.0
|
||||
var/weakened = 0.0
|
||||
var/paralysis = 0
|
||||
var/stunned = 0
|
||||
var/weakened = 0
|
||||
var/slowed = 0
|
||||
var/losebreath = 0.0//Carbon
|
||||
var/losebreath = 0 //Carbon
|
||||
var/intent = null//Living
|
||||
var/shakecamera = 0
|
||||
var/a_intent = I_HELP//Living
|
||||
@@ -123,10 +113,9 @@
|
||||
hud_possible = list(SPECIALROLE_HUD)
|
||||
|
||||
var/research_scanner = 0 //For research scanner equipped mobs. Enable to show research data when examining.
|
||||
var/datum/action/scan_mode/scanner = new
|
||||
|
||||
var/list/grabbed_by = list( )
|
||||
var/list/requests = list( )
|
||||
var/list/grabbed_by = list()
|
||||
var/list/requests = list()
|
||||
|
||||
var/list/mapobjs = list()
|
||||
|
||||
@@ -136,19 +125,10 @@
|
||||
|
||||
var/emote_cd = 0 // Used to supress emote spamming. 1 if on CD, 2 if disabled by admin (manually set), else 0
|
||||
|
||||
var/music_lastplayed = "null"
|
||||
|
||||
var/job = null//Living
|
||||
|
||||
var/cultslurring = 0
|
||||
|
||||
var/const/blindness = 1//Carbon
|
||||
var/const/deafness = 2//Carbon
|
||||
var/const/muteness = 4//Carbon
|
||||
|
||||
|
||||
var/datum/dna/dna = null//Carbon
|
||||
var/radiation = 0.0//Carbon
|
||||
var/radiation = 0 //Carbon
|
||||
|
||||
var/list/mutations = list() //Carbon -- Doohl
|
||||
//see: setup.dm for list of mutations
|
||||
@@ -161,24 +141,24 @@
|
||||
|
||||
var/has_enabled_antagHUD = 0
|
||||
var/antagHUD = 0
|
||||
//Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed.
|
||||
var/proc_holder_list[] = list()//Right now unused.
|
||||
//Also unlike the spell list, this would only store the object in contents, not an object in itself.
|
||||
|
||||
/* Add this line to whatever stat module you need in order to use the proc holder list.
|
||||
//Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed.
|
||||
var/proc_holder_list[] = list()
|
||||
|
||||
/* //Also unlike the spell list, this would only store the object in contents, not an object in itself.
|
||||
|
||||
Add this line to whatever stat module you need in order to use the proc holder list.
|
||||
Unlike the object spell system, it's also possible to attach verb procs from these objects to right-click menus.
|
||||
This requires creating a verb for the object proc holder.
|
||||
|
||||
if (proc_holder_list.len)//Generic list for proc_holder objects.
|
||||
if(proc_holder_list.len)//Generic list for proc_holder objects.
|
||||
for(var/obj/effect/proc_holder/P in proc_holder_list)
|
||||
statpanel("[P.panel]","",P)
|
||||
*/
|
||||
statpanel("[P.panel]","",P)*/
|
||||
|
||||
//The last mob/living/carbon to push/drag/grab this mob (mostly used by slimes friend recognition)
|
||||
var/mob/living/carbon/LAssailant = null
|
||||
|
||||
//Wizard mode, but can be used in other modes thanks to the brand new "Give Spell" badmin button
|
||||
var/obj/effect/proc_holder/spell/list/spell_list = list()
|
||||
var/list/mob_spell_list = list() //construct spells and mime spells. Spells that do not transfer from one mob to another and can not be lost in mindswap.
|
||||
|
||||
//Changlings, but can be used in other modes
|
||||
// var/obj/effect/proc_holder/changpower/list/power_list = list()
|
||||
@@ -199,9 +179,6 @@
|
||||
|
||||
var/has_unlimited_silicon_privilege = 0 // Can they interact with station electronics
|
||||
|
||||
var/list/radar_blips = list() // list of screen objects, radar blips
|
||||
var/radar_open = 0 // nonzero is radar is open
|
||||
|
||||
var/atom/movable/remote_control //Calls relaymove() to whatever it is
|
||||
|
||||
var/remote_view = 0 // Set to 1 to prevent view resets on Life
|
||||
@@ -223,11 +200,11 @@
|
||||
var/turf/listed_turf = null //the current turf being examined in the stat panel
|
||||
var/list/shouldnt_see = list(/atom/movable/lighting_overlay) //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes
|
||||
|
||||
var/kills=0
|
||||
var/kills = 0
|
||||
|
||||
var/stance_damage = 0 //Whether this mob's ability to stand has been affected
|
||||
|
||||
var/list/active_genes=list()
|
||||
var/list/active_genes = list()
|
||||
|
||||
var/last_movement = -100 // Last world.time the mob actually moved of its own accord.
|
||||
|
||||
@@ -237,4 +214,4 @@
|
||||
|
||||
var/list/permanent_huds = list()
|
||||
|
||||
var/datum/emoteHandler/emoteHandler
|
||||
var/list/actions = list()
|
||||
@@ -29,6 +29,26 @@ mob/spirit/proc/Spirit_Move(direct)
|
||||
// if we're trying to move, we want to stop following our target
|
||||
follow_target = null
|
||||
|
||||
|
||||
/mob/spirit/proc/follow_cultist(mob/living/target as mob)
|
||||
if(!istype(target)) return
|
||||
var/obj/cult_viewpoint/currentView = getCultViewpoint(target)
|
||||
var/mob/spirit/U = usr
|
||||
|
||||
if(!currentView)
|
||||
to_chat(U, "As a spirit, you may only track cultists.")
|
||||
|
||||
U.follow_target = target
|
||||
to_chat(U, "Now following [currentView.get_cult_name()].")
|
||||
|
||||
spawn (0)
|
||||
while(U.follow_target == target)
|
||||
if(U.follow_target == null)
|
||||
return
|
||||
U.setLoc(get_turf(target))
|
||||
sleep(10)
|
||||
|
||||
|
||||
mob/spirit/setLoc(var/T)
|
||||
T = get_turf(T)
|
||||
loc = T
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/AIize(move=1) // 'move' argument needs defining here too because BYOND is dumb
|
||||
if (notransform)
|
||||
if(notransform)
|
||||
return
|
||||
for(var/t in organs)
|
||||
qdel(t)
|
||||
@@ -16,7 +16,7 @@
|
||||
return ..(move)
|
||||
|
||||
/mob/living/carbon/AIize()
|
||||
if (notransform)
|
||||
if(notransform)
|
||||
return
|
||||
for(var/obj/item/W in src)
|
||||
unEquip(W)
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
/mob/proc/AIize()
|
||||
if(client)
|
||||
to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// stop the jams for AIs
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// stop the jams for AIs
|
||||
|
||||
var/mob/living/silicon/ai/O = new (loc,,,1)//No MMI but safety is in effect.
|
||||
O.invisibility = 0
|
||||
@@ -42,21 +42,21 @@
|
||||
|
||||
var/obj/loc_landmark
|
||||
for(var/obj/effect/landmark/start/sloc in landmarks_list)
|
||||
if (sloc.name != "AI")
|
||||
if(sloc.name != "AI")
|
||||
continue
|
||||
if (locate(/mob/living) in sloc.loc)
|
||||
if(locate(/mob/living) in sloc.loc)
|
||||
continue
|
||||
loc_landmark = sloc
|
||||
if (!loc_landmark)
|
||||
if(!loc_landmark)
|
||||
for(var/obj/effect/landmark/tripai in landmarks_list)
|
||||
if (tripai.name == "tripai")
|
||||
if(tripai.name == "tripai")
|
||||
if(locate(/mob/living) in tripai.loc)
|
||||
continue
|
||||
loc_landmark = tripai
|
||||
if (!loc_landmark)
|
||||
if(!loc_landmark)
|
||||
to_chat(O, "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone.")
|
||||
for(var/obj/effect/landmark/start/sloc in landmarks_list)
|
||||
if (sloc.name == "AI")
|
||||
if(sloc.name == "AI")
|
||||
loc_landmark = sloc
|
||||
|
||||
O.loc = loc_landmark.loc
|
||||
@@ -70,10 +70,61 @@
|
||||
qdel(src)
|
||||
return O
|
||||
|
||||
/mob/living/carbon/human/make_into_mask(var/should_gib = 0)
|
||||
for(var/t in organs)
|
||||
qdel(t)
|
||||
return ..(should_gib)
|
||||
|
||||
|
||||
/mob/proc/make_into_mask(var/should_gib = 0, var/should_remove_items = 0)
|
||||
|
||||
if(!should_gib)
|
||||
icon = null
|
||||
invisibility = 101
|
||||
|
||||
if(!should_remove_items)
|
||||
for(var/obj/item/W in src)
|
||||
unEquip(W)
|
||||
|
||||
var/mob/spirit/mask/new_spirit = new()
|
||||
|
||||
if(mind)
|
||||
new_spirit.mind = mind
|
||||
new_spirit.mind.assigned_role = "Mask"
|
||||
new_spirit.mind.original = new_spirit
|
||||
|
||||
new_spirit.key = key
|
||||
new_spirit.loc=loc
|
||||
|
||||
if(should_gib)
|
||||
spawn(0)
|
||||
src.gib() // gib the body
|
||||
else
|
||||
spawn(0)//To prevent the proc from returning null.
|
||||
src.visible_message( \
|
||||
"[src] disappears into the shadows, never to be seen again.", \
|
||||
"You disappear into the shadows, never to be seen again.", \
|
||||
"You hear strange noise, you can't quite place it.")
|
||||
qdel(src)
|
||||
|
||||
to_chat(new_spirit, "<font color=\"purple\"><b><i>You are a Mask of Nar'sie now. You are a tiny fragment of the unknowable entity that is the god.</b></i></font>")
|
||||
to_chat(new_spirit, "<font color=\"purple\"><b><i>Your job is to help your acolytes complete their goals. Be spooky. Do evil.</b></i></font>")
|
||||
|
||||
new_spirit.set_name()
|
||||
|
||||
// let spirits identify cultists
|
||||
if(ticker.mode)
|
||||
ticker.mode.add_cult_icon_to_spirit(new_spirit)
|
||||
|
||||
// highlander test
|
||||
there_can_be_only_one_mask(new_spirit)
|
||||
|
||||
return new_spirit
|
||||
|
||||
|
||||
//human -> robot
|
||||
/mob/living/carbon/human/proc/Robotize()
|
||||
if (notransform)
|
||||
if(notransform)
|
||||
return
|
||||
for(var/obj/item/W in src)
|
||||
unEquip(W)
|
||||
@@ -133,7 +184,7 @@
|
||||
|
||||
//human -> alien
|
||||
/mob/living/carbon/human/proc/Alienize()
|
||||
if (notransform)
|
||||
if(notransform)
|
||||
return
|
||||
for(var/obj/item/W in src)
|
||||
unEquip(W)
|
||||
@@ -165,7 +216,7 @@
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/slimeize(adult as num, reproduce as num)
|
||||
if (notransform)
|
||||
if(notransform)
|
||||
return
|
||||
for(var/obj/item/W in src)
|
||||
unEquip(W)
|
||||
@@ -201,7 +252,7 @@
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/corgize()
|
||||
if (notransform)
|
||||
if(notransform)
|
||||
return
|
||||
for(var/obj/item/W in src)
|
||||
unEquip(W)
|
||||
|
||||
@@ -24,15 +24,13 @@
|
||||
|
||||
/obj/singularity/narsie/large/New()
|
||||
..()
|
||||
icon_state = ticker.mode.cultdat.entity_icon_state
|
||||
name = ticker.mode.cultdat.entity_name
|
||||
to_chat(world, "<font size='15' color='red'><b>[uppertext(ticker.mode.cultdat.entity_name)] HAS RISEN</b></font>")
|
||||
to_chat(world, pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg')))
|
||||
to_chat(world, "<font size='15' color='red'><b>NAR-SIE HAS RISEN</b></font>")
|
||||
world << pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg'))
|
||||
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
var/image/alert_overlay = image('icons/effects/effects.dmi', "ghostalertsie")
|
||||
notify_ghosts("[ticker.mode.cultdat.entity_name] has risen in \the [A.name]. Reach out to [ticker.mode.cultdat.entity_title3] to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, attack_not_jump = 1)
|
||||
notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, attack_not_jump = 1)
|
||||
|
||||
narsie_spawn_animation()
|
||||
|
||||
@@ -40,7 +38,7 @@
|
||||
shuttle_master.emergency.request(null, 0.3) // Cannot recall
|
||||
|
||||
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
|
||||
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, user, null, 0)//narsie ghosts are not culted to avoid scorboard spam
|
||||
makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1)
|
||||
new /obj/effect/effect/sleep_smoke(user.loc)
|
||||
|
||||
|
||||
@@ -123,12 +121,12 @@
|
||||
|
||||
|
||||
/obj/singularity/narsie/proc/acquire(var/mob/food)
|
||||
to_chat(target, "<span class='cultlarge'>[uppertext(ticker.mode.cultdat.entity_name)] HAS LOST INTEREST IN YOU</span>")
|
||||
to_chat(target, "<span class='notice'>NAR-SIE HAS LOST INTEREST IN YOU</span>")
|
||||
target = food
|
||||
if(ishuman(target))
|
||||
to_chat(target, "<span class ='cultlarge'>[uppertext(ticker.mode.cultdat.entity_name)] HUNGERS FOR YOUR SOUL</span>")
|
||||
to_chat(target, "<span class ='userdanger'>NAR-SIE HUNGERS FOR YOUR SOUL</span>")
|
||||
else
|
||||
to_chat(target, "<span class ='cultlarge'>[uppertext(ticker.mode.cultdat.entity_name)] HAS CHOSEN YOU TO LEAD HER TO HER NEXT MEAL</span>")
|
||||
to_chat(target, "<span class ='userdanger'>NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL</span>")
|
||||
|
||||
//Wizard narsie
|
||||
/obj/singularity/narsie/wizard
|
||||
|
||||
|
Before Width: | Height: | Size: 353 KiB After Width: | Height: | Size: 325 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 462 KiB After Width: | Height: | Size: 467 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 153 KiB |