Merge pull request #15788 from Shadowlight213/Oldcultredo

Remake of #15690. Replaces newcult with oldcult.
This commit is contained in:
Cheridan
2016-03-01 22:37:58 -06:00
15 changed files with 652 additions and 428 deletions
+33 -8
View File
@@ -47,6 +47,7 @@
var/list/datum/objective/objectives = list()
var/list/datum/objective/special_verbs = list()
var/list/cult_words = list()
var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button.
var/datum/faction/faction //associated faction
@@ -145,7 +146,12 @@
if(src in ticker.mode.cult)
ticker.mode.cult -= src
ticker.mode.update_cult_icons_removed(src)
var/datum/game_mode/cult/cult = ticker.mode
if(istype(cult))
cult.memorize_cult_objectives(src)
special_role = null
remove_objectives()
remove_antag_equip()
/datum/mind/proc/remove_rev()
if(src in ticker.mode.revolutionaries)
@@ -319,8 +325,11 @@
text = "<i><b>[text]</b></i>: "
if (src in ticker.mode.cult)
text += "loyal|<a href='?src=\ref[src];cult=clear'>employee</a>|<b>CULTIST</b>"
text += "<br><a href='?src=\ref[src];cult=equip'>Equip</a>"
text += "<br>Give <a href='?src=\ref[src];cult=tome'>tome</a>|<a href='?src=\ref[src];cult=amulet'>amulet</a>."
/*
if (objectives.len==0)
text += "<br>Objectives are empty! Set to sacrifice and <a href='?src=\ref[src];cult=escape'>escape</a> or <a href='?src=\ref[src];cult=summon'>summon</a>."
*/
else if(isloyal(current))
text += "<b>LOYAL</b>|employee|<a href='?src=\ref[src];cult=cultist'>cultist</a>"
else
@@ -973,9 +982,14 @@
ticker.mode.add_cultist(src)
message_admins("[key_name_admin(usr)] has cult'ed [current].")
log_admin("[key_name(usr)] has cult'ed [current].")
if("equip")
if("tome")
if (!ticker.mode.equip_cultist(current,1))
usr << "<span class='danger'>Spawning tome failed!</span>"
if("amulet")
if (!ticker.mode.equip_cultist(current))
usr << "<span class='danger'>equip_cultist() failed! [current]'s starting equipment will be incomplete.</span>"
usr << "<span class='danger'>Spawning amulet failed!</span>"
else if (href_list["wizard"])
switch(href_list["wizard"])
@@ -1344,8 +1358,20 @@
special_role = "Cultist"
current << "<font color=\"purple\"><b><i>You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie.</b></i></font>"
current << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
current << "Your objective is to summon Nar-Sie by building and defending a suitable shell for the Geometer. Adequate supplies can be procured through human sacrifices."
ticker.mode.equip_cultist(current)
var/datum/game_mode/cult/cult = ticker.mode
if (istype(cult))
cult.memorize_cult_objectives(src)
else
var/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."
current << "<B>Objective #1</B>: [explanation]"
current.memory += "<B>Objective #1</B>: [explanation]<BR>"
current << "The convert rune is join blood self"
current.memory += "The convert rune is join blood self<BR>"
var/mob/living/carbon/human/H = current
if (!ticker.mode.equip_cultist(current))
H << "Spawning an amulet from your Master failed."
/datum/mind/proc/make_Rev()
if (ticker.mode.head_revolutionaries.len>0)
@@ -1683,5 +1709,4 @@
/mob/living/simple_animal/hostile/construct/mind_initialize()
..()
mind.assigned_role = "[initial(name)]"
mind.special_role = "Cultist"
mind.special_role = "Cultist"
+158 -35
View File
@@ -2,11 +2,28 @@
/datum/game_mode
var/list/datum/mind/cult = list()
var/list/cult_objectives = list()
/proc/iscultist(mob/living/M)
return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult)
/proc/cultist_commune(mob/living/user, say = 0, message)
/proc/is_sacrifice_target(datum/mind/mind)
if(ticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = ticker.mode
if(mind == cult_mode.sacrifice_target)
return 1
return 0
/proc/is_convertable_to_cult(datum/mind/mind)
if(!istype(mind)) return 0
if(istype(mind.current, /mob/living/carbon/human) && (mind.assigned_role in list("Captain", "Chaplain"))) return 0
if(isloyal(mind.current))
return 0
if (ticker.mode.name == "cult") //redundant?
if(is_sacrifice_target(mind)) return 0
return 1
/proc/cultist_commune(mob/living/user, clear = 0, say = 0, message)
if(!message)
return
if(say)
@@ -20,12 +37,18 @@
user.say(message)
else
user.whisper(message)
var/my_message = "<span class='cultitalic'><b>[(ishuman(user) ? "Acolyte" : "Construct")] [user]:</b> [message]</span>"
var/my_message = "Error, message null. You should probably report this."
for(var/mob/M in mob_list)
if(iscultist(M))
M << my_message
if(M in dead_mob_list)
M << "<a href='?src=\ref[M];follow=\ref[user]'>(F)</a> [my_message]"
if(iscultist(M) || (M in dead_mob_list))
if(clear || !ishuman(user))
my_message = "<span class='cultitalic'><b>[(ishuman(user) ? "Acolyte" : "Construct")] [user]:</b> [message]</span>"
else //Emergency comms
my_message = "<span class='purple'><i>Acolyte ???:</i> <b>[message]</b></span>"
if(M in dead_mob_list)
M << "<a href='?src=\ref[M];follow=\ref[user]'>(F)</a> [my_message]"
else
M << my_message
log_say("[user.real_name]/[user.key] : [message]")
@@ -36,22 +59,29 @@
antag_flag = ROLE_CULTIST
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
protected_jobs = list()
required_players = 10
required_enemies = 2
recommended_enemies = 2
required_players = 35
required_enemies = 4
recommended_enemies = 4
enemy_minimum_age = 14
var/eldergod = 0
var/orbs_needed = 3
var/obj/structure/constructshell/large/large_shell_reference = null
var/attempts_left = 3
var/finished = 0
var/eldergod = 1 //for the summon god objective
var/acolytes_needed = 10 //for the survive objective
var/acolytes_survived = 0
var/datum/mind/sacrifice_target = null//The target to be sacrificed
/datum/game_mode/cult/announce()
world << "<B>The current game mode is - Cult!</B>"
world << "<B>Some crewmembers are attempting to start a cult!<BR>\nCultists - summon the elder god. Sacrifice crewmembers and turn them into constructs. Remember - there is no you, there is only the cult.<BR>\nPersonnel - Do not let the cult succeed in its mission. Deal with the cultists and any constructs that they might summon.</B>"
world << "<B>Some crewmembers are attempting to start a cult!<BR>\nCultists - complete your objectives at all costs. Convert crewmembers to your cause by using the convert rune, or sacrifice them and turn them into constructs. Remember - there is no you, there is only the cult.<BR>\nPersonnel - Do not let the cult succeed in its mission. Forced consumption of holy water will convert a cultist back to a Nanotrasen-sanctioned faith.</B>"
/datum/game_mode/cult/pre_setup()
cult_objectives += "sacrifice"
cult_objectives += "eldergod"
if(config.protect_roles_from_antagonist)
restricted_jobs += protected_jobs
@@ -59,8 +89,8 @@
restricted_jobs += "Assistant"
//cult scaling goes here
recommended_enemies = 1 + round(num_players()/8)
orbs_needed = recommended_enemies
recommended_enemies = 3 + round(num_players()/30)
for(var/cultists_number = 1 to recommended_enemies)
if(!antag_candidates.len)
@@ -75,20 +105,43 @@
return (cult.len>=required_enemies)
/datum/game_mode/cult/proc/memorize_cult_objectives(datum/mind/cult_mind)
for(var/obj_count = 1,obj_count <= cult_objectives.len,obj_count++)
var/explanation
switch(cult_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("sacrifice")
if(sacrifice_target)
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. You will need the Sacrifice rune and three acolytes to do so."
else
explanation = "Free objective."
if("eldergod")
explanation = "Summon Nar-Sie via the rune 'Call Forth The Geometer'. It will only work if nine acolytes stand on and around it."
cult_mind.current << "<B>Objective #[obj_count]</B>: [explanation]"
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
/datum/game_mode/cult/post_setup()
modePlayer += cult
if("sacrifice" in cult_objectives)
var/list/possible_targets = get_unconvertables()
if(!possible_targets.len)
message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.")
for(var/mob/living/carbon/human/player in player_list)
if(player.mind && !(player.mind in cult))
possible_targets += player.mind
if(possible_targets.len > 0)
sacrifice_target = pick(possible_targets)
if(!sacrifice_target)
message_admins("Cult Sacrifice: ERROR - Null target chosen!")
else
message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!")
for(var/datum/mind/cult_mind in cult)
equip_cultist(cult_mind.current)
update_cult_icons_added(cult_mind)
cult_mind.current << "<span class='userdanger'>You are a member of the cult!</span>"
memorize_cult_objectives(cult_mind)
..()
/datum/game_mode/cult/proc/memorize_cult_objectives(datum/mind/cult_mind)
cult_mind.current << "Your objective is to summon Nar-Sie by building and defending a suitable shell for the Geometer. Adequate supplies can be procured through human sacrifices."
/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob)
/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob,tome = 0)
if(!istype(mob))
return
mob.cult_add_comm()
@@ -97,9 +150,10 @@
mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
mob.dna.remove_mutation(CLOWNMUT)
. += cult_give_item(/obj/item/weapon/tome, mob)
. += cult_give_item(/obj/item/weapon/paper/talisman/supply, mob)
. += cult_give_item(/obj/item/weapon/melee/cultblade/dagger, mob)
if(tome)
. += cult_give_item(/obj/item/weapon/tome, mob)
else
. += cult_give_item(/obj/item/weapon/paper/talisman/supply, mob)
mob << "These will help you start the cult on this station. Use them well, and remember - you are not the only one.</span>"
/datum/game_mode/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
@@ -110,6 +164,7 @@
"left hand" = slot_l_hand,
"right hand" = slot_r_hand,
)
var/T = new item_path(mob)
var/item_name = initial(item_path.name)
var/where = mob.equip_in_one_of_slots(T, slots)
@@ -126,14 +181,15 @@
return 1
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE
if (!istype(cult_mind) || (cult_mind in cult))
if (!istype(cult_mind))
return 0
cult_mind.current.Paralyse(5)
cult += cult_mind
cult_mind.current.faction |= "cult"
cult_mind.current.cult_add_comm()
update_cult_icons_added(cult_mind)
cult_mind.current.attack_log += "\[[time_stamp()]\] <span class='danger'>Has been converted to the cult!</span>"
if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind))
cult_mind.current.Paralyse(5)
cult += cult_mind
cult_mind.current.faction |= "cult"
cult_mind.current.cult_add_comm()
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, ROLE_CULTIST)
return 1
@@ -168,14 +224,81 @@
var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT]
culthud.leave_hud(cult_mind.current)
set_antag_hud(cult_mind.current, null)
/datum/game_mode/cult/proc/get_unconvertables()
var/list/ucs = list()
for(var/mob/living/carbon/human/player in player_list)
if(player.mind && !is_convertable_to_cult(player.mind))
ucs += player.mind
return ucs
/datum/game_mode/cult/proc/check_cult_victory()
var/cult_fail = 0
if(cult_objectives.Find("survive"))
cult_fail += check_survive() //the proc returns 1 if there are not enough cultists on the shuttle, 0 otherwise
if(cult_objectives.Find("eldergod"))
cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once
if(cult_objectives.Find("sacrifice"))
if(sacrifice_target && !sacrificed.Find(sacrifice_target)) //if the target has been sacrificed, ignore this step. otherwise, add 1 to cult_fail
cult_fail++
return cult_fail //if any objectives aren't met, failure
/datum/game_mode/cult/proc/check_survive()
var/acolytes_survived = 0
for(var/datum/mind/cult_mind in cult)
if (cult_mind.current && cult_mind.current.stat != DEAD)
if(cult_mind.current.onCentcom() || cult_mind.current.onSyndieBase())
acolytes_survived++
if(acolytes_survived>=acolytes_needed)
return 0
else
return 1
/datum/game_mode/cult/declare_completion()
if(eldergod)
if(!check_cult_victory())
feedback_set_details("round_end_result","win - cult win")
world << "<span class='greentext'>The cult wins! It has succeeded in serving its dark master!</span>"
feedback_set("round_end_result",acolytes_survived)
world << "<span class='greentext'>The cult has succeeded! Nar-sie has snuffed out another torch in the void!</span>"
else
feedback_set_details("round_end_result","loss - staff stopped the cult")
world << "<span class='redtext'>The staff managed to stop the cult!</span>"
feedback_set("round_end_result",acolytes_survived)
world << "<span class='redtext'>The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!</span>"
var/text = ""
if(cult_objectives.len)
text += "<br><b>The cultists' objectives were:</b>"
for(var/obj_count=1, obj_count <= cult_objectives.len, obj_count++)
var/explanation
switch(cult_objectives[obj_count])
if("survive")
if(!check_survive())
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <span class='greenannounce'>Success!</span>"
feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
else
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <span class='boldannounce'>Fail.</span>"
feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]")
if("sacrifice")
if(sacrifice_target)
if(sacrifice_target in sacrificed)
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <span class='greenannounce'>Success!</span>"
feedback_add_details("cult_objective","cult_sacrifice|SUCCESS")
else if(sacrifice_target && sacrifice_target.current)
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <span class='boldannounce'>Fail.</span>"
feedback_add_details("cult_objective","cult_sacrifice|FAIL")
else
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <span class='boldannounce'>Fail (Gibbed).</span>"
feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED")
if("eldergod")
if(!eldergod)
explanation = "Summon Nar-Sie. <span class='greenannounce'>Success!</span>"
feedback_add_details("cult_objective","cult_narsie|SUCCESS")
else
explanation = "Summon Nar-Sie. <span class='boldannounce'>Fail.</span>"
feedback_add_details("cult_objective","cult_narsie|FAIL")
text += "<br><B>Objective #[obj_count]</B>: [explanation]"
world << text
..()
return 1
+1 -65
View File
@@ -9,7 +9,7 @@
force = 30
throwforce = 10
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
@@ -124,67 +124,3 @@
w_class = 3
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/internals/)
armor = list(melee = 70, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
/obj/item/summoning_orb
name = "summoning orb"
desc = "A mysterious orb that glows eerily. <span class='cult'>You could swear that it just moved on its own.</span>"
icon = 'icons/obj/cult.dmi'
icon_state = "summoning_orb"
w_class = 1
/obj/item/summoning_orb/afterattack(atom/target, mob/user, proximity_flag)
if(!iscultist(user))
return ..()
if(proximity_flag && isliving(target) && iscultist(target))
var/mob/living/L = target
if(L.stat == DEAD)
user << "<span class='cultlarge'>You shouldn't waste that.</span>"
return ..()
target << "<span class='cult'>You feel the Geometer's essence violating your insides.</span>"
target << "<span class='cult'>It feels... </span><span class='cultitalic'>good.</span>"
target.reagents.add_reagent("unholywater", 15)
qdel(src)
..()
/obj/item/summoning_orb/attack_self(mob/user)
if(!iscultist(user))
return ..()
if(ticker.mode.name != "cult")
return
var/turf/T = get_turf(user)
if(T.z != ZLEVEL_STATION)
user << "<span class='cultlarge'>You shouldn't do this here. Go back.</span>"
return
var/datum/game_mode/cult/cult = ticker.mode
if(!cult.attempts_left)
user << "<span class='notice'>You attempt to call out to the Geometer, but there is no answer...</span>"
return
if(cult.eldergod)
user << "<span class='cultlarge>The Geometer is already among us.</span>"
return
if(cult.large_shell_reference)
var/obj/S = cult.large_shell_reference
if(S.anchored)
var/area/A = get_area(S)
user << "<span class='cult'>The Geometer has already started manifesting in [initial(A.name)]. You can no longer move Her shell.</span>"
return
switch(alert(user,"The Geometer's shell has already been manifested. Do you wish to summon it to your location?","Summoning Large Shell","Yes","No"))
if("Yes")
S.visible_message("<span class='cultlarge'>The shell suddenly vanishes.</span>")
S.loc = user.loc
else
switch(alert(user,"Are you sure you wish to summon the large construct shell? [cult.attempts_left] attempts left!","Summoning Large Shell","Yes","No"))
if("Yes")
cult.attempts_left--
place_down_large_shell(user)
qdel(src)
/obj/item/summoning_orb/proc/place_down_large_shell(mob/user)
if(!(ticker.mode.name == "cult"))
user << "<span class='notice'>You attempt to call out to the Geometer for Her shell, but you fail...</span>"
return
var/datum/game_mode/cult/cult = ticker.mode
if(cult.attempts_left <= 0)
user << "<span class='cultlarge'>The Geometer is no longer interested in you.</span>"
var/A = new /obj/structure/constructshell/large(get_turf(src))
cult.large_shell_reference = A
-169
View File
@@ -1,172 +1,3 @@
/obj/structure/constructshell/large
name = "large empty shell"
icon = 'icons/obj/cult_large.dmi'
icon_state = "shell_narsie_grey"
desc = "An oversized construct shell, fit for an elder god. Only a lunatic would even dream of such a crazed contraption."
pixel_x = -16
pixel_y = -16
density = 1
layer = 4.5
anchored = 0
var/maxhealth = 200
var/health = 200
var/image/black_overlay = null
var/orbs = 0
var/orbs_needed = 1
var/time_to_win = 1800 //3 minutes
var/timer_id = null
/obj/structure/constructshell/large/New()
..()
if(ticker.mode.name == "cult")
var/datum/game_mode/cult/cult = ticker.mode
orbs_needed = cult.orbs_needed
if(cult.eldergod || (cult.large_shell_reference && cult.large_shell_reference != src))
qdel(src)
return
else
qdel(src)
return
black_overlay = image('icons/obj/cult_large.dmi', "shell_narsie_black")
SSshuttle.emergencyNoEscape = 1
/obj/structure/constructshell/large/Destroy()
var/go_to_red = 1
if(ticker.mode.name == "cult")
var/datum/game_mode/cult/cult = ticker.mode
cult.large_shell_reference = null
if(cult.eldergod)
go_to_red = 0
black_overlay = null
if(timer_id)
deltimer(timer_id)
if(go_to_red)
priority_announce("The extra-dimensional flow has ceased. All personnel should return to their routine activities.","Central Command Higher Dimensions Affairs")
if(get_security_level() == "delta")
set_security_level("red")
SSshuttle.emergencyNoEscape = 0
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
SSshuttle.emergency.mode = SHUTTLE_DOCKED
SSshuttle.emergency.timer = world.time
..()
/obj/structure/constructshell/large/examine(mob/user)
..()
user << "<span class='cult'>You see a number of round holes on the surface of the shell. They number [orbs_needed], and [orbs ? orbs : "none"] of them [orbs > 1 ? "are" : "is"] filled.</span>"
/obj/structure/constructshell/large/update_icon()
var/new_alpha = round((orbs/orbs_needed)*255)
if(new_alpha)
overlays -= black_overlay
black_overlay.alpha = new_alpha
overlays += black_overlay
/obj/structure/constructshell/large/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/summoning_orb) && (orbs < orbs_needed))
if(!iscultist(user))
return
var/turf/T = get_turf(user)
if(T.z != ZLEVEL_STATION)
user << "<span class='cultlarge'>You shouldn't do this here. Go back.</span>"
return
visible_message("<span class='cult'>\The [src] glows.</span>")
orbs++
qdel(O)
update_icon()
if(orbs >= orbs_needed)
start_takeover()
return
if( (O.flags&NOBLUDGEON) || !O.force )
return
add_fingerprint(user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
visible_message("<span class='danger'>[user] has hit \the [src] with [O].</span>")
if(O.damtype == BURN || O.damtype == BRUTE)
damaged(O.force)
//this stuff is mostly copy-pasted from gang dominators, with some changes
/obj/structure/constructshell/large/proc/start_takeover()
anchored = 1
overlays -= black_overlay
icon_state = "shell_narsie_active"
flick("shell_narsie_activation", src)
set_security_level("delta")
var/area/A = get_area(src)
var/locname = initial(A.name)
priority_announce("Figments from an eldritch god have begun pouring into [locname] from an unknown dimension. Eliminate its vessel before it reaches a critical point.","Central Command Higher Dimensions Affairs")
timer_id = addtimer(src, "summon_narnar", time_to_win)
/obj/structure/constructshell/large/proc/damaged(damage)
health -= damage
if(health <= 0)
new /obj/item/stack/sheet/plasteel(get_turf(src))
qdel(src)
/obj/structure/constructshell/large/bullet_act(obj/item/projectile/P)
if(P.damage)
playsound(src, 'sound/effects/bang.ogg', 50, 1)
visible_message("<span class='danger'>[src] was hit by [P].</span>")
damaged(P.damage)
/obj/structure/constructshell/large/attack_alien(mob/living/user)
user.do_attack_animation(src)
playsound(src, 'sound/effects/bang.ogg', 50, 1)
user.visible_message("<span class='danger'>[user] smashes against [src] with its claws.</span>",\
"<span class='danger'>You smash against [src] with your claws.</span>")
damaged(15)
/obj/structure/constructshell/large/attack_animal(mob/living/user)
if(!isanimal(user))
return
var/mob/living/simple_animal/M = user
M.do_attack_animation(src)
if(M.melee_damage_upper <= 0)
return
damaged(M.melee_damage_upper)
/obj/structure/constructshell/large/mech_melee_attack(obj/mecha/M)
if(M.damtype == "brute")
playsound(src, 'sound/effects/bang.ogg', 50, 1)
visible_message("<span class='danger'>[M.name] has hit [src].</span>")
damaged(M.force)
/obj/structure/constructshell/large/attack_hulk(mob/user)
playsound(src, 'sound/effects/bang.ogg', 50, 1)
user.visible_message("<span class='danger'>[user] smashes [src].</span>",\
"<span class='danger'>You punch [src].</span>")
damaged(5)
/obj/structure/constructshell/large/ex_act()
return //nope
/obj/structure/constructshell/large/singularity_pull()
return //nope
/obj/structure/constructshell/large/singularity_act(current_size, obj/singularity/S)
var/atom/target = get_edge_target_turf(src, get_dir(src, S))
S.throw_at(target, 5, 1) //aaand nope
/obj/structure/constructshell/large/proc/summon_narnar()
if(ticker.mode.name != "cult")
visible_message("<span class='warning'>\The [src] glows brightly once, then falls dark. It looks strangely dull and lifeless...</span>")
log_game("Summon Nar-Sie rune failed - gametype is not cult")
return
var/datum/game_mode/cult/cult_mode = ticker.mode
if(cult_mode.eldergod)
return //this should never happen, so we don't need any special fluff
world << 'sound/effects/dimensional_rend.ogg'
world << "<span class='cultitalic'><b>Rip... <span class='big'>Rrrip...</span> <span class='reallybig'>RRRRRRRRRR--</span></b></span>"
var/turf/target_turf = get_turf(src)
spawn(40)
new /obj/singularity/narsie/large(target_turf) //Causes Nar-Sie to spawn even if the rune has been removed
cult_mode.eldergod = 1
if(src)
qdel(src)
/obj/structure/cult
density = 1
anchored = 1
+65 -22
View File
@@ -9,7 +9,7 @@ This file contains the arcane tome files as well as innate cultist emergency com
/mob/living/proc/cult_innate_comm()
set category = "Cultist"
set name = "Communion"
set name = "Imperfect Communion"
if(!iscultist(usr) || usr.incapacitated())
return
@@ -21,7 +21,24 @@ This file contains the arcane tome files as well as innate cultist emergency com
if(!iscultist(usr) || usr.incapacitated())
return //we do this again because input() sleeps
cultist_commune(usr, 0, input)
if(ishuman(usr) || ismonkey(usr)) //Damage only applies to humans and monkeys, to allow constructs to communicate
usr.visible_message("<span class='warning'>[usr] starts clawing at \his arms with \his fingernails!</span>", "<span class='cultitalic'>You begin slicing open your arms with your fingernails!</span>")
apply_damage(10,BRUTE, "l_arm")
apply_damage(10,BRUTE, "r_arm")
sleep(50)
if(usr.incapacitated())
return //Hard to drawn intrinsic symbols when you're bleeding out in your cell.
var/turf/location = loc
if(istype(location, /turf/simulated)) // tearing your arms apart is going to spill a bit of blood, in fact thats the idea
location.add_blood(usr) // TO-DO change this to a badly drawn rune
apply_damage(10,BRUTE, "l_arm") // does a metric fuck ton of damage because this meant to be an emergency method of communication.
apply_damage(10,BRUTE, "r_arm")
if(usr.incapacitated())
return
usr.visible_message("<span class='warning'>[usr] paints strange symbols with their own blood.</span>", "<span class='cultitalic'>You paint a messy rune with your own blood.</span>")
sleep(20)
cultist_commune(usr, 0, 1, input)
return
@@ -32,13 +49,6 @@ This file contains the arcane tome files as well as innate cultist emergency com
throw_speed = 2
throw_range = 5
w_class = 2
var/list/known_runes = null
/obj/item/weapon/tome/New()
..()
known_runes = shuffle(subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
var/known_amount = round((known_runes.len)/2)
known_runes.Cut(known_amount)
/obj/item/weapon/tome/examine(mob/user)
..()
@@ -79,20 +89,25 @@ This file contains the arcane tome files as well as innate cultist emergency com
open_tome(user)
/obj/item/weapon/tome/proc/open_tome(mob/user)
var/choice = alert(user,"You open the tome...",,"Scribe Rune","Read Tome")
var/choice = alert(user,"You open the tome...",,"Commune","Scribe Rune","Read Tome")
switch(choice)
if("Read Tome")
read_tome(user)
if("Scribe Rune")
scribe_rune(user)
if("Commune")
var/input = stripped_input(usr, "Please enter a message to tell to the other acolytes.", "Voice of Blood", "")
if(!input)
return
cultist_commune(user, 1, 0, input)
/obj/item/weapon/tome/proc/read_tome(mob/user)
var/text = ""
text += "<center><font color='red' size=3><b><i>Archives of the Dark One</i></b></font></center><br><br><br>"
text += "As a member of the cult, your goals are almost or entirely impossible to complete without special aid from the Geometer's plane. The primary method of doing this are <b>runes</b>. These \
scribings, drawn in blood, are concentrated nodes of the magic within Nar-Sie's realm and will allow the performance of many tasks to aid you and the rest of the cult in your objectives. Runes \
have many different names, and almost all of them are known as Rites. Each follower of the Geometer is only able to use a subset of these, thus you must go forth and meet your fellow followers. \
A small description of each rune can be found below.<br><br>A rune's name and effects can be revealed by examining the rune. <br><br><br>"
have many different names, and almost all of them are known as Rites. The only rune that is not a Rite is the Ritual of Dimensional Rending, which can only be performed with nine cultists and calls \
forth the avatar of the Geometer herself (so long as she consents).<br><br>A rune's name and effects can be revealed by examining the rune. <br><br><br>"
text += "<font color='red'><b>Teleport</b></font><br>The Rite of Translocation is a unique rite in that it requires a keyword before the scribing can begin. When invoked, the rune will \
search for other Rites of Translocation with the same keyword. Assuming one is found, the user will be instantaneously transported to the location of the other rune. If more than two runes are scribed \
@@ -101,6 +116,13 @@ This file contains the arcane tome files as well as innate cultist emergency com
text += "<font color='red'><b>Teleport Other</b></font><br>The Rite of Forced Translocation, like the Rite of Translocation, works by teleporting the person on the rune to one of the \
same keyword. However, this rune will only work on people other than the user, allowing the user to send any living creature somewhere else.<br><br>"
text += "<font color='red'><b>Summon Tome</b></font><br>The Rite of Knowledge is a simplistic rune. When invoked, it will summon a single arcane tome to the rune's location before vanishing. \
<br><br>"
text += "<font color='red'><b>Convert</b></font><br>The Rite of Enlightment is paramount 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 acolytes to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \
be unable to be converted. People the Geometer wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.<br><br>"
text += "<font color='red'><b>Sacrifice</b></font><br>The Rite of Tribute is used to offer sacrifice to the Geometer. Simply place any living creature upon the rune and invoke it (this will not \
target cultists!). If this creature has a mind, a soul shard will be created and the creature's soul transported to it. This rune is required if the cult's objectives include the sacrifice of a crew \
member.<br><br>"
@@ -110,7 +132,14 @@ This file contains the arcane tome files as well as innate cultist emergency com
within a few seconds, they will be brought back to life, healed of all ailments.<br><br>"
text += "<font color='red'><b>Veil Runes</b></font><br>The Rite of Obscurity is a rite that will cause all nearby runes to become invisible. The runes will still be considered by other rites \
(such as the Rite of Translocation) but will be unusuable directly. Use the same rite once more to reveal these runes once more.<br><br>"
(such as the Rite of Translocation) but will be unusuable directly.(such as the Rite of Translocation) but will be unusuable directly. Use the same rite once more to reveal these runes once more.<br><br>"
text += "<font color='red'><b>Reveal Runes</b></font><br>The Rite of True Sight is the foil of the Rite of Obscurity. It will turn all invisible runes visible once more, in addition to causing \
all spirits nearby to become visible.<br><br>"
text += "<font color='red'><b>Disguise Runes</b></font><br>Many crewmen enjoy drawing runes in crayon that resemble spell circles in order to play pranks on their fellow crewmen. The Rite of \
False Truths takes advantage of this very joke. When invoked, all nearby runes will appear dull, precisely resembling those drawn in crayon. They still cannot be cleaned by conventional means, so \
anyone trying to clean up the rune may become suspicious as it does not respond.<br><br>"
text += "<font color='red'><b>Electromagnetic Disruption</b></font><br>Robotic lifeforms have time and time again been the downfall of fledgling cults. The Rite of Disruption 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.<br><br>"
@@ -127,8 +156,8 @@ This file contains the arcane tome files as well as innate cultist emergency com
text += "<font color='red'><b>Debilitate</b></font><br>The Rite of the Shadowed Mind is simple. When invoked, it will cause all non-cultists that can see its rune to become deaf, blind and mute for a \
considerable amount of time.<br><br>"
text += "<font color='red'><b>Stun</b></font><br>Though the Rite of Blazing Light is weak when invoked normally, merely disorienting and disabling nearby non-cultists, non-cultists that step on the rune \
will be stunned without expending its power. However, the disorientation caused by this rune is quite brief, and when invoked directly, it will not remain for further invocation.<br><br>"
text += "<font color='red'><b>Stun</b></font><br>Though the Rite of Blazing Light is weak when invoked normally, using it in conjuction with the Rite of Binding makes it much more powerful. \
This rune will cause any non-cultists that can see the rune to become disoriented, disabling them for a short time.<br><br>"
text += "<font color='red'><b>Summon Cultist</b></font><br>The Rite of Joined Souls requires two acolytes to use. When invoked, it will allow the user to summon a single cultist to the rune from \
any location. This will deal a moderate amount of damage to all invokers.<br><br>"
@@ -147,9 +176,6 @@ This file contains the arcane tome files as well as innate cultist emergency com
text += "<font color='red'><b>Blood Boil</b></font><br>The Rite of Boiling Blood may be considered one of the most dangerous rites composed by the cult of Nar-Sie. When invoked, it will do a \
massive amount of damage to all non-cultist viewers, but it will also emit an explosion upon invocation. Use with caution<br><br>"
text += "<font color='red'><b>Immolate</b></font><br>The Rite of the Cleansing Flame is a weaker offensive rite, fit to be used by a lone cultist. When its rune is invoked, it will set any non-cultists \
that can see it on fire. However, it will also burn its user.<br><br>"
text += "<font color='red'><b>Time Stop</b></font><br>The Rite of Dimensional Corruption is a versatile rite that can be very strong when protecting our cult from the enemies of the Geometer. \
As it is invoked, it will rend and reshape reality around itself, stopping time for all those who don't follow the teachings of the Geometer. However, it requires more than one ritual soul as a \
catalyst, and its power is bound to overflow and hurt its casters.<br><br>"
@@ -159,6 +185,10 @@ This file contains the arcane tome files as well as innate cultist emergency com
to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, the 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>"
text += "<font color='red'><b><i>Call Forth The Geometer</i></b></font><br>There is only one way to summon the avatar of Nar-Sie, and that is the Ritual of Dimensional Rending. This ritual, in \
comparison to other runes, is very large, requiring a 3x3 space of empty tiles to create. To invoke the rune, nine cultists must stand on the rune, so that all of them are within its circle. Then, \
simply invoke it. A brief tearing will be heard as the barrier between dimensions is torn open, and the avatar will come forth.<br><br><br>"
text += "While runes are excellent for many tasks, they lack portability. The advent of <b>talismans</b> has, to a degree, solved this inconvenience. Simply put, a talisman is a piece of paper with a \
rune inlaid within it. The words of the rune can be whispered in order to invoke its effects, although usually to a lesser extent. To create a talisman, simply use a Rite of Binding as described above. \
Unless stated otherwise, talismans are invoked by activating them in your hand. A list of valid rites, as well as the effects of their talisman form, can be found below.<br><br><br>"
@@ -166,11 +196,17 @@ This file contains the arcane tome files as well as innate cultist emergency com
text += "<font color='red'><b>Talisman of Teleportation</b></font><br>The talisman form of the Rite of Translocation will transport the invoker to a randomly chosen rune of the same keyword, then \
disappear.<br><br>"
text += "<font color='red'><b>Talismans of Veiling</b></font><br>This talisman functions identically to its rune counterpart.It will disappear after one use.<br><br>"
text += "<font color='red'><b>Talisman of Tome Summoning</b></font><br>This talisman functions nearly identically to the rune. The talisman will attempt to place the tome in your hand \
instead of on the ground, though this is the only advantage it has over the rune. It can be used once, then disappears.<br><br>"
text += "<font color='red'><b>Talismans of Veiling, Revealing, and Disguising</b></font><br>These talismans all function identically to their rune counterparts, but with less range. In addition, \
the Talisman of True Sight will not reveal spirits. They will disappear after one use.<br><br>"
text += "<font color='red'><b>Talisman of Electromagnetic Pulse</b></font><br>This talisman functions like the Rite of Disruption. It disappears after one use.<br><br>"
text += "<font color='red'><b>Talisman of Immolation</b></font><br>This talisman functions exactly like the Rite of Cleansing Flame. It can only be used once.<br><br>"
text += "<font color='red'><b>Talisman of Stunning</b></font><br>Without this talisman, the cult would have no way of easily acquiring targets to convert. Commonly called \"stunpapers\", this \
talisman functions differently from others. Rather than simply reading the words, the target must be attacked directly with the talisman. The talisman will then knock down the target for a long \
duration in addition to inhibiting their speech. Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead."
var/datum/browser/popup = new(user, "tome", "", 800, 600)
popup.set_content(text)
@@ -182,10 +218,10 @@ This file contains the arcane tome files as well as innate cultist emergency com
var/rune_to_scribe
var/entered_rune_name
var/list/possible_runes = list()
for(var/T in known_runes)
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 += 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
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
@@ -210,6 +246,13 @@ This file contains the arcane tome files as well as innate cultist emergency com
if(iscarbon(user))
var/mob/living/carbon/C = user
C.apply_damage(0.1, BRUTE, pick("l_arm", "r_arm"))
if("Call Forth The Geometer" == entered_rune_name)
C.apply_damage(40, BRUTE, pick("l_arm", "r_arm"))
var/area/A = get_area(src)
var/locname = initial(A.name)
priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual before it reaches a critical point.","Central Command Higher Dimensionsal Affairs")
if(!do_after(user, 500, target = get_turf(user)))
return
if(!do_after(user, 50, target = get_turf(user)))
return
user.visible_message("<span class='warning'>[user] creates a strange circle in their own blood.</span>", \
+201 -64
View File
@@ -1,3 +1,6 @@
/var/list/sacrificed = list()
var/list/non_revealed_runes = (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
/*
This file contains runes.
@@ -50,6 +53,7 @@ To draw a rune, use an arcane tome.
qdel(src)
return
else if(istype(I, /obj/item/weapon/nullrod))
user.say("BEGONE FOUL MAGIKS!!")
user << "<span class='danger'>You disrupt the magic of [src] with [I].</span>"
qdel(src)
return
@@ -259,6 +263,59 @@ var/list/teleport_other_runes = list()
"<span class='cult'>Your vision blurs, and you suddenly appear somewhere else.</span>")
target.forceMove(get_turf(selected_rune))
//Rite of Knowledge: Creates an arcane tome at the rune's location and destroys the rune.
/obj/effect/rune/summon_tome
cultist_name = "Summon Tome"
cultist_desc = "Pulls an arcane tome from the archives of the Geometer."
invocation = "N'ath reth sh'yro eth d'raggathnor!"
icon_state = "5"
color = rgb(0, 0, 255)
/obj/effect/rune/summon_tome/invoke(mob/living/user)
visible_message("<span class='warning'>A frayed tome materializes on the surface of [src], which dissolves into nothing.</span>")
new /obj/item/weapon/tome(get_turf(src))
qdel(src)
//Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby.
/obj/effect/rune/convert
cultist_name = "Convert"
cultist_desc = "Converts a normal crewmember on top of it to the cult. Does not work on loyalty-implanted crew."
invocation = "Mah'weyh pleggh at e'ntrath!"
icon_state = "3"
color = rgb(255, 0, 0)
req_cultists = 2
/obj/effect/rune/convert/invoke(mob/living/user)
var/list/convertees = list()
var/turf/T = get_turf(src)
for(var/mob/living/M in T.contents)
if(!iscultist(M) && !isloyal(M))
convertees.Add(M)
if(!convertees.len)
fail_invoke()
log_game("Convert rune failed - no eligible convertees")
return
var/mob/living/new_cultist = pick(convertees)
if(!is_convertable_to_cult(new_cultist.mind) || new_cultist.null_rod_check())
user << "<span class='warning'>Something is shielding [new_cultist]'s mind!</span>"
fail_invoke()
log_game("Convert rune failed - convertee could not be converted")
if(is_sacrifice_target(new_cultist.mind))
for(var/mob/living/M in orange(1,src))
if(iscultist(M))
M << "<span class='cultlarge'>\"I desire this one for myself. <i>SACRIFICE THEM!</i>\"</span>"
return
new_cultist.visible_message("<span class='warning'>[new_cultist] writhes in pain as the markings below them glow a bloody red!</span>", \
"<span class='cultlarge'><i>AAAAAAAAAAAAAA-</i></span>")
ticker.mode.add_cultist(new_cultist.mind)
new_cultist.mind.special_role = "Cultist"
new_cultist << "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
and something evil takes root.</b></span>"
new_cultist << "<span class='cultitalic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
</b></span>"
//Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body.
/obj/effect/rune/sacrifice
cultist_name = "Sacrifice"
@@ -298,14 +355,14 @@ var/list/teleport_other_runes = list()
fail_invoke()
rune_in_use = 0
return
if(((ishuman(offering) || isrobot(offering)) && offering.stat != DEAD)) //Requires two people to sacrifice living targets
if(((ishuman(offering) || isrobot(offering)) && offering.stat != DEAD) || is_sacrifice_target(offering.mind)) //Requires three people to sacrifice living targets
var/cultists_nearby = 1
for(var/mob/living/M in range(1,src))
if(iscultist(M) && M != user)
cultists_nearby++
M.say(invocation)
if(cultists_nearby < 2)
user << "<span class='cultitalic'>[offering] is too greatly linked to the world! You need more acolytes!</span>"
if(cultists_nearby < 3)
user << "<span class='cultitalic'>[offering] is too greatly linked to the world! You need three acolytes!</span>"
fail_invoke()
log_game("Sacrifice rune failed - not enough acolytes and target is living")
rune_in_use = 0
@@ -317,17 +374,29 @@ var/list/teleport_other_runes = list()
sac(offering)
/obj/effect/rune/sacrifice/proc/sac(mob/living/T)
var/sacrifice_fulfilled
if(T)
if(istype(T, /mob/living/simple_animal/pet/dog))
for(var/mob/living/carbon/C in range(3,src))
if(iscultist(C))
C << "<span class='cultlarge'>\"Even I have standards, such as they are!\"</span>"
if(C.reagents)
C.reagents.add_reagent("hell_water", 2)
if(T.mind)
sacrificed.Add(T.mind)
if(is_sacrifice_target(T.mind))
sacrifice_fulfilled = 1
PoolOrNew(/obj/effect/overlay/temp/cult/sac, src.loc)
for(var/mob/living/M in range(3,src))
if(iscultist(M))
if(ishuman(T) || isrobot(T))
M << "<span class='cultlarge'>\"I accept this sacrifice.\"</span>"
if(sacrifice_fulfilled)
M << "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>"
else
M << "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>"
if(ishuman(T) || isrobot(T))
M << "<span class='cultlarge'>\"I accept this sacrifice.\"</span>"
else
M << "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>"
if(T.mind)
if(ishuman(T) || isrobot(T))
new /obj/item/summoning_orb(get_turf(src))
var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul()
if(!stone.transfer_soul("FORCE", T, usr)) //If it cannot be added
@@ -345,6 +414,77 @@ var/list/teleport_other_runes = list()
T.gib()
rune_in_use = 0
//Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station.
/obj/effect/rune/narsie
cultist_name = "Call Forth The Geometer"
cultist_desc = "Tears apart dimensional barriers, calling forth the avatar of the Geometer."
invocation = null
req_cultists = 9
icon = 'icons/effects/96x96.dmi'
icon_state = "rune_large"
pixel_x = -32 //So the big ol' 96x96 sprite shows up right
pixel_y = -32
var/used
/obj/effect/rune/narsie/invoke(mob/living/user)
if(used)
return
if(ticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = ticker.mode
if(!("eldergod" in cult_mode.cult_objectives))
message_admins("[usr.real_name]([user.ckey]) tried to summon Nar-Sie when the objective was wrong")
for(var/mob/living/M in range(1,src))
if(iscultist(M))
M << "<span class='cultlarge'><i>\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"</i></span>"
if(M.reagents)
M.reagents.add_reagent("hell_water", 10)
M.Weaken(5)
fail_invoke()
log_game("Summon Nar-Sie rune failed - improper objective")
return
else
if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed))
for(var/mob/living/M in orange(1,src))
if(iscultist(M))
M << "<span class='warning'>The sacrifice is not complete. The portal lacks the power to open!</span>"
fail_invoke()
log_game("Summon Nar-Sie rune failed - sacrifice not complete")
return
if(!cult_mode.eldergod)
for(var/mob/living/M in orange(1,src))
if(iscultist(M))
M << "<span class='warning'>The avatar of Nar-Sie is already on this plane!</span>"
log_game("Summon Nar-Sie rune failed - already summoned")
return
//BEGIN THE SUMMONING
used = 1
for(var/mob/living/M in range(1,src))
if(iscultist(M))
M.say("TOK-LYR RQA-NAP G'OLT-ULOFT!!")
world << 'sound/effects/dimensional_rend.ogg'
world << "<span class='cultitalic'><b>The veil... <span class='big'>is...</span> <span class='reallybig'>TORN!!!--</span></b></span>"
sleep(40)
new /obj/singularity/narsie/large(get_turf(user)) //Causes Nar-Sie to spawn even if the rune has been removed
cult_mode.eldergod = 0
else
fail_invoke()
log_game("Summon Nar-Sie rune failed - gametype is not cult")
return
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
if((istype(I, /obj/item/weapon/tome) && iscultist(user)))
user.visible_message("<span class='warning'>[user.name] begins erasing the [src]...</span>", "<span class='notice'>You begin erasing the [src]...</span>")
if(do_after(user, 50, target = src)) //Prevents accidental erasures.
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) with a tome")
message_admins("[key_name_admin(user)] erased a Narsie rune with a tome")
..()
return
else
if(istype(I, /obj/item/weapon/nullrod)) //Begone foul magiks. You cannot hinder me.
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) using a null rod")
message_admins("[key_name_admin(user)] erased a Narsie rune with a null rod")
..()
return
//Rite of Resurrection: Requires two corpses. Revives one and gibs the other.
/obj/effect/rune/raise_dead
@@ -414,8 +554,8 @@ var/list/teleport_other_runes = list()
mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=20)
sleep(20)
if(!mob_to_sacrifice || !in_range(mob_to_sacrifice, src))
mob_to_sacrifice.visible_message("<span class='warning'><b>[mob_to_sacrifice] disintegrates into a pile of bones</span>")
return
mob_to_sacrifice.visible_message("<span class='warning'><b>[mob_to_sacrifice] disintegrates into a pile of bones[mob_to_revive ? ", the glowing tendril sinking into [mob_to_revive]'s body":""].</span>")
mob_to_sacrifice.dust()
if(!mob_to_revive || mob_to_revive.stat != DEAD)
visible_message("<span class='warning'>The glowing tendril snaps against the rune with a shocking crack.</span>")
@@ -437,7 +577,7 @@ var/list/teleport_other_runes = list()
//Rite of Obscurity: Turns all runes within a 3-tile radius invisible or reveals them again.
/obj/effect/rune/hide_runes
cultist_name = "Veil Runes"
cultist_desc = "Turns nearby runes invisible. They can be revealed by using this rune again."
cultist_desc = "Turns nearby runes invisible. They can be revealed by using the Reveal Rune."
invocation = "Kla'atu barada nikt'o!"
icon_state = "1"
color = rgb(0,0,255)
@@ -445,15 +585,45 @@ var/list/teleport_other_runes = list()
/obj/effect/rune/hide_runes/invoke(mob/living/user)
visible_message("<span class='warning'>[src] darkens to black and vanishes.</span>")
for(var/obj/effect/rune/R in orange(3,src))
if(R.invisibility == INVISIBILITY_OBSERVER)
R.invisibility = 0
R.alpha = initial(R.alpha)
else
R.visible_message("<span class='danger'>[R] fades away.</span>")
R.invisibility = INVISIBILITY_OBSERVER
R.alpha = 100 //To help ghosts distinguish hidden runes
R.visible_message("<span class='danger'>[R] fades away.</span>")
R.invisibility = INVISIBILITY_OBSERVER
R.alpha = 100 //To help ghosts distinguish hidden runes
for(var/mob/dead/observer/O in orange(3,src))
if(!O.invisibility)
O << "<span class='cultitalic'>You suddenly feel as if you've vanished...</span>"
O.invisibility = INVISIBILITY_OBSERVER
qdel(src)
//Rite of True Sight: Turns ghosts and obscured runes visible
/obj/effect/rune/true_sight
cultist_name = "Reveal Runes"
cultist_desc = "Reveals all invisible objects nearby, from spirits to runes."
invocation = "Nikt'o barada kla'atu!"
icon_state = "4"
color = rgb(255, 255, 255)
/obj/effect/rune/true_sight/invoke()
visible_message("<span class='warning'>[src] explodes in a flash of blinding light!</span>")
for(var/mob/dead/observer/O in orange(3,src))
O << "<span class='cultitalic'>You suddenly feel very obvious...</span>"
O.invisibility = 0
for(var/obj/effect/rune/R in orange(3,src))
R.invisibility = 0
R.alpha = initial(R.alpha)
qdel(src)
//Rite of False Truths: Makes runes appear like crayon ones
/obj/effect/rune/make_runes_fake
cultist_name = "Disguise Runes"
cultist_desc = "Causes all nearby runes (including itself) to resemble those drawn in crayon."
invocation = "By'o isit!"
icon_state = "4"
color = rgb(0, 150, 0)
/obj/effect/rune/make_runes_fake/invoke(mob/living/user)
visible_message("<span class='warning'>[src] flares brightly, then slowly dulls and appears mundane.</span>")
for(var/obj/effect/rune/R in range(3,src))
R.desc = "A rune drawn in crayon."
//Rite of Disruption: Emits an EMP blast.
/obj/effect/rune/emp
@@ -575,7 +745,7 @@ var/list/teleport_other_runes = list()
visible_message("<span class='warning'>[src] emits a blinding red flash!</span>")
for(var/mob/living/carbon/C in viewers(src))
if(!iscultist(C) && !C.null_rod_check())
C << "<span class='cultlarge'>You feel oily shadows cover your senses.</span>"
C << "<span class='cultlarge'>A dark fog blankets your senses!</span>"
C.adjustEarDamage(0,50)
C.flash_eyes(1, 1)
C.adjust_blurriness(50)
@@ -586,7 +756,7 @@ var/list/teleport_other_runes = list()
//Rite of Disorientation: Stuns and mutes all non-cultists nearby for a brief time
/obj/effect/rune/stun
cultist_name = "Stun"
cultist_desc = "Stuns and mutes all nearby non-followers for a brief time."
cultist_desc = "Stuns all nearby non-followers for a brief time."
invocation = "Fuu ma'jin!"
icon_state = "2"
color = rgb(100, 0, 100)
@@ -594,29 +764,18 @@ var/list/teleport_other_runes = list()
/obj/effect/rune/stun/invoke(mob/living/user)
visible_message("<span class='warning'>[src] explodes in a bright flash!</span>")
for(var/mob/living/M in viewers(src))
stun_he(M)
if(!iscultist(M) && !M.null_rod_check())
M << "<span class='cultitalic'><b>You are disoriented by [src]!</b></span>"
M.Weaken(3)
M.Stun(3)
M.flash_eyes(1,1)
qdel(src)
/obj/effect/rune/stun/Crossed(atom/movable/AM)
..()
if(isliving(AM))
stun_he(AM)
/obj/effect/rune/stun/proc/stun_he(mob/living/M)
if(!iscultist(M) && !M.null_rod_check())
M << "<span class='cultitalic'><b>You are disoriented by [src]!</b></span>"
M.Weaken(3)
M.Stun(3)
M.flash_eyes(1,1)
if(iscarbon(M))
var/mob/living/carbon/C = M
C.silent += 3
//Rite of Joined Souls: Summons a single cultist.
/obj/effect/rune/summon
cultist_name = "Summon Cultist"
cultist_desc = "Summons a single cultist to the rune."
invocation = "N'ath reth sh'yro eth d'rekkathnor!"
req_cultists = 2
icon_state = "5"
color = rgb(0, 255, 0)
@@ -699,8 +858,7 @@ var/list/teleport_other_runes = list()
visible_message("<span class='warning'>[picked_rune] crumbles to dust, and bloody images form themselves on [paper_to_imbue].</span>")
qdel(paper_to_imbue)
qdel(picked_rune)
qdel(src)
//Rite of Fabrication: Creates a construct shell out of 5 metal sheets.
/obj/effect/rune/construct_shell
cultist_name = "Fabricate Shell"
@@ -781,11 +939,11 @@ var/list/teleport_other_runes = list()
//Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby
/obj/effect/rune/blood_boil
cultist_name = "Boil Blood"
cultist_desc = "Boils the blood of non-believers who can see the rune, dealing extreme amounts of damage."
cultist_desc = "Boils the blood of non-believers who can see the rune, dealing extreme amounts of damage. Requires 3 chanters."
invocation = "Dedo ol'btoh!"
icon_state = "4"
color = rgb(255, 0, 0)
req_cultists = 2
req_cultists = 3
/obj/effect/rune/blood_boil/invoke(mob/living/user)
visible_message("<span class='warning'>[src] briefly bubbles before exploding!</span>")
@@ -805,27 +963,6 @@ var/list/teleport_other_runes = list()
qdel(src)
//Rite of the Cleansing Flame: Sets all non-cultists on fire.
/obj/effect/rune/flame
cultist_name = "Immolate"
cultist_desc = "Sets any non-believers who can see the rune on fire."
invocation = "Dedo va'batoh!"
icon_state = "2"
color = rgb(255, 0, 0)
/obj/effect/rune/flame/invoke(mob/living/user)
visible_message("<span class='warning'>[src] burns away, scorching the floor below!</span>")
for(var/mob/living/carbon/C in viewers(src))
if(!iscultist(C) && !C.null_rod_check())
C << "<span class='cultlarge'>You feel your skin crisp as you burst into flames!</span>"
C.fire_act()
user.apply_damage(15, BURN, pick("l_arm", "r_arm"))
user << "<span class='cultitalic'>[src] burns your arms!</span>"
var/turf/simulated/T = get_turf(src)
T.burn_tile()
qdel(src)
//Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost.
/obj/effect/rune/manifest
cultist_name = "Manifest Spirit"
@@ -842,7 +979,7 @@ var/list/teleport_other_runes = list()
return
var/list/ghosts_on_rune = list()
for(var/mob/dead/observer/O in get_turf(src))
if(O.client)
if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
ghosts_on_rune.Add(O)
if(!ghosts_on_rune.len)
user << "<span class='cultitalic'>There are no spirits near [src]!</span>"
@@ -875,11 +1012,11 @@ var/list/teleport_other_runes = list()
//Rite of Dimensional Corruption: Stops time around the rune for all non-cultists.
/obj/effect/rune/timestop
cultist_name = "Time Stop"
cultist_desc = "Stops time around the rune for all non-cultists."
cultist_desc = "Stops time around the rune for all non-cultists. Requires 3 chanters."
invocation = "T'ak ot'marzah oahr'du!"
icon_state = "2"
color = rgb(0, 0, 255)
req_cultists = 2
req_cultists = 3
/obj/effect/rune/timestop/invoke(mob/living/user)
visible_message("<span class='warning'>[src] flares up for a moment, and then disappears into itself!</span>")
+128 -58
View File
@@ -70,11 +70,12 @@ Rite of Disorientation
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> - Allows you to summon an arcane tome.<BR>"
dat += "<A href='?src=\ref[src];rune=teleport'>Sas'so c'arta forbici!</A> - Allows you to move to a Rite of Dislocation with the keyword of \"veri\".<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 nearby runes, or reveal previously concealed runes.<BR>"
dat += "<A href='?src=\ref[src];rune=flame'>Dedo va'batoh!</A> - Allows you to set nearby non-believers on fire.<BR>"
dat += "<A href='?src=\ref[src];rune=sacrune'>Barhah hra zar'garis!</A> - A sacrifice rune appears under your feet, ready to be invoked in the name of Nar-sie.<BR>"
dat += "<A href='?src=\ref[src];rune=conceal'>Kla'atu barada nikt'o!</A> - Allows you to conceal nearby runes.<BR>"
dat += "<A href='?src=\ref[src];rune=reveal'>Nikt'o barada kla'atu!</A> - Allows you to reveal nearby runes.<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=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 captured souls. It is too large to carry on your person.<BR>"
var/datum/browser/popup = new(user, "talisman", "", 400, 400)
@@ -84,37 +85,45 @@ Rite of Disorientation
return 1
/obj/item/weapon/paper/talisman/supply/Topic(href, href_list)
if(!src || usr.stat || usr.restrained() || !in_range(src, usr))
if(src)
if(usr.stat || usr.restrained() || !in_range(src, usr))
return
if(href_list["rune"])
switch(href_list["rune"])
if("newtome")
var/obj/item/weapon/paper/talisman/summon_tome/T = new(usr)
usr.put_in_hands(T)
if("teleport")
var/obj/item/weapon/paper/talisman/teleport/T = new(usr)
T.keyword = "veri"
usr.put_in_hands(T)
if("emp")
var/obj/item/weapon/paper/talisman/emp/T = new(usr)
usr.put_in_hands(T)
if("conceal")
var/obj/item/weapon/paper/talisman/hide_runes/T = new(usr)
usr.put_in_hands(T)
if("reveal")
var/obj/item/weapon/paper/talisman/true_sight/T = new(usr)
usr.put_in_hands(T)
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))
src.uses--
if(src.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)
return
else
return
if(href_list["rune"])
switch(href_list["rune"])
if("teleport")
var/obj/item/weapon/paper/talisman/teleport/T = new(usr)
T.keyword = "veri"
usr.put_in_hands(T)
if("emp")
var/obj/item/weapon/paper/talisman/emp/T = new(usr)
usr.put_in_hands(T)
if("conceal")
var/obj/item/weapon/paper/talisman/hide_runes/T = new(usr)
usr.put_in_hands(T)
if("flame")
var/obj/item/weapon/paper/talisman/flame/T = new(usr)
usr.put_in_hands(T)
if("sacrune")
new /obj/effect/rune/sacrifice(get_turf(usr))
if("soulstone")
var/obj/item/device/soulstone/T = new(usr)
usr.put_in_hands(T)
if("construct")
new /obj/structure/constructshell(get_turf(usr))
src.uses--
if(src.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)
//Rite of Translocation: Same as rune
/obj/item/weapon/paper/talisman/teleport
@@ -151,26 +160,64 @@ Rite of Disorientation
if(iscultist(user) && keyword)
user << "<b>Keyword:</b> [keyword]"
//Rite of Knowledge: Same as rune, but has two uses
/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 the Geometer."
invocation = "N'ath reth sh'yro eth d'raggathnor!"
health_cost = 1
/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user)
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>")
var/obj/item/weapon/tome/T = new(get_turf(user))
if(user.put_in_hands(T))
user.visible_message("<span class='warning'>A tome appears in [user]'s hand!</span>", \
"<span class='cultitalic'>An arcane tome materializes in your free hand.</span>")
else
user.visible_message("<span class='warning'>A tome appears at [user]'s feet!</span>", \
"<span class='cultitalic'>An arcane tome materialzies at your feet.</span>")
//Talisman of Obscurity: Same as rune
/obj/item/weapon/paper/talisman/hide_runes
cultist_name = "Talisman of Veiling"
cultist_desc = "A talisman that will make all runes within a small radius invisible, or make invisible runes visible again."
cultist_desc = "A talisman that will make all runes within a small radius invisible."
invocation = "Kla'atu barada nikt'o!"
health_cost = 1
/obj/item/weapon/paper/talisman/hide_runes/invoke(mob/living/user)
user.visible_message("<span class='warning'>Dust flows from [user]'s hand.</span>", \
"<span class='cultitalic'>You speak the words of the talisman, veiling nearby runes.</span>")
for(var/obj/effect/rune/R in orange(3,src))
if(R.invisibility == INVISIBILITY_OBSERVER)
R.invisibility = 0
R.alpha = initial(R.alpha)
else
R.visible_message("<span class='danger'>[R] fades away.</span>")
R.invisibility = INVISIBILITY_OBSERVER
R.alpha = 100 //To help ghosts distinguish hidden runes
for(var/obj/effect/rune/R in orange(3,user))
R.visible_message("<span class='danger'>[R] fades away.</span>")
R.invisibility = INVISIBILITY_OBSERVER
//Rite of True Sight: Same as rune, but doesn't work on ghosts
/obj/item/weapon/paper/talisman/true_sight
cultist_name = "Talisman of Revealing"
cultist_desc = "A talisman that reveals nearby invisible runes."
invocation = "Nikt'o barada kla'atu!"
health_cost = 1
/obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user)
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 orange(3,user))
R.invisibility = 0
//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!"
health_cost = 3
/obj/item/weapon/paper/talisman/make_runes_fake/invoke(mob/living/user)
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(3,user))
R.desc = "A rune drawn in crayon."
//Rite of Disruption: Same as rune
/obj/item/weapon/paper/talisman/emp
@@ -184,22 +231,12 @@ Rite of Disorientation
"<span class='cultitalic'>You speak the words of the talisman, emitting an EMP blast.</span>")
empulse(src, 4, 8)
//Rite of the Cleansing Flame: Same as rune
/obj/item/weapon/paper/talisman/flame
cultist_name = "Talisman of Immolation"
cultist_desc = "A talisman that sets any non-believers who can see you on fire."
invocation = "Dedo va'batoh!"
health_cost = 10
/obj/item/weapon/paper/talisman/flame/invoke(mob/living/user)
user.visible_message("<span class='warning'>\The [src] in [user]'s hand suddenly burns away in a red flash!</span>", \
"<span class='cultitalic'>You speak the words of the talisman, setting your enemies on fire.</span>")
for(var/mob/living/carbon/C in viewers(user))
if(!iscultist(C) && !C.null_rod_check())
C << "<span class='cultlarge'>You feel your skin crisp as you burst into flames!</span>"
C.fire_act()
//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 = "Fuu ma'jin!"
health_cost = 15
//Rite of Arming: Equips cultist armor on the user, where available
/obj/item/weapon/paper/talisman/armor
@@ -208,6 +245,39 @@ Rite of Disorientation
invocation = "N'ath reth sh'yro eth draggathnor!"
health_cost = 3
/obj/item/weapon/paper/talisman/stun/attack_self(mob/living/user)
if(iscultist(user))
user << "<span class='warning'>To use this talisman, attack the target directly.</span>"
else
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
/obj/item/weapon/paper/talisman/stun/attack(mob/living/target, mob/living/user)
if(iscultist(user))
user.whisper(invocation)
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(9)
target.Stun(9)
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 += 4
C.stuttering += 15
C.cultslurring += 15
C.Jitter(15)
user.drop_item()
qdel(src)
return
..()
/obj/item/weapon/paper/talisman/armor/invoke(mob/living/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>")
+8 -4
View File
@@ -124,6 +124,12 @@
if("VICTIM")
var/mob/living/carbon/human/T = target
if(ticker.mode.name == "cult" && T.mind == ticker.mode:sacrifice_target)
if(iscultist(user))
user << "<span class='danger'>The Geometer of blood wants this mortal sacrificed with the rune.</span>"
else
user << "<span class='danger'>The soul stone doesn't work for no apparent reason.</span>"
return 0
if(imprinted != "empty")
user << "<span class='userdanger'>Capture failed!</span>: The soul stone has already been imprinted with [imprinted]'s mind!"
else
@@ -137,8 +143,6 @@
if(contents.len)
user << "<span class='userdanger'>Capture failed!</span>: The soul stone is full! Use or free an existing soul to make room."
else
if(iscultist(user))
new /obj/item/summoning_orb(get_turf(T))
for(var/obj/item/W in T)
T.unEquip(W)
init_shade(src, T, user, vic = 1)
@@ -204,7 +208,7 @@
if(stoner && iswizard(stoner))
newstruct << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
else if(stoner && iscultist(stoner))
newstruct << "<B>You are still bound to serve the cult, follow their orders and help them summon the Geometer at all costs.</B>"
newstruct << "<B>You are still bound to serve the cult, follow their orders and help them complete their goals at all costs.</B>"
else newstruct << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
newstruct.cancel_camera()
@@ -266,4 +270,4 @@
T.unEquip(W)
init_shade(C, T, U)
qdel(T)
return 1
return 1
+1 -1
View File
@@ -194,7 +194,7 @@
candidates += applicant
if(candidates.len)
var/numCultists = min(candidates.len, 5)
var/numCultists = min(candidates.len, 4)
for(var/i = 0, i<numCultists, i++)
H = pick(candidates)
+3
View File
@@ -364,6 +364,9 @@
if(slurring)
slurring = max(slurring-1,0)
if(cultslurring)
cultslurring = max(cultslurring-1, 0)
if(silent)
silent = max(silent-1, 0)
+3
View File
@@ -238,6 +238,9 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
if(slurring)
message = slur(message)
if(cultslurring)
message = cultslur(message)
message = capitalize(message)
return message
+1
View File
@@ -42,6 +42,7 @@
var/ear_damage = 0 //Carbon
var/stuttering = 0 //Carbon
var/slurring = 0 //Carbon
var/cultslurring = 0 //Carbon
var/real_name = null
var/druggy = 0 //Carbon
var/confused = 0 //Carbon
+42 -1
View File
@@ -114,7 +114,48 @@
newletter+="[newletter][newletter]"
newphrase+="[newletter]";counter-=1
return newphrase
/proc/cultslur(n) // Inflicted on victims of a stun talisman
var/phrase = html_decode(n)
var/leng = lentext(phrase)
var/counter=lentext(phrase)
var/newphrase=""
var/newletter=""
while(counter>=1)
newletter=copytext(phrase,(leng-counter)+1,(leng-counter)+2)
if(rand(1,2)==2)
if(lowertext(newletter)=="o")
newletter="u"
if(lowertext(newletter)=="s")
newletter="ch"
if(lowertext(newletter)=="a")
newletter="ah"
if(lowertext(newletter)=="u")
newletter="oo"
if(lowertext(newletter)=="c")
newletter=" NAR "
if(lowertext(newletter)=="t")
newletter=" SIE "
if(rand(1,4)==4)
if(newletter==" ")
newletter=" GLORY "
if(newletter=="H")
newletter=" HAIL "
switch(rand(1,10))
if(1)
newletter="'"
if(2)
newletter+="agn"
if(3)
newletter="fth"
if(4)
newletter="nglu"
newphrase+="[newletter]";counter-=1
return newphrase
/proc/stutter(n)
var/te = html_decode(n)
var/t = ""//placed before the message. Not really sure what it's for.
+4
View File
@@ -53,6 +53,10 @@
var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper)
assets.send(user)
if(istype(src, /obj/item/weapon/paper/talisman)) //Talismans cannot be read
if(!iscultist(user) && !user.stat)
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
return
if(in_range(user, src) || isobserver(user))
if( !(ishuman(user) || isobserver(user) || issilicon(user)) )
user << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[stars(info)]<HR>[stamps]</BODY></HTML>", "window=[name]")
@@ -184,11 +184,14 @@
M.stuttering = 1
M.stuttering += 4
M.Dizzy(5)
if(iscultist(M) && prob(5))
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis"))
if(data >= 75 && prob(33)) // 30 units, 135 seconds
if (!M.confused)
M.confused = 1
M.confused += 3
if((is_handofgod_cultist(M) && !is_handofgod_prophet(M)))
if(iscultist(M) || (is_handofgod_cultist(M) && !is_handofgod_prophet(M)))
ticker.mode.remove_cultist(M.mind)
ticker.mode.remove_hog_follower(M.mind)
holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
M.jitteriness = 0